Deep Learning Note: 2-2 正则化
解决过拟合问题的主要方法是使用正则化(Regularization)和获取更多数据,但并不是总能获取到更多的数据,或者获取更多数据的成本过高,因此通常首选使用正则化。
Contents [show]
1. 逻辑回归的正则化
首先以逻辑回归为例,说明正则化的过程。逻辑回归的代价函数为:
J(w,b)=1mm∑i=1L(ˆy(i),y(i))
式 (1) 中 w 为权重,是一个 nx×1 的向量,即 w∈Rnx,nx 为特征数量。b 为偏置,是一个实数,即 b∈R。
应用正则化的方法是,为代价函数额外加上一项 λ2m‖w‖22,即:
J(w,b)=1mm∑i=1L(ˆy(i),y(i))+λ2m‖w‖22
式 (2) 中,λ 为正则化系数,‖w‖2 为向量 w 的欧几里得范数(Euclidean Norm),也称为 L2 范数,是向量元素平方和再开平方:
‖w‖2=√nx∑j=1w2j=√wTw
式 (2) 中使用平方的形式:
‖w‖22=nx∑j=1w2j=wTw
因此式 (2) 所示的正则化方法称为 L2 正则化(L2 Regularization),是最常见的正则化方法。
注意是 (2) 中只增加了关于 w 的项,而没有增加关于 b 的项,例如:
J(w,b)=1mm∑i=1L(ˆy(i),y(i))+λ2m‖w‖22+λ2mb2
实际上,也可以像上式那样,添加关于 b 的项 λ2mb2。w 通常是一个非常高维的向量,它对模型的高方差问题做出了主要“贡献”,而 b 只是一个实数,对模型的影响较小。因为几乎所有的参数都集中在 w 中,即便像上式那样加上关于 b 的项,它的影响也微乎其微,所以通常省略关于 b 的项,只对 w 进行正则化。
此外,还有 L1 正则化,它在代价函数后添加 λ2m‖w‖1 一项,其中 ‖w‖1 为向量 w 的 L1 范数,即向量元素绝对值之和:
‖w‖1=nx∑j=1|w|
使用 L1 正则化可以让 w 变得稀疏,即有很多项为 0,有观点认为这有利于压缩模型的大小,存储模型所需的内存更少,但在实际应用中,其压缩的作用并不明显,
至于正则化参数 λ,它是一个超参数,其值可以通过开发集来选择,即尝试不同的值,在开发集上比较其性能,选择最佳值。λ 较大时,w 会倾向于较小,有助于降低拟合;当 λ 较小时,w 会倾向于较大,有助于提高拟合。
2. 神经网络的正则化
在神经网络中,代价函数为:
J(W[1],b[1],…,W[L],b[L])=1mm∑i=1L(ˆy(i),y(i))+λ2mL∑l=1‖W[l]‖2F
其中 L 为网络层数,‖W[l]‖F 为 W[l] 的 F-范数,即 Frobenius 范数,是矩阵元素的平方和再开平方。W[l] 是一个 n[l]×n[l−1] 的矩阵,因此有:
‖W[l]‖F=√n[l−1]∑i=1n[l]∑j=1(W[l]ij)2
式 (5) 中使用平方的形式:
‖W[l]‖2F=n[l−1]∑i=1n[l]∑j=1(W[l]ij)2
此时 dW[l] 除了从原来反向传播得到的项,也会多出一项 λmW[l]:
dW[l]=(原反向传播得到的项)+λmW[l]
此时梯度下降对权重 W[l] 的更新为:
W[l]:=W[l]–αdW[l]=W[l]–α[(原反向传播得到的项)+λmW[l]]=(1–αλm)W[l]–α(原反向传播得到的项)
每次更新 W[l] 时,L2 正则化都让 W[l] 乘以一个略小于 1 的系数 (1–αλm),使 W[l] 按比例缩小,因此 L2 正则化又称为权重衰减(Weight Decay)。
3. 正则化避免过拟合的原因
正则化可以降低权重参数 W,使其趋向于 0,进而导致神经网络中的相关节点输出减小、对结果产生的影响降低,相当于使神经网络的有效结构变得更简单,降低网络拟合复杂函数的能力,不容易过拟合。对于过拟合的模型,通过逐步增大正则化参数 lambda,可以让模型逐步从过拟合向欠拟合移动,使用开发集找到某个适中的 lambda,达到期望的低偏差和低方差的结果。
还可以从激活函数的角度来理解正则化避免过拟合的原因。例如使用如图 1 所示的 Tanh 作为激活函数:
通过增大正则化参数 lambda,可以降低权重参数 W[l],由:
Z[l]=W[l]a[l−1]+b[l]a[l]=tanh(Z[l])
可知 Z[l] 也会减小。由图 1 可见,当 Tanh 函数的输入较小时,Tanh 接近线性函数,因此该层接近于一个线性函数。即便对于很深的网络,如果每一层都是线性的,则整个网络也是线性的。通过增大正则化参数 lambda,可以使网络接近于线性,不容易拟合复杂的非线性函数,降低过拟合的风险。
4. Dropout
Dropout 也是一种有效的正则化方法。举例来说,对于图 2 所示的网络:
对于每一个训练样本,对于网络的每一层,以一个特定的概率随机移除一些节点。例如对于每一层,以 0.5 的概率移除其中的节点,此时得到的结果可能如图 3 所示:
使用如图 3 这样的移除了部分节点的网络,进行当前一个样本的前向传播和反向传播。对于后续各个样本,都以特定概率随机移除原网络各层的节点,再进行前向传播和反向传播的计算。相当于每个样本的训练都使用了不同的、“缩水”的网络,也因此带来正则化的效果。
Dropout 有多种实现方式,最常见的 Interted Dropout 实现方式为,给定第 l
层的保留节点的概率 keep_prob
,计算:
d[l] = np.random.rand(a[l].shape[0], a[l].shape[1]) < keep_prob a[l] = a[l].multiply(d[l]) a[l] /= keep_prob
第 1 行计算一个与第 l
层激活值 a[l]
具有相同大小的矩阵 d[l]
,它的每一个元素有 keep_prob
的概率为 1,有 1 - keep_prob
的概率为 0。第 2 行更新 a[l]
为其与 d[l]
逐元素相乘的结果,即使用 d[l]
作为掩码,以 keep_prob
的概率设置 a[l]
中的元素为 0。第 3 行又更新 a[l]
为其与 keep_prob
相除的结果,这是因为在为以 keep_prob
的概率随机移除 a[l]
中的元素后,在后续计算 Z[l+1]=W[l+1]a[l]+b[l+1] 时,W[l+1]a[l] 的值也会相应缩小,为了避免这一情况,在随机移除节点后,再使用 a[l] /= keep_prob
将其缩放回原来的比例。因此该方法被称为 Interted Dropout。
需要注意的是,如果使用向量化的实现方式,上面代码第 1 行计算的激活值掩码 d[l]
仅在每次迭代时会更新,对于某一次迭代的所有样本,使用的 d[l]
是相同的,移除的节点是相同的。即每次迭代中所有样本使用的网络是相同的,而不同迭代使用的网络是不同的。
不同层可以使用不同的节点保留概率 keep_prob
,例如对于节点数很多层,有较大的概率发生过拟合,可以使用较低的 keep_prob
,移除更多的节点。对于节点数较少的层,可以使用较大的 keep_prob
,甚至令 keep_prob
为 1,即保留所有节点。通常会将输入层的 keep_prob
设置为 1 或接近于 1,尽量保留所有的输入特征。为不同层设置不同 keep_prob
更加灵活,但缺点是引入了更多的超参数。
在测试时,不要使用 Dropout,因为 Dropout 的随机性会带来额外的噪声,干扰预测结果。如果一定要使用 Dropout,则可以多次计算移除不同节点的预测结果,取平均值,但这样做计算量更大,且结果和不使用 Dropout 差别不大。如果使用了 Interted Dropout,将各层保留概率(keep_prob
)设置为 1,即可保留所有节点。
5. 理解 Dropout
Dropout 通过随机地移除网络中的节点,使得网络变得更简单,更不容易拟合复杂函数。此外还可以从另一个角度理解 Dropout。
对于网络中的某一个节点 N,它接受前一层各节点的输出,分别乘以对应的权重,然后输出自己的结果。当使用了 Dropout 时,由于任一节点都可能被移除,对于前述节点 N,其任一输入都可能被移除,则节点 N 的输出不能依赖于任一个特定输入,其权重会倾向于分散到各个输入,而不是集中在某一个输入上。权重的分散有利于降低权重的F-范数,就像 L2 正则化一样,可以避免过拟合。Dropout 可以看做是一种自适应的 L2 正则化。
Dropout 最早成功应用于计算机视觉领域,因为该领域的输入,比如图像,通常非常大。Dropout 本质上是解决过拟合问题的方法,在其他领域,如果算法不存在过拟合,则不需要使用 Dropout。
使用 Dropout 的一个缺点是会影响代价函数的定义。因为每次迭代都会随机移除不同的节点,代价函数不再能真实地反映整个模型的性能。在 Debug 时,可以先禁用 Dropout,比如设置节点保留概率(keep_prop
)为 1,绘制代价函数随迭代次数变化的图像,确认代价函数的值随迭代次数的增加而单调下降,算法及其实现没有问题,可以收敛;然后再启用 Dropout,解决过拟合问题。
6. 其他正则化方法
除了前面提到的 L2 正则化和 Dropout,还有其他一些方法可以降低过拟合。
6.1. 数据扩充
获取更多数据是解决过拟合问题的有效途径,但有时无法获取更多数据,或者候获取数据的代价很大,此时可以尝试通过数据扩充(Data Augmentation),从现有数据中生成新的数据。例如对于图像识别的场景,可以将现有训练图片通过翻转、裁剪、旋转、变形、引入失真、添加噪声等方式,生成新的图片用于训练。虽然这些图片并没有引入多少额外的信息,但这样做的成本很低,并能在一定程度上降低过拟合。例如将图片水平翻转,相当于告诉算法,同一个物体水平转后还是该物体。
6.2. 提前终止
在梯度下降过程中,训练集错误率或代价函数应随迭代次数单调递减,而开发集错误率通常会先随迭代次数下降,然后随迭代次数上升,如图 4 所示。
提前终止(Early Stopping)指的是,在梯度下降的过程中,找到合适的开发集错误率和训练集错误率(或代价函数),在该次循环处终止训练,如图 4 中的绿点。因为通常会把权重 W 初始化为接近 0 的随机数,在训练早期,W 的值较小。随着迭代次数提升,W 会逐渐变大。通过在提前终止训练,可以得到大小适中的 W,此时 W 的 F-范数也适中,类似于 L2 正则化,可以避免过拟合。
提前终止的优点是只需进行一次梯度下降过程,就相当于比较了不同大小的 W 的影响,没有额外的超参数(如 L2 正则化的参数 lambda
)。
机器的学习过程涉及众多的参数和超参数,通过将其分解成若干个正交的步骤,可以简化训练过程。所谓正交的步骤,指的是连个步骤互不影响。例如在训练过程中,首先优化代价函数,如使用梯度下降,获得最佳参数;然后解决过拟合问题,如使用正则化、获取更多数据。优化代价函数和解决过拟合这两个问题是完全独立、互不影响的,可以独立解决,而不用担心在解决了一个问题后会影响另一个问题,这种解决问题的方式称为正交化(Orthogonalization)。
提前终止的缺点是,相当于尝试一次性解决优化代价函数和解决过拟合两个问题,提前终止训练会影响对代价函数的优化,同时降低模型过拟合的可能性,在解决其中一个问题的同时会影响到另一个问题,带来更大的复杂度。另一方面,使用 L2 正则化并训练尽可能长的时间,可以更系统地搜索不同的超参数,但会引入额外的超参数 λ,计算量也较大。