当前位置: 首页 > ai >正文

大模型算法面试笔记——常用优化器SGD,Momentum,Adagrad,RMSProp,Adam

常用参数:ttt-步数,α\alphaα-学习率,θ\thetaθ-参数,f(θ)f(\theta)f(θ)-目标函数,gtg_tgt-梯度,β1\beta_1β1-一阶矩衰减系数,通常取0.9,β2\beta_2β2-二阶矩,mtm_tmt-均值,vtv_tvt-方差,m^t\hat{m}_tm^t-mtm_tmt偏置矫正,v^t\hat{v}_tv^t-vtv_tvt偏置矫正。

  • 梯度下降(BGD):最简单的迭代求解算法,选取开始点θ0\theta_0θ0,对t=1,...,Tt=1,...,Tt=1,...,Tθt=θt−1−ηgt−1\theta_t=\theta_{t-1}-\eta g_{t-1}θt=θt1ηgt1,其中η\etaη是学习率。

  • 随机梯度下降(SGD):由于有nnn个样本时,为了减少计算量,所以SGD在时间ttt随机选取一个样本tit_iti来近似f(x)f(x)f(x),SGD的下降方向是对真实梯度方向的无偏估计。

  • 批量梯度下降(MBGD):为了充分利用GPU多核,计算批量的梯度,也是一个无偏的近似,但降低了方差。

  • 动量法(Momentum):为增加收敛的稳定性,并缓解陷入局部最优,动量法使用平滑过的梯度对权重更新:θt=θt−1−ηvt\theta_t=\theta_{t-1}-\eta v_tθt=θt1ηvt,它用一个动量vtv_tvt累加了过去的梯度,其中gtg_tgt为当前梯度:
    vt=βvt−1+(1−β)⋅gtv_t=\beta v_{t-1}+(1-\beta)·g_tvt=βvt1+(1β)gt

  • Adagrad:对于不同的参数,有时需要更新的幅度相差较大,此时不同参数就需要不同的学习率,Adagrad采用的方法是,将历史梯度的平方和累加起来,为学习率添加一个分母项Gt+ϵ\sqrt{G_t+\epsilon}Gt+ϵ,其中Gt=Gt−1+gt2G_t = G_{t-1}+g_t^2Gt=Gt1+gt2,因此,参数更新公式就变成:
    θt=θt−1−ηGt+ϵ⋅gt\theta_t=\theta_{t-1}-\frac{\eta}{\sqrt{G_t+\epsilon}}·g_tθt=θt1Gt+ϵηgt
    如此可见,对于梯度一直很大的参数,其对应的学习率就会变小,而如果参数的梯度很大,学习率相对就更大一点,实现了一定程度上的自动调整。此方法比较适合处理悉数数据,因为稀疏特征的参数更新少,学习率会较大,实现更快收敛,而缺点是累积梯度会随时间增大,导致学习率越来越小甚至接近0,可能导致后期收敛太慢。

  • RMSProp:和Adagrad类似,对累积平方梯度上做改进:Gt=λGt−1+(1−λ)⋅gt2G_t=\lambda G_{t-1}+(1-\lambda)·g_t^2Gt=λGt1+(1λ)gt2,参数更新公式相同。

  • Adam:结合了动量法和Adagrad,动态调整每个参数的学习率,同时利用梯度的一阶矩(动量)和二阶矩(自适应学习率,也可以理解为转动惯量)加速收敛。具体分为四步:
    计算梯度的一阶距估计:
    mt=β1⋅mt−1+(1−β1)⋅gtm_t=\beta_1·m_{t-1}+(1-\beta_1)·g_tmt=β1mt1+(1β1)gt
    计算梯度的二阶矩估计:
    vt=β2⋅vt−1+(1−β2)⋅gt2v_t=\beta_2·v_{t-1}+(1-\beta_2)·g_t^2vt=β2vt1+(1β2)gt2
    这样设计的原因是,展开式中,当t为无穷大时,历史梯度项权重系数和为1,此为数学依据:
    mt=(1−β1)(gt+β1gt−1+β12gt−2+β13gt−3+...)m_t=(1-\beta_1)(g_t+\beta_1g_{t-1}+\beta_1^2g_{t-2}+\beta_1^3g_{t-3}+...)mt=(1β1)(gt+β1gt1+β12gt2+β13gt3+...)
    ∑i=0∞β1i=11−β1\sum_{i=0}^{\infin}\beta^i_1=\frac{1}{1-\beta_1}i=0β1i=1β11
    由于初始项受初始值为0的影响较大,所以进行偏差修正,同理,这样设计的原因是有限项等比数列和公式∑i=0tβ1i=1−β1t1−β1\sum_{i=0}^{t}\beta^i_1=\frac{1-\beta_1^t}{1-\beta_1}i=0tβ1i=1β11β1t
    mt^=mt1−β1t,vt^=vt1−β2t\hat{m_t}=\frac{m_t}{1-\beta_1^t},\hat{v_t}=\frac{v_t}{1-\beta_2^t}mt^=1β1tmt,vt^=1β2tvt 例如,当t=1t=1t=1时:m^1=m11−β11=(1−β1)g11−β1=g1\hat{m}_1=\frac{m_1}{1-\beta_1^1}=\frac{(1-\beta_1)g_1}{1-\beta_1}=g_1m^1=1β11m1=1β1(1β1)g1=g1
    最后进行参数更新:
    θ=θt−1−ηv^t+ϵ⋅m^t\theta=\theta_{t-1}-\frac{\eta}{\sqrt{\hat{v}_t}+\epsilon}·\hat{m}_tθ=θt1v^t+ϵηm^t最后贴一个论文原文算法部分:
    请添加图片描述

http://www.xdnf.cn/news/16310.html

相关文章:

  • Spring MVC设计精粹:源码级架构解析与实践指南
  • AI Coding IDE 介绍:Cursor 的入门指南
  • 深度学习计算(深度学习-李沐-学习笔记)
  • Python 程序设计讲义(23):循环结构——循环控制语句 break 与 continue
  • 【笔记】Einstein关系式 D = ukBT 的推导与应用研究
  • 【自动化运维神器Ansible】Ansible常用模块之hostname模块详解
  • Java面试实战:企业级性能优化与JVM调优全解析
  • 【编号444】雅鲁藏布江(上中下)游8级水系湖泊数据合集
  • cacti漏洞CVE-2022-46169的复现
  • Java:采用mybatis+pagehealper优雅的实现分页功能
  • 如何筛选适合自己阅读的文献?高效文献调研流程?
  • 【C++高效编程】STL queue深度剖析:从底层原理到高级应用
  • FastAPI入门:安装、Pydantic、并发和并行
  • 嵌入式硬件篇---有线串口通信问题解决
  • 使用Clion开发STM32(Dap调试)
  • Android WorkManager 详解:高效管理后台任务
  • hot100-每日温度
  • Python爬虫实战:诗词名句网《三国演义》全集
  • obd运维OceanBase数据库的常见场景
  • 0基础法考随手笔记 03(刑诉05 刑事证据与证明+06 强制措施)
  • 【Canvas技法】绘制正N角星
  • 机器学习的工作流程
  • Windows 平台源码部署 Dify教程(不依赖 Docker)
  • 手写PPO_clip(FrozenLake环境)
  • 【LeetCode 热题 100】79. 单词搜索——回溯
  • 电子电气架构 --- 车载软件交样评审流程
  • Java面试题及详细答案120道之(041-060)
  • 排序算法,咕咕咕
  • 进制定义与转换详解
  • vcpkg如何交叉编译