优化策略和元算法

许多优化技术并非真正的算法,而是一般化的模板,可以特定地产生算法,或是并入到很多不同的算法中

批标准化(Batch Normalization)是优化深度神经网络中最激动人心的最新创新之一。实际上它并不是一个优化算法,而是第一个自适应的重参数化的方法,试图解决训练非常深的模型的困难。

非常深的模型会涉及多个函数或层组合。在其他层不改变的假设下,梯度用于如何更新每一个参数。在实践中,我们同时更新所有层。当我们进行更新时,可能会发生一些意想不到的结果,这是因为许多组合在一起的函数同时改变时,计算更新的假设是其他函数保持不变。举一个简单的例子,假设我们有一个深度神经网络,每一层只有一个单元,并且在每个隐藏层不使用激活函数: y^=xw1w2w3wl\hat{y}=xw_1w_2w_3\dots w_l ,此处, wiw_i 表示用于层 ii 的权重。层 ii 的输出是 hi=hi1wih_i=h_{i-1}w_i 。输出 y^\hat{y} 是输入 xx 的线性函数,但是权重 wiw_i 的非线性函数。假设我们的代价函数 y^\hat{y} 上的梯度为 11 ,所以我们希望稍微降低 y^\hat{y} 。然后反向传播算法可以计算梯度 g=wy^g = \nabla_w\hat{y} 。想想我们在更新 wwϵgw\gets w-\epsilon g 时会发生什么。近似 y^\hat{y} 的一阶泰勒级数会预测 y^\hat{y} 的值下降 ϵgg\epsilon g^\top g 。如果我们希望 y^\hat{y} 下降 0.10.1 ,那么梯度中的一阶信息表明我们应设置学习率 ϵ\epsilon0.1gg\frac{0.1}{g^\top g} 。然而,实际的更新将包括二阶,三阶,直到 ll 阶的影响。 y^\hat{y} 的更新值为

x(w1ϵg1)(w2ϵg2)(wlϵgl)x(w_1-\epsilon g_1)(w_2-\epsilon g_2)\dots(w_l-\epsilon g_l)

这个更新中所产生的一个二阶项示例是 ϵ2g1g2i=3lwi\epsilon^2g_1g_2\prod_{i=3}^lw_i 。如果 i=3lwi\prod_{i=3}^lw_i 很小,那么该项可以忽略不计。而如果层 33 到层 ll 的权重都比 11 大时,该项可能会指数级大。这使得我们很难选择一个合适的学习率,因为某一层中参数更新的效果很大程度上取决于其他所有层。二阶优化算法通过考虑二阶相互影响来解决这个问题,但我们可以看到,在非常深的网络中,更高阶的相互影响会很显著。即使是二阶优化算法,计算代价也很高,并且通常需要大量近似,以免真正计算所有的重要二阶相互作用。因此对于 n>2n>2 的情况,建立 nn 阶优化算法似乎是无望的。那么我们可以做些什么呢?

批标准化提出了一种几乎可以重参数化所有深度网络的优雅方法。重参数化显著减少了多层之间协调更新的问题。批标准化可应用于网络的任何输入层或隐藏层。设 HH 是需要标准化的某层的小批量激活函数,排布为设计矩阵,每个样本的激活出现在矩阵的每一行中。为了标准化 HH ,我们将其替代为

H=HμσH' = \frac{H-\mu}{\sigma}

其中 μ\mu 是包含每个单元均值的向量, σ\sigma 是包含每个单元标准差的向量。此处的算术是基于广播向量 μ\mu 和向量 σ\sigma 应用于矩阵 HH 的每一行。在每一行内,运算是逐元素的,因此 Hi,jH_{i,j} 标准化为减去 μj\mu_j 再除以 σj\sigma_j 。网络的其余部分操作 HH' 的方式和原网络操作 HH 的方式一样。

