本文作者:追一科技算法工程师 Tony
TFSEQ 这个系列总结了笔者在使用 tensorflow 进行自然语言处理的一些经验和思考。计划写三篇文章:
此为第三篇。
在介绍完分布式训练后,为了将故事讲完整,本文涉及的内容其实是绕不开的。本文会以综述和简介的方式,将笔者读过的东西串成一条线,希望能为读者提供一些实践中使用的 tricks 的动机。如有事实上的错误,希望能够指出并赐教。
本文由于信息量比较密集,且有部分来回引用,推荐在电脑屏幕上细读。知乎并不支持页内跳转,所以文中引用对应的链接可以直接打开论文的网页。为了方便读者阅读,每个部分结束时都会带上简单的小结。本文重在直观结论,公式和符号的存在是为了更精确地表达概念,所以跳过部分公式也不会造成理解上的困难,文中也并没有太多推导。
计算的实现方面:
算法的设计方面:
遵从一般的习惯,我们用大写字母 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(Y∣X)=P(X)P(X,Y),表示给定 X X X的取值后 Y Y Y的概率分布 – 样本空间随着 X X X取值的确定而改变了。在条件概率分布的基础上可以定义条件期望 E Y [ Y ∣ X ] E_Y[Y|X] EY[Y∣X]。
机器学习里最典型的问题是监督学习(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(Y∣X)描述。我们通常会使用条件期望 E Y [ Y ∣ X ] E_Y[Y|X] EY[Y∣X]去描述这个分布,这是一个关于 x x x的确定性函数(deterministic function)。
我们通常用一个函数(通常称为 Hypothesis function) h h h来近似 E Y [ Y ∣ X ] E_Y [Y|X] EY[Y∣X], y ^ = h ( x ) \hat y= h(x) y^=h(x)。
为了刻画 h h h对 E Y [ Y ∣ X ] E_Y [Y|X] EY[Y∣X]近似的好坏,我们通常会定义一个损失函数(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)=N1∑i=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)在讨论中表达的意思是一致的。
优化(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)。
出于种种原因,我们往往没办法找到最优化 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)的函数
机器学习的误差可以拆解成以下三点:
我们找到的是 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.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(θ)=N1∑i=1Nl(ψi;θ))↔RN(h)=N1∑i=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