逻辑回归的参数计算:牛顿法,梯度下降(上升)法,随机梯度下降法,批量梯度下降法
前面文章中对逻辑回归进行了讲解,下面来说一说逻辑回归的参数是怎么计算的。
逻辑回归的计算使用的是最大似然方法。记 z i = w ⋅ x i z^i=w\cdot x^i zi=w⋅xi,那么记 ϕ ( z i ) = 1 1 + e − z i \phi(z^i)=\frac{1}{1+e^{-z^i}} ϕ(zi)=1+e−zi1。逻辑回归的似然函数记为 L ( w ) L(w) L(w),假设数据集中的特征向量都是独立的,那么有: L ( w ) = ∏ i = 1 m ϕ ( z i ) y ( i ) ⋅ ( 1 − ϕ ( z i ) ) ( 1 − y ( i ) ) (1) L(w)=\prod_{i=1}^{m}{\phi(z^i)^{y(i)}\cdot (1-\phi(z^i))^{(1-y(i))}}\tag{1} L(w)=i=1∏mϕ(zi)y(i)⋅(1−ϕ(zi))(1−y(i))(1)我们可以直接对这个似然函数应用梯度上升算法求使得这个似然函数最大的 w w w的值,但是值得注意的一个问题是:直接对这个似然函数求导并不是很方便,所以可以先将似然函数取个对数,将里面的乘积变成加法、幂次方变成乘法,这样求导就会方便很多: l ( w ) = l n L ( w ) = ∑ i = 1 m y ( i ) ln ϕ ( z i ) + ( 1 − y ( i ) ln ( 1 − ϕ ( z i ) ) (2) l(w)=lnL(w)=\sum_{i=1}^m{y(i)\ln\phi(z^i)+(1-y(i)\ln(1-\phi(z^i))}\tag{2} l(w)=lnL(w)=i=1∑my(i)lnϕ(zi)+(1−y(i)ln(1−ϕ(zi))(2)其中 ϕ ( z i ) \phi(z^i) ϕ(zi)是关于 w w w的函数。
下面使用批量梯度下降法BGD(Batch Gradient Descent)求参数:对上面的似然函数(2)的求导,可以看成是对
m
m
m个特征向量分别求导再求和。现在我们来看对第
j
j
j个权重
w
j
w_j
wj进行求导的计算:
d
d
w
j
l
(
w
)
=
∑
i
=
1
m
(
y
(
i
)
ϕ
(
z
i
)
−
1
−
y
(
i
)
1
−
ϕ
(
z
i
)
)
⋅
d
d
w
j
ϕ
(
z
i
)
(3)
\frac{d}{dw_j}l(w)=\sum_{i=1}^m\left ({\frac{y(i)}{\phi(z^i)}-\frac{1-y(i)}{1-\phi(z^i)}}\right)\cdot\frac{d}{dw_j}\phi(z^i)\tag{3}
dwjdl(w)=i=1∑m(ϕ(zi)y(i)−1−ϕ(zi)1−y(i))⋅dwjdϕ(zi)(3)
加下来看一下对
ϕ
(
z
i
)
\phi(z^i)
ϕ(zi)的求导:
d
d
w
j
ϕ
(
z
i
)
=
d
d
z
i
1
1
+
e
−
z
i
⋅
d
z
i
d
w
j
=
ϕ
(
z
i
)
⋅
(
1
−
ϕ
(
z
i
)
)
⋅
x
i
j
(4)
\frac{d}{dw_j}\phi(z^i)=\frac{d}{dz^i}\frac{1}{1+e^{-z^i}}\cdot \frac{dz^i}{dw_j}=\phi(z^i)\cdot(1-\phi(z^i))\cdot x_{ij}\tag{4}
dwjdϕ(zi)=dzid1+e−zi1⋅dwjdzi=ϕ(zi)⋅(1−ϕ(zi))⋅xij(4)其中
x
i
j
x_{ij}
xij表示第i个特征向量的第
j
j
j个特征值。我们将(4)式代入(3)式就可以得到:
d
d
w
j
l
(
w
)
=
∑
i
=
1
m
(
y
(
i
)
ϕ
(
z
i
)
−
1
−
y
(
i
)
1
−
ϕ
(
z
i
)
)
⋅
ϕ
(
z
i
)
⋅
(
1
−
ϕ
(
z
i
)
)
⋅
x
i
j
=
∑
i
=
1
m
(
y
(
i
)
−
ϕ
(
z
i
)
)
⋅
x
i
j
(5)
\frac{d}{dw_j}l(w)=\sum_{i=1}^m\left ({\frac{y(i)}{\phi(z^i)}-\frac{1-y(i)}{1-\phi(z^i)}}\right)\cdot\phi(z^i)\cdot(1-\phi(z^i))\cdot x_{ij}\\=\sum_{i=1}^m{(y(i)-\phi(z^i))\cdot x_{ij}}\tag{5}
dwjdl(w)=i=1∑m(ϕ(zi)y(i)−1−ϕ(zi)1−y(i))⋅ϕ(zi)⋅(1−ϕ(zi))⋅xij=i=1∑m(y(i)−ϕ(zi))⋅xij(5)可以看出来,对
w
j
w_j
wj求导的结果是将
m
m
m个“数据误差与数据特征向量第
j
j
j个特征向量乘积”加起来。
w
j
w_j
wj的更新公式为:
w
j
⃗
=
w
j
⃗
+
η
⋅
∇
w
j
\vec{w_j}=\vec{w_j}+\eta\cdot\nabla{w_j}
wj=wj+η⋅∇wj这只是对
w
j
w_j
wj的求导结果,对所有的权值求导就会得到一个向量:
w
⃗
=
w
⃗
+
η
⋅
(
∇
w
)
⃗
\vec{w}=\vec{w}+\eta\cdot\vec{(\nabla{w})}
w=w+η⋅(∇w)这就是梯度上升算法的推导。如果我们将上面的似然函数取相反数,那么我们就可以应用梯度下降算法进行参数求解了,这也符合大多数优化中最小化“花销函数”的思想。梯度下降算法只是将梯度上升算法中权值向量的更新中的
+
+
+变成
−
-
−,似然函数取相反数,大致的形式是没有改变的。
特点:在更新每一参数时都使用所有的样本来进行更新;
优点:全局最优解;易于并行实现;
缺点:当样本数目很多时,训练过程会很慢。
下面使用随机梯度下降法SGD(stochastic gradient descent)求参数:我们注意到,批量梯度下降法BGD中,每一次计算一个权值
w
j
w_j
wj的更新都会用到所有的数据,这反映在求和符号
∑
i
=
1
m
\sum_{i=1}^m{}
∑i=1m这里。现实中的数据动辄成百上千,每一次更新都要将所有的数据都计算一遍花销会非常大。有没有一种办法降低这种花销呢?这就是随机梯度下降算法了。它的具体思路是在更新每一参数时都使用一个样本来进行更新,更新很多次。如果样本量很大的情况(例如几十万),那么可能只用其中几万条或者几千条的样本,就已经将
w
w
w迭代到最优解了,对比上面的批量梯度下降,迭代一次需要用到十几万训练样本,一次迭代不可能最优,如果迭代10次的话就需要遍历训练样本10次,这种更新方式计算复杂度太高。但是,SGD的一个问题是由于是随机选择一个样本,每次梯度更新都是随机的一个方向,那么SGD并不是每次迭代都向着整体最优化方向。但是整体上来看,每一次都是大致向着梯度减小的方向走,最终还是可以得到梯度最小的点的。
特点:在更新每一参数时都使用一个样本来进行更新,更新很多次;
优点:训练速度快;
缺点:准确度下降,可能并不是全局最优;不易于并行实现。
下面使用批量梯度下降法MBGD(Mini-batch Gradient Descent)求参数:它的具体思路是在更新每一参数时都使用一部分样本来进行更新,也就是采用大于1小于样本的数量更新 w w w。这克服了上面两种方法的缺点,又同时兼顾两种方法的优点。
下面使用牛顿法求解参数:
梯度下降是一阶收敛,牛顿法是二阶收敛,所以牛顿法就更快。如果更通俗地说的话,比如你想找一条最短的路径走到一个盆地的最底部,梯度下降法每次只从你当前所处位置选一个坡度最大的方向走一步;而牛顿法在选择方向时,不仅会考虑坡度是否够大,还会考虑你走了一步之后,坡度是否会变得更大。所以,可以说牛顿法比梯度下降法看得更远一点,能更快地走到最底部。
根据wiki上的解释,从几何上说,牛顿法就是用一个二次曲面去拟合你当前所处位置的局部曲面,而梯度下降法是用一个平面去拟合当前的局部曲面,通常情况下,二次曲面的拟合会比平面更好,所以牛顿法选择的下降路径会更符合真实的最优下降路径。
牛顿法的优缺点:
牛顿法优点:二阶收敛,收敛速度快;
牛顿法可以求最优化问题,而且求解精确,一般用牛顿法求得的解成为ground-truth。
牛顿法缺点:
1 牛顿法是一种迭代算法,每一步都需要求解目标函数的Hessian矩阵的逆矩阵,计算比较复杂。二阶方法实践中对高维数据不可行。
2 可能发生被零除错误。当函数在它的零点附近,导函数的绝对值非常小时,运算会出现被零除错误。
3 是可能出现死循环。当函数在它的零点有拐点时,可能会使迭代陷入死循环。
Note:f(x) = arctanx, 2阶导产生(拐点) f’’(x*) = 0。
4 定步长迭代。改进是阻尼牛顿法。
5还有拟牛顿法,目前来看是比较有可靠和快速的方法。
reference:
http://blog.csdn.net/pipisorry/article/details/24574293