模型优化算法

一、 模型的优化算法

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),误差函数是交叉熵误差函数,批量梯度下降法的计算过程如下:

  1. 对于每个输入 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+ez1.(注:初始化 w , b w,b w,b)
  2. 计算 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=1m(L(y^i),yi)=m1i=1m(yilogy^i+(1yi)log(1y^i))
  3. 计算 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=wJ(w,b), d b = ∂ J ( w , b ) ∂ b db = \frac{\partial J(w,b)}{\partial b} db=bJ(w,b)
  4. 更新 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=wlrdw,b=blrdb, l r lr lr是学习率.
  5. 重复步骤1~4,达到终止条件结束算法。

2.1.2 随机梯度下降

单个样本输入后,计算得到损失后,更新模型参数。

以逻辑斯蒂回归模型为例,训练集有m个样本 X ( x 1 , x 2 , . . . , x m ) X({x_{1}},{x_{2}},...,{x_{m}}) X(x1,x2,...,xm),误差函数是交叉熵误差函数,随机梯度下降法的计算过程如下:

  1. 对于任意一个输入 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+ez1.(注:初始化 w , b w,b w,b)
  2. 计算输入 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+(1yi)log(1y^i)
  3. 计算 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=wJi(w,b), d b = ∂ J i ( w , b ) ∂ b db = \frac{\partial J_{i}(w,b)}{\partial b} db=bJi(w,b)
  4. 更新 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=wlrdw,b=blrdb, l r lr lr是学习率.
  5. 重复步骤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),误差函数是交叉熵误差函数,批量梯度下降法的计算过程如下:

  1. 对于小批量的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+ez1.(注:初始化 w , b w,b w,b)
  2. 计算 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=1n(L(y^i),yi)=n1i=1nyilogy^i+(1yi)log(1y^i)
  3. 计算 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=wJ(w,b), d b = ∂ J ( w , b ) ∂ b db = \frac{\partial J(w,b)}{\partial b} db=bJ(w,b)
  4. 更新 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=wlrdw,b=blrdb, l r lr lr是学习率.
  5. 重复步骤1~4,达到终止条件结束算法。

2.2 梯度更新算法1

2.2.1 动量法

问题背景

下图所示,红点是最小值点。为了到达红点,如果使用较大的学习率,则会出现紫线画出的发散现象,如果使用较小的学习率,如蓝线所示,收敛的速度比较慢。因此,希望有种学习方法,能在纵轴上减小摆动,在横轴上,希望加快学习。这里就需要每次横轴和纵轴的更新量不同,如果使用 w = w − l r ∗ d w w = w - lr * dw w=wlrdw,则达不到这种效果。

方法引入

动量法在原始权值梯度 d w dw dw的基础上,增加了上一时刻的更新量 υ t − 1 \upsilon _{t-1} υt1
υ t = γ υ t − 1 + η ▽ θ J ( θ ) \upsilon _{t} = \gamma \upsilon _{t-1} + \eta \bigtriangledown _{\theta }J(\theta ) υt=γυt1+ηθ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=γυt1+ηθ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} GtRd×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,iGt,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]t1+(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]t1+(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]t1+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=β1mt1+(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νt1+(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=xnf(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)=[xixj2f]n×n

考虑无约束的最优化问题
m i n x ∈ R n f ( x ) \underset{x\in R^{n}}{min}f(x) xRnminf(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(xxk)+21(xxk)H(xk)(xxk)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)(xxk)=0,
    3. 牛顿法求解g(x)=0

以下源自2
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

2.3.2 拟牛顿法

计算 H k − 1 H^{-1}_{k} Hk1比较麻烦,在这里插入图片描述在这里插入图片描述
(B.12)或(B.13)是拟牛顿的条件
在这里插入图片描述

2.3.2.1 拟牛顿法-DFP(Davidon-Fletcher-Powell)算法

DFP算法用 G k G_{k} Gk来近似 H k − 1 H^{-1}_{k} Hk1
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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中的优化器有以下一些:

  1. Adadelta
  2. Adagrad
  3. Adam
  4. SparseAdam
  5. Adamax
  6. ASGD
  7. LBFGS
  8. RMSprop
  9. Rprop
  10. SGD

一些解释参考

关于Adagrad算法,连个新词:激励收敛和惩罚收敛
在这里插入图片描述
安利编辑公式的链接:
在线公式编辑
数学公式输入方法


  1. Ruder S . An overview of gradient descent optimization algorithms[J]. 2016. ↩︎

  2. 李航. 统计学习方法[M]. 清华大学出版社, 2012. ↩︎

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值