在训练阶段, μ=1miHi\mu=\frac{1}{m}\sum\limits_iH_iσ=δ+1mi(Hμ)i2\sigma=\sqrt{\delta+\frac{1}{m}\sum\limits_i(H-\mu)^2_i} 。其中 δ\delta 是个很小的值,比如 10810^{-8} ,以强制避免遇到 z\sqrt{z} 的梯度在 z=0z = 0 处未定义的问题。至关重要的是,我们反向传播这些操作,来计算均值和标准差,并应用它们于标准化 HH 。这意味着,梯度不会再简单地增加 hih_i 的标准差或均值;标准化操作会除掉这一操作的影响,归零其在梯度中的元素。这是批标准化方法的一个重大创新。以前的方法添加代价函数的惩罚,以鼓励单元标准化激活统计量,或是在每个梯度下降步骤之后重新标准化单元统计量。前者通常会导致不完全的标准化,而后者通常会显著地消耗时间,因为学习算法会反复改变均值和方差而标准化步骤会反复抵消这种变化。批标准化重参数化模型,以使一些单元总是被定义标准化,巧妙地回避了这两个问题。

在测试阶段, μ\muσ\sigma 可以被替换为训练阶段收集的运行均值。这使得模型可以对单一样本评估,而无需使用定义于整个小批量的 μ\muσ\sigma

回顾例子 y^=xw1w2w3wl\hat{y}=xw_1w_2w_3\dots w_l ,我们看到,我们可以通过标准化 hl1h_{l-1} 很大程度地解决了学习这个模型的问题。假设 xx 采样自一个单位高斯。那么 hl1h_{l-1} 也是来自高斯,因为从 xxhlh_l 的变换是线性的。然而, hl1h_{l-1} 不再有零均值和单位方差。使用批标准化后,我们得到的归一化 h^l1\hat{h}_{l-1} 恢复了零均值和单位方差的特性。对于底层的几乎任意更新而言, h^l1\hat{h}_{l-1} 仍然保持着单位高斯。然后输出 y^\hat{y} 可以学习为一个简单的线性函数 y^=wlh^l1\hat{y} = w_l\hat{h}_{l-1} 。现在学习这个模型非常简单,因为低层的参数在大多数情况下没什么影响;它们的输出总是重新标准化为单位高斯。只在少数个例中,低层会有影响。改变某个低层权重为 00 ,可能使输出退化;改变低层权重的符号可能反转 h^l1\hat{h}_{l-1}yy 之间的关系。这些情况都是非常罕见的。没有标准化,几乎每一个更新都会对 hl1h_{l-1} 的统计量有着极端的影响。因此,批标准化显著地使得模型更易学习。在这个示例中,容易学习的代价是使得底层网络没有用。在我们的线性示例中,较低层不再有任何有害的影响,但它们也不再有任何有益的影响。这是因为我们已经标准化了一阶和二阶统计量,这是线性网络可以影响的所有因素。在具有非线性激活函数的深度神经网络中,较低层可以进行数据的非线性变换,所以它们仍然是有用的。批标准化仅标准化每个单元的均值和方差,以稳定化学习,但允许单元和单个单元的非线性统计量之间的关系发生变化。

标准化一个单元的均值和标准差会降低包含该单元的神经网络的表达能力。为了保持网络的表现力,通常会将批量隐藏单元激活 HH 替换为 γH+β\gamma H'+\beta ,而不是简单地使用标准化的 HH' 。变量 γ\gammaβ\beta 是允许新变量有任意均值和标准差的学习参数。乍一看,这似乎是无用的——为什么我们将均值设为 00 ,然后又引入参数允许它被重设为任意值 β\beta ?答案是新的参数可以表示旧参数作为输入的同一族函数,但是新参数有不同的学习动态。在旧参数中, HH 的均值取决于 HH 下层中参数的复杂关联。在新参数中, γH+β\gamma H'+\beta 的均值仅由 β\beta 确定。新参数很容易通过梯度下降来学习。

