HarmonyOS开发者限时福利来啦!最高10w+现金激励等你拿~ 了解详情
写点什么

别用大批量 mini-batch 训练神经网络,用局部 SGD!

  • 2018-09-04
  • 本文字数:4889 字

    阅读完需:约 16 分钟



介绍

随机梯度下降(SGD)由于其极高的效率,成为目前大多数机器学习应用中最常见的训练方法。在考虑计算效率时,mini-batch SGD 同时计算多个随机梯度,似乎不符合计算效率的要求。但是 mini-batch SGD 可以在不同网络之间并行化,所以它是现代分布式深度学习应用的更好选择。有以下两个原因:(1)mini-batch SGD 可以利用在 GPU 上的局部计算并行性;(2)降低参数更新频率有助于减轻不同设备间的通信瓶颈,这对于大型模型的分布式设置是十分重要的。

目前有些方法为了减少训练时间,使用大批量的 SGD。但是这一选择是错误的,因为它没有正确考虑设备的局部并行化以及设备间的通信效率。尤其是当设备的数量增加时,每台设备的并行化程度会严重约束通信效率。

为了解决这个问题,我们提出在每个网络上使用局部 SGD 的一种新变体。局部 SGD 在几次迭代后(无通信)对网络的平均来更新参数。我们发现,调整通信间隔中的迭代次数可以成功地将局部并行性与通信延迟分离。

我们进一步将该想法推广到去中心化和异质的系统上。如下图所示的层次化网络结构推动了局部 SGD 的层次化扩展。



图 1 数据中心某集群的层次化网络结构示意图。

除此之外,端用户的设备,例如移动手机,组成了巨大的异质网络。在这里,机器学习模型的分布式计算和数据局部训练具有极大的优势。

论文贡献

我们提出了一个新的局部 SGD 的层次化扩展训练框架,进一步提高了局部 SGD 对实际应用中异质分布系统的适应性。对于实际情况下多服务器或数据中心的训练,层次结构的局部 SGD 比局部 SGD 和 mini-batch SGD 均提供了更好的表现性能,尤其是在达到同样准确率的情况下,层次结构的 SGD 提高了通信效率。

我们在多个计算机视觉模型上进行了局部 SGD 训练方法的实证研究,实验显示了该方法相比于 mini-batch SGD 有明显优势。结果显示局部 SGD 在保证预测准确率的前提下大大降低了通信需求。在 ImageNet 上,局部 SGD 的表现超出了现有的大批量训练方法约 1.5 倍。

分布式训练

我们主要考虑标准的求和结构的优化问题:



其中 w 是模型(神经网络)的参数,fi 是第 i 个训练样本的损失函数。

Mini-batch SGD 表达式为:



在分布式设置中,数据样本被划分到 K 个设备上,每个设备只能访问局部的训练数据。在这种情况下的 mini-batch SGD 算法表达式为:



这里第 k 个设备的 mini-batch 来自本地数据,这 K 个设备并行计算梯度,然后通过平均来同步局部梯度。

局部 SGD

与 mini-batch SGD 相比,局部 SGD 先在每个设备上进行局部的序列更新,然后累积 K 个设备之间的参数更新,如下图所示。



图 2 一轮局部 SGD(左)与一次 mini-batch SGD(右)对比。每个设置中批尺寸 B_loc 均为 2,对于局部 SGD,进行 H=3 次局部迭代。局部参数更新由红色箭头表示,而全局平均(同步)由紫色箭头表示。

每个网络 k 反复地从局部数据中提取固定数量的样本,批尺寸为 B_loc,然后进行 H 次局部参数更新,在此之后再与其他设备进行全局参数累积。因此,每一次同步(通信),局部 SGD 在每一台设备上已经访问了 B_glob=H x B_loc 个训练样本(亦为梯度计算次数)。

一轮局部 SGD 可以描述为:



其中表示设备 k 上的局部模型在 t 次全局同步以及 h 次局部更新之后的参数。在 H 次局部更新后,同步的全局模型通过平均 K 个模型得到:



层次化局部 SGD

实际的系统都会有不同的通信带宽,因此我们提出将局部 SGD 部署在不同层级上,使之适应相应层级的计算能力与通信效率的平衡。层次化局部 SGD 在系统适应性和表现性能上均具有显著优势。

下图是层次化局部 SGD 的示意图:



图 3 层次化局部 SGD 示意图。设批尺寸 B_loc=2,局部迭代次数为 H=3,区块迭代次数 H_b=2。局部参数更新用红色箭头表示,而区块和全局同步分别用紫色和黑色箭头表示。

