序言
在探索个人成长与技能提升的广阔领域中,学习与纯优化作为两大核心策略,虽相辅相成,却各有其独特的侧重点与路径。学习,这一古老而永恒的活动,是人类文明进步的基石,它强调对未知的探索、知识的积累与思维方式的拓展。而纯优化,则更像是在既定框架下的精细调整,旨在通过科学方法和技术手段,使某一系统或过程达到最佳状态。两者在推动个人与社会发展的道路上,扮演着不可或缺的角色,却又在目标导向、方法运用及影响范围上展现出显著差异。
学习和纯优化有什么不同
- 用于深度模型训练的优化算法与传统的优化算法在几个方面有所不同。
- 机器学习通常是间接作用的。在大多数机器学习问题中,我们关注定义于测试集上的,也可能是不可解的性能度量 P P P。
- 因此,我们只是间接地优化 P P P。我们希望通过降低代价函数 J ( θ ) J(\boldsymbol{\theta}) J(θ)来提高 P P P。
- 这一点不同于纯优化最小化 J J J本身。
- 训练深度模型的优化算法通常也会包括一些用于机器学习目标函数特定结构上的特殊优化。
- 通常,代价函数可写为训练集上的平均,如:
J ( θ ) = E ( x , y ) ∼ p ^ d a t a L ( f ( x ; θ ) , y ) J(\boldsymbol{\theta})=\mathbb{E}_{(\bold{x},\text{y})\sim\hat{p}_{data}}L(f(\boldsymbol{x;\theta}),y) J(θ)=E(x,y)∼p^dataL(f(x;θ),y) — 公式1 \quad\textbf{---\footnotesize{公式1}} —公式1- 其中, L L L是每个样本的损失函数
- f ( x ; θ ) f(\boldsymbol{x;\theta}) f(x;θ)是输入为 x \boldsymbol{x} x时所预测的输出
- p ^ d a t a \hat{p}_{data} p^data是经验分布
- 监督学习中, y y y是目标输出
- 在本章中,我们会介绍不带正则化的监督学习, L L L的变量是 f ( x ; θ ) f(\boldsymbol{x;\theta}) f(x;θ)和 y y y。
- 很容易将这种监督学习扩展成其他形式,如包括 θ \boldsymbol{\theta} θ或者 x \boldsymbol{x} x做参数,或是去掉参数 y y y,以发展不同形式的正则化或是无监督学习。
- 公式1定义了训练集上的目标函数。通常,我们更希望最小化取自数据生成分布
p
d
a
t
a
p_{data}
pdata的期望而不仅是有限个训练集上的对应目标函数:
J ∗ ( θ ) = E ( x , y ) ∼ p d a t a L ( f ( x ; θ ) , y ) J^\ast(\boldsymbol{\theta})=\mathbb{E}_{(\bold{x},y)\sim p_{data}}L(f(\boldsymbol{x;\theta}),y) J∗(θ)=E(x,y)∼pdataL(f(x;θ),y) — 公式2 \quad\textbf{---\footnotesize{公式2}} —公式2
经验风险最小化
- 风险 ( risk \text{risk} risk)
- 机器学习算法的目标是降低公式2所示的期望泛化误差。这个数据量被称为风险 (
risk
\text{risk}
risk)。
- 在这里我们要强调该期望取自真实的潜在分布 p d a t a p_{data} pdata。
- 如果我们知道了真实分布 p d a t a ( x , y ) p_{data}(\boldsymbol{x},y) pdata(x,y),那么最小化风险变成了一个可以被优化算法解决的优化问题。
- 然而,我们遇到的机器学习问题,通常是不知道 p d a t a ( x , y ) p_{data}(\boldsymbol{x},y) pdata(x,y),只知道训练集中样本。
- 经验风险 (empirical risk)
- 将机器学习问题转化回一个优化问题的最简单方法是最小化训练集上的期望损失。
- 这意味着用训练集上的经验分布 p ^ ( x , y ) \hat{p}(\boldsymbol{x},y) p^(x,y)替代真实分布 p ( x , y ) p(\boldsymbol{x},y) p(x,y)。
- 现在,我们将最小化经验风险 (empirical risk):
E x , y ∼ p ( x , y ) [ L ( f ( x ; θ ) , y ) ] = 1 m ∑ i = 1 m L ( f ( x ( i ) ; θ ) , y ( i ) ) \mathbb{E}_{\bold{x},y\sim p(\bold{x},y)}[L(f(\boldsymbol{x;\theta}),y)]=\frac{1}{m}\sum\limits_{i=1}^m L(f(\boldsymbol{x}^{(i)};\boldsymbol{\theta}),y^{(i)}) Ex,y∼p(x,y)[L(f(x;θ),y)]=m1i=1∑mL(f(x(i);θ),y(i)) — 公式3 \quad\textbf{---\footnotesize{公式3}} —公式3 - 其中 m m m表示训练样本的数目。
- 经验风险最小化 (empirical risk minimization)
- 基于最小化这种平均训练误差的训练过程被称为经验风险最小化 (empirical risk minimization)。
- 在这种情况下,机器学习仍然和传统的直接优化很相似。
- 我们并不直接最优化风险,而是最优化经验风险,希望也能够很大地降低风险。
- 一系列不同的理论构造了一些条件,使得在这些条件下真实风险的期望可以下降不同的量。
- 然而,经验风险最小化很容易导致过拟合。
- 高容量的模型会简单地记住训练集。
- 在很多情况下,经验风险最小化并非真的可行。
- 最有效的现代优化算法是基于梯度下降的,但是很多有用的损失函数,如 0 − 1 0 − 1 0−1损失,没有有效的导数(导数要么为零,要么处处未定义)。
- 这两个问题说明,在深度学习中我们很少使用经验风险最小化。
- 反之,我们会使用一个稍稍不同的方法,我们真正优化的目标会更加不同于我们希望优化的目标。
替代损失函数和提前终止
- 有时,我们真正关心的损失函数(比如分类误差)并不能高效地优化。
- 例如,即使对于线性分类器而言,精确地最小化 0 − 1 0 − 1 0−1损失通常是不可解的(复杂度是输入维数的指数级别)(Marcotte and Savard, 1992)。
- 在这种情况下,我们通常会优化替代损失函数 (surrogate loss function)。
- 替代损失函数作为原目标的代理,还有一些优点。
- 例如,正确类别的负对数似然通常用作 0 − 1 0 − 1 0−1损失的替代。
- 负对数似然允许模型估计给定样本的条件概率,如果该模型效果好,那么它能够输出最小期望分类误差对应的类别。
- 在某些情况下,替代损失函数能比原函数学习到更多。
- 例如,使用对数似然替代函数时,在训练集上的 0 − 1 0 − 1 0−1损失达到 0 0 0之后,测试集上的 0 − 1 0 − 1 0−1损失还能持续下降很长一段时间。
- 这是因为即使 0 − 1 0 − 1 0−1损失期望是零时,我们还能拉开不同类别的距离以改进分类器的鲁棒性,获得一个更强壮的、值得信赖的分类器。
- 因而,相较于简单地最小化训练集上的平均 0 − 1 0 − 1 0−1损失,它能够从训练数据中抽取了更多信息。
- 一般的优化和我们用于训练算法的优化的一个重要不同:训练算法通常不会停止在局部极小点。
- 反之,机器学习通常优化替代损失函数,但是在基于提前终止(深度学习中的正则化技术 - 提前终止篇)的收敛条件满足时停止。
- 通常,提前终止使用真实潜在损失函数,如验证集上的 0 − 1 0 − 1 0−1损失,并设计为在过拟合发生之前终止。
- 与纯优化不同的是,提前终止时替代损失函数仍然有较大的导数,而纯优化终止时导数较小。
批算法和 minibatch \text{minibatch} minibatch
- 机器学习算法和一般优化算法不同的一点是,机器学习算法的目标函数通常可以分解为训练样本上的求和。
- 机器学习中的优化算法在计算参数的每一次更新时通常基于使用整个代价函数中仅仅一部分项来估计代价函数的期望值。
- 例如, 最大似然估计问题可以在对数空间中分解成每个样本的总和:
θ ML = arg max θ ∑ i = 1 m log p model ( x ( i ) , y ( i ) ; θ ) \boldsymbol{\theta}_{\text{ML}}=\argmax\limits_{\boldsymbol{\theta}}\sum\limits_{i=1}^m \log p_{\text{model}}(\boldsymbol{x}^{(i)},y^{(i)};\boldsymbol{\theta}) θML=θargmaxi=1∑mlogpmodel(x(i),y(i);θ) — 公式4 \quad\textbf{---\footnotesize{公式4}} —公式4- 最大化这个总和等价于最大化训练集在经验分布上的期望:
J ( θ ) = E x , y ∼ p ^ data log p model ( x , y ; θ ) J(\boldsymbol{\theta})=\mathbb{E}_{\text{x},y\sim\hat{p}_{\text{data}}}\log p_{\text{model}}(\boldsymbol{x},y;\boldsymbol{\theta}) J(θ)=Ex,y∼p^datalogpmodel(x,y;θ) — 公式5 \quad\textbf{---\footnotesize{公式5}} —公式5 - 优化算法用到的目标函数
J
J
J中的大多数性质也是训练集上的期望。例如,最常用的性质是梯度:
∇ θ J ( θ ) = E x , y ∼ p ^ data ∇ θ log p model ( x , y ; θ ) \nabla_{\boldsymbol{\theta}}J(\boldsymbol{\theta})=\mathbb{E}_{\text{x},y\sim\hat{p}_{\text{data}}}\nabla_{\boldsymbol{\theta}}\log p_{\text{model}}(\boldsymbol{x},y;\boldsymbol{\theta}) ∇θJ(θ)=Ex,y∼p^data∇θlogpmodel(x,y;θ) — 公式6 \quad\textbf{---\footnotesize{公式6}} —公式6 - 准确计算这个期望的计算量非常大,因为需要在整个数据集上的每个样本上评估模型。
- 在实践中,我们可以从数据集中随机采样少量的样本,然后计算这些样本上的平均值。
- 最大化这个总和等价于最大化训练集在经验分布上的期望:
- 回想一下,
n
n
n个样本的均值的标准误差,方程式:
SE ( μ ^ m ) = Var [ 1 m ∑ i = 1 2 x ( i ) ] = σ m \text{SE}(\hat{\mu}_m) = \sqrt{\text{Var} \left[\displaystyle{\frac{1}{m}}\sum\limits_{i=1}^2 x^{(i)}\right]} = \displaystyle{\frac{\sigma}{\sqrt{m}}} SE(μ^m)=Var[m1i=1∑2x(i)]=mσ的均值的标准误差是 σ m \displaystyle{\frac{\sigma}{\sqrt{m}}} mσ- 其中 σ \sigma σ是样本值真实的标准差。
- 分母 n \sqrt{n} n表明使用更多样本来估计梯度的方法的回报是低于线性的。
- 比较两个假想的梯度计算,一个基于 100 100 100个样本,另一个基于 10 , 000 10,000 10,000个样本。
- 后者的计算量多于前者的 100 100 100倍,但却只降低了 10 10 10倍的均值标准误差。
- 如果能够快速计算出梯度估计值,而不是缓慢计算准确值,那么大多数优化算法会收敛地更快(就总的计算量而言,而不是指更新次数)。
- 另一个从小数目样本中获得梯度的统计估计的动机是训练集的冗余。
- 在最坏的情况下,训练集中所有的 m m m个样本可以是彼此相同的拷贝。
- 基于采样的梯度估计可以使用单个样本计算出正确的梯度,而比原来的做法少花了 m m m倍时间。
- 实践中,我们不太可能真的遇到这种最坏情况,但我们可能会发现大量样本都对梯度做出了非常相似的贡献。
- 使用整个训练集的优化算法被称为批量(
batch
\text{batch}
batch)或确定性(
deterministic
\text{deterministic}
deterministic)梯度算法,因为它们会同时在大
batch
\text{batch}
batch中处理所有的样本。
- 这个术语可能有点令人困惑,因为这个词“ batch \text{batch} batch“也经常被用来描述 minibatch \text{minibatch} minibatch随机梯度下降算法中用到的 minibatch \text{minibatch} minibatch样本。
- 通常,术语“ batch \text{batch} batch梯度下降”指使用全部训练集,而术语“ batch \text{batch} batch”单独出现时指一组样本。例如,我们普遍使用术语“ batch \text{batch} batch大小“表示 minibatch \text{minibatch} minibatch的大小。
- 每次只使用单个样本的优化算法有时被称为随机(
stochastic
\text{stochastic}
stochastic)或者在线(
online
\text{online}
online)算法。
- 术语“在线”通常是指从连续产生样本的数据流中抽取样本的情况,而不是从一个固定大小的训练集中遍历多次采样的情况。
- 大多数用于深度学习的算法介于以上两者之间,使用一个以上,而又不是全部的训练样本。传统上,这些会被称为minibatch( minibatch \text{minibatch} minibatch)或minibatch随机( minibatch stochastic \text{minibatch stochastic} minibatch stochastic)方法,现在通常将他们简单地称为随机( stochastic \text{stochastic} stochastic)方法。
- 随机方法的典型示例是随机梯度下降,我们将在篇章:基本算法中详细描述。
- minibatch大小通常由以下几个因素决定:
- 更大的 batch \text{batch} batch会计算更精确的梯度估计,但是回报却是小于线性的。
- 极小 batch \text{batch} batch通常难以充分利用多核架构。这促使我们使用一些绝对最小 batch \text{batch} batch,低于这个值的小 batch \text{batch} batch处理不会减少计算时间。
- 如果 batch \text{batch} batch处理中的所有样本可以并行地处理(通常确是如此),那么内存消耗和 batch \text{batch} batch大小会成比增长。对于很多硬件设施,这是 batch \text{batch} batch大小的限制因素。
- 有些硬件在特定大小的数列上效果更好。
- 尤其是在使用 GPU \text{GPU} GPU时,通常使用 2 2 2的幂数作为 batch \text{batch} batch大小来获得更少的运行时间。
- 一般, 2 2 2的幂数的取值范围是 32 32 32到 256 256 256, 16 16 16有时用于尝试大的模型。
- 可能是由于小
batch
\text{batch}
batch处理在学习过程中加入了噪扰,它们会有一些正则化效果 (Wilson and Martinez, 2003)。
- 泛化误差通常在 batch \text{batch} batch大小为 1 1 1时最好。
- 因为梯度估计的高方差,小 batch \text{batch} batch训练需要较小的学习速率以维持稳定性。
- 由于降低的学习速率和消耗更多步骤来观察整个训练集而产生更多的步骤,会导致总的运行时间非常大。
- 不同的算法使用不同的方法从
minibatch
\text{minibatch}
minibatch中获取不同的信息。
- 有些算法对采样误差比其他算法更敏感,有两个可能原因。
- 一个是它们使用了很难在少量样本上精确估计的信息。
- 另一个是它们以放大采样误差的方式使用了信息。
- 仅基于梯度 g \boldsymbol{g} g的更新方法通常相对鲁棒,并能在更小的 batch \text{batch} batch获得成功,如 100 100 100。
- 使用 Hessian \text{Hessian} Hessian矩阵 H \boldsymbol{H} H,计算如 H − 1 g \boldsymbol{H}^{-1}\boldsymbol{g} H−1g更新的二阶方法通常需要更大的 batch \text{batch} batch,如 10 , 000 10,000 10,000。
- 这些大 batch \text{batch} batch需要最小化估计 H − 1 g \boldsymbol{H}^{-1}\boldsymbol{g} H−1g的波动。
- 假设 H \boldsymbol{H} H被精确估计,但是有病态条件数。
- 乘以 H \boldsymbol{H} H或是其逆会放大之前存在的误差(这个示例中是指 g \boldsymbol{g} g的估计误差)。
- 即使 H \boldsymbol{H} H被精确估计, g \boldsymbol{g} g中非常小的变化也会导致更新值 H − 1 g \boldsymbol{H}^{-1}\boldsymbol{g} H−1g中非常大的变化。
- 当然,我们通常只会近似地估计 H \boldsymbol{H} H,因此相较于我们使用具有较差条件数的操作去估计 g \boldsymbol{g} g,更新 H − 1 g \boldsymbol{H}^{-1}\boldsymbol{g} H−1g会含有更多的误差。
- 有些算法对采样误差比其他算法更敏感,有两个可能原因。
-
minibatch
\text{minibatch}
minibatch是随机抽取的这点也很重要。
- 从一组样本中计算出梯度期望的无偏估计需要这些样本是独立的。
- 我们也希望两个连续的梯度估计是互相独立的,因此两个连续的 minibatch \text{minibatch} minibatch样本也应该是彼此独立的。
- 很多现实的数据集自然排列,从而使得连续的样本之间具有高度相关性。
- 例如,假设我们得到了一个长长的血液样本测试结果清单。
- 清单上的数据有可能是这样获取的,头五个血液样本于不同时间段取自第一个病人,接下来三个血液样本取自第二个病人,再随后的血液样本取自第三个病人,等等。
- 如果我们从这个清单上顺序抽取样本,那么我们的每个 minibatch \text{minibatch} minibatch数据都非常有偏,因为这个 minibatch \text{minibatch} minibatch很可能只代表着数据集上众多患者中的某一个患者。
- 在这种数据集中的顺序有很大影响的情况下,很有必要在抽取 minibatch \text{minibatch} minibatch样本前打乱样本顺序。
- 对于非常大的数据集,如数据中心含有几十亿样本的数据集,我们每次构建 minibatch \text{minibatch} minibatch样本时都将样本完全均匀地抽取出来是不太现实的。
- 幸运的是,实践中通常将样本顺序打乱一次,然后按照这个顺序存储起来就足够了。
- 这将会固定之后训练模型时会用到的一组组 minibatch \text{minibatch} minibatch连续样本,每个独立的模型每次遍历训练数据时都会重复使用这个顺序。
- 然而,这种偏离真实随机采样的方法并非具有很严重的有害影响。不曾打乱样本顺序的方法才会极大地降低算法的性能。
- 很多机器学习上的优化问题都可以分解成并行地计算不同样本上单独的更新。
- 换言之,我们在计算 minibatch \text{minibatch} minibatch样本 X \boldsymbol{X} X上的最小化 J ( X ) J(\boldsymbol{X}) J(X)的更新时,同时可以计算其他 minibatch \text{minibatch} minibatch样本上的更新。
- 这类异步并行分布式方法将在后续篇章中进一步讨论(敬请期待!)。
-
minibatch
\text{minibatch}
minibatch随机梯度下降的一个有趣动机是,只要没有重复使用样本,它将遵循着真实泛化误差(公式2)的梯度。
- 很多 minibatch \text{minibatch} minibatch随机梯度下降方法的实现会打乱数据顺序一次,然后多次遍历数据更新参数。
- 第一次遍历时,每个 minibatch \text{minibatch} minibatch样本都用来计算真实泛化误差的无偏估计。
- 第二次遍历时,估计将会是有偏的,因为它重新抽取了已经用过的样本,而不是从和原先样本相同的数据生成分布中获取新的公正的样本。
- 随机梯度下降最小化泛化误差的原因很容易从在线学习的情况中看出来,这时样本或者
minibatch
\text{minibatch}
minibatch都是从数据流(
stream
\text{stream}
stream)中抽取出来的。
- 换言之,并非获取固定大小的训练集,学习器好像是一个每次看到新样本的人,每个样本 ( x , y ) (\boldsymbol{x},y) (x,y)都来自数据生成分布 p data ( x , y ) p_{\text{data}}(\boldsymbol{x},y) pdata(x,y)。
- 这种情况下,样本从来不会重复;每次更新也是公平地从分布 p data p_{\text{data}} pdata中采样获得。
- 在
x
\boldsymbol{x}
x和
y
y
y是离散时,以上的等价性很容易得到。在这种情况下, 泛化误差(公式2可以表示为:
J ∗ ( θ ) = ∑ x ∑ y p data ( x , y ) L ( f ( x ; θ ) , y ) J^\ast(\boldsymbol{\theta})=\sum\limits_x\sum\limits_y p_{\text{data}}(\boldsymbol{x},y)L(f(\boldsymbol{x};\boldsymbol{\theta}),y) J∗(θ)=x∑y∑pdata(x,y)L(f(x;θ),y) — 公式7 \quad\textbf{---\footnotesize{公式7}} —公式7 - 上式的准确梯度为:
g = ∇ θ J ∗ ( θ ) = ∑ x ∑ y p data ( x , y ) ∇ θ L ( f ( x ; θ ) , y ) \boldsymbol{g}=\nabla_{\boldsymbol{\theta}}J^\ast(\boldsymbol{\theta})=\sum\limits_x\sum\limits_y p_{\text{data}}(\boldsymbol{x},y)\nabla_{\boldsymbol{\theta}}L(f(\boldsymbol{x};\boldsymbol{\theta}),y) g=∇θJ∗(θ)=x∑y∑pdata(x,y)∇θL(f(x;θ),y) — 公式8 \quad\textbf{---\footnotesize{公式8}} —公式8 - 在公式5和公式6中,我们已经在对数似然中看到了相同的结果;现在我们发现这一点在包括似然的其他函数 L L L上也是成立的。做一些温和的关于 p data p_{\text{data}} pdata和 L L L的假设时,类似的结果在 x \boldsymbol{x} x和 y y y是连续时也能得到。
- 因此,泛化误差的准确梯度的无偏估计可以通过从数据生成分布
p
data
p_{\text{data}}
pdata抽取
minibatch
\text{minibatch}
minibatch样本
{
x
(
i
)
,
…
,
x
(
m
)
}
\{\boldsymbol{x}^{(i)},\dots,\boldsymbol{x}^{(m)}\}
{x(i),…,x(m)}以及对应的目标
y
(
i
)
y^{(i)}
y(i),然后计算该
minibatch
\text{minibatch}
minibatch上损失函数关于对应参数的梯度:
g ^ = 1 m ∇ θ ∑ i L ( f ( x ( i ) ; θ ) , y ( i ) ) \hat{\boldsymbol{g}}=\displaystyle\frac{1}{m}\nabla_{\boldsymbol{\theta}}\sum\limits_i L(f(\boldsymbol{x}^{(i)};\boldsymbol{\theta}),y^{(i)}) g^=m1∇θi∑L(f(x(i);θ),y(i)) — 公式9 \quad\textbf{---\footnotesize{公式9}} —公式9
在泛化误差上使用 SGD \text{SGD} SGD方法在方向 g ^ \hat{\boldsymbol{g}} g^更新 θ \boldsymbol{\theta} θ。 - 当然,这个解释只能用于样本没有重复使用的情况。
- 然而,除非训练集特别大,通常最好是多次遍历训练集。
- 当多次遍历数据集更新时,只有第一遍满足泛化误差梯度的无偏估计。
- 但是,额外的遍历更新当然会由于减小训练误差而得到足够的好处,以抵消其带来的训练误差和测试误差间差距的增加。
- 随着数据集的规模迅速增长,超越了计算能力的增速,机器学习应用每个样本只使用一次的情况变得越来越常见,甚至是不完整地使用训练集。
- 在使用一个非常大的训练集时,过拟合不再是问题,而欠拟合和计算效率变成了主要的顾虑。也可以参看Bottou and Bousquet (2008a) 中关于训练样本数目增长时, 泛化误差上计算瓶颈影响的讨论。
总结
简而言之,学习与纯优化的不同在于:学习是广泛而深远的,它要求我们跨越已知边界,拥抱新知,培养批判性思维与创新能力,为个人的全面发展和社会进步奠定坚实基础。而纯优化则聚焦于具体目标的高效达成,通过数据分析、算法优化等手段,在既定条件下追求效率与效果的极致。学习为优化提供源源不断的灵感与方向,优化则是学习成果在实践中的精准应用与检验。两者相辅相成,共同推动着个人与社会的持续进步与发展。在快速变化的今天,我们既需要不断学习以拓宽视野,也需掌握优化技巧以提升效率,从而在复杂多变的环境中稳健前行。
往期内容回顾
深度学习中的正则化技术 - 提前终止篇
应用数学与机器学习基础 - 估计、偏差和方差篇
应用数学与机器学习基础 - 数值计算篇