大多数神经网络层会采取 ϕ(XW+b)\phi(XW+b) 的形式,其中 ϕ\phi 是某个固定的非线性激活函数,如ReLU。自然想到我们应该讲批标准化应用于输入 XX 还是变换后的值 XW+bXW+b 。Ioffe and Szegedy的文章中推荐后者。更具体地, XW+bXW+b 应被替换为 XWXW 的标准化形式。偏置项应被忽略,因为参数 β\beta 会加入批标准化重参数化,它是冗余的。一层的输入通常是前一层的非线性激活函数的输出。因此,输入的统计量更符合非高斯,而更不服从线性操作的标准化。

坐标下降

在某些情况下,将一个优化问题分解成几个部分,可以更快地解决原问题。如果我们相对于某个单一变量 xix_i 最小化 f(x)f(x) ,然后相对于另一个变量 xjx_j 等等,反复循环所有的变量,我们会保证到达(局部)极小值。这种做法被称为坐标下降(coordinate descent),因为我们一次优化一个坐标。更一般地, 块坐标下降(block coordinate descent)是指对于某个子集的变量同时最小化。术语“坐标下降’’ 通常既指块坐标下降,也指严格的单个坐标下降。

当优化问题中的不同变量能够清楚地分成相对独立的组,或是当优化一组变量明显比优化所有变量效率更高时,坐标下降最有意义。例如,考虑代价函数:

J(H,W)=i,jHi,j+i,j(XWH)i,j2J(H,W)=\sum\limits_{i,j}|H_{i,j}|+\sum\limits_{i,j}(X-W^\top H)^2_{i,j}

该函数描述了一种被称为稀疏编码的学习问题,其目标是寻求一个权重矩阵 WW ,可以线性解码激活值矩阵 HH 以重构训练集 XX 。稀疏编码的大多数应用还涉及到权重衰减或 WW 列范数的约束,以避免极小 HH 和极大 WW 地病态解。

函数 JJ 不是凸的。然而,我们可以将训练算法的输入分成两个集合:字典参数 WW 和编码表示 HH 。最小化关于这两者之一的任意一组变量的目标函数都是凸问题。因此,块坐标下降允许我们使用高效的凸优化算法,交替固定 HH 优化 WW 和固定 WW 优化 HH

当一个变量的值很大程度地影响另一个变量的最优值时,坐标下降不是一个很好的方法,如函数 f(x)=(x1x2)2+α(x12+x22)f(x)=(x_1-x_2)^2+\alpha(x_1^2+x_2^2) ,其中 α\alpha 是正值常数。第一项鼓励两个变量具有相似的值,而第二项鼓励它们接近零。解是两者都为零。牛顿法可以一步解决这个问题,因为它是一个正定二次问题。但是,对于小值 α\alpha 而言,坐标下降会使进展非常缓慢,因为第一项不允许单个变量变为和其他变量当前值显著不同的值

Polyak平均

Polyak平均(Polyak and Juditsky, 1992)会平均优化算法在参数空间访问轨迹中的几个点。如果 tt 次迭代梯度下降访问了点 θ(1),,θ(t)\theta^{(1)},\dots,\theta^{(t)} ,那么Polyak平均算法的输出是 θ^(t)=1tiθ(i)\hat{\theta}^{(t)}=\frac{1}{t}\sum\limits_i\theta^{(i)} 。在某些问题中,如梯度下降应用于凸问题时,这种方法具有较强的收敛保证。当应用于神经网络时,其验证更多是启发式的,但在实践中表现良好。基本想法是,优化算法可能会来回穿过山谷好几次而没经过山谷底部附近的点。尽管两边所有位置的均值应比较接近谷底。

在非凸问题中,优化轨迹的路径可以非常复杂,并且经过了许多不同的区域。包括参数空间中遥远过去的点,可能与当前点在代价函数上相隔很大的障碍,看上去不像一个有用的行为。其结果是,当应用Polyak 平均于非凸问题时,通常会使用指数衰减计算平均值:

