一、 模型的优化算法
1.1 基于梯度下降的方法
1.1.1样本量
- 批量梯度下降BGD(Batch Gradient Dencent)
- 随机梯度下降SGD(Stochastic Gradient Descent)
- mini-batch GD
1.1.2. 学习率的更新方法
- 动量法momentum(引入了动量项)
- Nesterov accelerated gradient(NAG,预测下一时刻的位置)
二阶方法,调整学习率
- Adagrad(每个参数单独调节)
- Adelta(防止Adagrad中的学习率一直减小)
- RMSprop(Adelta实例化)
- Adam(梯度、梯度方的历史加权平均值)
- Adamax(Adam的二范数变为无穷范数,更稳定)
1.2. 牛顿法系列
1.2.1. 牛顿法
1.2.2. 拟牛顿法
- DFP
- BGFS
- L-BGFS(待完成)
- Broyden
二. 具体算法
2.1.1批量梯度下降
根据所有样本的损失,更新模型参数。
以逻辑斯蒂回归模型为例,训练集有m个样本 X ( x 1 , x 2 , . . . , x m ) X({x_{1}},{x_{2}},...,{x_{m}}) X(x1,x2,...,xm),误差函数是交叉熵误差函数,批量梯度下降法的计算过程如下:
- 对于每个输入 x x x,计算模型输出 y ^ \hat{y} y^. y ^ = σ ( w T x + b ) \hat{y} = \sigma (w^{T}x+b) y^=σ(wTx+b) .其中 σ ( z ) = 1 1 + e − z \sigma (z) = \frac{1}{1+e^{-z}} σ(z)=1+e−z1.(注:初始化 w , b w,b w,b)
- 计算
m
m
m个样本的交叉熵损失,取平均值,得到关于
w
,
b
w,b
w,b的损失值
J ( w , b ) = 1 m ∑ i = 1 m ( L ( y ^ i ) , y i ) = − 1 m ∑ i = 1 m ( y i l o g y ^ i + ( 1 − y i ) l o g ( 1 − y ^ i ) ) J(w,b) = \frac{1}{m} \sum_{i=1}^{m}(L(\hat{y}_{i}),y_{i}) = -\frac{1}{m}\sum_{i=1}^{m}(y_{i}log\hat{y}_{i}+(1-y_{i})log(1-\hat{y}_{i})) J(w,b)=m1i=1∑m(L(y^i),yi)=−m1i=1∑m(yilogy^i+(1−yi)log(1−y^i)) - 计算 J ( w , b ) J(w,b) J(w,b)关于 w , b w,b w,b的偏导 d w = ∂ J ( w , b ) ∂ w dw = \frac{\partial J(w,b)}{\partial w} dw=∂w∂J(w,b), d b = ∂ J ( w , b ) ∂ b db = \frac{\partial J(w,b)}{\partial b} db=∂b∂J(w,b)
- 更新 w , b w,b w,b w = w − l r ∗ d w , b = b − l r ∗ d b w = w - lr * dw, b = b - lr*db w=w−lr∗dw,b=b−lr∗db, l r lr lr是学习率.
- 重复步骤1~4,达到终止条件结束算法。
2.1.2 随机梯度下降
单个样本输入后,计算得到损失后,更新模型参数。
以逻辑斯蒂回归模型为例,训练集有m个样本 X ( x 1 , x 2 , . . . , x m ) X({x_{1}},{x_{2}},...,{x_{m}}) X(x1,x2,...,xm),误差函数是交叉熵误差函数,随机梯度下降法的计算过程如下:
- 对于任意一个输入 x i x_{i} xi,计算模型输出 y i ^ \hat{y_{i}} yi^. y i ^ = σ ( w T x i + b ) \hat{y_{i}} = \sigma (w^{T}x_{i}+b) yi^=σ(wTxi+b) .其中 σ ( z ) = 1 1 + e − z \sigma (z) = \frac{1}{1+e^{-z}} σ(z)=1+e−z1.(注:初始化 w , b w,b w,b)
- 计算输入 x i x_{i} xi的交叉熵损失 J i ( w , b ) = L ( y ^ i , y i ) = y i l o g y ^ i + ( 1 − y i ) l o g ( 1 − y ^ i ) J_{i}(w,b) = L(\hat{y}_{i},y_{i})= y_{i}log\hat{y}_{i}+(1-y_{i})log(1-\hat{y}_{i}) Ji(w,b)=L(y^i,yi)=yilogy^i+(1−yi)log(1−y^i)
- 计算 J i ( w , b ) J_{i}(w,b) Ji(w,b)关于 w , b w,b w,b的偏导 d w = ∂ J i ( w , b ) ∂ w dw = \frac{\partial J_{i}(w,b)}{\partial w} dw=∂w∂Ji(w,b), d b = ∂ J i ( w , b ) ∂ b db = \frac{\partial J_{i}(w,b)}{\partial b} db=∂b∂Ji(w,b)
- 更新 w , b w,b w,b w = w − l r ∗ d w , b = b − l r ∗ d b w = w - lr * dw, b = b - lr*db w=w−lr∗dw,b=b−lr∗db, l r lr lr是学习率.
- 重复步骤1~4,达到终止条件结束算法。
2.1.3 mini-Batch梯度下降
根据小批量n个样本的损失,更新模型参数。
以逻辑斯蒂回归模型为例,训练集有m个样本 X ( x 1 , x 2 , . . . , x m ) X({x_{1}},{x_{2}},...,{x_{m}}) X(x1,x2,...,xm),误差函数是交叉熵误差函数,批量梯度下降法的计算过程如下:
- 对于小批量的n个样本中的每个输入 x x x,计算模型输出 y ^ \hat{y} y^. y ^ = σ ( w T x + b ) \hat{y} = \sigma (w^{T}x+b) y^=σ(wTx+b) .其中 σ ( z ) = 1 1 + e − z \sigma (z) = \frac{1}{1+e^{-z}} σ(z)=1+e−z1.(注:初始化 w , b w,b w,b)
- 计算
n
n
n个样本的交叉熵损失,取平均值,得到关于
w
,
b
w,b
w,b的损失值
J ( w , b ) = 1 n ∑ i = 1 n ( L ( y ^ i ) , y i ) = − 1 n ∑ i = 1 n y i l o g y ^ i + ( 1 − y i ) l o g ( 1 − y ^ i ) J(w,b) = \frac{1}{n} \sum_{i=1}^{n}(L(\hat{y}_{i}),y_{i})\\ = -\frac{1}{n}\sum_{i=1}^{n}y_{i}log\hat{y}_{i}+(1-y_{i})log(1-\hat{y}_{i}) J(w,b)=n1i=1∑n(L(y^i),yi)=−n1i=1∑nyilogy^i+(1−yi)log(1−y^i) - 计算 J ( w , b ) J(w,b) J(w,b)关于 w , b w,b w,b的偏导 d w = ∂ J ( w , b ) ∂ w dw = \frac{\partial J(w,b)}{\partial w} dw=∂w∂J(w,b), d b = ∂ J ( w , b ) ∂ b db = \frac{\partial J(w,b)}{\partial b} db=∂b∂J(w,b)
- 更新 w , b w,b w,b w = w − l r ∗ d w , b = b − l r ∗ d b w = w - lr * dw, b = b - lr*db w=w−lr∗dw,b=b−lr∗db, l r lr lr是学习率.
- 重复步骤1~4,达到终止条件结束算法。
2.2 梯度更新算法1
2.2.1 动量法
问题背景
下图所示,红点是最小值点。为了到达红点,如果使用较大的学习率,则会出现紫线画出的发散现象,如果使用较小的学习率,如蓝线所示,收敛的速度比较慢。因此,希望有种学习方法,能在纵轴上减小摆动,在横轴上,希望加快学习。这里就需要每次横轴和纵轴的更新量不同,如果使用 w = w − l r ∗ d w w = w - lr * dw w=w−lr∗dw,则达不到这种效果。
方法引入
动量法在原始权值梯度
d
w
dw
dw的基础上,增加了上一时刻的更新量
υ
t
−
1
\upsilon _{t-1}
υt−1。
υ
t
=
γ
υ
t
−
1
+
η
▽
θ
J
(
θ
)
\upsilon _{t} = \gamma \upsilon _{t-1} + \eta \bigtriangledown _{\theta }J(\theta )
υt=γυt−1+η▽θJ(θ)
θ
=
θ
−
υ
t
\theta =\theta - \upsilon _{t}
θ=θ−υt
2.2.2 Nesterov 梯度加速法(Nesterov Accelerated Gradient)
问题背景
寻找最小值的过程,就像小球下山,小球在下山的过程中,速度会一直增加,这样会冲过最低点,然后又冲下来。我们希望小球到山底附近时,会自动减速,停在最小值处。
方法引入
θ
−
υ
t
\theta - \upsilon _{t}
θ−υt是下一时刻小球所在位置的近似估计。通过计算函数关于下一时刻的梯度表示参数的梯度方向。
υ
t
=
γ
υ
t
−
1
+
η
▽
θ
J
(
θ
−
υ
t
)
\upsilon _{t} = \gamma \upsilon _{t-1} + \eta \bigtriangledown _{\theta }J(\theta -\upsilon _{t} )
υt=γυt−1+η▽θJ(θ−υt)
θ
=
θ
−
υ
t
\theta =\theta - \upsilon _{t}
θ=θ−υt
短的蓝色 当前梯度 棕色和长的蓝色 更新的累积梯度 绿色 最终的更新值
这种更新方法可以阻止更新过快而越过最小值点而使响应速度提高。
2.2.3 Adagrad
问题背景
我们能够根据误差函数的斜率调整更新量并加速SGD,我们还希望根据每个参数的重要性来调整每个参数的更新量
Adagrad 是一种基于梯度的优化算法。它调整参数的学习率的规则: larger updates for infrequent and smaller updates for frequent parameters(怎么翻呢?)
SGD的更新规则如下:
g
t
,
i
=
▽
θ
t
J
(
θ
t
,
i
)
g_{t,i} = \bigtriangledown _{\theta _{t}}J(\theta _{t,i})
gt,i=▽θtJ(θt,i)
θ
t
+
1
,
i
=
θ
t
,
i
−
η
⋅
g
t
,
i
\theta_{t+1,i} = \theta _{t,i} - \eta \cdot g_{t,i}
θt+1,i=θt,i−η⋅gt,i
G
t
∈
R
d
×
d
G_{t}\in R^{d\times d}
Gt∈Rd×d是对角阵,对角上的元素
(
i
,
i
)
(i,i)
(i,i)是累积到
t
t
t时刻的梯度的平方。
其中
g
t
,
i
g_{t,i}
gt,i表示参数
θ
i
\theta _{i}
θi在时间
t
t
t时的梯度。
Adagrad算法每次单独更新每个参数:
θ
t
+
1
,
i
=
θ
t
,
i
−
η
G
t
,
i
i
+
ε
⋅
g
t
,
i
\theta_{t+1,i} = \theta _{t,i} - \frac{\eta}{\sqrt {G_{t,ii}+\varepsilon} } \cdot g_{t,i}
θt+1,i=θt,i−Gt,ii+εη⋅gt,i
其中
ε
\varepsilon
ε是平滑项,防止除数为0.
向量化后:
Adagrad的主要缺点是,训练过程中,分母中的梯度平方项一直在增加,这会使学习率越来越小,从而导致模型无法继续学习。
2.2.4 Adadelta
当前时刻参数梯度平方的均值
E
[
g
2
]
t
=
γ
E
[
g
2
]
t
−
1
+
(
1
−
γ
)
g
t
2
E[g^{2}]_{t} = \gamma E[g^{2}]_{t-1} +(1-\gamma)g_{t}^{2}
E[g2]t=γE[g2]t−1+(1−γ)gt2
Adagrad参数的更新量
用
E
[
g
2
]
t
E[g^{2}]_{t}
E[g2]t代替
G
t
G_{t}
Gt,得
Δ
θ
t
=
−
η
E
[
g
2
]
t
+
ε
g
t
\Delta \theta_{t} = - \frac{\eta }{\sqrt{E[g^{2}]_{t}+\varepsilon }} g_{t}
Δθt=−E[g2]t+εηgt
分母是梯度RMSE的校正,用RMSE代替后:
Δ
θ
t
=
−
η
R
M
S
E
(
[
g
]
t
)
g
t
\Delta \theta_{t} = - \frac{\eta }{RMSE([g]_{t})} g_{t}
Δθt=−RMSE([g]t)ηgt
完整的Adadelta算法:
E
[
g
2
]
t
=
γ
E
[
g
2
]
t
−
1
+
(
1
−
γ
)
g
t
2
(
1
)
E[g^{2}]_{t} = \gamma E[g^{2}]_{t-1} +(1-\gamma)g_{t}^{2} \text(1)
E[g2]t=γE[g2]t−1+(1−γ)gt2(1)
Δ
θ
t
=
−
η
R
M
S
E
(
[
g
]
t
)
g
t
(
2
)
\Delta \theta_{t} = - \frac{\eta }{RMSE([g]_{t})} g_{t} \text(2)
Δθt=−RMSE([g]t)ηgt(2)
- Adadelta 与 Adagrad相比,在分母上做了处理,避免学习率一直减小。
2.2.5 RMSprop
RMSprop是Adadelta的实例化,
γ
=
0.9
\gamma =0.9
γ=0.9.
E
[
g
2
]
t
=
0.9
E
[
g
2
]
t
−
1
+
0.1
g
t
2
(
1
)
E[g^{2}]_{t} = 0.9 E[g^{2}]_{t-1} +0.1g_{t}^{2} \text(1)
E[g2]t=0.9E[g2]t−1+0.1gt2(1)
Δ
θ
t
=
−
η
E
[
g
2
]
t
+
ε
g
t
\Delta \theta_{t} = - \frac{\eta }{\sqrt{E[g^{2}]_{t}+\varepsilon }} g_{t}
Δθt=−E[g2]t+εηgt
2.2.6 Adam( Adaptive Moment Estimation)
Adam,Adaptive Moment Estimation,自适应动量评估。Adam除了像Adadelta和RMSprop那样保存历史指数衰梯度方的均值,还保存了历史指数衰减动量的均值
m
t
=
β
1
m
t
−
1
+
(
1
−
β
1
)
g
t
m_{t}=\beta _{1}m_{t-1} + (1-\beta _{1})g_{t}
mt=β1mt−1+(1−β1)gt
ν
t
=
β
1
ν
t
−
1
+
(
1
−
β
2
)
g
t
2
\nu _{t}=\beta _{1}\nu_{t-1} + (1-\beta _{2})g^{2}_{t}
νt=β1νt−1+(1−β2)gt2
m
t
,
ν
t
m_{t},\nu _{t}
mt,νt初始化为0,在初始阶段这二者趋于0,为了解决这个问题,引入了偏差修正:
m
^
t
=
m
t
1
−
β
1
\hat m_{t} = \frac{m_{t}}{1-\beta _{1}}
m^t=1−β1mt,
ν
t
=
ν
t
1
−
β
2
\nu _{t} = \frac{\nu_{t}}{1-\beta _{2}}
νt=1−β2νt
Adam的参数更新规则:
Δ
θ
t
=
−
η
ν
^
t
+
ε
m
^
t
\Delta \theta_{t} = - \frac{\eta }{\sqrt{\hat \nu_{t}+\varepsilon }} \hat m_{t}
Δθt=−ν^t+εηm^t
2.2.7 AdaMax
AdaMax将Adam中的分母的计算推广到了
∞
\infty
∞范数
Adamax更新规则
2.3.1 牛顿法
为了便于理解用牛顿法优化目标函数,首先介绍单个变量牛顿法,用于数值分析中求近似解。具体参考,得到的近似解的推导公式为:
x
n
+
1
=
x
n
−
f
(
x
n
)
f
′
(
x
n
)
x_{n+1} = x_{n} - \frac{f(x^{n})} {f^{'}(x^{n})}
xn+1=xn−f′(xn)f(xn)
引入 :对于多元变量,在某点处的导数变成了海塞矩阵(Hesse matrix).海塞矩阵是一个多元函数二阶偏导构成的矩阵。 f ( x ) f(x) f(x)具有二阶连续偏导, f ( x ) f(x) f(x)的海塞矩阵 H ( x ) H(x) H(x)为
H ( x ) = [ ∂ 2 f ∂ x i ∂ x j ] n × n H(x) = [\frac{\partial ^{2}f}{\partial x_{i}\partial x_{j}}]_{n\times n} H(x)=[∂xi∂xj∂2f]n×n
考虑无约束的最优化问题
m
i
n
x
∈
R
n
f
(
x
)
\underset{x\in R^{n}}{min}f(x)
x∈Rnminf(x)
- 思考
1. 写出 f ( x ) f(x) f(x)在 x k x_{k} xk处的泰勒展式 f ( x ) = f ( x k ) + g k T ( x − x k ) + 1 2 ( x − x k ) H ( x k ) ( x − x k ) T + . . . f(x)=f(x_{k})+g_{k}^{T}(x-x_{k})+\frac{1}{2}(x-x_{k})H(x_{k})(x-x_{k})^{T}+... f(x)=f(xk)+gkT(x−xk)+21(x−xk)H(xk)(x−xk)T+...
2. 求 f ( x ) f(x) f(x)的极值的必要条件是 f ′ ( x ) = 0 f'(x)=0 f′(x)=0, g k T + H ( x k ) ( x − x k ) = 0 g_{k}^{T}+ H(x_{k})(x-x_{k})=0 gkT+H(xk)(x−xk)=0,
3. 牛顿法求解g(x)=0
以下源自2
2.3.2 拟牛顿法
计算
H
k
−
1
H^{-1}_{k}
Hk−1比较麻烦,
(B.12)或(B.13)是拟牛顿的条件
2.3.2.1 拟牛顿法-DFP(Davidon-Fletcher-Powell)算法
DFP算法用
G
k
G_{k}
Gk来近似
H
k
−
1
H^{-1}_{k}
Hk−1
2.3.2.2 拟牛顿法-BFGS(Broyden-Fletcher-Goldfarb-Shanno)算法
BFGS算法用
B
k
B_{k}
Bk来近似
H
k
H_{k}
Hk
2.3.2.3 ∗ * ∗ 拟牛顿法-Broyden类算法
三、Pytorch中的优化器
Pytorch中的优化器有以下一些:
- Adadelta
- Adagrad
- Adam
- SparseAdam
- Adamax
- ASGD
- LBFGS
- RMSprop
- Rprop
- SGD
一些解释参考
关于Adagrad算法,连个新词:激励收敛和惩罚收敛
安利编辑公式的链接:
在线公式编辑
数学公式输入方法
Ruder S . An overview of gradient descent optimization algorithms[J]. 2016. ↩︎
李航. 统计学习方法[M]. 清华大学出版社, 2012. ↩︎