码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【炼金术士】BatchSize对网络训练的影响


    文章目录

    • 1 BatchSize对于网络训练的影响
    • 2 调整学习率可以提高大BatchSize的性能
    • 3 实际训练时的建议
      • 3.1 设置初始学习率的方法
      • 3.2 多卡训练时学习率的设置

    参考资料:

    • 【深度学习】Batch Size对神经网络训练的影响
    • 【AI不惑境】学习率和batchsize如何影响模型的性能?
    • 论文:ON LARGE-BATCH TRAINING FOR DEEP LEARNING: GENERALIZATION GAP AND SHARP MINIMA
    • 如何找到最优学习率
    • 论文:Cyclical Learning Rates for Training Neural Networks

    一句话总结:当BatchSize增大k倍时,学习率也要对应增大k倍,以达到同样的泛化效果。

    1 BatchSize对于网络训练的影响

    网络、超参数、训练数据一样的情况下:

    • BatchSize越大,网络训练速度越快;
    • 大BatchSize训练出来的模型,泛化性比小BatchSize训练出来的模型泛化性要差。

    针对BatchSize越大,网络训练速度快这条很好理解,在相同的单位时间内,一次训练的数据越多,网络训练的速度也就越快。那么为什么在条件相同的情况下,大BatchSize训练出来的模型泛化性比小Batch训练出来的模型泛化性要差呢?

    Keskar 等人对小批量和大批量之间的性能差距提出了一种解释:使用小批量的训练倾向于收敛到平坦的极小化,该极小化在极小化的小邻域内仅略有变化,而大批量则收敛到尖锐的极小化,这变化很大。平面minimizers 倾向于更好地泛化,因为它们对训练集和测试集之间的变化更加鲁棒 。
    在这里插入图片描述
    Source: Keskar et al.

    此外,他们发现与大批量训练相比,小批量训练可以找到距离初始权重更远的最小值。他们解释说,小批量训练可能会为训练引入足够的噪声,以退出锐化minimizers 的损失池,而是找到可能更远的平坦minimizers 。

    这个证明非常有意思,已知基于Batch参数更新公式如下:
    θ = θ − α ( 1 B Σ i = 1 B ∇ θ J i ( θ ) ) \theta = \theta - \alpha(\frac{1}{B} \Sigma_{i=1}^{B}\nabla_{\theta}J_i(\theta)) θ=θ−α(B1​Σi=1B​∇θ​Ji​(θ))
    其中B代表BatchSize的大小。假设a,b分别代表batch为1的两次迭代,a+b代表batch为2的一次迭代。

    在这里插入图片描述
    Source: 【深度学习】Batch Size对神经网络训练的影响

    很明显, ∣ a ∣ + ∣ b ∣ ≥ ∣ a + b ∣ |a| + |b| \geq |a+b| ∣a∣+∣b∣≥∣a+b∣的。只有当a和b更新的方向与(a+b)更新的方向一致,且 ∣ a ∣ + ∣ b ∣ = ∣ a + b ∣ |a| + |b| = |a+b| ∣a∣+∣b∣=∣a+b∣时,两次小batch的迭代才等价为一次大batch的迭代。然而这种情况发生的概率非常低。所以可以得出结论:小Batch可以引入更加丰富的梯度信息,使网络有更好的泛化性。

    2 调整学习率可以提高大BatchSize的性能

    从上图可以看出,2轮小Batch的参数更新幅度是要比1次大Batch的更新幅度要大的,为了弥补这种差距,相应的提高大Batch的学习率,就可以使得大Batch与多轮小Batch迭代效果差不多,从而弥补大Batch训练出来的模型泛化性问题。

    实验也证明了这一点:批量大小为 32、64、128 和 256。我们将对批量大小 32 使用 0.01 的基本学习率,并相应地缩放其他批量大小。
    在这里插入图片描述
    Source: 【深度学习】Batch Size对神经网络训练的影响

    事实上,我们发现调整学习率确实消除了小批量和大批量之间的大部分性能差距。现在,批量大小 256 的验证损失为 0.352 而不是 0.395——更接近批量大小 32 的损失 0.345。

    3 实际训练时的建议

    在实际网络训练过程中,BatchSize的设置往往取决于模型的大小和GPU的显存,那么为了提高训练的效率,可以:

    • 最大限度设置BatchSize,使GPU的利用率最高;
    • 在单卡GPU上测试最佳初始学习率;

    3.1 设置初始学习率的方法

    初始的学习率肯定是有一个最优值的,过大则导致模型不收敛,过小则导致模型收敛特别慢或者无法学习,下图展示了不同大小的学习率下模型收敛情况的可能性。
    在这里插入图片描述
    Source: tensorflow loss分析

    首先在单卡GPU上,先将BatchSize拉满,然后通过以下的方式寻找最佳初始学习率。

    Leslie N. Smith 在2015年的一篇论文“Cyclical Learning Rates for Training Neural Networks”中的3.3节描述了一个非常棒的方法来找初始学习率,方法非常简单。首先我们设置一个非常小的初始学习率,比如1e-5,然后在每个batch之后都更新网络,同时增加学习率,统计每个batch计算出的loss。最后我们可以描绘出学习的变化曲线和loss的变化曲线,从中就能够发现最好的学习率。
    关键点:

    • 初始学习率要足够小,并随着迭代次数增加而逐渐增大
    • 选择使loss下降最快的学习率作为最佳初始学习率
      在这里插入图片描述
      Source: 如何找到最优学习率
      从上图可以看出最佳学习初始学习率为0.1。

    3.2 多卡训练时学习率的设置

    上一小节讲述了如何在单卡GPU上寻找最佳初始学习率,如果有多卡GPU同时训练时,就需要遵循线性缩放原则。有多少块GPU同时训练,就意味着BatchSize增大多少倍,那么学习率也要对应增大多少倍。

  • 相关阅读:
    Python Parser 因子计算性能简单测试
    秋招面经第五弹:一家上市小公司二面-大数据开发工程师
    java面试题背不下来怎么办?java面试题总结
    Alexa智能家居构建技能教程(官网版翻译=保姆级)
    Git Flow——项目开发中经典分支管理策略
    typeScript--[es6class类实现继承]
    七 R语言|箱须图、饼图的绘制
    C 与 C++ 的真正区别在哪里?
    FPGA时序约束与分析-简单入门
    pikachu之暴力破解
  • 原文地址:https://blog.csdn.net/kabuto_hui/article/details/138172828
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号