θ^(t)=αθ^(t1)+(1α)θ(t)\hat{\theta}^{(t)}=\alpha\hat{\theta}^{(t-1)}+(1-\alpha)\theta^{(t)}

监督预训练

有时,如果模型太复杂难以优化,或是如果任务非常困难,直接训练模型来解决特定任务的挑战可能太大。有时训练一个较简单的模型来求解问题,然后使模型更复杂会更有效。训练模型来求解一个简化的问题,然后转移到最后的问题,有时也会更有效些。这些在直接训练目标模型求解目标问题之前,训练简单模型求解简化问题的方法统称为预训练(pretraining)。

贪心算法(greedy algorithm)将问题分解成许多部分,然后独立地在每个部分求解最优值。令人遗憾的是,结合各个最佳的部分不能保证得到一个最佳的完整解。然而,贪心算法计算上比求解最优联合解的算法高效得多,并且贪心算法的解在不是最优的情况下,往往也是可以接受的。贪心算法也可以紧接一个精调(fine-tuning)阶段,联合优化算法搜索全问题的最优解。使用贪心解初始化联合优化算法,可以极大地加速算法,并提高寻找到的解的质量。

预训练算法,特别是贪心预训练,在深度学习中是普遍存在的。在本节中,我们会具体描述这些将监督学习问题分解成其他简化的监督学习问题的预训练算法。这种方法被称为贪心监督预训练(greedy supervised pretraining)。

在贪心监督预训练的原始版本(Bengio et al., 2007)中,每个阶段包括括一个仅涉及最终神经网络的子集层的监督学习训练任务。贪心监督预训练的一个例子如下图所示,其中每个附加的隐藏层作为浅层监督多层感知机的一部分预训练,以先前训练的隐藏层输出作为输入。Simonyan and Zisserman (2015) 预训练深度卷积网络(11 层权重),然后使用该网络前四层和最后三层初始化更深的网络(多达19 层权重),并非一次预训练一层。非常深的新网络的中间层是随机初始化的。然后联合训练新网络。还有一种选择,由Yu et al. (2010) 提出,将先前训练多层感知机的输出,以及原始输入,作为每个附加阶段的输入。

为什么贪心监督预训练会有帮助呢?最初由Bengio et al. (2007d) 提出的假说是,其有助于更好地指导深层结构的中间层的学习。一般情况下,预训练对于优化和泛化都是有帮助的。

另一个与监督预训练有关的方法扩展了迁移学习的想法:Yosinski et al. (2014)在一组任务上预训练了8 层权重的深度卷积网络(1000 个ImageNet 对象类的子集),然而用该网络的前 kk 层初始化同样规模的网络。然后第二个网络的所有层(上层随机初始化)联合训练以执行不同的任务(1000 个ImageNet 对象类的另一个子集),但训练样本少于第一个任务。

另一条相关的工作线是FitNets (Romero et al., 2015) 方法。这种方法始于训练深度足够低和宽度足够大(每层单元数),容易训练的网络。然后,这个网络成为第二个网络(被指定为学生)的老师。学生网络更深更窄(11 至19 层),且在正常情况下很难用 SGD 训练。训练学生网络不仅需要预测原任务的输出,还需要预测教师网络中间层的值,这样使得训练学生网络变得更容易。这个额外的任务说明了隐藏层应如何使用,并且能够简化优化问题。附加参数被引入来从更深的学生网络中间层去回归 5 层教师网络的中间层。然而,该目标是预测教师网络的中间隐藏层,并非预测最终分类目标。学生网络的低层因而具有两个目标:帮助学生网络的输出完成其目标和预测教师网络的中间层。尽管一个窄而深的网络似乎比宽而浅的网络更难训练,但窄而深网络的泛化能力可能更好,并且如果其足够窄,参数足够少,那么其计算代价更小。没有隐藏层的提示,学生网络在训练集和测试集上的实验表现都很差。因而中间层的提示是有助于训练很难训练的网络的方法之一,但是其他优化技术或是架构上的变化也可能解决这个问题。

