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

大模型算法面试笔记——常用优化器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.lryc.cn/news/601745.html

相关文章:

  • Java 代理机制详解:从静态代理到动态代理,彻底掌握代理模式的原理与实战
  • 雪花算法原理深度解析
  • 【0基础PS】PS工具详解--选择工具--快速选择工具
  • 【n8n教程笔记——工作流Workflow】文本课程(第一阶段)——5.4 计算预订订单数量和总金额 (Calculating booked orders)
  • 使用Python,OpenCV,K-Means聚类查找图像中最主要的颜色
  • Unity Catalog与Apache Iceberg如何重塑Data+AI时代的企业数据架构
  • 【LeetCode 热题 100】35. 搜索插入位置——二分查找(左闭右开)
  • 高格办公空间:以 “空间为基,服务为翼”,重塑办公场景生态
  • 【语义分割】记录2:yolo系列
  • libomxil-bellagio移植到OpenHarmony
  • java小白闯关记第一天(两个数相加)
  • Python-初学openCV——图像预处理(三)
  • XSS利用
  • Web-Machine-N7靶机攻略
  • 文件权限标记机制在知识安全共享中的应用实践
  • JavaEE初阶第十二期:解锁多线程,从 “单车道” 到 “高速公路” 的编程升级(十)
  • C++学习(线程相关)
  • 05 - spring security权限控制
  • Java Ai(day04)
  • [Linux入门] Linux 远程访问及控制全解析:从入门到实战
  • 【工具】python汇总发票(含源码)
  • InfluxDB 与 MQTT 协议集成实践(二)
  • Linux网络-------2.应⽤层⾃定义协议与序列化
  • 基于深度学习的图像分割:使用DeepLabv3实现高效分割
  • 【C语言网络编程】HTTP 客户端请求(基于 Socket 的完整实现)
  • 程序代码篇---python向http界面发送数据
  • 【QT入门到晋级】window opencv安装及引入qtcreator(包含两种qt编译器:MSVC和MinGW)
  • 字节前端面试知识点总结
  • 应对反爬机制的具体方法与策略
  • 《 接口日志与异常处理统一设计:AOP与全局异常捕获》