序言
在人工智能与机器学习的快速发展中,深度模型作为核心技术之一,其优化问题至关重要。深度模型通过构建多层神经网络来模拟人脑的学习与推理过程,处理复杂数据模式与任务。然而,这些强大能力的背后,离不开高效的优化策略与元算法的支撑。优化旨在通过调整模型参数,最小化预设的损失函数,从而提升模型性能,确保模型能够更准确地拟合数据并泛化至未见过的样本。
优化策略和元算法
- 许多优化技术并非真正的算法,而是一般化的模板,可以特定产生算法,或是并入到很多不同的算法中。
batch normalization
- b a t c h \bold{batch} batch n o r m a l i z a t i o n \bold{normalization} normalization ( Ioffe and Szegedy, 2015 \text{Ioffe and Szegedy, 2015} Ioffe and Szegedy, 2015)是优化深度神经网络中最激动人心的最新创新之一。实际上它并不是一个优化算法,而是一个自适应的重新参数化的方法,试图解决训练非常深层模型的困难。
- 非常深层的模型会涉及多个函数或层组合。在其他层不改变的假设下,梯度用于如何更新每一个参数。
- 在实践中,我们同时更新所有层。
- 当我们进行更新时,可能会发生一些意想不到的结果,这是因为许多组合在一起的函数同时改变时,计算更新的假设是其他函数保持不变。
- 举一个简单的例子,假设我们有一个深度神经网络,每一层只有一个单元,并且在每个隐藏层不使用激励函数:
y
^
=
x
w
1
w
2
w
3
…
w
l
\hat{y}=xw_1w_2w_3\dots w_l
y^=xw1w2w3…wl。
- 这里, w i w_i wi表示用于层 i i i的权重。
- 层 i i i的输出是 h i = h i − 1 w i h_i=h_{i-1}w_i hi=hi−1wi。
- 输出 y ^ \hat{y} y^是输入 x x x的线性函数,但是权重 w i w_i wi的非线性函数。
- 假设我们的代价函数 y ^ \hat{y} y^上的梯度为 1 1 1,所以我们希望稍稍降低 y ^ \hat{y} y^。
- 然后反向传播算法可以计算梯度 g = ∇ w y ^ \boldsymbol{g}=\nabla_{\boldsymbol{w}}\hat{y} g=∇wy^。想想我们在更新 w ← w − ϵ g \boldsymbol{w}\gets\boldsymbol{w}-\epsilon\boldsymbol{g} w←w−ϵg时会发生什么。
- 近似 y ^ \hat{y} y^的一阶泰勒级数会预测 y ^ \hat{y} y^的值下降 ϵ g ⊤ g \epsilon\boldsymbol{g}^\top\boldsymbol{g} ϵg⊤g。
- 如果我们希望 y ^ \hat{y} y^下降 0.1 0.1 0.1,那么梯度中的一阶信息表明我们应设置学习速率 ϵ \epsilon ϵ为 0.1 g ⊤ g \frac{0.1}{\boldsymbol{g}^\top\boldsymbol{g}} g⊤g0.1。
- 然而,实际的更新将包括二阶,三阶,直到
l
l
l阶的影响。
y
^
\hat{y}
y^的更新值为:
x ( w 1 − ϵ g 1 ) ( w 2 − ϵ g 2 ) … ( w l − ϵ g l ) x(w_1-\epsilon\boldsymbol{g}_1)(w_2-\epsilon\boldsymbol{g}_2)\dots(w_l-\epsilon\boldsymbol{g}_l) x(w1−ϵg1)(w2−ϵg2)…(wl−ϵgl) — 公式1 \quad\textbf{---\footnotesize{公式1}} —公式1 - 这个更新中所产生的一个二阶项示例是 ϵ 2 g 1 g 2 ∏ i = 3 l w i \epsilon^2 g_1g_2\prod_{i=3}^lw_i ϵ2g1g2∏i=3lwi。
- 如果 ∏ i = 3 l w i \prod_{i=3}^lw_i ∏i=3lwi很小,那么该项可以忽略不计。而不过层 3 3 3到层 l l l的权重都比 1 1 1大时,该项可能会指数级大。
- 这使得很难选择一个合适的学习速率,因为某一层中参数更新的效果很大程度上取决于其他所有层。
- 二阶优化算法通过考虑二阶相互影响来解决这个问题,但我们可以看到,在非常深的网络中,更高阶的相互影响会很显著。即使是二阶优化算法,计算代价也很高,并且通常需要大量近似,以免真正计算所有的重要二阶相互作用。因此对于 n > 2 n > 2 n>2的情况建立 n n n阶优化算法似乎是无望的。那么我们可以做些什么呢?
-
batch
\text{batch}
batch
normalization
\text{normalization}
normalization提出了一种几乎可以重新参数化所有深度网络的优雅方法。
- 重新参数化显著减少了多层之间协调更新的问题。
- batch \text{batch} batch normalization \text{normalization} normalization可应用于网络的任何输入层或隐藏层。
- 设 H \boldsymbol{H} H是需要标准化的某层的 minibatch \text{minibatch} minibatch激励函数,布置为设计矩阵,每个样本的激励出现在矩阵的每一行中。
- 标准化
H
\boldsymbol{H}
H,我们替代它为:
H
′
=
H
−
μ
σ
\boldsymbol{H}'=\frac{\boldsymbol{H}-\boldsymbol{\mu}}{\boldsymbol{\sigma}}
H′=σH−μ
- 其中 μ \boldsymbol{\mu} μ是包含每个单元均值的向量。
- σ \boldsymbol{\sigma} σ是包含每个单元标准差的向量。
- 该算术是基于广播向量 μ \boldsymbol{\mu} μ和向量 σ \boldsymbol{\sigma} σ应用于矩阵 H \boldsymbol{H} H的每一行。
- 在每一行内,运算是逐元素的,因此 H i , j H_{i,j} Hi,j标准化为减去 μ j \mu_j μj再除以 σ j \sigma_j σj。
- 网络的其余部分操作 H ′ \boldsymbol{H}' H′的方式和原网络操作 H \boldsymbol{H} H的方式一样。
- 在训练阶段,
μ = 1 m ∑ i H i , : \boldsymbol{\mu}=\frac{1}{m}\sum\limits_i\boldsymbol{H}_{i,:} μ=m1i∑Hi,: — 公式2 \quad\textbf{---\footnotesize{公式2}} —公式2
和
σ = δ + 1 m ∑ i ( H − μ ) i 2 \boldsymbol{\sigma}=\sqrt{\delta+\frac{1}{m}\sum\limits_i(\boldsymbol{H}-\boldsymbol{\mu})_i^2} σ=δ+m1i∑(H−μ)i2 — 公式3 \quad\textbf{---\footnotesize{公式3}} —公式3 - 其中 δ \delta δ是个很小的正值,比如 1 0 − 8 10^{−8} 10−8,以强制避免遇到 z \sqrt{z} z的梯度在 z = 0 z = 0 z=0处未定义的问题。至关重要的是, 我们反向传播这些操作,计算均值和标准差,并应用它们于标准化 H \boldsymbol{H} H。这意味着,梯度不会再简单地增加 h i h_i hi的标准差或均值;标准化操作会除掉这一操作的影响,归零其在梯度中的元素。这是 batch \text{batch} batch normalization \text{normalization} normalization方法的一个重大创新。以前的方法添加代价函数的惩罚,以鼓励单位标准化激励统计量,或是在每个梯度下降步骤之后重新标准化单位统计量。前者通常会导致不完全的标准化,而后者通常会显著地消耗时间,因为学习算法会反复改变均值和方差而标准化步骤会反复抵消这种变化。 batch \text{batch} batch normalization \text{normalization} normalization重新参数化模型,以使一些单元总是被定义标准化,巧妙地回避了这两个问题。
- 在测试阶段, μ \boldsymbol{\mu} μ和 σ \boldsymbol{\sigma} σ可以被替换为训练阶段收集的运行均值。这使得模型可以对单一样本评估,而无需使用定义于整个 minibatch \text{minibatch} minibatch的 μ \boldsymbol{\mu} μ和 σ \boldsymbol{\sigma} σ。
- 回顾例子
y
^
=
x
w
1
w
2
w
3
…
w
l
\hat{y}=xw_1w_2w_3\dots w_l
y^=xw1w2w3…wl,我们看到,我们可以通过标准化
h
l
−
1
h_{l-1}
hl−1很大程度地解决学习这个模型的问题。
- 假设 x x x采样自一个单位高斯,那么 h l − 1 h_{l-1} hl−1也是来自高斯,因为从 x x x到 h l h_l hl 的变换是线性的。
- 然而, h l − 1 h_{l-1} hl−1不再有零均值和单位方差。使用 batch \text{batch} batch normalization \text{normalization} normalization后,我们得到的归一化 h ^ l − 1 \hat{h}_{l-1} h^l−1恢复了零均值和单位方差的特性。
- 对于底层的几乎任意更新而言, h ^ l − 1 \hat{h}_{l-1} h^l−1仍然保持着单位高斯。然后输出 y ^ \hat{y} y^可以学习为一个简单的线性函数 y ^ = w l h ^ l − 1 \hat{y}=w_l\hat{h}_{l-1} y^=wlh^l−1。
- 现在学习这个模型非常简单,因为低层的参数在大多数情况下没有什么影响;它们的输出总是重新标准化为单位高斯。
- 只在少数个例中,低层会有影响。
- 改变某个低层权重为 0 0 0,可能退化输出;改变低层权重的符号可能反转 h ^ l − 1 \hat{h}_{l-1} h^l−1和 y y y之间的关系。这些情况都是非常罕见的。
- 没有标准化,几乎每一个更新都会对 h l − 1 h_{l-1} hl−1的统计量有着极端的影响。
- 因此,
batch
\text{batch}
batch
normalization
\text{normalization}
normalization显著地使得模型更易学习。
- 在这个示例中,容易学习的代价是使得底层网络没有用。
- 在我们的线性示例中,较低层不再有任何有害的影响,但它们也不再有任何有益的影响。这是因为我们已经标准化了一阶和二阶统计量,这是线性网络可以影响的所有因素。
- 在具有非线性激励函数的深度神经网络中,较低层可以进行数据的非线性变换,所以它们仍然是有用的。 batch \text{batch} batch normalization \text{normalization} normalization仅标准化每个单元的均值和方差,以稳定化学习,但允许单元和单个单元的非线性统计量之间的关系发生变化。
- 由于网络的最后一层能够学习线性变换,实际上我们可能希望移除一层内单元之间的所有线性关系。事实上,这是 Guillaume Desjardins (2015) \text{Guillaume Desjardins (2015)} Guillaume Desjardins (2015)中采用的方法,为 batch \text{batch} batch normalization \text{normalization} normalization提供了灵感。令人遗憾的是,消除所有的线性关联比标准化各个独立单元的均值和标准差代价更高,因此迄今 batch \text{batch} batch normalization \text{normalization} normalization仍是最实用的方法。
- 标准化一个单元的均值和标准差会降低包含该单元的神经网络的表达能力。
- 为了保持网络的表现力,通常会取代 batch \text{batch} batch隐藏单元激励 H \boldsymbol{H} H为 γ H ′ + β \gamma\boldsymbol{H}'+\beta γH′+β,而不是简单地使用标准化的 H ′ \boldsymbol{H}' H′。
- 变量 γ \gamma γ和 β \beta β是允许新变量有任意均值和标准差的学习参数。
- 乍一看,这似乎是无用的——为什么我们将均值设为 0 0 0,然后又引入参数允许它被重设为任意值 β \beta β?答案是,新的参数可以表示旧参数作为输入的同一族函数,但是新参数有不同的学习动态。
- 在旧参数中, H \boldsymbol{H} H的均值取决于 H \boldsymbol{H} H下层中参数的复杂关联。
- 在新参数中, γ H ′ + β \gamma\boldsymbol{H}'+\beta γH′+β的均值仅由 β \beta β确定。新参数很容易通过梯度下降来学习。
- 大多数神经网络层会采取形式
ϕ
(
X
W
+
b
)
\phi(\boldsymbol{XW}+\boldsymbol{b})
ϕ(XW+b),其中
ϕ
\phi
ϕ是某个固定的非线性激励函数,如整流线性变换。
- 自然想到是否我们应该应用 batch \text{batch} batch normalization \text{normalization} normalization于输入 X \boldsymbol{X} X,或是变换值 X W + b \boldsymbol{XW}+\boldsymbol{b} XW+b。
- Ioffe and Szegedy (2015) \text{Ioffe and Szegedy (2015)} Ioffe and Szegedy (2015)推荐后者。更具体地, X W + b \boldsymbol{XW}+\boldsymbol{b} XW+b应替换为 X W \boldsymbol{XW} XW的标准化形式。
- 偏置项应被忽略,因为参数 β \beta β会加入 batch \text{batch} batch normalization \text{normalization} normalization重新参数化,它是冗余的。
- 一层的输入通常是前一层的非线性激励函数,如整流线性函数的输出。
- 因此,输入的统计量更符合非高斯,而更不服从线性操作的标准化。
- 在后续篇章:卷积神经网络所述的卷积网络,在特征映射中每个空间位置同样地标准化 μ \boldsymbol{\mu} μ和 σ \boldsymbol{\sigma} σ是很重要的,能使特征映射的统计量不因空间位置而保持相同。
坐标下降
- 在某些情况下,将一个优化问题分解成几个部分,可以更快地解决原问题。如果我们最小化 f ( x ) f(\boldsymbol{x}) f(x)相对于某个单一变量 x i x_i xi,然后相对于另一个变量 x j x_j xj,等等,反复循环所有的变量,我们会保证到达(局部)极小值。这种做法被称为坐标下降( coordinate descent \text{coordinate descent} coordinate descent),因为我们一次优化一个坐标。更一般地, 块坐标下降( blockcoordinate descent \text{blockcoordinate descent} blockcoordinate descent) 是指对于某个子集的变量同时最小化。术语 “坐标下降’’ 通常既指块坐标下降,也指严格的单个坐标下降。
- 当优化问题中的不同变量能够清楚地分成相对独立的组,或是当优化一组变量明显比优化所有变量效率更高时,坐标下降最有意义。例如,考虑代价函数:
J ( H , W ) = ∑ i , j ∣ H i , j ∣ + ∑ i , j ( X − W ⊤ H ) i , j 2 J(\boldsymbol{H},\boldsymbol{W})=\sum\limits_{i,j}|H_{i,j}|+\sum\limits_{i,j}(\boldsymbol{X}-\boldsymbol{W}^\top\boldsymbol{H})_{i,j}^2 J(H,W)=i,j∑∣Hi,j∣+i,j∑(X−W⊤H)i,j2 — 公式4 \quad\textbf{---\footnotesize{公式4}} —公式4 - 该函数描述了一种被称为稀疏编码的学习问题,其目标是寻求一个权重矩阵 W \boldsymbol{W} W,可以线性解码激励值矩阵 H \boldsymbol{H} H以重构训练集 X \boldsymbol{X} X。稀疏编码的大多数应用还涉及到权重衰减或 W \boldsymbol{W} W列范数的约束,以免极小 H \boldsymbol{H} H和极大 W \boldsymbol{W} W的病态解。
- 函数 J J J不是凸的。然而,我们可以将训练算法的输入分成两个集合:字典参数 W \boldsymbol{W} W和编码表示 H \boldsymbol{H} H。最小化关于这两者之一的任意一组变量的目标函数都是凸问题。因此,块坐标下降允许我们使用高效的凸优化算法,交替固定 H \boldsymbol{H} H优化 W \boldsymbol{W} W和固定 W \boldsymbol{W} W优化 H \boldsymbol{H} H。
- 当一个变量的值很大程度地影响另一个变量的最优值时,坐标下降不是一个很好的方法,如函数 f ( x ) = ( x 1 − x 2 ) 2 + α ( x 1 2 + x 2 2 ) f(\boldsymbol{x})=(x_1-x_2)^2+\alpha(x_1^2+x_2^2) f(x)=(x1−x2)2+α(x12+x22),其中 α \alpha α是正值常数。第一项鼓励两个变量具有相似的值,而第二项鼓励它们接近零。解是两者都为零。 牛顿法可以一步解决这个问题,因为它是一个正定二次问题。但是,对于小值 α \alpha α而言,坐标下降会使进展非常缓慢,因为第一项不允许单个变量变为和其他变量当前值显著不同的值.
Polyak平均
- P o l y a k \bold{Polyak} Polyak平均 ( Polyak and Juditsky, 1992 \text{Polyak and Juditsky, 1992} Polyak and Juditsky, 1992) 会平均优化算法在参数空间访问轨迹中的几个点。如果 t t t次迭代梯度下降访问了点 θ ( 1 ) , … , θ ( t ) \boldsymbol{\theta}^{(1)},\dots,\boldsymbol{\theta}^{(t)} θ(1),…,θ(t),那么 Polyak \text{Polyak} Polyak平均算法的输出是 θ ^ ( t ) = 1 t ∑ i θ ( i ) \hat{\boldsymbol{\theta}}^{(t)}=\frac{1}{t}\sum_i\boldsymbol{\theta}^{(i)} θ^(t)=t1∑iθ(i)。在某些问题中,如梯度下降应用于凸问题,这种方法具有较强的收敛保证。当应用于神经网络时,其验证更多是启发式的,但在实践中表现良好。基本想法是,优化算法可能会来回穿过山谷好几次而没经过山谷底部附近的点。尽管两边所有位置的均值应比较接近谷底。
- 在非凸问题中,优化轨迹的路径可以非常复杂,经过了许多不同的区域。包括参数空间中遥远过去的点,可能与当前点在代价函数上相隔很大的障碍,看上去不像一个有用的行为。其结果是,当应用
Polyak
\text{Polyak}
Polyak平均于非凸问题时,通常会使用指数衰减计算平均值:
θ ^ ( t ) = α θ ^ ( t − 1 ) + ( 1 − α ) θ ( t ) \hat{\boldsymbol{\theta}}^{(t)}=\alpha\hat{\boldsymbol{\theta}}^{(t-1)}+(1-\alpha)\boldsymbol{\theta}^{(t)} θ^(t)=αθ^(t−1)+(1−α)θ(t) — 公式5 \quad\textbf{---\footnotesize{公式5}} —公式5 - 这个计算平均值的方法被用于大量数值应用中。最近的例子请参看 Szegedy et al.(2015) \text{Szegedy et al.(2015)} Szegedy et al.(2015)。
监督预训练
- 有时,如果模型太复杂难以优化,或是如果任务非常困难,直接训练模型来解决特定任务可能太过挑战。有时训练一个较简单的模型来求解问题,然后使模型更复杂会更有效。训练模型来求解一个简化的问题,然后转移到最后的问题,有时也会更有效些。这些在直接训练目标模型求解目标问题之前,训练简单模型求解简化问题的方法统称为预训练( pretraining \text{pretraining} pretraining)。
- 贪心算法( greedy algorithm \text{greedy algorithm} greedy algorithm)将问题分解成许多部分,然后独立地在每个部分求解最优值。令人遗憾的是,结合各个最佳的部分不能保证得到一个最佳的完整解。然而,贪心算法计算上比求解最优联合解的算法高效得多,并且贪心算法的解在不是最优的情况下,往往也是可以接受的。贪心算法也可以后跟一个微调( fine-tuning \text{fine-tuning} fine-tuning)阶段,联合优化算法搜索全问题的最优解。使用贪心解初始化联合优化算法,可以极大地加速算法,并提高寻找到的解的质量。
- 预训练算法,特别是贪心预训练,在深度学习中是普遍存在的。在本篇章中,我们会具体描述这些将监督学习问题分解成其他简化的监督学习问题的预训练算法。这种方法被称为贪心监督预训练( greedy supervised pretraining \text{greedy supervised pretraining} greedy supervised pretraining)。
- 在贪心监督预训练的原始版本(
Bengio et al., 2007c
\text{Bengio et al., 2007c}
Bengio et al., 2007c) 中,每个阶段包括一个仅涉及最终神经网络的子集层的监督学习训练任务。
- 贪心监督预训练的一个例子如图例1所示,其中每个附加的隐藏层作为浅监督 MLP \text{MLP} MLP的一部分预训练,以先前训练的隐藏层输出作为输入。
- 并非一次预训练一层, Simonyan and Zisserman (2015) \text{Simonyan and Zisserman (2015)} Simonyan and Zisserman (2015)预训练深度卷积网络( 11 11 11层权重),然后使用该网络前四层和最后三层初始化更深的网络(多达 19 19 19层权重)。
- 非常深的新网络的中间层是随机初始化的。然后联合训练新网络。
- 还有一种选择,由 Yu et al. (2010) \text{Yu et al. (2010)} Yu et al. (2010)提出,将先前训练 MLP \text{MLP} MLP的输出,以及原始输入,作为每个附加阶段的输入。
- 为什么贪心监督预训练会有帮助呢?最初由 Bengio et al. (2007d) \text{Bengio et al. (2007d)} Bengio et al. (2007d)提出的假说是,其有助于更好地指导深层结构的中间层的学习。一般情况下, 预训练在优化和泛化两边面都是有帮助的。
- 另一个与监督预训练有关的方法扩展了迁移学习的想法: Yosinski et al. (2014) \text{Yosinski et al. (2014)} Yosinski et al. (2014)在一组任务上预训练了 8 8 8层权重的深度卷积网络( 1000 1000 1000个 ImageNet \text{ImageNet} ImageNet对象类的子集),然而用该网络的前 k k k层初始化同样规模的网络。然后第二个网络的所有层(上层随机初始化)联合训练以执行不同的任务( 1000 1000 1000个 ImageNet \text{ImageNet} ImageNet对象类的另一个子集),但训练样本少于第一个任务。神经网络中另一个和迁移学习相关的方法将在篇章:表示学习 - 迁移学习和领域自适应中讨论。
- 另一条相关的工作线是
FitNets(Romero et al., 2015)
\text{FitNets(Romero et al., 2015)}
FitNets(Romero et al., 2015)方法。
- 这种方法始于训练深度足够低和宽度足够大(每层单元数),容易训练的网络。
- 然后,这个网络成为第二个网络(被指定为学生)的老师。
- 学生网络更深更窄( 11 11 11至 19 19 19层),且在正常情况下很难用 SGD \text{SGD} SGD训练。
- 训练学生网络不仅需要预测原任务的输出,还需要预测教师网络中间层的值,这样使得训练学生网络变得更容易。
- 这个额外的任务说明了隐藏层应如何使用,能够简化优化问题。
- 附加参数被引入来从更深的学生网络中间层去回归 5 5 5层教师网络的中间层。
- 然而,并非预测最终分类目标,该目标是预测教师网络的中间隐藏层。
- 学生网络的低层因而具有两个目标:学生网络的输出完成其目标,和预测教师网络的中间层。
- 尽管一个窄而深的网络似乎比宽而浅的网络更难训练,但窄而深网络的泛化能力可能更好,并且如果其足够窄,参数足够少,那么其计算代价更小。
- 没有隐藏层的提示,学生网络在训练集和测试集上的实验表现都很差。
- 因而中间层的提示是有助于训练很难训练的网络的方法之一,但是其他优化技术或是架构上的变化也可能解决这个问题。
设计有助于优化的模型
- 改进优化的最好方法并不总是改进优化算法。相反,深度模型中优化的许多改进来自于设计易于优化的模型。
- 原则上,我们可以使用呈锯齿非单调模式上上下下的激励函数,但是,这将使优化极为困难。在实践中,选择一族容易优化的模型比使用一个强大的优化算法更重要。神经网络学习在过去 30 30 30年的大多数进步主要来自于改变模型族,而非改变优化过程。 1980 1980 1980年代用于训练神经网络的带动量的随机梯度下降,仍然是现代神经网络应用中的前沿算法。
- 具体来说,现代神经网络的设计选择体现在层之间的线性变换,几乎处处可导的激励函数,和大部分定义域都有明显的梯度。
- 特别地,创新的模型,如 LSTM \text{LSTM} LSTM,整流线性单元和 maxout \text{maxout} maxout单元都比先前的模型(如基于 sigmoid \text{sigmoid} sigmoid单元的深度网络)使用更多的线性函数。这些模型都具有简化优化的性质。
- 如果线性变换的 Jacobian \text{Jacobian} Jacobian具有相对合理的奇异值,那么梯度能够流经很多层。
- 此外,线性函数在一个方向上一致增加,所以即使模型的输出远离正确值,也可以简单清晰地计算梯度,使其输出方向朝降低损失函数的方向移动。
- 换言之,现代神经网络的设计方案旨在使其局部梯度信息合理地对应着移向一个遥远的解。
- 其他的模型设计策略有助于使优化更简单。
- 例如,层之间的线性路径或是跳过连接减少了从较低层参数到输出最短路径的长度,因而缓解了梯度消失的问题( Srivastava et al., 2015 \text{Srivastava et al., 2015} Srivastava et al., 2015)。
- 一个和跳过连接相关的想法是添加和网络中间隐藏层相连的输出的额外副本,如 GoogLeNet \text{GoogLeNet} GoogLeNet( Szegedy et al., 2014a \text{Szegedy et al., 2014a} Szegedy et al., 2014a) 和深度监督网络 ( Lee et al., 2014 \text{Lee et al., 2014} Lee et al., 2014)。
- 这些“辅助头”被训练来执行和网络顶层主要输出相同的任务,以确保底层网络能够接受较大的梯度。
- 当训练完成时,辅助头可能被丢弃。这是之前篇章中介绍到的预训练策略的替代方法。以这种方式,我们可以在一个阶段联合训练所有层,而不改变架构,使得中间层(特别是低层)能够通过更短的路径得到一些有些如何更新的有用信息
连续方法和课程学习
- 正如神经网络优化中的挑战篇 - 局部核全局结构间的弱对应探讨的,许多优化挑战都来自于代价函数的全局结构,不能仅通过局部更新方向上更好的估计来解决。解决这个问题的主要方法是尝试初始化参数到某种区域内,该区域可以通过局部下降很快连接到参数空间中的解。
- 连续方法(
continuation method
\text{continuation method}
continuation method)是一族通过挑选初始点使优化更容易的方法,以确保局部优化花费大部分时间在表现良好的空间。
- 连续方法的背后想法是构造一系列具有相同参数的目标函数。为了最小化代价函数 J ( θ ) J(\boldsymbol{\theta}) J(θ),我们构建新的代价函数 { J ( 0 ) , … , J ( n ) } \{J^{(0)},\dots,J^{(n)}\} {J(0),…,J(n)}。
- 这些代价函数逐步提高难度,其中 J ( 0 ) J^{(0)} J(0)是最容易最小化的, J ( n ) J^{(n)} J(n)是最难的,真正的代价函数促进整个过程。
- 当我们说 J ( i ) J^{(i)} J(i)比 J ( i + 1 ) J^{(i+1)} J(i+1)更容易时,是指其在更多的 θ \boldsymbol{\theta} θ空间上表现良好。
- 随机初始化更有可能落入局部下降可以成功最小化代价函数的区域,因为其良好区域更大。
- 这系列代价函数设计为前一个解是下一个的良好初始点。
- 因此,我们首先解决一个简单的问题,然后改进解以解决逐步变难的问题,直到我们求解真正问题的解。
- 传统的连续方法(用于神经网络训练之前的连续方法)通常是基于平滑的目标函数。参看 Wu (1997) \text{Wu (1997)} Wu (1997)了解这类方法的示例,以及一些相关方法的综述。连续方法也和参数中加入噪扰的模拟退火紧密相关( Kirkpatrick et al., 1983 \text{Kirkpatrick et al., 1983} Kirkpatrick et al., 1983)。连续方法在最近几年非常成功。参看 Mobahi and Fisher (2015) \text{Mobahi and Fisher (2015)} Mobahi and Fisher (2015) 了解其近期文献的概述,特别是在 AI \text{AI} AI方面的应用。
- 传统上,连续方法主要用来克服局部极小值的问题。
- 具体地,它被设计来在有很多局部极小值的情况下,求解一个全局最小点。
- 这些连续方法会通过“模糊”原来的代价函数来构建更容易的代价函数。
- 这些模糊操作可以是用采样来近似:
J ( i ) ( θ ) = E θ ′ ∼ N ( θ ′ ; θ , σ ( i ) 2 ) J ( θ ′ ) J^{(i)}(\boldsymbol{\theta})=\mathbb{E}_{\theta'\sim\mathcal{N}(\boldsymbol{\theta}';\boldsymbol{\theta},\sigma^{(i)2})}J(\boldsymbol{\theta}') J(i)(θ)=Eθ′∼N(θ′;θ,σ(i)2)J(θ′) — 公式6 \quad\textbf{---\footnotesize{公式6}} —公式6
- 这个方法的直觉是有些非凸函数在模糊后会近似凸的。
- 在许多情况下,这种模糊保留了关于全局极小值的足够信息,我们可以通过逐步求解更少模糊的问题来求解全局极小值。
- 这种方法有三种可能失败的方式。
- 首先,它可能成功地定义了一连串代价函数,并从开始的一个凸函数起(逐一地)沿着函数链最佳轨迹逼近全局最小值,但可能需要非常多的逐步代价函数,整个过程的成本仍然很高。
- 另外,即使连续方法可以适用, NP \text{NP} NP难的优化问题仍然是 NP \text{NP} NP难的。
- 其他两种连续方法失败的原因是不实用。
- 其一,不管如何模糊,可能函数没法变成凸的,比如函数 J ( θ ) = − θ ⊤ θ J(\boldsymbol{\theta})=-\boldsymbol{\theta}^\top\boldsymbol{\theta} J(θ)=−θ⊤θ。
- 其二,函数可能在模糊后是凸的,但模糊函数的最小值可能会逐步到一个局部值,而非原始代价函数的全局最小值。
- 尽管连续方法最初用来解决局部最小值的问题,局部最小值已不再是神经网络优化中的主要问题了。
- 幸运的是,连续方法仍然有所帮助。
- 连续方法引入的简化目标函数能够消除平坦区域,减少梯度估计的方差,提高 Hessian \text{Hessian} Hessian矩阵的条件数,使局部更新更容易计算,或是改进局部更新方向和朝向全局解方向之间的对应关系。
-
Bengio et al.(2009)
\text{Bengio et al.(2009)}
Bengio et al.(2009)指出被称为课程学习(
curriculum learning
\text{curriculum learning}
curriculum learning) 或者塑造(
shaping
\text{shaping}
shaping)的方法可以解释为连续方法。
- 课程学习规划学习过程的想法是,首先学习简单的概念,然后逐步学习依赖于这些简化概念的复杂概念。
- 之前这一基本策略被用来加速动物训练过程 ( Skinner, 1958; Peterson, 2004; Krueger and Dayan, 2009 \text{Skinner, 1958; Peterson, 2004; Krueger and Dayan, 2009} Skinner, 1958; Peterson, 2004; Krueger and Dayan, 2009) 和机器学习过程( Solomonoff, 1989; Elman, 1993; Sanger, 1994 \text{Solomonoff, 1989; Elman, 1993; Sanger, 1994} Solomonoff, 1989; Elman, 1993; Sanger, 1994)。 Bengio et al. (2009) \text{Bengio et al. (2009)} Bengio et al. (2009) 验证这一策略为连续方法,通过增加简单样本的影响(通过分配它们较大的系数到代价函数,或者更频繁地采样),先前的 J ( i ) J^{(i)} J(i)会容易。
- 实验证明,在大规模的神经语言模型任务上使用课程学习,可以获得更好的结果。
- 课程学习已经成功应用于大量的自然语言 ( Spitkovsky et al., 2010; Collobert et al., 2011a; Mikolov et al., 2011b;Tu and Honavar, 2011 \text{Spitkovsky et al., 2010; Collobert et al., 2011a; Mikolov et al., 2011b;Tu and Honavar, 2011} Spitkovsky et al., 2010; Collobert et al., 2011a; Mikolov et al., 2011b;Tu and Honavar, 2011) 和计算机视觉( Kumar et al., 2010; Lee and Grauman, 2011;Supancic and Ramanan, 2013 \text{Kumar et al., 2010; Lee and Grauman, 2011;Supancic and Ramanan, 2013} Kumar et al., 2010; Lee and Grauman, 2011;Supancic and Ramanan, 2013) 任务上。
- 课程学习被证实为与人类教学方式一致( Khan et al., 2011 \text{Khan et al., 2011} Khan et al., 2011):教师刚开始会展示更容易,更典型的示例,然后帮助学习者在不太显然的情况下提炼决策面。
- 在人类教学上,基于课程学习的策略比基于样本均匀采样的策略更有效,也能提高其他学习策略的效率( Basu and Christensen, 2013 \text{Basu and Christensen, 2013} Basu and Christensen, 2013)。
- 课程学习研究的另一个重要贡献体现在训练循环神经网络抓住长期依赖: Zaremba and Sutskever (2014) \text{Zaremba and Sutskever (2014)} Zaremba and Sutskever (2014)发现使用随机课程获得了更好的结果,容易和困难的示例混合在一起,随机提供给学习者,更难示例(这些具有长期依赖)的平均比例在逐渐上升。具有确定性课程,不再发现超过基线(完整训练集的普通训练)的改进。
- 现在我们已经介绍了一些基本的神经网络模型,以及如何正则和优化。在接下来的篇章章中,我们转向神经网络的细化,扩展到能够处理很大规模的数据和具有特殊结构的数据。在本篇章中讨论的优化算法在较少或者没有改动后,通常可以直接用于这些特殊的架构。
- 图例1:一种形式的贪心监督预训练的示意图(
Bengio et al., 2007a
\text{Bengio et al., 2007a}
Bengio et al., 2007a)。
-
一种形式的贪心监督预训练的示意图( Bengio et al., 2007a \text{Bengio et al., 2007a} Bengio et al., 2007a)。
-
说明:
- (a) 我们从训练一个足够浅的架构开始。
- (b) 同一个架构的另一描绘。
- © 我们只保留原始网络的输入到隐藏层,并丢弃隐藏到输出层。我们将第一层隐藏层的输出作为输入发送到另一监督单隐层 MLP \text{MLP} MLP(使用与第一个网络相同的目标训练),从而可以添加第二层隐藏层。这可以根据需要重复多层。
- (d) 所得架构的另一种描绘,可视为前馈网络。为了进一步改进优化,我们可以联合地微调所有层(仅在该过程的结束或者该过程的每个阶段)。
-
总结
综上所述,深度模型优化中的优化策略和元算法是提升模型性能、确保训练效率与稳定性的关键。通过综合运用数据预处理、模型优化、损失函数选择、正则化与集成方法以及先进的优化算法,我们可以更好地应对深度模型训练中的挑战,推动人工智能技术的持续发展与应用。