1. 牛顿法
牛顿法(英语:Newton’s method)又称为牛顿-拉弗森方法(英语:Newton-Raphson method),它是一种在实数域和复数域上近似求解方程的方法。
牛顿法的基本思想是使用函数 f ( x ) {\displaystyle f(x)} f(x) 的泰勒级数的前面几项来寻找方程 f ( x ) = 0 {\displaystyle f(x)=0} f(x)=0 的根。
牛顿法主要应用在两个方面,1:求方程的根;2:最优化(求解最值问题)。
1.1 求方程 f ( x ) = 0 {\displaystyle f(x)} = 0 f(x)=0的根
选择一个接近函数
f
(
x
)
{\displaystyle f(x)}
f(x)零点的
x
0
\mathbf x_0
x0, 牛顿法对函数进行一阶泰勒展开:
f
(
x
)
=
f
(
x
0
)
+
f
′
(
x
0
)
(
x
−
x
0
)
f(x)=f\left(x_{0}\right)+f^{\prime}\left(x_{0}\right)\left(x-x_{0}\right)
f(x)=f(x0)+f′(x0)(x−x0)
由
f
(
x
)
=
0
{\displaystyle f(x)} = 0
f(x)=0,得到迭代方式:
x
n
+
1
=
x
n
−
f
(
x
n
)
/
f
′
(
x
n
)
x_{n+1}=x_{n}-f\left(x_{n}\right) / f^{\prime}\left(x_{n}\right)
xn+1=xn−f(xn)/f′(xn)
迭代后求得方程的根
x
∗
x^*
x∗:
f
(
x
∗
)
=
0
f\left(x^{*}\right)=0
f(x∗)=0
牛顿法有一个性质,就是能够保证二次收敛到方程的根。论述如下:
假设函数
f
f
f在开区间
(
a
,
b
)
(a,b)
(a,b)是二阶可导的,并存在函数的根
x
∗
∈
(
a
,
b
)
x^*\in(a,b)
x∗∈(a,b).定义牛顿迭代法:
x
k
+
1
=
x
k
−
f
(
x
k
)
f
′
(
x
k
)
,
k
=
1
,
2
,
…
x_{k+1}=x_{k}-\frac{f\left(x_{k}\right)}{f^{\prime}\left(x_{k}\right)}, \quad k=1,2, \ldots
xk+1=xk−f′(xk)f(xk),k=1,2,…
假设
k
→
∞
k \rightarrow \infty
k→∞时,
x
k
x_k
xk收敛到
x
∗
x^*
x∗。若
f
′
(
x
∗
)
≠
0
f^{\prime}\left(x^{*}\right) \neq 0
f′(x∗)=0,对于足够大的
k
k
k,有:
∣
x
k
+
1
−
x
∗
∣
≤
M
∣
x
k
−
x
∗
∣
2
if
M
>
∣
f
′
′
(
x
∗
)
∣
2
∣
f
′
(
x
∗
)
∣
\left|x_{k+1}-x^{*}\right| \leq M\left|x_{k}-x^{*}\right|^{2} \quad \text { if } M>\frac{\left|f^{\prime \prime}\left(x^{*}\right)\right|}{2\left|f^{\prime}\left(x^{*}\right)\right|}
∣xk+1−x∗∣≤M∣xk−x∗∣2 if M>2∣f′(x∗)∣∣f′′(x∗)∣
于是,
x
k
x_k
xk是二次收敛到
x
∗
x^*
x∗。
证明:
假设
e
k
=
x
k
−
x
∗
e_k = x_k - x^*
ek=xk−x∗, 即
x
∗
=
x
k
−
e
k
x^*= x_k - e_k
x∗=xk−ek,根据泰勒展开公式,
f
(
x
k
−
e
k
)
=
f
(
x
k
)
−
e
k
f
′
(
x
k
)
+
(
e
k
)
2
2
f
′
′
(
ξ
k
)
f\left(x_{k}-e_{k}\right)=f\left(x_{k}\right)-e_{k} f^{\prime}\left(x_{k}\right)+\frac{\left(e_{k}\right)^{2}}{2} f^{\prime \prime}\left(\xi_{k}\right)
f(xk−ek)=f(xk)−ekf′(xk)+2(ek)2f′′(ξk)
其中,
ξ
k
\xi_k
ξk介于
x
k
x_k
xk和
x
∗
x^*
x∗之间。
由于
f
(
x
∗
)
=
0
f(x^*) = 0
f(x∗)=0,所以有
0
=
f
(
x
k
)
−
(
x
k
−
x
∗
)
f
′
(
x
k
)
+
(
e
k
)
2
2
f
′
′
(
ξ
k
)
0=f\left(x_{k}\right)-\left(x_{k}-x^{*}\right) f^{\prime}\left(x_{k}\right)+\frac{\left(e_{k}\right)^{2}}{2} f^{\prime \prime}\left(\xi_{k}\right)
0=f(xk)−(xk−x∗)f′(xk)+2(ek)2f′′(ξk)
由于函数
f
f
f连续可导,且
f
′
(
x
∗
)
≠
0
f^{\prime}\left(x^{*}\right) \neq 0
f′(x∗)=0,只要
x
k
x_k
xk和
x
∗
x^*
x∗足够接近,则有
f
′
(
x
k
)
≠
0
f^{\prime}\left(x_{k}\right) \neq 0
f′(xk)=0。两边除于
f
′
(
x
k
)
f^{\prime}\left(x_{k}\right)
f′(xk)得到
0
=
f
(
x
k
)
f
′
(
x
k
)
−
(
x
k
−
x
∗
)
+
(
e
k
)
2
f
′
′
(
ξ
k
)
2
f
′
(
x
k
)
0=\frac{f\left(x_{k}\right)}{f^{\prime}\left(x_{k}\right)}-\left(x_{k}-x^{*}\right)+\frac{\left(e_{k}\right)^{2} f^{\prime \prime}\left(\xi_{k}\right)}{2 f^{\prime}\left(x_{k}\right)}
0=f′(xk)f(xk)−(xk−x∗)+2f′(xk)(ek)2f′′(ξk)
根据牛顿迭代法的定义,可以得到下式:
x
k
+
1
−
x
∗
=
(
e
k
)
2
f
′
′
(
ξ
k
)
2
f
′
(
x
k
)
x_{k+1}-x^{*}=\frac{\left(e_{k}\right)^{2} f^{\prime \prime}\left(\xi_{k}\right)}{2 f^{\prime}\left(x_{k}\right)}
xk+1−x∗=2f′(xk)(ek)2f′′(ξk)
所以有,
∣
x
k
+
1
−
x
∗
∣
≤
∣
f
′
′
(
ξ
k
)
∣
2
∣
f
′
(
x
k
)
∣
∣
x
k
−
x
∗
∣
2
\left|x_{k+1}-x^{*}\right| \leq \frac{\left|f^{\prime \prime}\left(\xi_{k}\right)\right|}{2\left|f^{\prime}\left(x_{k}\right)\right|}\left|x_{k}-x^{*}\right|^{2}
∣xk+1−x∗∣≤2∣f′(xk)∣∣f′′(ξk)∣∣xk−x∗∣2
一般地,
f
′
(
x
k
)
f^{\prime}\left(x_{k}\right)
f′(xk)会收敛到
f
′
(
x
∗
)
f^{\prime}\left(x^*\right)
f′(x∗),由于
ξ
k
\xi_k
ξk介于
x
k
x_k
xk和
x
∗
x^*
x∗之间,因此,
ξ
k
\xi_k
ξk收敛到
x
∗
x^*
x∗,
f
′
′
(
ξ
k
)
f^{\prime\prime}\left(\xi_{k}\right)
f′′(ξk)收敛到
f
′
′
(
x
∗
)
f^{\prime\prime}\left(x^*\right)
f′′(x∗)。对应足够大的
k
k
k,有
∣
x
k
+
1
−
x
∗
∣
≤
M
∣
x
k
−
x
∗
∣
2
if
M
>
∣
f
′
′
(
x
∗
)
∣
2
∣
f
′
(
x
∗
)
∣
\left|x_{k+1}-x^{*}\right| \leq M\left|x_{k}-x^{*}\right|^{2} \quad \text { if } M>\frac{\left|f^{\prime \prime}\left(x^{*}\right)\right|}{2\left|f^{\prime}\left(x^{*}\right)\right|}
∣xk+1−x∗∣≤M∣xk−x∗∣2 if M>2∣f′(x∗)∣∣f′′(x∗)∣
证毕。
1.2 最优化(求取极值)
解决最优化问题 min x ∈ R n f ( x ) \min\limits_{x \in \mathbf{R}^{n}} f(x) x∈Rnminf(x)的结构:
给定初始点 x 0 \mathbb x_0 x0,
- 确定搜索方向 d k \mathbb d_k dk,即依照一定规则构造 f f f在 x k \mathbb x_k xk点处的下降方向为搜索方向;
- 确定步长因子 α k α_k αk,使目标函数值有某种意义下降;
- 令 x k + 1 = x k + α k d k \mathbb x_{k+1}=\mathbb x_k+ α_k \mathbb d_k xk+1=xk+αkdk
a) 若 x k + 1 \mathbb x_{k+1} xk+1满足某种终止条件,则停止迭代,得到近似最优解,
b) 否则,重复以上步骤。
牛顿法解决最优化问题的基本思想是利用目标函数的二次Taylor展开,并将其极小化。
假设目标函数 f ( x ) f(x) f(x)具有二阶连续偏导数, x ∗ x^{*} x∗ 为目标函数的极小点,对目标函数在第 k k k次迭代值进行二阶泰勒展开:
f
(
x
)
=
f
(
x
k
)
+
g
k
T
(
x
−
x
k
)
+
1
2
(
x
−
x
k
)
T
H
(
x
k
)
(
x
−
x
k
)
f(x)=f\left(x_{k}\right)+g_{k}^{T}\left(x-x_{k}\right)+\frac{1}{2}\left(x-x_{k}\right)^{T} H\left(x_{k}\right)\left(x-x_{k}\right)
f(x)=f(xk)+gkT(x−xk)+21(x−xk)TH(xk)(x−xk)
其中,
g
k
=
g
(
x
k
)
=
∇
f
(
x
k
)
g_{k}=g\left(x_{k}\right)=\nabla f\left(x_{k}\right)
gk=g(xk)=∇f(xk)是
f
(
x
)
f(x)
f(x)在
x
k
x_{k}
xk的一阶导数值,
H
(
x
k
)
H\left(x_{k}\right)
H(xk)是
f
(
x
)
f(x)
f(x)的海森矩阵:
H
(
x
)
=
[
∂
2
f
∂
x
i
∂
x
j
]
n
×
n
H(x)=\left[\frac{\partial^{2} f}{\partial x_{i} \partial x_{j}}\right]_{n \times n}
H(x)=[∂xi∂xj∂2f]n×n
函数 f ( x ) f(x) f(x)有极值的必要条件是在极值点处一阶导数为0。特别的当 H ( x k ) H(x_k) H(xk)是正定矩阵时,函数 f ( x ) f(x) f(x)的极值为极小值。
对方程
∇
f
(
x
)
=
0
\nabla f(x)=0
∇f(x)=0,根据上述牛顿迭代法可以求解,也可以二阶泰勒展开公式再进行求导:
∇
f
(
x
)
=
g
k
+
H
k
(
x
−
x
k
)
\nabla f(x)=g_{k}+H_{k}\left(x-x_{k}\right)
∇f(x)=gk+Hk(x−xk)
其中,记
H
k
=
H
(
x
k
)
H_{k}=H\left(x_{k}\right)
Hk=H(xk),则有
g
k
+
H
k
(
x
k
+
1
−
x
k
)
=
0
\begin{array}{l} g_{k}+H_{k}\left(x_{k+1}-x_{k}\right)=0 \end{array}
gk+Hk(xk+1−xk)=0
迭代公式:
x
k
+
1
=
x
k
−
H
k
−
1
g
k
x_{k+1}=x_{k}-H_{k}^{-1} g_{k}
xk+1=xk−Hk−1gk
对于一元函数,上述迭代公式也可以写成:
x
k
+
1
=
x
k
−
f
′
(
x
k
)
f
′
′
(
x
k
)
x_{k+1}=x_{k}-\frac{f^{\prime}\left(x_{k}\right)}{f^{\prime \prime}\left(x_{k}\right)}
xk+1=xk−f′′(xk)f′(xk)
1.3 牛顿法最优化的示例
已知(X, y) 样本,X 为特征值,y为label。
建立线性回归模型对样本进行拟合:y_pred = Wx + b.
则,用平方差的一半作为损失(乘于0.5后,W一阶导的系数为1), loss = 0.5 ∗ ( y − y p r e d ) 2 = 0.5 ∗ ( y − W x − b ) 2 0.5*(y - y_{pred})^2 = 0.5*(y-Wx-b)^2 0.5∗(y−ypred)2=0.5∗(y−Wx−b)2
最小化损失,即 M i n W , b ( y − W x − b ) 2 Min_{W,b} (y - Wx -b)^2 MinW,b(y−Wx−b)2.
根据上述最优化理论,求取,W,b 一阶导,二阶导,进行迭代更新即可.
注意:sklearn Python包安装为:
pip install scikit-learn
import numpy as np
from sklearn.linear_model import LinearRegression
class Newton(object):
def __init__(self,epochs=50):
self.W = None
self.b = 0
self.epochs = epochs
def get_loss(self, X, y, W,b):
"""
计算损失 0.5*sum(y_pred-y)^2
input: X(2 dim np.array):特征
y(1 dim np.array):标签
W(2 dim np.array):线性回归模型权重矩阵
output:损失函数值
"""
#print(np.dot(X,W))
loss = 0.5*np.sum((y - np.dot(X,W)-b)**2)
return loss
def first_derivative(self,X,y):
"""
计算一阶导数g = (y_pred - y)*x
input: X(2 dim np.array):特征
y(1 dim np.array):标签
W(2 dim np.array):线性回归模型权重矩阵
output:损失函数值
"""
y_pred = np.dot(X,self.W) + self.b
g = np.dot(X.T, np.array(y_pred - y))
g_b = np.mean(y_pred-y)
return g,g_b
def second_derivative(self,X,y):
"""
计算二阶导数 Hij = sum(X.T[i]*X.T[j])
input: X(2 dim np.array):特征
y(1 dim np.array):标签
output:损失函数值
"""
H = np.zeros(shape=(X.shape[1],X.shape[1]))
H = np.dot(X.T, X)
H_b = 1
return H, H_b
def fit(self, X, y):
"""
线性回归 y = WX + b拟合,牛顿法求解
input: X(2 dim np.array):特征
y(1 dim np.array):标签
output:拟合的线性回归
"""
np.random.seed(10)
self.W = np.random.normal(size=(X.shape[1]))
self.b = 0
for epoch in range(self.epochs):
g,g_b = self.first_derivative(X,y) # 一阶导数
H,H_b = self.second_derivative(X,y) # 二阶导数
self.W = self.W - np.dot(np.linalg.pinv(H),g)
self.b = self.b - 1/H_b*g_b
print("itration:{} ".format(epoch), "loss:{:.4f}".format(
self.get_loss(X, y , self.W,self.b)))
def predict(self, X):
"""
预估未知的样本 X, y = W * X + b.
"""
return np.dot(X, self.W) + self.b
def normalize(x):
return (x - np.min(x))/(np.max(x) - np.min(x))
if __name__ == "__main__":
np.random.seed(2)
X = np.random.rand(100,5)
y = np.sum(X**3 + X**2,axis=1)
print(X.shape, y.shape)
# 归一化
X_norm = normalize(X)
X_train = X_norm[:int(len(X_norm)*0.8)]
X_test = X_norm[int(len(X_norm)*0.8):]
y_train = y[:int(len(X_norm)*0.8)]
y_test = y[int(len(X_norm)*0.8):]
# 牛顿法求解回归问题
newton=Newton()
newton.fit(X_train, y_train)
y_pred = newton.predict(X_test)
print("newton predict mse: ", 1 / len(y_test) * np.sum((y_test - y_pred)**2))
reg = LinearRegression().fit(X_train, y_train)
y_pred = reg.predict(X_test)
print("lr predict mse: ", 1 / len(y_test) * np.sum((y_test - y_pred)**2))
对比了牛顿法求解线性回归和sklearn中的线性回归(最小二乘法求解)的结果:
itration:48 loss:8.5195
itration:49 loss:8.2219
newton predict mse: 0.3770617848430015
lr predict mse: 0.32062598186600233
如果迭代次数epoch调大,两者的效果一样:
itration:498 loss:4.9358
itration:499 loss:4.9358
newton predict mse: 0.3206259816847965
lr predict mse: 0.32062598186600233
2. 拟牛顿法
由于Hesse矩阵的计算工作量大,有时目标函数的Hesse阵很难计算。
拟牛顿法利用目标函数和一阶导数,来构造目标函数的曲率近似,而不需要明显形成Hesse阵,同时具有收敛速度快的优点。
2.1 一般拟牛顿法
由
g
(
x
)
=
∇
f
(
x
)
≈
g
k
+
H
k
(
x
−
x
k
)
g(x) = \nabla f(x) \approx g_{k}+H_{k}\left(x-x_{k}\right)
g(x)=∇f(x)≈gk+Hk(x−xk)
令
x
=
x
k
x = x_k
x=xk,得:
g
k
−
1
−
g
k
≈
H
k
(
x
k
−
1
−
x
k
)
g_{k-1}-g_{k} \approx H_{k}\left(x_{k-1}-x_{k}\right)
gk−1−gk≈Hk(xk−1−xk)
令
s
k
−
1
=
x
k
−
x
k
−
1
,
y
k
−
1
=
g
k
−
g
k
−
1
\mathbf{s}_{k-1}=\mathbf{x}_{k}-\mathbf{x}_{k-1}, \mathbf{y}_{k-1}=\mathbf{g}_{k}-\mathbf{g}_{k-1}
sk−1=xk−xk−1,yk−1=gk−gk−1,得
H
k
−
1
y
k
−
1
≈
s
k
−
1
H_{k}^{-1} \mathbf{y}_{k-1} \approx \mathbf{s}_{k-1}
Hk−1yk−1≈sk−1
或者记为:
H
k
+
1
−
1
y
k
≈
s
k
H_{k+1}^{-1} \mathbf{y}_{k} \approx \mathbf{s}_{k}
Hk+1−1yk≈sk
对于二次函数
f
f
f,上述关系式精确成立。
要求在拟牛顿法中构造出Hesse逆近似
G
k
+
1
G_{k+1}
Gk+1(如DFP算法),满足
G
k
+
1
y
k
=
s
k
G_{k+1} \mathbf{y}_{k} = \mathbf{s}_{k}
Gk+1yk=sk
或者构建Hesse近似(如BFGS算法)
B
k
+
1
s
k
≈
y
k
B_{k+1} \mathbf{s}_{k} \approx \mathbf{y}_{k}
Bk+1sk≈yk
这称为拟牛顿法条件 。
一般拟牛顿法:
- 给定初始点 x 0 ∈ R n , H 0 ∈ R n × n , 0 ≤ ε ≤ 1 , k = 0 \mathbf{x}_{0} \in R^{n}, H_{0} \in R^{n \times n}, 0 \leq \varepsilon \leq 1, k=0 x0∈Rn,H0∈Rn×n,0≤ε≤1,k=0;
- 若 ∥ g k ∥ ≤ ε \left\|\mathbf{g}_{k}\right\| \leq \varepsilon ∥gk∥≤ε,则停止;否则,计算 d k = − H k g k \mathbf{d}_{k}=-H_{k} \mathbf{g}_{k} dk=−Hkgk;
- 沿方向 d k \mathbb d_k dk线性搜索求步长因子 α k α_k αk,令 x k + 1 = x k + α k d k \mathbb x_{k+1}=\mathbb x_k+ α_k \mathbb d_k xk+1=xk+αkdk;
- 校正 H k H_k Hk产生 H k + 1 H_{k+1} Hk+1,使得拟牛顿法条件满足。
- k = k + 1 k=k+1 k=k+1, 转2.
优点:
(1)只需要一阶导数;
(2) H k H_k Hk保持正定,具有下降性;
(3)迭代每次需要 O ( n 2 ) O(n^2) O(n2)次乘法;牛顿法是 O ( n 3 ) O(n^3) O(n3)次(因为牛顿法需要求逆)。
2.2 DFP算法
设秩二校正为:
G
k
+
1
=
G
k
+
a
u
u
T
+
b
v
v
T
G_{k+1}=G_{k}+a u u^{T}+b v v^{T}
Gk+1=Gk+auuT+bvvT
若要拟牛顿法条件
G
k
+
1
y
k
=
(
G
k
+
a
u
u
T
+
b
v
v
T
)
y
k
=
s
k
G_{k+1} y_k =(G_{k}+a u u^{T}+b v v^{T}) y_k = s_k
Gk+1yk=(Gk+auuT+bvvT)yk=sk成立,对于
u
,
v
u,v
u,v一个取法为:
u
=
s
k
,
v
=
G
k
y
k
u=s_{k}, \quad v=G_{k} y_{k}
u=sk,v=Gkyk
a
u
T
y
k
=
1
,
b
v
T
y
k
=
−
1
a u^{T} y_{k}=1, b v^{T} y_{k}=-1
auTyk=1,bvTyk=−1
可以得到,
a
=
1
s
k
T
y
k
,
b
=
−
1
y
k
T
G
k
y
k
a=\frac{1}{s_{k}^{T} y_{k}}, b=-\frac{1}{y_{k}^{T} G_{k} y_{k}}
a=skTyk1,b=−ykTGkyk1
那么,
G
k
+
1
=
G
k
+
s
k
s
k
T
s
k
T
y
k
−
G
k
y
k
y
k
T
G
k
T
y
k
T
G
k
y
k
G_{k+1}=G_{k}+\frac{s_{k} s_{k}^{T}}{s_{k}^{T} y_{k}}-\frac{G_{k} y_{k} y_{k}^{T} G_{k}^{T}}{y_{k}^{T} G_{k} y_{k}}
Gk+1=Gk+skTykskskT−ykTGkykGkykykTGkT
2.2 L-BFGS算法
BFGS算法推导和DFP算法差不多,直接给出公式:
B
k
+
1
=
B
k
+
y
k
y
k
T
y
k
T
s
k
−
B
k
s
k
s
k
T
B
k
T
s
k
T
B
k
s
k
B_{k+1}=B_{k}+\frac{\mathbf{y}_{k} \mathbf{y}_{k}^{\mathrm{T}}}{\mathbf{y}_{k}^{\mathrm{T}} \mathbf{s}_{k}}-\frac{B_{k} \mathbf{s}_{k} \mathbf{s}_{k}^{\mathrm{T}} B_{k}^{\mathrm{T}}}{\mathbf{s}_{k}^{\mathrm{T}} B_{k} \mathbf{s}_{k}}
Bk+1=Bk+ykTskykykT−skTBkskBkskskTBkT
Limited memory Broyden–Fletcher–Goldfarb–Shanno (L-BFGS) 是对BFGS的一种优化,BFGS需要存储
n
∗
n
n* n
n∗n的方阵
B
k
B_k
Bk来近似Hessian矩阵的逆矩阵,而L-BFGS只存储最近m(m约为10)个(
y
k
,
s
k
y_k, s_k
yk,sk)用于近似
B
k
B_k
Bk. 因此,L-BFGS的空间复杂度是
O
(
m
n
)
O(mn)
O(mn).
L-BFGS算法:
y
k
=
g
k
+
1
−
g
k
ρ
k
=
1
y
k
T
s
k
q
=
g
k
For
i
=
k
−
1
,
k
−
2
,
…
,
k
−
m
α
i
=
ρ
i
s
i
⊤
q
q
=
q
−
α
i
y
i
γ
k
=
s
k
−
1
y
k
−
1
y
k
−
1
⊤
y
k
−
1
H
k
0
=
γ
k
I
z
=
H
k
0
q
For
i
=
k
−
m
,
k
−
m
+
1
,
…
,
k
−
1
β
i
=
ρ
i
y
i
⊤
z
z
=
z
+
s
i
(
α
i
−
β
i
)
S
t
o
p
w
i
t
h
H
k
g
k
=
z
\begin{array}{l} y_{k}=g_{k+1}-g_{k} \quad \rho_{k}=\frac{1}{y_{k}^{\mathrm{T}} s_{k}}\\ q=g_{k} \\ \text { For } i=k-1, k-2, \ldots, k-m \\ \quad \alpha_{i}=\rho_{i} s_{i}^{\top} q \\ \quad q=q-\alpha_{i} y_{i} \\ \gamma_{k}=\frac{s_{k-1} y_{k-1}}{y_{k-1}^{\top} y_{k-1}} \\ H_{k}^{0}=\gamma_{k} I \\ z=H_{k}^{0} q \\ \text { For } i=k-m, k-m+1, \ldots, k-1 \\ \quad \beta_{i}=\rho_{i} y_{i}^{\top} z \\ \quad z=z+s_{i}\left(\alpha_{i}-\beta_{i}\right)\\ Stop \;with \; H_k g_k = z \end{array}
yk=gk+1−gkρk=ykTsk1q=gk For i=k−1,k−2,…,k−mαi=ρisi⊤qq=q−αiyiγk=yk−1⊤yk−1sk−1yk−1Hk0=γkIz=Hk0q For i=k−m,k−m+1,…,k−1βi=ρiyi⊤zz=z+si(αi−βi)StopwithHkgk=z
3. 总结
(1)牛顿法是通过求解一阶导数为0,从而引入Hessian矩阵指导参数优化;拟牛顿法是对牛顿法的性能优化,思路是近似求解Hessian矩阵。
(2)牛顿法在什么时候只需要迭代一次就能求解,什么时候牛顿法不能适用?
对于正定二次函数,一步即可得最优解。
当初始点远离最优解时,
H
k
H_k
Hk不一定是正定的,则牛顿方向不一定为下降方向,其收敛性不能保证。这说明恒取步长因子为1是不合适的,应该采用一维搜索(仅当步长因子
α
k
{αk}
αk收敛1时,牛顿法才是二阶收敛的),此时迭代公式是:
d
k
=
−
H
k
−
1
g
k
,
x
k
+
1
=
x
k
+
α
k
d
k
\mathbf{d}_{k}=-H_{k}^{-1} \mathbf{g}_{k}, \mathbf{x}_{k+1}=\mathbf{x}_{k}+\alpha_{k} \mathbf{d}_{k}
dk=−Hk−1gk,xk+1=xk+αkdk
带步长因子的牛顿法是总体收敛的。
(3)牛顿法和最小二乘法的区别?
牛顿法和最小二乘法相比,牛顿法需要求解Hessian矩阵及确定步长,而最小二乘法不需要。牛顿法是迭代求解,最小二乘法是计算解析解。如果样本量不算很大,且存在解析解,最小二乘法比起牛顿法要有优势,计算速度很快。但是如果样本量很大,用最小二乘法由于需要求一个超级大的逆矩阵,这时就很难或者很慢才能求解解析解了,使用迭代的牛顿法比较有优势。
(4)牛顿法和梯度下降法的区别,以及为什么深度学习不使用牛顿法进行参数优化?
两者都是迭代求解,不过梯度下降法是梯度求解,而牛顿法/拟牛顿法是用二阶的海森矩阵的逆矩阵或伪逆矩阵求解。相对而言,使用牛顿法/拟牛顿法收敛更快。但是每次迭代的时间比梯度下降法长。
深度学习一般不使用牛顿法的原因:
原因一:牛顿法需要用到Hessian矩阵,这难以求解,因为很难写出深度神经网络拟合函数的表达式。
原因二:即使可以得到梯度和Hessian矩阵,当输入向量的维度 n n n较大时,Hessian矩阵的大小是 n ∗ n n*n n∗n,所需要的内存非常大(L-BFGS会有所改善)。
原因三:在高维非凸优化问题中,鞍点相对于局部最小值的数量非常多,而且鞍点处的损失值相对于局部最小值处也比较大。而二阶优化算法是寻找梯度为0的点,所以很容易陷入鞍点。
最近开通了个公众号,主要分享推荐系统,风控等算法相关的内容,感兴趣的伙伴可以关注下。
公众号相关的学习资料会上传到QQ群596506387,欢迎关注。
参考: