常用机器学习算法最终都会需要求解一个无约束凸优化问题
minw∈ℝdf(x)
这个模块实现了常用的优化问题求解算法,例如梯度下降法,LBFGS算法等。各种不同的线性求解算法
区别在于2点:
- 下降方向(梯度方向、牛顿方向等)
- 步长(wolf条件等)
这个模块一共有以下几个文件:
- Gradient.scala:针对特定机器学习问题,定义了一些梯度计算函数
- Updater.scala:根据计算好的梯度及步长信息来更新迭代
- Optimizer.scala:定义凸优化问题 基类 Optimizer,优化函数optimize
- GradientDescent.scala:梯度下降算法
- LBFGS.scala:LBFGS算法
- NNLS.scala:??
下面较为详细的阅读各个文件的源代码。
Gradient.scala文件
定义Gradient 基类
/**
* 计算loss function在某个data point的gradient和loss value
*/
abstract class Gradient extends Serializable {
/**
* @param data:一个data point
* @param label:data point的标签
* @param weights:权重向量
*
* @return (gradient: 梯度, loss: 损失函数值)
*/
def compute(data: Vector, label: Double, weights: Vector): (Vector, Double)
/**
* @param cumGradient the computed gradient will be added to this vector
*
* @return loss:损失函数值
*/
def compute(data: Vector, label: Double, weights: Vector, cumGradient: Vector): Double
}
定义Gradient 继承类:
- LogisticGradient for LR
- LeastSquaresGradient for linear regression
- HingeGradient for SVM
class LogisticGradient(numClasses: Int) extends Gradient {
numClasses match {
case 2 =>
/**
* For Binary Logistic Regression.
* 考虑到效率,2分类单独做
*/
val margin = -1.0 * dot(data, weights)
val multiplier = (1.0 / (1.0 + math.exp(margin))) - label
axpy(multiplier, data, cumGradient)
if (label > 0) {
// The following is equivalent to log(1 + exp(margin)) but more numerically stable.
MLUtils.log1pExp(margin)
} else {
MLUtils.log1pExp(margin) - margin
}