梯度下降算法是很多机器学习算法会采用的一个解决最小化问题的方法。比如线性回归中,我们定义了一个线性的假设函数,现在需要估算其中的参数。
首先想想既然是参数肯定会有各种不同的取值可能,那么参数取哪个值构成的假设函数最符合输入数据的特征呢?
因此我们需要一个评估函数,这个评估函数可以用来打分,比较哪个参数取值更好,帮助我们选择最优的参数组合。这个评估函数通常被称为损失函数。
对于线性回归来说,可以选择MSE作为评估函数,MSE反映了预测值与实际值偏差的总和,我们当然是希望这个总和越小越好。因此参数求解变成了一个最优化问题:求解min(MSE)对应的参数值。
用程序如何实现呢?梯度下降算法就对了。
猜测一个初始值,然后不断更新这个值,来步步逼近最终结果,直至收敛为止。
- 给定初始值(w)
- 沿着梯度方向下降,更新初始值
w1 = w0 - gradient * stepSize - 若w1与w0相比在tolerance范围之类,
则返回w1
abs(w1, w0) < tolerance - 否则按2继续迭代,直到满足3或迭代次数用尽为止
总结一下上面步骤,得到一个基本求解框架:
- 猜测初始值
- 计算结果并比较
- 更新初始值
- 不断迭代直至收敛为止
大部分涉及到方程求解及最优化问题的求解都可按照上面的思路来做。比如SICP上面提到的不动点求解方法。
MSE函数求梯度涉及到所有的数据点,当训练集较大的时候,计算较慢,因此有人提出了一个梯度下降算法的改进版SGD(随机梯度下降)。
重点在随机上,该算法在每次计算梯度的时候只随机选取部分数据来计算,涉及参数miniBatchSize,定义了抽样的数据比例,为了保证所有数据都参与了计算,miniBatchSize * iteration最好 > 1.