Accurate, Large Minibatch SGD: Training ImageNet in 1 Hour阅读笔记


原文链接

一、论文简介

最近在学习《Accurate, Large Minibatch SGD: Training ImageNet in 1 Hour》,论文中主要提出了一个线性缩放原则用来设置参数,并且应用此原则将8个GPU扩展到256个。提出了四个remark(此描述来自于原文)。并做了大量的实验。本文将按照自己的理解来简单的介绍一下上述内容。

二、线性缩放和remake

2.1线性缩放原则

1.在同样数量的GPU上进行参数的设置
Linear Scaling Rule: When the minibatch size is
multiplied by k, multiply the learning rate by k.

线性缩放原则:当minibatch size 乘以k时,学习率乘以k

2.在不同数量GPU上进行参数的设置
自己的GPU数量是n1
所使用代码的原GPU数量是n2,学习率为η2
自己的学习率计算为:
lr=n1/n2*η2

2.2四个remake

这部分内容将会按照论文的写作顺序
1.首先我们来回顾一下SGD
在这里插入图片描述
其中w表示weight,X是有标签的训练数据,l(x,w)是loss
在这里插入图片描述
其中B是从X中的一个minibatch取样,n=|B|是minibatch的大小,η是学习率,t代表迭代指数,并且现在的SGD不使用momentum(动量)

我们的目标是在保持训练和泛化精度的同时,使用大的minibatches代替小的minibatches。 这对分布式学习特别感兴趣,因为它可以允许我们使用简单的数据并行性扩展到多个workers,而不减少每个per-worker的工作量,也不牺牲模型的准确性。 正如我们将在综合实验中显示的那样,我们发现学习率缩放规则对于广泛的minibatch size是惊人的有效:
(worker即GPU)
在这里插入图片描述
我们对线性缩放规则以及为什么它可能是有效的进行了非正式的讨论。
在这里插入图片描述
在上述前提下,根据公式(2),在学习率为η的,SGD经过k次迭代,minibatch size为kn时,有:
在这里插入图片描述
若采取一个单一的步骤:
large minibatchUjBj 的size为kn,学习率为ηˆ
在这里插入图片描述
此时
在这里插入图片描述
不太可能,但是如果设
在这里插入图片描述

