summaryrefslogtreecommitdiff
path: root/minrisk/minrisk_optimize.cc
diff options
context:
space:
mode:
authorChris Dyer <cdyer@cs.cmu.edu>2012-06-29 18:45:26 -0700
committerChris Dyer <cdyer@cs.cmu.edu>2012-06-29 18:45:26 -0700
commitb73722556f2bbc51736b716c613430250abef907 (patch)
tree62928fe4f1269ca1ca616f7009db920eac361c1d /minrisk/minrisk_optimize.cc
parentb3a7f6c5d97acac3cd6b14de194eadaa18175fda (diff)
add option for entropy optimization
Diffstat (limited to 'minrisk/minrisk_optimize.cc')
-rw-r--r--minrisk/minrisk_optimize.cc67
1 files changed, 58 insertions, 9 deletions
diff --git a/minrisk/minrisk_optimize.cc b/minrisk/minrisk_optimize.cc
index 6e651994..da8b5260 100644
--- a/minrisk/minrisk_optimize.cc
+++ b/minrisk/minrisk_optimize.cc
@@ -17,6 +17,7 @@
#include "ns_docscorer.h"
#include "candidate_set.h"
#include "risk.h"
+#include "entropy.h"
using namespace std;
namespace po = boost::program_options;
@@ -28,6 +29,9 @@ void InitCommandLine(int argc, char** argv, po::variables_map* conf) {
("weights,w",po::value<string>(), "[REQD] Weights files from current iterations")
("input,i",po::value<string>()->default_value("-"), "Input file to map (- is STDIN)")
("evaluation_metric,m",po::value<string>()->default_value("IBM_BLEU"), "Evaluation metric (ibm_bleu, koehn_bleu, nist_bleu, ter, meteor, etc.)")
+ ("temperature,T",po::value<double>()->default_value(0.0), "Temperature parameter for objective (>0 increases the entropy)")
+ ("l1_strength,C",po::value<double>()->default_value(0.0), "L1 regularization strength")
+ ("memory_buffers,M",po::value<unsigned>()->default_value(20), "Memory buffers used in LBFGS")
("kbest_repository,R",po::value<string>(), "Accumulate k-best lists from previous iterations (parameter is path to repository)")
("kbest_size,k",po::value<unsigned>()->default_value(500u), "Top k-hypotheses to extract")
("help,h", "Help");
@@ -52,36 +56,80 @@ void InitCommandLine(int argc, char** argv, po::variables_map* conf) {
EvaluationMetric* metric = NULL;
struct RiskObjective {
- explicit RiskObjective(const vector<training::CandidateSet>& tr) : training(tr) {}
+ explicit RiskObjective(const vector<training::CandidateSet>& tr, const double temp) : training(tr), T(temp) {}
double operator()(const vector<double>& x, double* g) const {
fill(g, g + x.size(), 0.0);
double obj = 0;
+ double h = 0;
for (unsigned i = 0; i < training.size(); ++i) {
training::CandidateSetRisk risk(training[i], *metric);
- SparseVector<double> tg;
+ training::CandidateSetEntropy entropy(training[i]);
+ SparseVector<double> tg, hg;
double r = risk(x, &tg);
+ double hh = entropy(x, &hg);
+ h += hh;
obj += r;
for (SparseVector<double>::iterator it = tg.begin(); it != tg.end(); ++it)
g[it->first] += it->second;
+ if (T) {
+ for (SparseVector<double>::iterator it = hg.begin(); it != hg.end(); ++it)
+ g[it->first] += T * it->second;
+ }
}
- cerr << (1-(obj / training.size())) << endl;
- return obj;
+ cerr << (1-(obj / training.size())) << " H=" << h << endl;
+ return obj - T * h;
}
const vector<training::CandidateSet>& training;
+ const double T; // temperature for entropy regularization
};
double LearnParameters(const vector<training::CandidateSet>& training,
+ const double temp, // > 0 increases the entropy, < 0 decreases the entropy
const double C1,
const unsigned memory_buffers,
vector<weight_t>* px) {
- RiskObjective obj(training);
+ RiskObjective obj(training, temp);
LBFGS<RiskObjective> lbfgs(px, obj, memory_buffers, C1);
lbfgs.MinimizeFunction();
return 0;
}
-// runs lines 4--15 of rampion algorithm
+#if 0
+struct FooLoss {
+ double operator()(const vector<double>& x, double* g) const {
+ fill(g, g + x.size(), 0.0);
+ training::CandidateSet cs;
+ training::CandidateSetEntropy cse(cs);
+ cs.cs.resize(3);
+ cs.cs[0].fmap.set_value(FD::Convert("F1"), -1.0);
+ cs.cs[1].fmap.set_value(FD::Convert("F2"), 1.0);
+ cs.cs[2].fmap.set_value(FD::Convert("F1"), 2.0);
+ cs.cs[2].fmap.set_value(FD::Convert("F2"), 0.5);
+ SparseVector<double> xx;
+ double h = cse(x, &xx);
+ cerr << cse(x, &xx) << endl; cerr << "G: " << xx << endl;
+ for (SparseVector<double>::iterator i = xx.begin(); i != xx.end(); ++i)
+ g[i->first] += i->second;
+ return -h;
+ }
+};
+#endif
+
int main(int argc, char** argv) {
+#if 0
+ training::CandidateSet cs;
+ training::CandidateSetEntropy cse(cs);
+ cs.cs.resize(3);
+ cs.cs[0].fmap.set_value(FD::Convert("F1"), -1.0);
+ cs.cs[1].fmap.set_value(FD::Convert("F2"), 1.0);
+ cs.cs[2].fmap.set_value(FD::Convert("F1"), 2.0);
+ cs.cs[2].fmap.set_value(FD::Convert("F2"), 0.5);
+ FooLoss foo;
+ vector<double> ww(FD::NumFeats()); ww[FD::Convert("F1")] = 1.0;
+ LBFGS<FooLoss> lbfgs(&ww, foo, 100, 0.0);
+ lbfgs.MinimizeFunction();
+ return 1;
+#endif
po::variables_map conf;
InitCommandLine(argc, argv, &conf);
const string evaluation_metric = conf["evaluation_metric"].as<string>();
@@ -89,8 +137,6 @@ int main(int argc, char** argv) {
metric = EvaluationMetric::Instance(evaluation_metric);
DocumentScorer ds(metric, conf["reference"].as<vector<string> >());
cerr << "Loaded " << ds.size() << " references for scoring with " << evaluation_metric << endl;
- double goodsign = -1;
- double badsign = -goodsign;
Hypergraph hg;
string last_file;
@@ -141,7 +187,10 @@ int main(int argc, char** argv) {
cerr << "\nHypergraphs loaded.\n";
weights.resize(FD::NumFeats());
- LearnParameters(kis, 0.0, 100, &weights);
+ double c1 = conf["l1_strength"].as<double>();
+ double temp = conf["temperature"].as<double>();
+ unsigned m = conf["memory_buffers"].as<unsigned>();
+ LearnParameters(kis, temp, c1, m, &weights);
Weights::WriteToFile("-", weights);
return 0;
}