逻辑回归-梯度下降训练
在http://blog.csdn.net/bitcarmanlee/article/details/51165444中,我们已经对logistic回归的cost
function做了完整的推导。如果是单个样本,其损失函数为:
1.梯度下降的原理
现在问题就转化为一个无约束优化问题,即我们找出最小的,使得cost
function达到最小。而在无约束优化问题中,最重要最基本的方法莫过于梯度下降(Gradient Descent)了。
描述梯度下降的资料很多,这里我选取wiki百科上的一部分内容:
梯度下降法,基于这样的观察:如果实值函数在点处可微且有定义,那么函数在点沿着梯度相反的方向下降最快。
因而,如果
对于为一个够小数值时成立,那么。
考虑到这一点,我们可以从函数F的局部极小值的初始估计出发,并考虑如下序列, , , 使得
。
因此可得到
,
如果顺利的话序列收敛到期望的极值。注意每次迭代步长可以改变。
同样是来自wiki的一张示意图,清楚地描述了梯度下降的过程:
2.对损失函数求导并得出迭代公式
令单个样本的损失函数为:
注意从第一步到第二步,用到了http://blog.csdn.net/bitcarmanlee/article/details/51165444里对logistic函数求导的结论。
如果对单个样本迭代,则表达式如下:
扩展到全体样本,表达式如下:
3.迭代公式向量化(vectorization)
根据第二部分我们得到的最终相关的迭代公式为
:
首先我们将样本矩阵表示如下:
将要求的也表示成
矩阵的形式:
将的乘积记为A,有:
将记为E:
由上面的式子可以看出,的参数是一个 m*1的矩阵,或者说是一个列向量。如果我们设计函数的时候,支持传入一个列向量,并返回一个列向量,则可以一次计算得到结果。
回到我们的迭代公式,令j=0
对于,同理:
将其写成矩阵的表达式:
所以最后的迭代公式为:
4.几点需要注意的事项
1.x的矩阵表示方式里,上边的范围是m,表示样本的数量,下边的范围是n,表示每个样本变量的维度。整个样本矩阵的大小是m*n。
2.如何快速理解的迭代公式?我自己总结的一个小技巧:
表示每一维特征的权重,所以它是n*1的矩阵。是n*m,E是m*1,这两个矩阵相乘,刚好得到一个n*1的矩阵,跟的大小是相吻合的!
5.批量梯度下降(Batch Gradient Descent)与随机梯度下降(Stochastic Gradient Descent SGD)
对于迭代公式
BGD是一次训练带入所有样本,SGD则是每来一次样本进行一次计算:
i表示是第i个样本,j表示样本第j个维度。
SGD是通过每个样本来迭代更新。如果样本的数量很多,有可能才迭代了一小部分样本,就已经得到了的解。所以SGD的收敛速度可能比BGD要快,而且运算量小。但是SGD的问题是每次迭代并不是全局最优解的方向,尤其是遇到噪声数据,影响会比较大。有的时候SGD在最优解附近会存在比较明显的锯齿震荡现象,即损失函数的值会在最优解附近上下震荡一段时间才最终收敛。