使用spark-ml中的LBFGS优化器,我们将尝试使用熵正则化项。
LBFGS成本函数(类LBFGS.CostFun)仅返回成本函数值及其梯度。损失函数在LBFGS的Spark代码内部计算为
val regVal = updater.compute(w, Vectors.zeros(n), 0, 1, regParam)._2
loss = lossSum / numExamples + regVal
梯度部分以及正则化如下:
// The following gradientTotal is actually the regularization part of gradient.
// Will add the gradientSum computed from the data with weights in the next step.
val gradientTotal = w.copy
axpy(-1.0, updater.compute(w, Vectors.zeros(n), 1, 1, regParam)._1, gradientTotal)
// gradientTotal = gradientSum / numExamples + gradientTotal
axpy(1.0 / numExamples, gradientSum, gradientTotal)
不幸的是,据我所知,Spark没有实现熵更新器(只有四个:ANNUpdater,SimpleUpdater,L1更新器,L2更新器)。
有人知道Spark的现有Entropic Updater实现吗? 最终,在最坏的情况下,我们可以自己编写它-将熵罚项添加到损失部分(作为regVal)是微不足道的,但是,这将如何影响梯度?有人可以提供在权重向量w上方定义的方式/方程式/代码熵项:
会影响渐变吗?