最近在做期末总结复习这学期学过的模型算法,复习到逻辑回归的时候,看到西瓜书上用到的优化方法除了梯度下降法以外,还提到了牛顿法。于是我花了点时间看了一下牛顿法的相关实现,特此记录,以备遗忘。
牛顿法可以理解为一种求零点的方法,也就是求方程的解。用几何的思维理解:可以想象在有一条曲线 f(x),与 x 轴相交于一个点,我们称为曲线的根点记为 x* 。此时我们在曲线上任意找一个点 ( x0 , f(x0) ) 作它的切线记作 L0,L0与 x 轴的交点称为切线的根点记为 x1。如果我们在 x1 处作垂线交于曲线上一点,再在这个点上作它的切线记作 L1,L1与 x 轴上的交点记作 x2,接着重复上述动作,我们会发现 xi 越来越接近 x* 。那么我们用代数的方法来表示:
L0: f ( x 0 ) + f ( x 0 ) ′ ( x − x 0 ) f(x_0)+f(x_0)'(x-x_0) f(x0)+f(x0)′(x−x0)
令 f ( x 0 ) + f ( x 0 ) ′ ( x − x 0 ) f(x_0)+f(x_0)'(x-x_0) f(x0)+f(x0)′(x−x0) = 0
解得: x 1 = x 0 − f ( x 0 ) f ′ ( x 0 ) x_1=x_0-\cfrac{f(x_0)}{f'(x_0)} x1=x0−f′(x0)f(x0)
L1: f ( x 1 ) + f ( x 1 ) ′ ( x − x 1 ) f(x_1)+f(x_1)'(x-x_1) f(x1)+f(x1)′(x−x1)
令 f ( x 1 ) + f ( x 1 ) ′ ( x − x 1 ) f(x_1)+f(x_1)'(x-x_1) f(x1)+f(x1)′(x−x1) = 0
解得: x 2 = x 1 − f ( x 1 ) f ′ ( x 1 ) x_2=x_1-\cfrac{f(x_1)}{f'(x_1)} x2=x1−f′(x1)f(x1)
那么以此类推:
for {
x i = x i − 1 − f ( x ( i − 1 ) f ′ ( x ( i − 1 ) ) x_i=x_{i-1}-\cfrac{f(x_{(i-1)}}{f'(x_{(i-1)})} xi=xi−1−f′(x(i−1))f(x(i−1) }
当迭代 n 次后我们会发现 xi 不断靠近 x* ,结果越来越收敛。这是最好的一种情况,其他情况下可能会出现不收敛,甚至来回震荡。由于我们是用于凸函数的优化,故不作讨论。
我们要最小化逻辑回归的损失函数: J ( w ) = ∑ i = 1 m ( − y i w T x + l n ( 1 + e w T x ) ) J(w)=\sum_{i=1}^{m}(-y_iw^Tx+ln(1+e^{w^Tx})) J(w)=∑i=1m(−yiwTx+ln(1+ewTx))
因为 J ( w ) J(w) J(w)是凸函数,因此最小化它的方法很容易想到是令导函数为0解方程。因此我们可以用牛顿法求解 J ( w ) ′ J(w)' J(w)′=0 ,解法如下:
在一元的情况下,令初始点为w0:
先将 J ( w ) J(w) J(w)按二阶泰勒公式展开:
J ( w ) = J ( w 0 ) + ( w − w 0 ) J ( w 0 ) ′ + 1 2 ! ( w − w 0 ) 2 J ( w 0 ) ′ ′ J(w)=J(w_0)+(w-w_0)J(w_0)'+\cfrac{1}{2!}(w-w_0)^2J(w_0)'' J(w)=J(w0)+(w−w0)J(w0)′+2!1(w−w0)2J(w0)′′
令 J ( w ) ′ = 0 ( 对 ( w − w 0 ) 求 导 ) J(w)'=0(对(w-w0)求导) J(w)′=0(对(w−w0)求导) ,则: w i = w i − 1 − J ( w i − 1 ) ′ J ( w i − 1 ) ′ ′ wi=w_{i-1}-\cfrac{J(w_{i-1})'}{J(w_{i-1})''} wi=wi−1−J(wi−1)′′J(wi−1)′ ,通过不断迭代逼近最优解。
在多元情况下,令初始点为wk:
J ( w ) J(w) J(w)的泰勒展开式表示为:
J ( w 1 . . . w N ) J(w_1...w_N) J(w1...wN)
= J ( w k 1 . . . w k N ) + ∑ i = 1 N ( w − w i ) α J ( w k ) α w i + 1 2 ! ∑ i = 1 N ∑ j = 1 N ( w − w i ) ( w − w j ) α J ( w k ) α w i α w j =J(w_{k_1}...w_{kN})+\sum_{i=1}^{N}(w-w_i)\cfrac{\alpha{J(w_k)}}{\alpha{wi}}+\cfrac{1} {2!}\sum_{i=1}^{N}\sum_{j=1}^{N}(w-w_i)(w-w_j)\cfrac{\alpha{J(w_k)}}{\alpha{w_i}\alpha{w_j}} =J(wk1...wkN)+∑i=1N(w−wi)αwiαJ(wk)+2!1∑i=1N∑j=1N(w−wi)(w−wj)αwiαwjαJ(wk)
用矩阵的形式表示:
J ( w ) = J ( w k ) + ( w − w k ) ∇ w J ( w k ) + ( w − w k ) T H ( w k ) ( w − w k ) J(w)=J(w_k)+(w-w_k)\nabla_{w}{J(w_k)}+(w-w_k)^TH(w_k)(w-w_k) J(w)=J(wk)+(w−wk)∇wJ(wk)+(w−wk)TH(wk)(w−wk)
其中 H ( w k ) H(w_k) H(wk)(Hessian矩阵)为:
[ α J ( w k ) α w 1 w 1 α J ( w k ) α w 1 w 2 ⋯ α J ( w k ) α w 1 w N ⋮ ⋱ ⋮ α J ( w k ) α w N w 1 α J ( w k ) α w N w 2 ⋯ α J ( w k ) α w N w N ] \begin{bmatrix} \cfrac{\alpha{J(w_k)}}{\alpha{w_1w_1}}&\cfrac{\alpha{J(w_k)}}{\alpha{w_1w_2}} \cdots & \cfrac{\alpha{J(w_k)}}{\alpha{w_1w_N}} \\ \vdots & \ddots & \vdots \\ \cfrac{\alpha{J(w_k)}}{\alpha{w_Nw_1}} & \cfrac{\alpha{J(w_k)}}{\alpha{w_Nw_2}}\cdots & \cfrac{\alpha{J(w_k)}}{\alpha{w_Nw_N}} \end{bmatrix} ⎣⎢⎢⎢⎢⎢⎡αw1w1αJ(wk)⋮αwNw1αJ(wk)αw1w2αJ(wk)⋯⋱αwNw2αJ(wk)⋯αw1wNαJ(wk)⋮αwNwNαJ(wk)⎦⎥⎥⎥⎥⎥⎤
然后同样令 J ( w ) ′ = 0 J(w)'=0 J(w)′=0 ,求解得:
w t = w t − 1 − α J ( w t − 1 ) ′ α J ( w t − 1 ) ′ ′ w_{t}=w_{t-1}-\cfrac{\alpha{J(w_{t-1})'}}{\alpha{J(w_{t-1})''}} wt=wt−1−αJ(wt−1)′′αJ(wt−1)′
不断迭代上式,以逼近最优解,来最小化损失函数。