我们以 GPU 计算集群为例,将大量 GPU 成组分布于几个机器上,将每组称为一个 GPU 区块。层次化的局部 SGD 连续更新每块 GPU 上的局部模型,在 H 次局部更新之后,会在 GPU 区块内部进行一次快速同步。在外层,在 H_b 次区块更新后,会对所有的 GPU 区块进行全局的同步。完整的过程可以表达如下:



实验结果

在这一部分,我们通过实验分析对比 mini-batch SGD 和我们提出的层次化局部 SGD 的性能。

数据集

  • CIFAR-10/100。训练集包含 50K 张彩色图像,测试集包含 10K 张彩色图像,大小均为 32 x 32,分别具有 10 个和 100 个类别标签。我们采用标准数据增强方法和预处理方法处理数据集。
  • ImageNet。ILSVRC2012 图像分类数据集包含 128 百万张训练图像,50K 张验证图像,具有 1000 个类别标签。网络输入图像大小为 224 x 224。

模型选择

我们用 ResNet-20 来测试(层次化)局部 SGD 在 CIFAR-10/100 上的表现,然后用 ResNet-50 来测试(层次化)局部 SGD 在 ImageNet 上的准确率和可扩展性。我们也用 DenseNet 和 WideResNet 进行了实验,验证局部 SGD 对不同模型的泛化能力。

CIFAR-10/100 实验

  • 局部 SGD 训练

对于 CIFAR-10,我们在 2 个服务器上进行局部 SGD 训练,每个服务器有 1 块 GPU。

保证准确率的同时提高通信效率



图 4 通过局部 SGD 在 CIFAR-10 数据集上训练 ResNet-20。批尺寸 B_loc=128,局部更新次数从 1 到 32。

从图 4 中可以看出,局部 SGD 在保证了准确率的同时,极大提高了通信效率,并且具有更快的收敛速度。在实验中,mini-batch SGD 是局部 SGD 的一种特殊形式,(局部迭代次数)H=1。从图 4(a) 可以看出,对于同样数量的样本,局部 SGD 缓解了通信瓶颈的问题。图 4(b) 给出了局部 SGD 对于整体训练时间的影响:局部迭代次数 H 越大,影响越大,H=32 时局部 SGD 至少比 mini-batch SGD 快 3 倍。从图 4(c) 中可以看出,对于不同的 H 值,最终的准确率会趋于稳定,并且与测试准确率并无大的差异。

比“大批量训练”更好的泛化能力



表 1 通过局部 SGD 在 CIFAR-10 数据集上训练 ResNet-20。给出了固定访问数据量 B_glob 时,mini-batch SGD 和局部 SGD 的 top-1 测试准确率。

从表 1 中可以看出当访问同样的样本数时,局部 SGD 比 mini-batch SGD 具有更好的泛化能力。大批量训练方法提出了很多技巧来克服收敛问题,包括改变学习率和逐渐开始。Mini-batch SGD 如果采用大批量训练方法仍然会有很多问题,而局部 SGD 通过局部迭代次数很自然的解决了这个问题。

  • 层次化的局部 SGD 训练

下面我们在分布式异质系统上测试我们提出的训练方法。我们模仿真实情况的设定,即计算设备(GPU)在不同的服务器上的集群,网络带宽限制了大型模型更新所需的通信效率。



表 2 随机 SGD 在 CIFAR-10 数据集上训练 ResNet-20 模型(5 x 2GPU 集群)。在局部批尺寸 B_loc 和区块迭代次数 H_b 固定的情况下,我们给出了 H 从 1 到 1024,训练时间的变化情况。

训练时间 vs 局部迭代步数

表 2 给出了局部 SGD 与训练时间的关系。通信需求主要来自于 5 个节点的全局同步,每个节点有 2 个 GPU。我们发现过大的局部更新迭代次数甚至会降低局部更新带来的通信优势。这一性能降级或许是由于独立的局部过程增加了同步时间。

层次化局部 SGD 对网络延迟的高容忍度



图 5 层次化局部 SGD 在 CIFAR-10 数据集上训练 ResNet-20 模型(2 x 2GPU 集群)表现性能。局部迭代次数 H=2(a)训练准确率 vs 时间(b)每次全局同步有 1 秒延迟情况下的训练准确率 vs 时间(c)每次全局同步有 50 秒延迟情况下的训练准确率 vs 时间.

层次化的局部 SGD 对网络延迟具有鲁棒性。例如,对于固定的 H=2,通过减少在所有模型上进行全局同步的次数,我们可以减少一定的训练时间,如图 5(a) 所示。图 5(b) 进一步展示了网络对于较慢的通信的影响,其中每个全局通信都增加了 1 秒的延时。图 5(c) 显示增加区块内迭代次数能够克服通信瓶颈的问题,而不会对表现造成影响。