设计有助于优化的模型

改进优化的最好方法并不总是改进优化算法。相反,深度模型中优化的许多改进来自于设计易于优化的模型。原则上,我们可以使用呈锯齿非单调模式上上下下的激活函数,但是,这将使优化极为困难。在实践中,选择一族容易优化的模型比使用一个强大的优化算法更重要。神经网络学习在过去30 年的大多数进步主要来自于改变模型族,而非改变优化过程。1980 年代用于训练神经网络的带动量的随机梯度下降,仍然是现代神经网络应用中的前沿算法。

具体来说,现代神经网络的设计选择体现在层之间的线性变换,几乎处处可导的激活函数,和大部分定义域都有明显的梯度。特别地,创新的模型,如LSTM,整流线性单元和maxout 单元都比先前的模型(如基于sigmoid 单元的深度网络)使用更多的线性函数。这些模型都具有简化优化的性质。如果线性变换的Jacobian 具有相对合理的奇异值,那么梯度能够流经很多层。此外,线性函数在一个方向上一致增加,所以即使模型的输出远离正确值,也可以简单清晰地计算梯度,使其输出方向朝降低损失函数的方向移动。换言之,现代神经网络的设计方案旨在使其局部梯度信息合理地对应着移向一个遥远的解。

其他的模型设计策略有助于使优化更简单。例如,层之间的线性路径或是跳跃连接减少了从较低层参数到输出最短路径的长度,因而缓解了梯度消失的问题(Srivastava et al., 2015)。一个和跳跃连接相关的想法是添加和网络中间隐藏层相连的输出的额外副本,如GoogLeNet (Szegedy et al., 2014a) 和深度监督网络(Leeet al., 2014)。这些‘‘辅助头’’ 被训练来执行和网络顶层主要输出相同的任务,以确保底层网络能够接受较大的梯度。当训练完成时,辅助头可能被丢弃。这是之前小节介绍到的预训练策略的替代方法。以这种方式,我们可以在一个阶段联合训练所有层,而不改变架构,使得中间层(特别是低层)能够通过更短的路径得到一些如何更新的有用信息。这些信息为底层提供了误差信号。

延拓法和课程学习

许多优化挑战都来自于代价函数的全局结构,不能仅通过局部更新方向上更好的估计来解决。解决这个问题的主要方法是尝试初始化参数到某种区域内,该区域可以通过局部下降很快连接到参数空间中的解。

延拓法(continuation method)是一族通过挑选初始点使优化更容易的方法,以确保局部优化花费大部分时间在表现良好的空间。延拓法的背后想法是构造一系列具有相同参数的目标函数。为了最小化代价函数 J(θ)J(\theta) ,我们构建新的代价函数 {J(0),,J(n)}\{J^{(0)},\dots,J^{(n)}\} 。这些代价函数的难度逐步提高,其中 J(0)J^{(0)} 是最容易最小化的, J(n)J^{(n)} 是最难的,真正的代价函数驱动整个过程。当我们说 J(i)J^{(i)}J(i+1)J^{(i+1)} 更容易时,是指其在更多的 θ\theta 空间上表现良好。随机初始化更有可能落入局部下降可以成功最小化代价函数的区域,因为其良好区域更大。这系列代价函数设计为前一个解是下一个的良好初始点。因此,我们首先解决一个简单的问题,然后改进解以解决逐步变难的问题,直到我们求解真正问题的解。

