double CrossEntropy::operator() ( const dlib::matrix<double,0,1>& arg) const { double total = 0.0; double n = 0.0; std::vector<float> weight_vector (m_model->m_numModels); for (int i=0; i < arg.nr(); i++) { weight_vector[i] = arg(i); } if (m_model->m_mode == "interpolate") { weight_vector = m_model->normalizeWeights(weight_vector); } for ( std::vector<multiModelStatisticsOptimization*>::const_iterator iter = m_optimizerStats.begin(); iter != m_optimizerStats.end(); ++iter ) { multiModelStatisticsOptimization* statistics = *iter; size_t f = statistics->f; double score; score = std::inner_product(statistics->p[m_iFeature].begin(), statistics->p[m_iFeature].end(), weight_vector.begin(), 0.0); total -= (FloorScore(TransformScore(score))/TransformScore(2))*f; n += f; } return total/n; }
double CrossEntropyCounts::operator() ( const dlib::matrix<double,0,1>& arg) const { double total = 0.0; double n = 0.0; std::vector<float> weight_vector (m_model->m_numModels); for (int i=0; i < arg.nr(); i++) { weight_vector[i] = arg(i); } if (m_model->m_mode == "interpolate") { weight_vector = m_model->normalizeWeights(weight_vector); } for ( std::vector<multiModelCountsStatisticsOptimization*>::const_iterator iter = m_optimizerStats.begin(); iter != m_optimizerStats.end(); ++iter ) { multiModelCountsStatisticsOptimization* statistics = *iter; size_t f = statistics->f; double score; if (m_iFeature == 0) { score = m_model->m_combineFunction(statistics->fst, statistics->ft, weight_vector); } else if (m_iFeature == 1) { score = m_model->ComputeWeightedLexicalTranslationFromCache(statistics->lexCachee2f, weight_vector); } else if (m_iFeature == 2) { score = m_model->m_combineFunction(statistics->fst, statistics->fs, weight_vector); } else if (m_iFeature == 3) { score = m_model->ComputeWeightedLexicalTranslationFromCache(statistics->lexCachef2e, weight_vector); } else { score = 0; UTIL_THROW(util::Exception, "Trying to optimize feature that I don't know. Aborting"); } total -= (FloorScore(TransformScore(score))/TransformScore(2))*f; n += f; } return total/n; }
vector<float> PhraseDictionaryMultiModel::Optimize(OptimizationObjective *ObjectiveFunction, size_t numModels) { dlib::matrix<double,0,1> starting_point; starting_point.set_size(numModels); starting_point = 1.0; try { dlib::find_min_bobyqa(*ObjectiveFunction, starting_point, 2*numModels+1, // number of interpolation points dlib::uniform_matrix<double>(numModels,1, 1e-09), // lower bound constraint dlib::uniform_matrix<double>(numModels,1, 1e100), // upper bound constraint 1.0, // initial trust region radius 1e-5, // stopping trust region radius 10000 // max number of objective function evaluations ); } catch (dlib::bobyqa_failure& e) { cerr << e.what() << endl; } vector<float> weight_vector (numModels); for (int i=0; i < starting_point.nr(); i++) { weight_vector[i] = starting_point(i); } cerr << "Cross-entropy: " << (*ObjectiveFunction)(starting_point) << endl; return weight_vector; }