简介
本文主要讨论了机器学习中随机梯度下降(SGD)和自适应学习率算法的原理及应用。SGD通过随机选择小批量样本计算损失值,减少了计算量,加快了训练速度。自适应学习率算法如Adam、RMSProp和Adagrad,通过自动调整学习率,提高了训练收敛速度。此外,本文还介绍了超参数筛选、交叉验证、正则化(权重衰减、L1和L2正则化)、Dropout等方法,以解决过拟合和欠拟合问题,提高模型泛化能力。最后,对Dropout的比例控制和测试时调整进行了阐述。
随机梯度下降和自适应学习率
与其在每个迭代中对全部的训练数据计算损失函数 L L L ,随机梯度下降(Stochastic Gradient Decent, SGD) 计算损失值时随机选择一小部分的训练样本。
这一小部分的训练样本称为 小批量(Mini-batch) 小批量的具体大小称为 批大小(Batch size)B
用批大小
B
和
B
≪
N
重写公式
用批大小B和B\ll N重写公式
用批大小B和B≪N重写公式,损失函数
L
\mathcal{L}
L 可以重写为仅涉及当前小批量样本的损失,改进计算
L
L
L 的效率
L
=
1
2
∥
y
−
a
L
∥
2
2
=
1
2
∑
i
=
1
B
(
y
i
−
a
i
L
)
2
\mathcal{L}=\frac12\|\boldsymbol{y}-\boldsymbol{a}^L\|_2^2=\frac12\sum_{i=1}^B(y_i-a_i^L)^2
L=21∥y−aL∥22=21i=1∑B(yi−aiL)2
训练过程如下,通过这种方式,每个迭代只处理一小部分数据,从而减少了计算量,加快了训练速度。当迭代次数足够多时,每个样本都有机会多次被用于更新参数,从而在整个训练集上近似地进行优化。
# 输入参数
θ, α, S = 参数θ, 学习率α, 训练步数/迭代次数S
# 训练过程
for i in range(S):
# 计算一个小批量的损失L
L = compute_loss(θ)
# 通过反向传播计算梯度∂L/∂θ
grad_L = backpropagation(L, θ)
# 更新梯度▽θ
▽θ = -α * grad_L
# 更新参数θ
θ = θ + ▽θ
# 返回训练好的参数
return θ
学习率(Learning rate) 控制了随机梯度下降中每次更新的步长。
如果过大,可能无法找到最小值,如果过小,收敛速度将十分缓慢。
针对这个问题,需要使用自适应学习率算法,如 Adam、RMSProp和Adagrad 通过自动、自适应的方法来调整学习率,从而加速训练算法的收敛速度。
算法的原理的在于,当参数收到了一个较小的梯度时,算法会转到一个更大的步长;反之,如果梯度过大,算法给一个较小的步长。
Adam优化器的训练过程:β1, β2为梯度的遗忘因子,或者分别是其动量和二阶动量
# 输入参数
θ, α, S, β1, β2, ϵ = 参数θ, 学习率α, 训练步数/迭代次数S, 0.9, 0.999, 10**-8
# 初始化动量
m0 = 0 # 初始化一阶动量
v0 = 0 # 初始化二阶动量
# 训练过程
for t in range(1, S + 1):
# 第4步: 用一个随机的小批量计算梯度
grad_L = compute_gradient(θ)
# 第6步: 更新一阶动量
mt = β1 * m0 + (1 - β1) * grad_L
# 第7步: 更新二阶动量
vt = β2 * v0 + (1 - β2) * (grad_L ** 2)
# 第8步: 计算一阶动量的滑动平均
mt_hat = mt / (1 - β1 ** t)
# 第10步: 计算二阶动量的滑动平均
vt_hat = vt / (1 - β2 ** t)
# 第11步: 更新参数θ
▽θ = -α * mt_hat / (sqrt(vt_hat) + ϵ)
θ = θ + ▽θ
# 更新动量变量
m0 = mt
v0 = vt
# 第12步: 返回训练好的参数
return θ
超参数筛选
超参数(Hyper-Parameters ) 指和设置相关的参数,比如层的数量以及训练过程的设置参数,如更新步的数量、批大小和学习率。这些设置参数很大程度上会影响模型的表现。
为了衡量不同超参数对模型表现的影响,通常将数据集划为训练集、验证集、测试集。
交叉验证
在一个小数据集上,划分训练集、验证集、测试集的做法会浪费宝贵的数据。训练集分得过小,可能因为训练不足而让训练出来的模型表现不佳。验证集过小,不能让模型被充分的评估。**交叉验证(Cross Validation)**就是解决这个问题,所有的数据都能被用来训练模型,也不需要验证集,充分利用数据。
在一个k折交叉验证策略中,一个数据集将会被分成k个互相不重复的子集,并且每个子集包含同样数量的数据。我们将重复训练模型k次,其中每次训练时,一个子集将会被选为测试集, 而剩下的数据将会被用来训练模型。最后用来评估的结果则是:k次训练后,模型输出性能(如准确度)的平均值。图1.11展示了一个四折交叉验证示例。
正则化
一个被过度优化的模型会有很小的训练集误差,但有很大的测试集误差,这叫 过拟合(overfitting)
相对的概念叫 欠拟合(Underfitting) 在训练集和测试集上都有很大的误差。
正则化是减轻过拟合的一种手段
权重衰减
权重衰减(Weight Decay)是一种简单却有效的用于解决过拟合的正则化方法。它用了一个正则项作为惩戒,使θ有更小的绝对值。这会使得模型的上下摇摆幅度减小,能更好地拟合数据。
用参数范式作为惩戒的损失函数定义为:
L
t
o
t
a
l
=
L
(
y
,
y
^
)
+
λ
Ω
(
θ
)
\mathcal{L}_{\mathrm{total}}=\mathcal{L}(\boldsymbol{y},\hat{\boldsymbol{y}})+\lambda\Omega(\boldsymbol{\theta})
Ltotal=L(y,y^)+λΩ(θ)
其中
L
(
y
,
y
^
)
\mathcal{L}(\boldsymbol{y},\hat{\boldsymbol{y}})
L(y,y^)是从使用目标
y
\boldsymbol y
y和预测
y
^
\hat{\boldsymbol{y}}
y^来计算的损失函数,
Ω
\Omega
Ω是模型的参数范式惩戒函数,
λ
\lambda
λ是有比较小的值,以控制参数范式惩戒函数的幅度。
两种最常见的参数范式惩戒函数是 L 1 = ∥ W ∥ \mathcal{L}_1=\|W\| L1=∥W∥和 L 2 = ∥ W ∥ 2 2 \mathcal{L}_2=\|W\|_2^2 L2=∥W∥22。深度神经网络的参数的绝对值通常小于 1,所以 L 1 \mathcal{L}_1 L1会比 L 2 \mathcal{L}_2 L2输出一个更大的惩戒,因为当 ∣ w ∣ < 1 |w|<1 ∣w∣<1时, ∣ w ∣ > w 2 |w|>w^2 ∣w∣>w2。可见, L 1 \mathcal{L}_1 L1 函数用来作为参数范式惩戒函数时,会让参数偏向于更小的值甚至为0。这是模型隐性地选择特征的方法,把那些不重要特征的相对应参数设为一个很小的值或者是0。
- 参数范式惩戒函数
Ω
\Omega
Ω:
- Ω \Omega Ω 是正则化项,用于对模型的复杂度进行惩罚。在深度学习中,模型过于复杂可能导致过拟合(Overfitting),即模型在训练数据上表现很好,但在未见过的数据上表现不佳。正则化通过惩罚模型权重的大小,来鼓励模型学习更加简单、泛化的表示。
- 正则化强度
λ
\lambda
λ:
- λ \lambda λ 是一个超参数,用于控制正则化项的强度。 λ \lambda λ 值较小意味着对模型复杂度的惩罚较小,而 λ \lambda λ 值较大则意味着对模型复杂度的惩罚较大。
- 两种最常见的参数范式惩戒函数:
- L 1 = ∥ W ∥ \mathcal{L}_1 = \|W\| L1=∥W∥:L1正则化,也称为Lasso正则化。这里的 ∥ W ∥ \|W\| ∥W∥ 表示权重矩阵 W W W 的各个元素的绝对值之和。
- L 2 = ∥ W ∥ 2 2 \mathcal{L}_2 = \|W\|_2^2 L2=∥W∥22:L2正则化,也称为Ridge正则化。这里的 ∥ W ∥ 2 2 \|W\|_2^2 ∥W∥22 表示权重矩阵 W W W 的各个元素的平方和。
- L1和L2正则化的比较:
- 对于深度神经网络,参数的绝对值通常小于1。在 ∣ w ∣ < 1 |w|<1 ∣w∣<1 的情况下, ∣ w ∣ |w| ∣w∣(L1正则化)会大于 w 2 w^2 w2(L2正则化)。这意味着L1正则化会对较小的权重施加更大的惩罚。
- 由于L1正则化对较小的权重施加更大的惩罚,它倾向于推动模型将不重要的特征的权重推向0。这实际上是一种特征选择机制,因为模型会倾向于只保留那些对预测任务真正重要的特征。
L1正则化的“尖刺”特性:
- 在右图中,L1正则化的轮廓线(蓝色)呈现出“尖刺”状,特别是在坐标轴上。这意味着当参数接近0时,L1正则化的惩罚迅速减小。因此,为了最小化整体损失(原始损失加上正则化项),模型参数有更大的倾向落在坐标轴上,即参数值为0。
- 当两个轮廓线(原始损失和L1正则化)相交时,相交点往往更靠近坐标轴,这是因为L1正则化在参数为0时提供了最小的惩罚。因此,L1正则化倾向于将不重要的参数推向0。
L2正则化的“圆形”特性:
- 在左图中,L2正则化的轮廓线(蓝色)呈现出“圆形”状,这是因为它惩罚的是参数的平方。因此,L2正则化对任何大小的参数都施加惩罚,只是参数越大,惩罚越重。这导致最小化整体损失的参数解更可能是一个较小的非零值,而不是0。
L1正则化更倾向于进行特征选择,而L2正则化则更倾向于保持所有特征,但减少它们对模型的影响。
Dropout
Dropout是另一种很受欢迎的用来解决过拟合问题的方法。
当神经元数量非常多时,网络会出现共适应的问题,从而会过拟合。
神经元的共适应指神经元之间会相互依赖。故而,一旦一个神经元失效,就有可能所有依赖它的神经元都会失效,以致于整个网络瘫痪的局面。
为了避免共适应,随机丢弃(Dropout): 在每次训练迭代中,Dropout会随机选择一部分隐藏层神经元,并将它们的输出置为0。这意味着在每次迭代时,神经网络都在使用一个不同的网络结构进行训练。
由于神经元可能会在任意时刻被丢弃,这迫使网络中的每个神经元学习更加鲁棒的特征。这样,网络就不能依赖于某些特定的神经元存在,从而减少了神经元之间的共适应。
效果类似于模型集成: Dropout可以看作是一种廉价的模型集成方法。每次迭代中的网络结构不同,最终的效果类似于训练了多个不同的网络,并在测试时对这些网络进行平均。
比例控制: Dropout的比例,即被置为0的神经元的比例,是一个超参数。通常这个比例在0.2到0.5之间,需要根据具体情况进行调整。
测试时的调整: 在测试阶段,由于所有的神经元都是活跃的,因此需要调整输出层的权重,以补偿训练时丢弃的神经元。这通常是通过将测试时的输出乘以Dropout的比例来实现的。