优化算法
梯度
梯度就是高度变化率最大的方向
\[gradf(x,y)=\frac{\partial f}{\partial x}\vec i + \frac{\partial f}{\partial y}\vec j
\]
所以一般优化方向选梯度的反方向
BGD
batch gradient descent:
一次迭代是对所有样本进行计算,算出总的梯度,并进行梯度下降
-
优点
- 由全数据集确定的方向能够更好地代表样本总体,从而更准确地朝向极值所在的方向。当目标函数为凸函数时,BGD一定能够得到全局最优。
-
缺点
- 对显存要求高(可以用梯度累计解决)
- 每迭代一步都要计算所有样本,训练速度慢
SGD
stochastic gradient descent:
每次参数更新只使用一个样本
\[\theta_{t+1}=\theta_t-\eta *g_t\\
\eta :学习率
\]
-
优点
- 迭代速度快
-
缺点
-
准确度低,抗干扰能力差
-
不易并行
-
Mini-Batch GD
mini-batch gradient descent:
每次参数更新使用一小批样本
- 融合了BGD,SGD
- 速度比BGD快,比SGD慢
- 精度比BGD低,比SGD高
- 每次使用一个batch可以大大减小收敛所需要的迭代次数,同时可以使收敛到的结果更加接近梯度下降的效果。
- 可并行
SGD-Momentum
SGD 在遇到沟壑时容易陷入震荡。为此,可以为其引入动量 Momentum,加速 SGD 在正确方向的下降并抑制震荡。
\[m_t=\gamma m_{t-1}+ (1-\gamma) g_t\\
\theta_{t}=\theta_{t-1}- \eta m_t
\]
SGD-M 在原步长之上,增加了与上一时刻步长相关的 \(\gamma m_{t-1}\) ,\(\gamma\) 通常取 0.9 左右。
作用:加速收敛,减小震荡
Nesterov
提前预判下一步位置,算梯度,来矫正当前梯度
\[g_t=gradf( \theta_{t-1}-\eta m_{t-1}) \\
m_t=\gamma m_{t-1}+ (1-\gamma) g_t\\
\theta_{t}=\theta_{t-1}- \eta m_t
\]
Adagrad
自适应学习率
SGD、SGD-M、Nesterov 均是以相同的学习率去更新参数 \(\theta\) 的各个分量。而深度学习模型中往往涉及大量的参数,不同参数的更新频率往往有所区别。对于更新不频繁的参数(典型例子:更新 word embedding 中的低频词),我们希望单次步长更大,多学习一些知识;对于更新频繁的参数,我们则希望步长较小,使得学习到的参数更稳定,不至于被单个样本影响太多。
于是引入二阶动量
\[r_t=r_{t-1}+ g_t \odot g_t\\
\theta_{t}=\theta_{t-1}- \frac{\eta}{\sqrt {r_t+\varepsilon }} g_t
\]
作用:加速收敛慢的参数,减缓剧烈变换的参数
缺点是 学习率很快就会接近0
RMSprop
Adagrad中的 \(r\) 单调递增,导致学习率很快会接近0。RMSprop选择只关注一段时间内的梯度信息,越老的信息权重越小。
\[r_t=\rho r_{t-1}+(1-\rho )g_t \odot g_t\\
\theta_{t}=\theta_{t-1}- \frac{\eta}{\sqrt {r_t+\varepsilon }} g_t
\]
一般 \(\rho=0.9\)
Adam
Momentum+RMSProp
\[m_t=\rho_1 m_{t-1}+ (1-\rho_1) g_t\\
r_t=\rho_2 r_{t-1}+(1-\rho_2 )g_t \odot g_t\\
\theta_{t}=\theta_{t-1}- \frac{\eta}{\sqrt {r_t+\varepsilon }} m_t
\]
一般 $ \rho_1=0.9, \rho_2=0.999$
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?