Ejemplo n.º 1
0
double ComputeDelta(const vector<boost::shared_ptr<HypothesisInfo> >& pair) {
	const double loss0 = pair[0]->features.dot(w) + pair[0]->cost - (pair[0]->oracle->features.dot(w) - pair[0]->oracle->cost);
	const double loss1 = pair[1]->features.dot(w) + pair[1]->cost - (pair[1]->oracle->features.dot(w) - pair[1]->oracle->cost);
	const double num = loss0 - loss1;
	//const double num = pair[0]->loss - pair[1]->loss;
	//cerr << "loss_0=" << pair[0]->loss << " loss_1=" << pair[1]->loss << endl;
	cerr << " ComputeDelta: loss_0=" << loss0 << " loss_1=" << loss1;
	SparseVector<double> diff = pair[0]->features;
	diff -= pair[1]->features;
	double diffsqnorm = diff.l2norm_sq();
	double delta;
	if (diffsqnorm > 0)
		delta = num / (diffsqnorm * lr);
	else
		delta = 0;
	cerr << " delta1=" << delta;
	// clip
	delta = max(-pair[0]->alpha, min(delta, pair[1]->alpha));
	cerr << " delta2=" << delta << endl;
	return delta;

}