TFSEQ PART III: Batch size大小,优化和泛化

TFSEQ PART III: Batch size大小,优化和泛化

本文作者:追一科技算法工程师 Tony

文章目录

  • **TFSEQ** PART III: Batch size大小,优化和泛化
    • 前言
    • TLDR:分布式训练的 Recipe
    • 1. 机器学习问题的简单拆解
      • 1.1 简单的概率论符号
      • 1.2 机器学习和泛化
      • 1.3 优化的限制
      • 1.4 误差的拆解[[Bottou et al, 2008]](https://papers.nips.cc/paper/3323-the-tradeoffs-of-large-scale-learning.pdf)
      • 1.5 小结和符号的简化
    • 2. 对$R_N(\theta )$的优化: SGD [[Bottou et al, 2018]](https://arxiv.org/abs/1606.04838)
      • 2.1 梯度下降的动机
      • 2.2 梯度估计噪声的控制:Stochastic, Mini-batch Stochastic 和 Full-batch
      • 2.3 噪声下 SGD 的收敛性
      • 2.4 比梯度更好的更新:二阶方法的动机
      • 2.5 调整$R _N(\theta)$的 Lipschitz 常数$L$
      • 2.6 小结
    • 3. Large Batch Training 和 Generalization Gap
      • 3.1 Generalization Gap 提法的由来
      • 3.2 Gap 并不存在:更新量不足
      • 3.3 减少迭代次数:Linear Scaling
      • 3.4 更大的 Batch Size: Layer-wise Adaptive Rate Scaling
      • 3.5 训练噪声和泛化
      • 3.6 小结
    • 4. 总结
    • 5. 参考文献

前言

TFSEQ 这个系列总结了笔者在使用 tensorflow 进行自然语言处理的一些经验和思考。计划写三篇文章:

  1. 分布式训练的方案和效率对比
  2. 序列模型的实现细节
  3. Batch size大小,优化和泛化

此为第三篇。

在介绍完分布式训练后,为了将故事讲完整,本文涉及的内容其实是绕不开的。本文会以综述和简介的方式,将笔者读过的东西串成一条线,希望能为读者提供一些实践中使用的 tricks 的动机。如有事实上的错误,希望能够指出并赐教。

本文由于信息量比较密集,且有部分来回引用,推荐在电脑屏幕上细读。知乎并不支持页内跳转,所以文中引用对应的链接可以直接打开论文的网页。为了方便读者阅读,每个部分结束时都会带上简单的小结。本文重在直观结论,公式和符号的存在是为了更精确地表达概念,所以跳过部分公式也不会造成理解上的困难,文中也并没有太多推导。

TLDR:分布式训练的 Recipe

计算的实现方面:

  • 分布式训练的方案和效率对比: 使用 allreduce 的同步更新。ring-allreduce 是简单的实现,如果集群较大,switch 层级较多,可以根据拓扑结构选择其他 allreduce 算法。为了减少节点异构带来的阻塞,尽量平衡各个计算节点的 workload,在单机多卡的场景下可以构建全局的 data pipeline 来实现。
  • 序列模型的实现细节:为了减少 GPU 因等待数据预处理或者 batch 内长序列计算而浪费的计算资源,可以使用 Tensorflow 的 data pipeline 以及 bucketing 的实现。

算法的设计方面:

  • 本文内容:使用 linear scaling[Goyal et al, 2017] 同时增大 batch size 和 learning rate,以充分利用多节点的计算资源。使用 learning rate warmup[Goyal et al, 2017] 来避免测试效果变差。使用 LARS [You et al, 2017] 来达到更大的 batch size。batch size 的增大受到模型结构的限制。我们可以加入 skip connection 和 batch normalization,以及将模型变宽变浅去缓解这种限制。

1. 机器学习问题的简单拆解

1.1 简单的概率论符号

遵从一般的习惯,我们用大写字母 X X X代表随机变量,小写字母 x x x代表随机变量的特定取值。 X X X的每个取值区间对应了样本空间(sample space)里的一个事件(event)。这里的随机变量可以是一个标量(scalar),也可以是一个向量(vector),这里不做区分。随机变量 X X X的概率分布 P ( X ) P(X) P(X)定义了每个取值区间对应的概率值。

E X [ g ( X ) ] E_{X}[g(X)] EX[g(X)]为随机变量 X X X的函数 g ( X ) g(X) g(X)(也是一个随机变量) 在分布 P ( X ) P(X) P(X)中的期望(均值)。可以认为期望 E X [ g ( X ) ] E_X[g(X)] EX[g(X)]抹去了变量 X X X的随机性,转用一个常量来描述在分布 P ( X ) P(X) P(X)中变量 g ( X ) g(X) g(X)的性质(平均取值/中心点)。

联合概率分布 P ( X , Y ) P(X, Y) P(X,Y)描述了两个随机变量 ( X , Y ) (X,Y) (X,Y)的概率分布。在联合概率分布的基础上可以定义条件概率分布 P ( Y ∣ X ) = P ( X , Y ) P ( X ) P(Y|X) = \frac{P(X,Y)}{P(X)} P(YX)=P(X)P(X,Y),表示给定 X X X的取值后 Y Y Y的概率分布 – 样本空间随着 X X X取值的确定而改变了。在条件概率分布的基础上可以定义条件期望 E Y [ Y ∣ X ] E_Y[Y|X] EY[YX]

1.2 机器学习和泛化

机器学习里最典型的问题是监督学习(Supervised learning):给定输入 X X X,预测输出 Y Y Y。产生输入 X X X和输出 Y Y Y的机制通常用一个联合概率分布 P ( X , Y ) P(X, Y) P(X,Y)描述。给定输入 X X X后, Y Y Y的分布转由条件概率分布 P ( Y ∣ X ) P(Y|X) P(YX)描述。我们通常会使用条件期望 E Y [ Y ∣ X ] E_Y[Y|X] EY[YX]去描述这个分布,这是一个关于 x x x的确定性函数(deterministic function)。

我们通常用一个函数(通常称为 Hypothesis function) h h h来近似 E Y [ Y ∣ X ] E_Y [Y|X] EY[YX] y ^ = h ( x ) \hat y= h(x) y^=h(x)

为了刻画 h h h E Y [ Y ∣ X ] E_Y [Y|X] EY[YX]近似的好坏,我们通常会定义一个损失函数(loss function/cost function) l ( h ( x ) , y ) l(h(x), y) l(h(x),y)来描述产生的近似错误:当 h ( x ) h(x) h(x)离输出 y y y比较远时值比较大,反之比较小。在二分类任务中, y y y为 0-1 标签,我们可以用 l ( h ( x ) , y ) = I ( h ( x ) ≠ y ) l(h(x), y) = \textrm{I}(h(x)\neq y) l(h(x),y)=I(h(x)̸=y),其中 I [ h ( X ) ≠ Y ] \textrm{I}[h(X)\neq Y] I[h(X)̸=Y]为指示函数,当 h ( x ) ≠ y h(x)\neq y h(x)̸=y时为 1, 否则为 0。

有了在单个取值上的损失函数后,我们可以定义期望风险(Expected Risk) R ( h ) = E X Y [ l ( h ( X ) , Y ) ] R(h) = E_{XY}[l(h(X),Y)] R(h)=EXY[l(h(X),Y)],描述 h h h在分布 P ( X , Y ) P(X,Y) P(X,Y)下的平均近似错误。 R ( h ) R(h) R(h) 比较低时,我们会说 h h h 的泛化性能好。

有了评价指标后,我们自然想要找出最小化 R ( h ) R(h) R(h)的函数 h h h。然而我们并没有分布 P ( X , Y ) P(X,Y) P(X,Y)的全部信息(否则就没机器学习什么事了)。但我们可以采集到分布 P ( X , Y ) P(X,Y) P(X,Y)产生的一系列样本 ( x i , y i ) (x_i, y_i) (xi,yi)。假设我们有 N N N个样本,我们可以通过这些样本的平均错误对 R ( h ) R(h) R(h)进行估计: R N ( h ) = 1 N ∑ i = 1 N l ( x i , y i ) ) R_N(h) = \frac{1}{N} \sum_{i=1}^N l(x_i, y_i)) RN(h)=N1i=1Nl(xi,yi)) R N ( h ) R_N(h) RN(h)被称作是经验风险(Empirical Risk),对应的样本称为训练集。在机器学习文献中, R N ( h ) R_N(h) RN(h) 有时也被叫做 Loss。