传统的延拓法(用于神经网络训练之前的延拓法)通常基于平滑目标函数。可以查看Wu (1997) 了解这类方法的示例,以及一些相关方法的综述。延拓法也和参数中加入噪声的模拟退火紧密相关(Kirkpatrick et al., 1983)。延拓法在最近几年非常成功。参考Mobahi and Fisher (2015) 了解近期文献的概述,特别是在AI 方面的应用。

传统上,延拓法主要用来克服局部极小值的问题。具体地,它被设计来在有很多局部极小值的情况下,求解一个全局最小点。这些连续方法会通过‘‘模糊’’ 原来的代价函数来构建更容易的代价函数。这些模糊操作可以是用采样来近似

J(i)(θ)=EθN(θ;θ,σ(i)2)J(θ)J^{(i)}(\theta)=\mathbb{E}_{\theta'\sim \mathcal{N}(\theta';\theta,\sigma^{(i)2})}J(\theta')

这个方法的直觉是有些非凸函数在模糊后会近似凸的。在许多情况下,这种模糊保留了关于全局极小值的足够信息,我们可以通过逐步求解模糊更少的问题来求解全局极小值。这种方法有三种可能失败的方式。首先,它可能成功地定义了一连串代价函数,并从开始的一个凸函数起(逐一地)沿着函数链最佳轨迹逼近全局最小值,但可能需要非常多的逐步代价函数,整个过程的成本仍然很高。另外,即使延拓法可以适用,NP-hard 的优化问题仍然是NP-hard。其他两种延拓法失败的原因是不实用。其一,不管如何模糊,函数都没法变成凸的,比如函数 J(θ)=θθJ(\theta)=-\theta^\top\theta 。其二,函数可能在模糊后是凸的,但模糊函数的最小值可能会追踪到一个局部最小值,而非原始代价函数的全局最小值。

尽管延拓法最初用来解决局部最小值的问题,而局部最小值已不再认为是神经网络优化中的主要问题了。幸运的是,延拓法仍然有所帮助。延拓法引入的简化目标函数能够消除平坦区域,减少梯度估计的方差,提高Hessian 矩阵的条件数,使局部更新更容易计算,或是改进局部更新方向与朝向全局解方向之间的对应关系。

Bengio et al. (2009) 指出被称为课程学习(curriculum learning)或者塑造(shaping)的方法可以被解释为延拓法。课程学习基于规划学习过程的想法,首先学习简单的概念,然后逐步学习依赖于这些简化概念的复杂概念。之前这一基本策略被用来加速动物训练过程(Skinner, 1958; Peterson, 2004; Krueger and Dayan,2009) 和机器学习过程(Solomonoff, 1989; Elman, 1993; Sanger, 1994)。Bengio et al.(2009) 验证这一策略为延拓法,通过增加简单样本的影响(通过分配它们较大的系数到代价函数,或者更频繁地采样),先前的 J(i)J^{(i)} 会变得更容易。实验证明,在大规模的神经语言模型任务上使用课程学习,可以获得更好的结果。课程学习已经成功应用于大量的自然语言(Spitkovsky et al., 2010; Collobert et al., 2011a; Mikolovet al., 2011b; Tu and Honavar, 2011) 和计算机视觉(Kumar et al., 2010; Lee and Grauman, 2011; Supancic and Ramanan, 2013) 任务上。课程学习被证实为与人类教学方式一致(Khan et al., 2011):教师刚开始会展示更容易、更典型的示例,然后帮助学习者在不太显然的情况下提炼决策面。在人类教学上,基于课程学习的策略比基于样本均匀采样的策略更有效,也能提高其他学习策略的效率(Basu andChristensen, 2013)。

课程学习研究的另一个重要贡献体现在训练循环神经网络捕获长期依赖:Zaremba and Sutskever (2014) 发现使用随机课程获得了更好的结果,其中容易和困难的示例混合在一起,随机提供给学习者,更难示例(这些具有长期依赖)的平均比例在逐渐上升。而使用确定性课程,并没有发现超过基线(完整训练集的普通训练)的改进。

Source

Last updated