如何在Java中创建diffFunction以用于QNMinimizer?

时间:2017-04-06 17:33:53

标签: java function stanford-nlp mathematical-optimization

我正在尝试使用Stanford NLP库中的QNMinimizer,我遇到了使qn.minimize正常运行所需的参数出现问题。

QNMinimzer qn = new QNMinimizer(10, true)
qn.minimize(null, 1e-5, new double[] {0,0,0}, 400)

我需要将一个diffFunction类型的对象放在“null”中,但不确定如何创建/实现一个。我有一个使用梯度下降的方法,并希望将其合并到diffFunction对象中。

1 个答案:

答案 0 :(得分:0)

您应该只需实现DiffFunction界面 - 一旦您了解了正在进行的操作,我真的会推荐AbstractCachingDiffFunction,因为它更多高效并附带一些很好的实用功能(例如,渐变检查器)。

在较高级别,对于任何输入向量x \in R^k(表示为长度为k的双向量),您需要提供两个值:函数y = f_{\theta}(x) \in R的值和渐变{ {0}},输出为长度为\frac{d}{d\theta}f_\theta(x) \in R^k的双向量。

维度kFunction#domainDimensionDiffFunction的超级接口)中定义。

yFunction#valueAt中定义。

渐变在DiffFunction#derivativeAt中定义。

如果已经实施了梯度下降,则值y将是损失的值。梯度将是梯度下降的梯度。如果你有随机梯度下降而不是批量梯度下降。值y是数据集上的损失之和,与梯度相同。