逻辑回归-梯度下降训练

http://blog.youkuaiyun.com/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.youkuaiyun.com/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在最优解附近会存在比较明显的锯齿震荡现象,即损失函数的值会在最优解附近上下震荡一段时间才最终收敛。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值