我们只能找到最小化 R N ( h ) R_N(h) RN(h)的函数 h h h,并期待对应的 R ( h ) R(h) R(h)比较小 。这种做法叫做 ERM(Empirical Risk Minimization)。用经验风险去估计期望风险,这是机器学习间接性的一种体现。

但最小化 R N ( h ) R_N(h) RN(h)不一定能带来比较小的 R ( h ) R(h) R(h):假设我们找到的函数 h h h为 "记住所有样本 ( x i , y i ) (x_i, y_i ) (xi,yi),我们可以让 R N ( h ) R_N(h) RN(h)变得很小,但是 R ( h ) R(h) R(h)的值却没法保障。 R ( h ) − R N ( h ) R(h) -R_N(h) R(h)RN(h)也被称为泛化误差(Genaralization Error),是一个关于 h h h的函数。机器学习的核心问题之一**泛化(Genaralization)**就是定量确定影响泛化误差的因素。

我们通常会用一个与训练集不相交的样本集,即测试集去估计 R ( h ) R(h) R(h)。在固定 R N ( h ) R_N(h) RN(h)并比较 R ( h ) R(h) R(h)时,泛化性能和泛化误差 R ( h ) − R N ( h ) R(h) - R_N(h) R(h)RN(h)在讨论中表达的意思是一致的。

