Welcome to mirror list, hosted at ThFree Co, Russian Federation.

Normalizer.h « vw - github.com/moses-smt/mosesdecoder.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 74d94a79f3f33a48b96c1b06dd1cc876c0e45409 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#ifndef moses_Normalizer_h
#define moses_Normalizer_h

#include <vector>
#include "Util.h"

namespace Discriminative
{

class Normalizer
{
public:
  virtual void operator()(std::vector<float> &losses) const = 0;
  virtual ~Normalizer() {}
};

class SquaredLossNormalizer : public Normalizer
{
public:
  virtual void operator()(std::vector<float> &losses) const {
    // This is (?) a good choice for sqrt loss (default loss function in VW)

    float sum = 0;

    // clip to [0,1] and take 1-Z as non-normalized prob
    std::vector<float>::iterator it;
    for (it = losses.begin(); it != losses.end(); it++) {
      if (*it <= 0.0) *it = 1.0;
      else if (*it >= 1.0) *it = 0.0;
      else *it = 1.0 - *it;
      sum += *it;
    }

    if (! Moses::Equals(sum, 0)) {
      // normalize
      for (it = losses.begin(); it != losses.end(); it++)
        *it /= sum;
    } else {
      // sum of non-normalized probs is 0, then take uniform probs
      for (it = losses.begin(); it != losses.end(); it++)
        *it = 1.0 / losses.size();
    }
  }

  virtual ~SquaredLossNormalizer() {}
};

class LogisticLossNormalizer : public Normalizer
{
public:
  virtual void operator()(std::vector<float> &losses) const {
    float sum = 0;
    std::vector<float>::iterator it;
    for (it = losses.begin(); it != losses.end(); it++) {
      *it = exp(-*it);
      sum += *it;
    }
    for (it = losses.begin(); it != losses.end(); it++) {
      *it /= sum;
    }
  }

  virtual ~LogisticLossNormalizer() {}
};

} // namespace Discriminative

#endif // moses_Normalizer_h