深度学习中的优化器
一、最优化和深度学习
特定的优化问题:寻找神经网络上的一组参数,能显著降低损失函数
1、数学中的最优化和深度学习中最优化的主要差异
- 目标不同:最优化有明确度量,深度学习只能用代理损失函数。深度学习中优化的是数学定义的损失函数(如交叉熵、均方根误差等),但是实际任务目标是比如分类的准确率、生成图片的质量(这些实际目标很难用数学公式来定义优化),所以深度学习中的损失函数只是对实际任务目标的一个代理,不能完全代表实际的任务目标
- 数据不同:最优化只关心现有数据(训练集),而深度学习关心泛化(测试集)。即深度学习不仅关心在训练集上的表现,更关心在测试集上的表现
- 实现方式:最优化只是数学算法,深度学习关心实现细节
- 研究内容:最优化只关心最优解算法,而深度学习专注于多层神经网络达到好的效果
2、训练误差和泛化误差
3、经验风险
把机器学习问题转化为一个优化问题的最简单的方法就是最小化训练集上的期望损失(经验风险)
E x , y ∼ p ^ data [ L ( f ( x ; θ ) , y ) ] = 1 m ∑ i = 1 m L ( f ( x ( i ) ; θ ) , y ( i ) ) p ^ data 就是训练集 \mathbb{E}_{\mathbf{x}, y \sim \hat{p}_{\text{data}}} \left[ L(f(\mathbf{x}; \boldsymbol{\theta}), y) \right] = \frac{1}{m} \sum_{i=1}^m L\left(f(\mathbf{x}^{(i)}; \boldsymbol{\theta}), y^{(i)}\right)\\ \hat{p}_{\text{data}}就是训练集 Ex,y∼p^data[L(f(x;θ),y)]=m1i=1∑mL(f(x(i);θ),y(i))p^data就是训练集
4、优化中的挑战
- 病态(ill-conditioned problem):问题的解对于条件非常敏感,即使存在很微妙很少的噪声,也会对问题的解造成很大的影响。比如过拟合
- 局部极小值:在某个局部区域内,目标的值小于周围所有点的值,局部极小值可能是全局最小值,也可能不是全局最小值,梯度下降可能在局部极小值就停止减小
- 鞍点:目标函数在某个点处的梯度等于等于0,但这个点既不是局部最小值也不是局部最大值,如下图所示。鞍点的出现通常是由于模型复杂度过高或者训练数据过少导致的
- 悬崖:梯度更新会很大程度上改变参数值,使得参数弹射得非常远,导致直接跳过全局最优点。悬崖是由于几个较大的权重相乘导致的;采用梯度截断,减小搜索步长可以减轻悬崖带来的危害
- 长期依赖问题:深度结构使得模型丧失了学习到先前信息的能力,使得模型优化十分困难,容易导致梯度消失和梯度爆炸问题
5、小结:
二、损失函数
1、损失函数的起源
损失函数是衡量预测值和真实值之间差异的函数
损失函数的起源可以追溯到统计学和最小二乘法
2、最大似然估计(Maximum Likelihood Estimation, MLE)
**理论思想:**选择一组使得观测数据似然函数最大化的参数,认为数据是由模型生成的,所以找到使得数据出现频率最高的参数就是最优的模型参数
特点:
- 数据驱动:MLE完全基于数据,认为观测数据包含了所有的信息
- 直观性强:通过直接最大化似然函数,找到最能解释数据的模型参数
- 缺点:当数据量少或者含有噪声时,MLE容易过拟合,因为MLE估计的参数全部取决于数据
2.1 最大似然估计和均方根误差
最大似然估计,假设样本之间是相互独立的(独立性假设),这样联合概率就可以写成单个样本概率的连乘,最大似然就是求使得联合概率分布最大的一组参数,但是由于连乘会容易导致目标函数为0,或者很大,所以通常会加上log,转化为单个样本的对数值连加。
假设样本服从高斯分布,最终推导到的最小化目标函数等于最小化均方根误差
2.2 交叉熵损失概率分布解释
交叉熵的公式为: H ( p , q ) = − ∑ y p ( y ∣ x ) log q ( y ∣ x ) 其中 p 代表真实概率分布, q 代表预测概率分布 交叉熵的公式为: H(p, q) = -\sum_y p(y | x) \log q(y | x)\\ 其中p代表真实概率分布,q代表预测概率分布 交叉熵的公式为:H(p,q)=−y∑p(y∣x)logq(y∣x)其中p代表真实概率分布,q代表预测概率分布
交叉熵损失起源于最大似然估计
3、最大后验估计(Maximum A Posteriori, MAP)
理论思想: 结合先验知识和观测数据,找到使得后验概率最大的一组参数,MAP认为数据是被直接观测到的,不仅和模型参数有关系还和参数的先验知识有关系。MAP是贝叶斯方法的一个具体应用
数学定义: 根据贝叶斯公式 , 后验概率为: P ( θ ∣ X ) = P ( X ∣ θ ) P ( θ ) P ( X ) M A P 的目标是: θ ^ MAP = arg max θ P ( θ ∣ X ) 忽略分母 P ( X ) (因为它是常数,与 θ 无关)等价于: θ ^ MAP = arg max θ P ( X ∣ θ ) P ( θ ) 数学定义:\\ 根据贝叶斯公式,后验概率为: P(\theta | X) = \frac{P(X | \theta) P(\theta)}{P(X)}\\ MAP 的目标是:\\ \hat{\theta}_{\text{MAP}} = \arg\max_\theta P(\theta | X)\\ 忽略分母 P(X)(因为它是常数,与 \theta 无关)等价于:\\ \hat{\theta}_{\text{MAP}} = \arg\max_\theta P(X | \theta) P(\theta) 数学定义:根据贝叶斯公式,后验概率为:P(θ∣X)=P(X)P(X∣θ)P(θ)MAP的目标是:θ^MAP=argθmaxP(θ∣X)忽略分母P(X)(因为它是常数,与θ无关)等价于:θ^MAP=argθmaxP(X∣θ)P(θ)
先验知识在我们进行最大后验估计时,就需要具体指定先验的特定分布
特点:
- 结合先验:在参数估计时,同时结合了参数的先验知识和观测数据的似然估计
- 更加鲁棒:对于数据量少或者含有噪声的情况,模型估计得到的参数更加鲁棒和稳定
4、频率学派和贝叶斯学派
频率学派:数据是随机的,模型参数是固定的,全部有模型参数生成;
贝叶斯学派:数据是固定的,模型参数是满足某种分布的随机值,通过数据来更新模型参数
特点 | 频率学派 | 贝叶斯学派 |
---|---|---|
参数的本质 | 参数是固定的未知值 | 参数是随机变量,服从某种概率分布 |
数据的本质 | 数据是随机的,由参数生成 | 数据是固定的,但通过数据更新参数分布 |
重点 | 推断参数的固定值 | 推断参数的分布,反映不确定性 |
方法 | 最大似然估计(MLE)等方法 | 贝叶斯公式,结合先验和似然更新后验分布 |
适用场景 | 数据量足够多时鲁棒 | 数据少、噪声较多或需要引入先验知识时更强大 |
结果形式 | 单个点估计(如参数的最大似然值) | 后验分布,或者基于后验的期望/中位数估计 |
应用 | 最大似然估计 | 最大后验估计、贝叶斯估计 |
5、贝叶斯估计
贝叶斯估计是在最大后验估计(MAP)上的一个拓展。贝叶斯估计通过后验分布 来找到参数的期望值(通常称为后验期望)
贝叶斯估计的表达式 θ ^ Bayesian = E [ θ ∣ X ] = ∫ θ P ( θ ∣ X ) d θ 最终是找到参数 θ 在所有样本上的加权平均值 贝叶斯估计的表达式\\ \hat{\theta}_{\text{Bayesian}} = \mathbb{E}[\theta | X] = \int \theta P(\theta | X) \, d\theta\\ 最终是找到参数\theta在所有样本上的加权平均值 贝叶斯估计的表达式θ^Bayesian=E[θ∣X]=∫θP(θ∣X)dθ最终是找到参数θ在所有样本上的加权平均值
贝叶斯估计与最大后验估计对比
特点 | 贝叶斯估计 | 最大后验估计(MAP) |
---|---|---|
结果形式 | 后验分布的期望值 | 后验分布的众数(概率最大的点) |
不确定性表达 | 通过后验分布表达参数的不确定性 | 只提供一个最优点估计 |
适用场景 | 表达完整的不确定性,适合决策问题 | 适合单点参数估计 |
计算复杂性 | 需要计算积分,可能较复杂 | 只需找到最大值,相对简单 |
6、小结
三、损失函数的性质
1、可微性和可导性
- 可微性(differentiability):函数在任意一点处都有导数(左右导数相等才叫有导数),导函数可以不连续
- 可导性(continuity):函数有连续的导函数,导函数是连续不间断的
可导性强于可微性
2、凸性
- 凸函数保证损失函数有全局最小值,可以使用较为简单的优化算法
- 凹函数不容易找到全局最小值,需要更复杂的优化算法
2.1 凸优化和凸约束
- 凸优化:使用凸优化算法来最小化目标函数为凸函数的优化问题
- 凸约束:在优化问题中,约束条件是凸函数
2.2 Jensen不等式
期望的函数值小于等于凸函数的期望值,f(E[x])>=E[f(x)]
四、随机梯度下降法(Stochastic Gradient Descent,SGD)
经典梯度下降法、随机梯度下降法、Mini-batch随机梯度下降法,他们的区别就是进行参数更新所使用的梯度来自于多少个样本
1、经典梯度下降法
每次迭代都使用所有样本来计算梯度并进行参数更新
1.1 问题
- 不能保证被优化函数达到全局最优解,因为被优化函数不一定是凸函数
- 全部训练数据上最小化损失,计算量大,耗时长
- 如果函数形态复杂,可能会在局部最小值附件来回震荡
- 对于初始值的选择非常敏感
2、随机梯度下降法(SGD)
每次迭代仅随机选训练集中的一个样本来计算梯度,并利用该梯度进行参数更新.
3、优缺点
- 优点:计算速度快,不容易陷入局部最优
- 缺点:受噪声影响大,容易出现震荡,有方差大无法收敛的情况
4、动态学习率
由于每次迭代都是随机选一个样本,所有设置动态学习率可以帮助模型更快的收敛,动态学习率的形式有很多
5、小结
五、Mini batch 随机梯度下降法(Mini-batch Stochastic Gradient Descent,Mini-batch SGD)
思想:每次迭代中,使用一小部分的随机样本来计算梯度,并进行参数更新。
深度学习中使用的SGD一般都是默认指Mini-batch随机梯度下降法
优点:
- 训练速度快
- 和经典随机梯度下降相比,有更少的震荡
- 更多的控制梯度下降的方向
缺点:
- 超参数变多
- 学习率敏感
六、动量法(Momentum)
1、深度学习中的动量
-
一阶动量:过去各个时刻梯度的线性组合
m t = β 1 ⋅ m t − 1 + ( 1 − β 1 ) ⋅ g t m_t = \beta_1 \cdot m_{t-1} + (1 - \beta_1) \cdot g_t mt=β1⋅mt−1+(1−β1)⋅gt -
二阶动量:过去各个时刻梯度平方的和
V t = ∑ τ = 1 t g τ 2 V_t = \sum_{\tau=1}^t g_\tau^2 Vt=τ=1∑tgτ2
2、动量法的基本思想
将当前的梯度于上一步的梯度加权平均来减少梯度下降的震荡,使得模型训练更加稳定,只使用了一阶动量
3、优缺点
优点:
- 加速收敛,某种程度上可以跳过局部最小值,因为动量法可以在梯度较小的情况下获得较大的梯度更新值
- 减小学习率过大导致的震荡风险,因为动量法可以平滑梯度方向
- 减轻初始化权重的敏感度
缺点:
- 需要维护动量项,速度变慢
七、AdaGrad算法
1、基本思想
根据二阶动量动态调整学习率,对于更新频率较快的参数更新得慢一些,对于更新频率较慢的参数更新得快一些
V t = ∑ i = 1 t g i 2 η t = α ⋅ m t V t + ϵ w t + 1 = w t − η t V_t = \sum_{i=1}^{t} g_i^2\\ \eta_t = \alpha \cdot \frac{m_t}{\sqrt{V_t} + \epsilon} \quad\\ w_{t+1} = w_t - \eta_t Vt=i=1∑tgi2ηt=α⋅Vt+ϵmtwt+1=wt−ηt
2、适用场景
适合稀疏特征的场景。稀疏特征就是指那些在训练样本中很少出现的特征,训练模型时,稀疏特征很少出现,导致其对应的参数难以收敛,而AdaGrad算法可以加大稀疏特征对应的参数的更新步幅,加快收敛。
3、优缺点
优点:
- 能够有效地处理稀疏特征场景
- 能够根据二阶动量自动调整学习率
缺点:
- 由于二阶动量的积累,训练后期的收敛速度会越变越慢
- 学习率的调整方式固定,都是根据二阶动量来调整学习率
八、RMSProp优化算法
1、基本思想
不像AdaGrad算法关注历史所有梯度的二阶动量,而是只关注一小段时间窗口内的历史二阶动量(通过增设β2参数隐式地实现)其公式为:
V t = β 2 ∗ V t − 1 + ( 1 − β 2 ) g t 2 ,,越早的梯度,二阶动量对其的权重越小 η t = α ⋅ m t V t + ϵ w t + 1 = w t − η t V_t = \beta_2*V_{t-1}+(1-\beta_2)g_t^2,,越早的梯度,二阶动量对其的权重越小\\ \eta_t = \alpha \cdot \frac{m_t}{\sqrt{V_t} + \epsilon} \quad\\ w_{t+1} = w_t - \eta_t Vt=β2∗Vt−1+(1−β2)gt2,,越早的梯度,二阶动量对其的权重越小ηt=α⋅Vt+ϵmtwt+1=wt−ηt
2、优缺点
- 自动调整学习率
- 实现上较为简单
- 需要调整更多的超参数
九、AdaDelta优化算法
1、基本思想
不设学习率超参数,避免手动调整学习率来控制训练过程,而是自动调整学习率,使得训练过程更加顺畅
Δ w = − E [ Δ w 2 ] + ϵ E [ g 2 ] + ϵ ⋅ g , E 代表当前变量的期望 w t = w t − 1 − Δ w t − 1 \Delta w = -\frac{\sqrt{E[\Delta w^2] + \epsilon}}{\sqrt{E[g^2] + \epsilon}} \cdot g,E代表当前变量的期望\\ w_{t}=w_{t-1}-\Delta w_{t-1} Δw=−E[g2]+ϵE[Δw2]+ϵ⋅g,E代表当前变量的期望wt=wt−1−Δwt−1
2、优缺点
- 自动调整学习率,不用调参
- 收敛比较慢,不知道学习率
- 需要维护梯度和权重更新量的积分,增加开销
十、Adam优化算法
当前(2025.2.4)最为主流最好用的优化算法,其公式:
m t = β 1 ∗ m t − 1 + ( 1 − β 1 ) ∗ g t v t = β 2 ∗ v t − 1 + ( 1 − β 2 ) ∗ g t 2 m ^ t = m t / ( 1 − β 1 t ) v ^ t = v t / ( 1 − β 2 t ) θ t = θ t − 1 − α ⋅ m ^ t / ( v ^ t + ϵ ) m_t=\beta_1*m_{t-1}+(1-\beta_1)*g_t\\ v_t=\beta_2*v_{t-1}+(1-\beta_2)*g_t^2\\ \hat{m}_t = m_t / (1 - \beta_1^t) \\ \hat{v}_t = v_t / (1 - \beta_2^t) \\ \theta_t = \theta_{t-1} - \alpha \cdot \hat{m}_t / (\sqrt{\hat{v}_t} + \epsilon) mt=β1∗mt−1+(1−β1)∗gtvt=β2∗vt−1+(1−β2)∗gt2m^t=mt/(1−β1t)v^t=vt/(1−β2t)θt=θt−1−α⋅m^t/(v^t+ϵ)
Adam算法改进,Nadam使用了前瞻梯度,其公式:
m t = β 1 ⋅ m t − 1 + ( 1 − β 1 ) ⋅ g t v t = β 2 ⋅ v t − 1 + ( 1 − β 2 ) ⋅ g t 2 m ^ t = m t / ( 1 − β 1 t ) v ^ t = v t / ( 1 − β 2 t ) θ t = θ t − 1 − { α ⋅ [ β 1 m ^ t + ( 1 − β 1 ) g t ] } / ( v ^ t + ϵ ) 其中 [ β 1 m ^ t + ( 1 − β 1 ) g t ] 称为前瞻梯度 m_t=\beta_1 \cdot m_{t-1}+(1-\beta_1) \cdot g_t\\ v_t=\beta_2 \cdot v_{t-1}+(1-\beta_2) \cdot g_t^2\\ \hat{m}_t = m_t / (1 - \beta_1^t) \\ \hat{v}_t = v_t / (1 - \beta_2^t) \\ \theta_t = \theta_{t-1} - \{\alpha \cdot [\beta_1\hat{m}_t+(1-\beta_1)g_t]\} / (\sqrt{\hat{v}_t} + \epsilon)\\ 其中[\beta_1\hat{m}_t+(1-\beta_1)g_t]称为前瞻梯度 mt=β1⋅mt−1+(1−β1)⋅gtvt=β2⋅vt−1+(1−β2)⋅gt2m^t=mt/(1−β1t)v^t=vt/(1−β2t)θt=θt−1−{α⋅[β1m^t+(1−β1)gt]}/(v^t+ϵ)其中[β1m^t+(1−β1)gt]称为前瞻梯度
十一、优化算法小结
1、各类优化算法的核心差异
梯度更新的方向
2、最佳选择策略
- 快速验证模型,不想做精细的调优,选Adam算法
- 更加自如地控制优化迭代参数,选SGD
- 一种好的方法是先用Adam算法快速下降逼近全局最优点,再用SGD作精细调优
- 数据才是王道,要结合数据来选择算法
3、经验建议
- 选择熟悉的算法
- 根据需求选择
- 先用小数据实验
- 数据集充分打乱
- 考虑不用的组合
- 监控好训练过程各类指标,及时调整
十二、学习率调节器
1、设置学习率需要考虑的因素
- 模型复杂度
- 训练数据规模
- 任务复杂度
- 优化器类型
- 损失函数变化情况
- Batch_size
2、什么是学习率调节器
- 学习率是各类优化算法中最为关键的参数之一
- 学习率调节器的作用是在训练过程中动态地调整学习率
3、常见的学习率调节器
3.1 学习率衰减
每次训练一定次数就将学习率降低到一定比例,学习率陡峭降低
3.2 指数衰减
每次迭代都将学习率乘上一个衰减率,使得学习率逐渐降低,学习率平滑降低
3.3 余弦学习率调节
根据余弦函数来调节学习率,学习率像余弦函数一样,降低又升高,升高又降低
3.4 预热 warmup
学习率从较小值逐渐提升到较大值的过程,其公式为:
l r ( t ) = l r i n i t i a l + ( l r m a x − l r i n i t i a l ) ∗ t / T 其中 t 是指当前步, T 是指总的预热步长 lr(t) = lr_{initial} + (lr_max - lr{initial}) * t / T\\ 其中t是指当前步,T是指总的预热步长 lr(t)=lrinitial+(lrmax−lrinitial)∗t/T其中t是指当前步,T是指总的预热步长
4、小结
调节器
3.1 学习率衰减
每次训练一定次数就将学习率降低到一定比例,学习率陡峭降低
3.2 指数衰减
每次迭代都将学习率乘上一个衰减率,使得学习率逐渐降低,学习率平滑降低
3.3 余弦学习率调节
根据余弦函数来调节学习率,学习率像余弦函数一样,降低又升高,升高又降低
[外链图片转存中…(img-YwF0vOKU-1739163206296)]
3.4 预热 warmup
学习率从较小值逐渐提升到较大值的过程,其公式为:
l r ( t ) = l r i n i t i a l + ( l r m a x − l r i n i t i a l ) ∗ t / T 其中 t 是指当前步, T 是指总的预热步长 lr(t) = lr_{initial} + (lr_max - lr{initial}) * t / T\\ 其中t是指当前步,T是指总的预热步长 lr(t)=lrinitial+(lrmax−lrinitial)∗t/T其中t是指当前步,T是指总的预热步长
4、小结
=========================================================================================================自己感受:如何根据需求设置合适的损失函数,这决定了最终训练完成模型所能达到的上限,而各类优化算法可以帮助我们更好地训练模型,更快更好地收敛,这需要长期的积累和充分地理解业务。