1.3 优化的限制

优化(Optimization)算法对问题的定义也有一定的限制。

通常我们会要求 l ( h ( x ) , y ) l(h(x), y) l(h(x),y) h ( x ) h(x) h(x)可导,从而可以用上基于梯度的优化算法。然而上述二分类问题的损失函数 l ( h ( x ) , y ) = I ( h ( x ) ≠ y ) l(h(x), y) = \textrm{I}(h(x)\neq y) l(h(x),y)=I(h(x)̸=y) h ( x ) h(x) h(x)不可导,所以我们通常用一个可导的函数,如 cross entropy 或者 hinge loss 来作为二分类的损失函数。这是机器学习间接性的另一种体现。

我们还需要对搜索的范围做限制。以所有可能的函数作为搜索空间会带来优化算法设计的困难。我们往往会根据问题的类型确定一个模型(Model),从而定义以向量 θ \theta θ为参数(Parameter)的一族函数 h θ ∈ H θ h_\theta \in \mathcal{H}^\theta hθHθ。给定模型后参数 θ \theta θ和函数 h θ h_\theta hθ一一对应。

模型的确定通常还需要其他不参与训练的参数,如模型层数的多少,隐层的维度等,我们称之为超参数(Hyper-Parameter)

1.4 误差的拆解[Bottou et al, 2008]

出于种种原因,我们往往没办法找到最优化 R ( h ) R(h) R(h)的函数 h h h。定义以下符号:

- h ∗ h^* h为最小化期望风险 R ( h ) R(h) R(h)的函数。这是我们想要找到的函数
- h θ ∗ h^*_\theta hθ为模型中最小化期望风险 R ( h ) R(h) R(h)的函数
- h N , θ ∗ h_{N,\theta}^* hN,θ为模型中最小化经验风险 R N ( h ) R_N(h) RN(h)的函数
- h ^ N , θ ∗ \hat h^*_{N,\theta} h^N,θ为利用优化算法在模型中找到的最小化经验风险 R N ( h ) R_N(h) RN(h)的函数

机器学习的误差可以拆解成以下三点:

  1. 近似误差(Approximation error) ε app = R ( h θ ∗ ) − R ( h ∗ ) ≥ 0 \varepsilon _{\textrm{app}} = R(h^*_\theta) - R(h^*) \geq 0 εapp=R(hθ)R(h)0 h ∗ h^* h不一定在模型定义的函数族内
  2. 估计误差(Estimation error) ε est = R ( h N , θ ∗ ) − R ( h θ ∗ ) ≥ 0 \varepsilon _{\textrm{est}} = R(h_{N,\theta}^*) - R(h^*_\theta) \geq 0 εest=R(hN,θ)R(hθ)0 R N R_N RN并不能完美估计 R R R
  3. 优化误差(Optimization error) ε opt = R ( h ^ N , θ ∗ ) − R ( h N , θ ∗ ) ≥ 0 \varepsilon _{\textrm{opt}} = R(\hat h^*_{N,\theta}) - R(h_{N,\theta}^*) \geq 0 εopt=R(h^N,θ)R(hN,θ)0:优化算法不一定能找到全局最小

我们找到的是 h ^ N , θ ∗ \hat h^*_{N,\theta} h^N,θ,但想要的是 h ∗ h^* h,这中间的误差便为:

R ( h ^ N , θ ∗ ) − R ( h ∗ ) = ε app + ε est + ε opt = R ( h ^ N , θ ∗ ) − R ( h N , θ ∗ ) + R ( h N , θ ∗ ) − R ( h θ ∗ ) + R ( h θ ∗ ) − R ( h ∗ ) R(\hat h_{N,\theta}^{*}) - R(h^{*}) = \varepsilon _{\textrm{app}} + \varepsilon _{\textrm{est}}+ \varepsilon _{\textrm{opt}} =R(\hat h^{*}_{N,\theta}) - R(h_{N,\theta}^{*}) + R(h_{N,\theta}^{*}) - R(h^{*}_\theta) + R(h^{*}_\theta) - R(h^{*}) R(h^N,θ)R(h)=εapp+εest+εopt=R(h^N,θ)R(hN,θ)+R(hN,θ)R(hθ)+R(hθ)R(h)

