没有合适的资源?快使用搜索试试~ 我知道了~
使用Kronecker-Factored近似曲率的大规模分布式二阶优化方法用于深度卷积神经网络
Kazuki Osawa1Yohei Tsuji1,5Yuichiro Ueno1Akira Naruse3Rio Yokota2,5Satoshi Matsuoka4,1123590使用Kronecker-Factored近似曲率的大规模分布式二阶优化方法用于深度卷积神经网络01 东京工业大学计算机科学学院 2 东京工业大学全球科学信息与计算中心 3 NVIDIA 4 RIKEN计算科学中心 5AIST-Tokyo Tech RWBC-OIL, AIST { oosawa.k.ad, tsuji.y.ae, ueno.y.ai } @m.titech.ac.jp anaruse@nvidia.com,rioyokota@gsic.titech.ac.jp, matsu@is.titech.ac.jp0摘要0大规模分布式训练深度神经网络受到有效小批量大小增加而导致的泛化差距的困扰。以往的方法尝试通过在不同的epoch和层上变化学习率和批量大小,或者对批量归一化进行一些特殊修改来解决这个问题。我们提出了一种使用二阶优化方法的替代方法,该方法具有与一阶方法相似的泛化能力,但收敛速度更快,可以处理更大的小批量。为了在高度优化的一阶方法可作为参考的基准测试上测试我们的方法,我们在ImageNet上训练了ResNet-50。我们在小批量大小小于16,384的情况下收敛到75%的Top-1验证准确率,并且即使在小批量大小为131,072的情况下,也只用了978次迭代就达到了75%的准确率。01. 引言0随着深度神经网络模型的规模和训练数据的快速增长,对分布式并行计算的需求也在增加。一种常见的方法是使用数据并行方法,即将数据分布在不同的进程中,同时在这些进程中复制模型。当每个进程的小批量大小固定时,为了增加计算与通信的比例,整个系统的有效小批量大小与进程数量成比例增长。当小批量大小增加到一定程度时,验证准确率开始下降。这种由大型小批量大小引起的泛化差距已经被发现。0已经对各种模型和数据集进行了广泛研究[23]。Hoffer等人将这种泛化差距归因于更新次数有限,并建议进行更长时间的训练[13]。这导致了一些策略,例如将学习率与小批量大小成比例地缩放,同时使用前几个epoch逐渐升高学习率[24]。这些方法使得可以使用8K的小批量大小进行训练,其中ImageNet [7]与ResNet-50[12]可以在90个epoch内训练,以在60分钟内达到76.3%的Top-1验证准确率[9]。结合这种学习率缩放与其他技术,如RMSprop预热、无移动平均值的批量归一化和缓慢启动的学习率调度,Akiba等人能够使用32K的小批量大小训练相同的数据集和模型,在15分钟内达到74.9%的准确率[3]。0更复杂的学习率调整方法被提出,例如LARS[29],其中通过将权重和梯度的层内范数之比进行归一化,为每个层使用不同的学习率。这使得在不使用特殊修改的情况下,可以使用32K的小批量大小进行训练,在14分钟(64个epoch)内达到74.9%的准确率[29]。有报道称,将LARS与对批量归一化进行反直觉的修改相结合,即使对于65K的小批量大小,也可以达到75.8%的准确率[15]。0使用小批量大小来促进早期收敛,然后逐渐增加批量大小是另一种成功的方法[8,24]。使用这种自适应批量大小方法,Mikami等人能够在122秒内以75.3%的准确率进行训练。还提出了小批量的分层同步方法[18],但此类方法尚未进行大规模测试。4,0963510,94875.1 ± 0.09 %8,192355,43475.2 ± 0.05 %16,384352,73775.2 ± 0.03 %32,768451,76075.3 ± 0.13 %65,536601,17375.0 ± 0.09 %131,07210097875.0 ± 0.06 %123600据作者所知,目前还没有研究涉及到如此大规模mini-batch训练的问题。在本研究中,我们采用了更加数学严谨的方法来解决大mini-batch问题,即使用二阶优化方法。我们关注的是对于大mini-batch训练,每个mini-batch变得更加统计稳定,并且进入了二阶优化方法可能展示出一些优势的领域。我们方法的另一个独特之处在于我们可以相对准确地近似Hessian矩阵,与其他二阶方法相比。与使用非常粗糙的Hessian近似方法(如TONGA [17]、Hessianfree方法[19])不同,我们采用了Kronecker-FactoredApproximateCurvature(K-FAC)方法[21]。K-FAC的两个主要特点是它比一阶随机梯度下降(SGD)方法收敛更快,并且可以容忍相对较大的mini-batch大小而无需任何特殊修改。K-FAC已经成功应用于卷积神经网络[10]、ImageNet的分布式内存训练[5]、循环神经网络[20]、贝叶斯深度学习[30]和强化学习[27]。我们的贡献包括:0•我们使用同步的全工作节点方案实现了分布式K-FAC优化器。我们使用半精度浮点数进行计算,并利用Kronecker因子的对称性来减少开销。0•我们首次展示了与高度优化的SGD相比,二阶优化方法可以达到类似的泛化能力,通过在ImageNet上训练ResNet-50作为基准。我们在小于16,384的mini-batch大小下,在35个epoch内收敛到了75%的Top-1验证准确率,并且即使在mini-batch大小为131,072的情况下,也只需要978个迭代(表1)就能达到75%的准确率。0•我们展示了在几百次迭代后,我们可以减少更新K-FAC的Fisher矩阵的频率。通过这样做,我们能够减少K-FAC的开销。我们使用1024个Tesla V100GPU在10分钟内训练了ImageNet上的ResNet-50,达到了74.9%的Top-1准确率(表2)。0• 我们展示了BatchNormalization层[14]的Fisher矩阵可以近似为对角矩阵,从而进一步减少计算和内存消耗。02. 相关工作0关于大规模分布式训练深度神经网络,使用二阶方法的研究非常少。在较小的规模上,有一些研究0表1. 使用K-FAC训练ImageNet上的ResNet-50的训练epoch(迭代次数)和Top-1单裁剪验证准确率。0Mini-batch大小 Epoch 迭代次数 准确率0之前的研究使用K-FAC在ImageNet上训练ResNet-50[5]。然而,他们所使用的SGD并没有展示出最先进的Top-1验证准确率(仅约为70%),因此从结果来看,K-FAC相对于SGD的优势并不明显。在本研究中,我们将Top-1验证准确率与介绍中提到的大mini-batch的最先进的SGD方法进行了比较(表2)。之前的研究使用K-FAC在ImageNet上训练ResNet-50[5]也没有考虑到大mini-batch,并且只使用了每个GPU上512个样本的mini-batch大小进行训练。相反,本研究使用了高达131,072的mini-batch大小,相当于4096个GPU上每个GPU上32个样本,并且我们能够达到更高的Top-1验证准确率,达到了75%。需要注意的是,通过在更新参数之前在多个迭代中累积梯度,也可以实现这样的大mini-batch大小,这可以模拟在许多GPU上执行的行为,而无需实际在许多GPU上运行。之前使用K-FAC的研究也因为通信开销大而受到影响,因为他们在TensorFlow[1]中实现了他们的K-FAC,并使用了参数服务器方法。由于参数服务器要求所有工作节点发送梯度并从参数服务器接收最新的模型参数,因此参数服务器在大规模情况下成为一个巨大的通信瓶颈。我们的实现使用了MPI/NCCL集体通信来实现分散式方法。虽然像Horovod这样的软件可以缓解参数服务器的问题,但分散式方法在高性能计算中已经被使用了很长时间,并且已知可以扩展到数千个GPU而无需修改。03. 分布式K-FAC03.1. 符号和背景0在本文中,我们使用E[∙]表示在小批量{ (x, y)}中样本之间的均值,并计算交叉熵损失如下:0L(θ) = E[−log p(y|x;θ)]. (1)−1 ⊗ A(t)ℓ−1123610表2. ImageNet上ResNet-50的训练迭代次数(时间)和单裁剪验证准确率的相关工作报告。0硬件 软件 Mini-batch大小 优化器 迭代次数 时间 准确率0Goyal等人[9] Tesla P100 × 256 Caffe2 8,192 SGD 14,076 1小时 76.3% You等人[29] KNL × 2048 Intel Caffe 32,768 SGD 3,51920分钟 75.4% Akiba等人[3] Tesla P100 × 1024 Chainer 32,768 RMSprop/SGD 3,519 15分钟 74.9% You等人[29] KNL × 2048Intel Caffe 32,768 SGD 2,503 14分钟 74.9% Jia等人[15] Tesla P40 × 2048 TensorFlow 65,536 SGD 1,800 6.6分钟 75.8%Ying等人[28] TPU v3 × 1024 TensorFlow 32,768 SGD 3,519 2.2分钟 76.3% Mikami等人[22] Tesla V100 × 3456 NNL 55,296SGD 2,086 2.0分钟 75.3%0本文(第5.4节)Tesla V100 × 1024 Chainer 32,768 K-FAC 1,760 10分钟 74.9% 本文(第5.3节)- Chainer 131,072 K-FAC 978 -75.0%0其中x, y是输入和标签,p(y|x;θ)是由参数θ ∈RN的概率模型使用深度神经网络计算的似然。0SGD的更新规则。对于标准的一阶随机梯度下降(SGD),第ℓ层的参数wℓ ∈ RNℓ根据损失函数的梯度进行更新:0w(t+1)ℓ ← w(t)ℓ − η�L(t)ℓ. (2)0其中η > 0是学习率,�Lℓ ∈ RNℓ表示wℓ的损失函数梯度。0Fisher信息矩阵。概率模型的Fisher信息矩阵(FIM)通过以下方式估计:0Fθ = E[�log p(y|x;θ)�log p(y|x;θ)T] ∈ RN×N. (3)0严格来说,Fθ是经验(随机版本的)FIM[21],但为了简洁起见,我们在本文中将该矩阵称为FIM。在深度神经网络的训练中,FIM可以被视为参数空间中的曲率矩阵[4,6,21]。03.2. K-FAC0Kronecker-Factored ApproximateCurvature(K-FAC)[21]是一种用于深度神经网络的二阶优化方法,它基于对FIM的准确且数学严格的近似。K-FAC应用于卷积神经网络的训练,该网络最小化对数似然(例如分类任务)。对于具有L层的深度神经网络的训练,K-FAC将Fθ近似为对角块矩阵:0Fθ ≈ diag(F1, ..., Fℓ, ..., FL). (4)0对角块Fℓ ∈ RNℓ × Nℓ表示具有权重wℓ ∈ RNl(ℓ = 1, ...,L)的第ℓ层的FIM。每个对角块矩阵Fℓ都近似为Kronecker乘积:0Fℓ ≈ Gℓ � Aℓ−1 (ℓ = 1, ..., L). (5)0这被称为Kronecker分解,Gℓ,Aℓ−1被称为Kronecker因子。Gℓ是根据第ℓ层输出的损失梯度计算的,Aℓ−1是根据第ℓ−1层的激活(第ℓ层的输入)计算的[10,21]。Kronecker乘积的逆矩阵通过每个Kronecker因子的逆矩阵的Kronecker乘积来近似:F−1ℓ ≈ (Gℓ � Aℓ−1)−1 = G−1ℓ � A−1ℓ−1. (6)0K-FAC的更新规则。第ℓ层的参数wℓ的更新如下:0G(t)ℓ = � G(t)ℓ0−1 �L(t)ℓ, (7)0w(t+1)ℓ ← w(t)ℓ − ηG(t)ℓ. (8)0其中Gℓ是预处理梯度。03.3. 我们的设计0由于额外计算逆FIM,K-FAC与SGD相比具有相当大的开销。我们设计了一个分布式并行化方案,使得随着进程数量的增加,这种开销减少。此外,我们引入了一种松弛技术来减少FIM的计算量,这在第5.4节中解释。通过这样做,我们能够将K-FAC的开销减少到几乎可以忽略不计的程度。图1显示了我们设计的概述,显示了训练的单个迭代。我们使用术语“阶段”来指代计算的每个阶段,在图的顶部指示。每个框中的变量说明了进程在该阶段计算的内容,例如在第1阶段,每个进程计算激活的Kronecker因子A。第1和第2阶段是前向传播和反向传播,分别计算Kronecker因子Aℓ−1和Gℓ。由于前两个阶段以数据并行的方式计算,每个进程计算所有层的Kronecker因子,但使用不同的小批量。AAACD3icbVDLSsNAFJ34rPUVdelmsChdSElE0GVFRJcV7APaEG6mk3boZBJmJkIJ+QM3/oobF4q4devOv3H6ELT1wMC559zL3HuChDOlHefLWlhcWl5ZLawV1zc2t7btnd2GilNJaJ3EPJatABTlTNC6ZprTViIpRAGnzWBwOfKb91QqFos7PUyoF0FPsJAR0Eby7aNOBLofhNlF7jvH+Ke6zn3XVAICDvjKd3275FScMfA8caekhKao+fZnpxuTNKJCEw5KtV0n0V4GUjPCaV7spIomQAbQo21DBURUedn4nhwfGqWLw1iaJzQeq78nMoiUGkaB6Rztq2a9kfif1051eO5lTCSppoJMPgpTjnWMR+HgLpOUaD40BIhkZldM+iCBaBNh0YTgzp48TxonFdfw29NStTyNo4D20QEqIxedoSq6QTVURwQ9oCf0gl6tR+vZerPeJ60L1nRmD/2B9fEN2JGbJw== AAACD3icbVDLSsNAFJ34rPUVdelmsChdSElE0GVFRJcV7APaEG6mk3boZBJmJkIJ+QM3/oobF4q4devOv3H6ELT1wMC559zL3HuChDOlHefLWlhcWl5ZLawV1zc2t7btnd2GilNJaJ3EPJatABTlTNC6ZprTViIpRAGnzWBwOfKb91QqFos7PUyoF0FPsJAR0Eby7aNOBLofhNlF7jvH+Ke6zn3XVAICDvjKd3275FScMfA8caekhKao+fZnpxuTNKJCEw5KtV0n0V4GUjPCaV7spIomQAbQo21DBURUedn4nhwfGqWLw1iaJzQeq78nMoiUGkaB6Rztq2a9kfif1051eO5lTCSppoJMPgpTjnWMR+HgLpOUaD40BIhkZldM+iCBaBNh0YTgzp48TxonFdfw29NStTyNo4D20QEqIxedoSq6QTVURwQ9oCf0gl6tR+vZerPeJ60L1nRmD/2B9fEN2JGbJw== AAACD3icbVDLSsNAFJ34rPUVdelmsChdSElE0GVFRJcV7APaEG6mk3boZBJmJkIJ+QM3/oobF4q4devOv3H6ELT1wMC559zL3HuChDOlHefLWlhcWl5ZLawV1zc2t7btnd2GilNJaJ3EPJatABTlTNC6ZprTViIpRAGnzWBwOfKb91QqFos7PUyoF0FPsJAR0Eby7aNOBLofhNlF7jvH+Ke6zn3XVAICDvjKd3275FScMfA8caekhKao+fZnpxuTNKJCEw5KtV0n0V4GUjPCaV7spIomQAbQo21DBURUedn4nhwfGqWLw1iaJzQeq78nMoiUGkaB6Rztq2a9kfif1051eO5lTCSppoJMPgpTjnWMR+HgLpOUaD40BIhkZldM+iCBaBNh0YTgzp48TxonFdfw29NStTyNo4D20QEqIxedoSq6QTVURwQ9oCf0gl6tR+vZerPeJ60L1nRmD/2B9fEN2JGbJw== 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
下载后可阅读完整内容,剩余1页未读,立即下载
cpongm
- 粉丝: 5
- 资源: 2万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- Fisher Iris Setosa数据的主成分分析及可视化- Matlab实现
- 深入理解JavaScript类与面向对象编程
- Argspect-0.0.1版本Python包发布与使用说明
- OpenNetAdmin v09.07.15 PHP项目源码下载
- 掌握Node.js: 构建高性能Web服务器与应用程序
- Matlab矢量绘图工具:polarG函数使用详解
- 实现Vue.js中PDF文件的签名显示功能
- 开源项目PSPSolver:资源约束调度问题求解器库
- 探索vwru系统:大众的虚拟现实招聘平台
- 深入理解cJSON:案例与源文件解析
- 多边形扩展算法在MATLAB中的应用与实现
- 用React类组件创建迷你待办事项列表指南
- Python库setuptools-58.5.3助力高效开发
- fmfiles工具:在MATLAB中查找丢失文件并列出错误
- 老枪二级域名系统PHP源码简易版发布
- 探索DOSGUI开源库:C/C++图形界面开发新篇章
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功