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