在传统机器学习中,我们 trade-off 的是近似误差和估计误差,优化误差基本上可以忽略不计。但在深度学习中,通常会认为近似误差可以忽略不计,我们 trade-off 的主要是估计误差和优化误差。

模型的设计控制着模型的表达能力,这决定了近似误差 ε app \varepsilon _{\textrm{app}} εapp。设计中归纳偏差(inductive bias) 的使用使得不同模型有着不同的样本复杂度(sample complexity),这决定了在有限数据集下估计误差 ε est \varepsilon _{\textrm{est}} εest的大小,以及模型优化的难度。部分模型无法使用梯度下降的优化方法,只能使用 EM 算法(Expectation-Maximization),极端情况下甚至只能用黑箱优化方法;而即使能使用梯度下降, R N ( h ) R_N(h) RN(h)对应的 Loss surface 的光滑程度也受模型设计影响(见 2.5 节),这也决定了梯度下降(见 2.1 节)的收敛性和稳定性(见 2.3 节)。

模型的训练方案决定了估计误差 ε est \varepsilon _{\textrm{est}} εest和优化误差 ε opt \varepsilon _{\textrm{opt}} εopt。通常我们不会让模型收敛到 R N ( h ) R_N(h) RN(h)最低的点,因为这会带来比较大的估计误差 ε est \varepsilon _{\textrm{est}} εest。trick 和超参数的选择,如 learning rate schedule 的方法,batch size,optimizer,normalization,early stop 的轮数和 dropout 等,在影响优化误差 ε opt \varepsilon_{\textrm{opt}} εopt的同时,也是在做估计误差 ε est \varepsilon_{\textrm{est}} εest和优化误差 ε opt \varepsilon _{\textrm{opt}} εopt间的 trade-off。

1.5 小结和符号的简化

至此我们介绍完机器学习问题的定义。

1.2 中我们谈到机器学习的目标是找到最小化期望风险(Expected risk) R ( h ) R(h) R(h)的函数。由于我们没有数据生成分布的信息,只能通过优化算法找到最小化经验风险(Empirical risk) R N ( h ) R_N(h) RN(h)的函数。1.3 中提到由于优化算法的限制,我们只能定义一个模型,并在模型定义的函数族内搜索最优解。

在 1.4 中我们将机器学习任务的误差拆解成了三部分:近似误差、估计误差和优化误差,并简单分析了传统机器学习以及深度学习的不同之处。

下面的讨论中我们着重关注模型的训练方案带来的影响,并把重点放在优化方法上。为了讨论方便,我们对符号做一定的简化,以突出机器学习中优化问题的核心。

在上面的讨论中,随机变量 X , Y X, Y X,Y总是成对出现,我们可以把它们合成一个随机变量 Ψ ↔ ( X , Y ) \Psi \leftrightarrow (X,Y) Ψ(X,Y),其取值对应为 ψ ↔ ( x , y ) \psi \leftrightarrow(x,y) ψ(x,y),作为损失函数 l l l随机性的来源。给定模型后, h θ h_\theta hθ完全由 θ \theta θ决定。

综合这些考虑,我们将损失函数 l ( h ( x ) , y ) l(h(x),y) l(h(x),y)改写成 l ( ψ ; θ ) l(\psi;\theta) l(ψ;θ)。损失函数 l l l同时受确定性变量(Deterministic variable) θ \theta θ和随机变量(Random variable) Ψ \Psi Ψ影响,是关于 θ \theta θ的随机函数(Stochastic function)。

对应的经验风险为:

R N ( θ ) = 1 N ∑ i = 1 N l ( ψ i ; θ ) ) ↔ R N ( h ) = 1 N ∑ i = 1 N l ( x i , y i ) ) R_N(\theta) =\frac{1}{N} \sum_{i=1}^N l(\psi_i;\theta)) \leftrightarrow R_N(h) = \frac{1}{N} \sum_{i=1}^N l(x_i, y_i)) RN(θ)=N1i=1Nl(ψi;θ))RN(h)=N1i=1Nl(xi,yi))

对应的期望风险为:

R ( θ ) = E Ψ [ l ( Ψ ; θ ) ] ↔ R ( h ) = E X Y [ l ( h ( X ) , Y ) ] R(\theta) = E_{\Psi}[l(\Psi;\theta)]\leftrightarrow R(h) = E_{XY}[l(h(X),Y)] R(θ)=EΨ[l(Ψ;θ)]R(h)=EXY

你可能感兴趣的:(技术分享,深度学习,Deep,Learning,Tensorflow)