logistic回归详解(三):梯度下降训练方法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/bitcarmanlee/article/details/51473567

http://blog.csdn.net/bitcarmanlee/article/details/51165444中,我们已经对logistic回归的cost function做了完整的推导。如果是单个样本,其损失函数为:

cost(hθ(x),y)=yilog(hθ(x))(1yi)log(1hθ(x))

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γnF(xn), n0
因此可得到

F(x0)F(x1)F(x2),
如果顺利的话序列(xn)收敛到期望的极值。注意每次迭代步长γ可以改变。

同样是来自wiki的一张示意图,清楚地描述了梯度下降的过程:
这里写图片描述

2.对损失函数求导并得出迭代公式

令单个样本的损失函数为:

J(θ)=cost(hθ(x),y)=yilog(hθ(x))(1yi)log(1hθ(x))
,则:
θJ(θj)=(y1g(θTx)(1y)11g(θTx))θjg(θTx)=(y1g(θTx)(1y)11g(θTx))g(θTx)(1g(θTx))θjθTx)=(y(1g(θTx))(1y)g(θTx))xj=(hθ(x)y)xj

注意从第一步到第二步,用到了http://blog.csdn.net/bitcarmanlee/article/details/51165444里对logistic函数求导的结论。

如果对单个样本迭代,则表达式如下:

θj:=θjα(hθ(xi)yi)xij

扩展到全体样本,表达式如下:
θj:=θjimα(hθ(xi)yi)xij

3.迭代公式向量化(vectorization)

根据第二部分我们得到的最终θ相关的迭代公式为 :

θj:=θjimα(hθ(xi)yi)xij
如果按照此公式操作的话,每计算一个θ需要 循环m次。为此,我们需要将迭代公式进行向量化。

首先我们将样本矩阵表示如下:

X=x(1)x(2)x(m)=x(1)0x(2)0x(m)0x(1)1x(2)1x(m)1x(1)nx(2)nx(m)n

y=y(1)y(2)y(m)

将要求的θ也表示成 矩阵的形式:

θ=θ0θ1θn

xθ的乘积记为A,有:

A=xθ=x(1)0x(2)0x(m)0x(1)1x(2)1x(m)1x(1)nx(2)nx(m)nθ0θ1θm=θ0x(1)0θ0x(2)0θ0x(m)0θ1x(1)1θ1x(2)1θ1x(m)1θnx(1)nθnx(2)nθnx(m)n

hθ(x)y记为E:

E=hθ(x)y=g(A1)y1g(A2)y2g(Am)ym=e1e2em=g(A)y

由上面的式子可以看出,g(A)的参数是一个 m*1的矩阵,或者说是一个列向量。如果我们设计函数g的时候,支持传入一个列向量,并返回一个列向量,则hθ(x)y可以一次计算得到结果。

回到我们的迭代公式,令j=0

θ0:=θ0imα(hθ(xi)yi)xi0=θ0αime(i)x(i)0=θ0α(x(1)0,x(2)0,,x(n)0)E

对于θj,同理:

θj:=θjα(x(1)j,x(2)j,,x(n)j)E

将其写成矩阵的表达式:

θ0θ1θm:=θ0θ1θmαx(1)0x(1)1x(1)nx(2)0x(2)1x(2)nx(m)0x(m)1x(m)nE=θαxTE

所以最后的迭代公式为:

θ=θαxTE

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)

对于迭代公式

θ=θαxTE
最大的好处就是形式简单明了,直接将样本矩阵与残差矩阵带入迭代即可。而且这种方式是将所有的训练样本代入,最终所求得的解也是全局最优解,求解出来的参数将使损失函数最小。如果将所有样本矩阵带入进行计算,这就是所谓的批量梯度下降(BGD)。但在实际应用场景中,最大的问题就是样本矩阵可能非常大。比如大到放不进内存,比如大到进行一轮迭代需要的运算时间非常长,这个时候,批量梯度下降就不是那么好用了。这个时候,我们可以采用考虑随机梯度下降 (SGD)。
BGD是一次训练带入所有样本,SGD则是每来一次样本进行一次计算:
θj:=θj+α(yihθ(xi))xij

i表示是第i个样本,j表示样本第j个维度。
SGD是通过每个样本来迭代更新。如果样本的数量很多,有可能才迭代了一小部分样本,就已经得到了θ的解。所以SGD的收敛速度可能比BGD要快,而且运算量小。但是SGD的问题是每次迭代并不是全局最优解的方向,尤其是遇到噪声数据,影响会比较大。有的时候SGD在最优解附近会存在比较明显的锯齿震荡现象,即损失函数的值会在最优解附近上下震荡一段时间才最终收敛。

展开阅读全文

没有更多推荐了,返回首页