层次化局部 SGD 能够进行更大的扩展并且具有更好的表现



表 3 层次化局部 SGD 在 CIFAR-10 数据集上训练 ResNet-20 模型(10GPU Kubernetes 集群)表现性能。

表 3 对比了 mini-batch SGD 和层次化的局部 SGD。我们可以发现,具有足够区块迭代次数的层次化局部 SGD 可以有效缓解准确率降低的问题。并且,内节点同步次数更多的层次化局部 SGD 的表现也超过了局部 SGD。结合表 2 和表 3 可以发现,层次化的局部 SGD 的表现超过了局部 SGD 和 mini-batch SGD 的训练速度和模型表现。

ImageNet-1K 实验



图 6 局部 SGD 在 ImageNet-1k 数据集上训练 ResNet-50 模型(15 x 2GPU 集群)表现性能。

图 6 显示我们可以通过局部 SGD 在 15 x 2GPU 集群上有效训练(快 1.5 倍)ResNet-50。在达到同样准确率时,局部 SGD 只需要很少的时间和同步次数,节省了计算量,并且提高了通信效率。

结论

在这篇文章中,我们利用局部 SGD 的思想,将其扩展至去中心化和异质的系统环境。我们提出了层次化的局部 SGD,能够有效适应于实际情况中的异质系统。此外,我们实证研究了局部 SGD 在不同的计算机视觉模型上的表现,实验显示算法在整体性能和通信效率方面均有显著提高。

查看论文原文: Don't Use Large Mini-Batches, Use Local SGD

感谢蔡芳芳对本文的审校。

2018-09-04 18:197738
用户头像

发布了 52 篇内容, 共 29.8 次阅读, 收获喜欢 73 次。

关注

评论

发布
暂无评论
发现更多内容

JNI不正确的信号处理导致 JVM 崩溃问题分析

毕昇JDK社区

自媒体培训行业水很深,入行新人要谨慎选择

石头IT视角

Java环境配置:Eclipse简单上手

Bob

Java eclipse 8月日更

prometheus 语法

Rubble

Prometheus 8月日更

Vue进阶(二十五):<component>实现动态组件

No Silver Bullet

Vue 动态组件 8月日更

小手哆嗦一下,就能用 Python Django 实现一个微型博客系统

梦想橡皮擦

8月日更

零代码上线小布对话技能:技能平台的实践与思考

OPPO小布助手

人工智能 自然语言处理 算法 零代码 语义理解

Linux之traceroute命令

入门小站

Linux

失败的小项目

箭上有毒

生活随想 8月日更

失败的小项目-Tiktok搬运

箭上有毒

8月日更

电商秒杀系统架构设计

arctec

Regan Yue带你一起学习微软AZ-900认证的有关知识「 第Ⅱ章」

Regan Yue

云计算 微软 后端 8月日更

手撸二叉树之数据流中的第 K 大元素

HelloWorld杰少

数据结构与算法 8月日更

netty系列之:使用POJO替代buf

程序那些事

Java Netty nio 程序那些事

架构实战营模块 4 作业

zlz

VSCode July 2021 (version 1.59) 更新

IT蜗壳-Tango

8月日更

感恩架构实战营学习的一路陪伴、不断进度!

arctec

HashMap面试中的12个点

4ye

Java 面试 后端 hashmap 8月日更

Node.js 实现存储服务的下载功能【包含前后端代码】

liuzhen007

8月日更

【Flutter 专题】72 图解极简自定义跑马灯 ACEMarquee

阿策小和尚

Flutter 小菜 0 基础学习 Flutter Android 小菜鸟 8月日更

架构实战营模块 5 作业

zlz

Nvm 安装新的 nodejs 版本

HoneyMoose

Windows 中 Node.js 中 nvm 的安装配置和使用

HoneyMoose

SpringBoot 日志配置(logback)

xcbeyond

springboot logback 8月日更

Linux Docker 中安装 Jenkins 并实现 Maven 工程自动化部署

陈皮的JavaLib

Java maven jenkins 8月日更

贡献数字力量 浪潮云洲赋能广州箱包皮具产业集群

工业互联网

在线圆周率查询下载工具

入门小站

工具

Habor 入门指南

Se7en

从0开始的TypeScriptの四:接口Interfaces · 上

空城机

JavaScript typescript 大前端 8月日更

【Vue2.x 源码学习】第三十二篇 - diff算法-乱序比对

Brave

源码 vue2 8月日更

Vue进阶(二十六):详解 router.push()

No Silver Bullet

Vue router 8月日更

别用大批量mini-batch训练神经网络,用局部SGD!_语言 & 开发_马卓奇_InfoQ精选文章