(在j<k的情况下)
同时设置在这里插入图片描述
那么我们通过计算可以得到:
在这里插入图片描述
那么从小到大的minibatch的更新将是近似的
若上述假设为真,那么只有我们设置
在这里插入图片描述
这两个更新才是近似的。
至少在两种情况下在这里插入图片描述
不会成立
1.在初始化训练中,网络快速变化时
2.minibatch size不能无限缩放,(虽然结果对于大范围的尺寸是稳定的,但超过一定的点精度会迅速下降,如图1)
在这里插入图片描述
当网络迅速变化时,线性缩放规则会崩溃,这种情况通常发生在训练的早期阶段,在此我们使用了warmup(在训练开始时使用较少侵略性的学习率的策略)
使用持续warmup,在前几个阶段使用低且恒定的学习率,但是发现恒定的warmup无法解决问题,并且从低学习率warmup阶段的过渡会导致 training error to spike。因此基于warmup提出了Gradual warmup,即学习率从小到大的变化,从而避免学习率的突然增大,达到在训练开始时健康的收敛的目的,large minibatch size为kn,学习率为η,且学习率在之后的迭代中逐步递增,使学习率在设置的迭代次数之后达到ηˆ = kη(论文中使用的是五次迭代)
large minibatches的batch normalization
BN沿着minibatch的维度计算统计数据,这破坏了每个样本损失之间的独立性,当BN被执行并在样本之间计算激活函数时,公式(1)和(2)并不适用,则训练损失L(w)变为:
在这里插入图片描述
首先我们取在这里插入图片描述
表示单个样本x 的损失
在这里插入图片描述
使用BN,训练集可以被认为包含从原始训练集X中提取的大小为n 的不同子集,我们将其表示为在这里插入图片描述
如果我们在Xn中将B看作是一个“单个样本”,那么每个单个样本B的损失是独立计算的。计算BN统计量的最小块大小n是损失的关键组成部分:如果per-worker minibatch 样本大小n被更改,则更改优化的底层损失函数L。 更具体地说,由不同n的BN计算的均值/方差统计量表现出不同水平的随机变化。在分布式(和多GPU)训练的情况下,如果per-worker的样本大小n保持固定,并且总的最小样本大小为kn, 它可以被看作是k个样本的minibatch,每个样本Bj独立地从Xn中选择, 因此,潜在的损失函数是不变的。在此观点下,在BN设置后看到(3)和(4)变为:
在这里插入图片描述
我们设置ηˆ=kη当我们改变workers数量k时,我们保持per-worker样本大小n不变。
分布式SGD的缺陷和微妙之处
在实践中,分布式实现有许多微妙之处。 许多常见的实现错误改变了超参数的定义,导致了训练但其误差可能高于预期的模型,并且这些问题可能很难发现。 虽然下面的评论是直截了当的,但重要的是要明确考虑忠实地实现底层求解器。
Weight decay:
公式(1)中的样本损失可以改写为在这里插入图片描述
在这里插入图片描述
权重上与样本无关的L2正则化,ε(x,w)是一个与样本相关的项,如交叉熵损失。
因此公式(2)中的SGD可以更新为
在这里插入图片描述
在实践中,通常只用反向传播计算与样本相关的项在这里插入图片描述
λwt是单独计算的,并添加到由ε(x,wt)贡献的聚合梯度中。
如果没有权重衰减项,则有许多等效的方法来缩放学习速率,包括缩放项ε(x,wt)。然而,从公式(8)中可以看出情况并非如此, 我们在以下评论中总结了这些意见:
在这里插入图片描述
缩放交叉熵损失不等于缩放学习率
动量修正:
动量SGD是公式(2)中普通SGD的一种常见变体, 动量SGD的参考实现有以下形式:在这里插入图片描述
m表示动量衰减因子 u表示更新张量
一个流行的变体将学习速率η吸收到更新张量中。 用vt代替公式(9)中的ηut产率:在这里插入图片描述
我们将η固定,公式(9)与公式(10)等价,v应更新为在这里插入图片描述
在这里插入图片描述
表示动量修正
当ηt+1 >> ηt,这对稳定训练很重要,否则vt太小,导致不稳定(对于ηt+1 < ηt,动量校正不是那么关键)。 由此引出我们的第二句话:
在这里插入图片描述
若使用公式(10),则在改变学习率之后应使用动量校正。

梯度聚集:
对于k个workers,每个都有一个尺寸为n的minibatch,依据公式(4),根据在这里插入图片描述
必须在整组kn上执行梯度聚集
损失值通道常被用来计算其本地P输入的平均损失,这相当于计算每个per-worker的损失
在这里插入图片描述
因此,正确的聚合需要平均k梯度,才能恢复缺失的 1/k因子,将 1/k 吸收到损失中,只需对损失相对于其输入梯度进行缩放。我们总结如下:在这里插入图片描述
将每个per-worker的损失归一化为总的minibatch size kn,而不是per-worker的size n。
数据洗牌:
SGD通常被分析为一个以替换方式随机洗牌的过程。 为确保k个workers在一个epoch内所处理的样本来自训练集的单一一致随机洗牌,对每个epoch,我们都使用一个随机洗牌,他被划分为k个部分,每个部分由k个workers之一处理。若在多个worker中不能正确使用数据洗牌,可能导致明显不同的行为,这可能会污染结果和结论,综上:在这里插入图片描述
标记4:使用单个随机洗牌的训练数据(每个epoch),将其划分为k个worker

三、总结

刚刚开始看论文,还没有形成自己看论文和记笔记的方法,文章中的英文部分取自原文。因为刚刚开始阅读英文的论文,对于许多专业性名词的表述可能不是那么的准确,如果有需要可以查看文章开头部分的论文链接。本篇文章只表述了关于线性缩放规则和4个remake,实验部分和NCCL(nvidia集体通讯库)部分请查看原论文。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值