深度学习正则化(一)

简介: 深度学习正则化(一)

学习目标


  • 目标


  • 了解偏差与方差的意义


  • 知道L2正则化与L1正则化的数学意义


  • 知道Droupout正则化的方法


  • 了解早停止法、数据增强法的其它正则化方式


  • 应用



2.3.1 偏差与方差


2.3.1.1 数据集划分



首先我们对机器学习当中涉及到的数据集划分进行一个简单的复习


  • 训练集(train set):用训练集对算法或模型进行训练过程;
  • 验证集(development set):利用验证集(又称为简单交叉验证集,hold-out cross validation set)进行交叉验证,选择出最好的模型;
  • 测试集(test set):最后利用测试集对模型进行测试,对学习方法进行评估。


在小数据量的时代,如 100、1000、10000 的数据量大小,可以将数据集按照以下比例进行划分:


  • 无验证集的情况:70% / 30%
  • 有验证集的情况:60% / 20% / 20%


而在如今的大数据时代,拥有的数据集的规模可能是百万级别的,所以验证集和测试集所占的比重会趋向于变得更小。


  • 100 万数据量:98% / 1% / 1%
  • 超百万数据量:99.5% / 0.25% / 0.25%


以上这些比例可以根据数据集情况选择。


2.3.1.2 偏差与方差的意义


“偏差-方差分解”(bias-variance decomposition)是解释学习算法泛化性能的一种重要工具。


泛化误差可分解为偏差、方差与噪声,泛化性能是由学习算法的能力、数据的充分性以及学习任务本身的难度所共同决定的。


  • 偏差:度量了学习算法的期望预测与真实结果的偏离程度,即刻画了学习算法本身的拟合能力
  • 方差:度量了同样大小的训练集的变动所导致的学习性能的变化,即刻画了数据扰动所造成的影响
  • 噪声:表达了在当前任务上任何学习算法所能够达到的期望泛化误差的下界,即刻画了学习问题本身的难度。


那么偏差、方差与我们的数据集划分到底有什么关系呢?


1、训练集的错误率较小,而验证集/测试集的错误率较大,说明模型存在较大方差,可能出现了过拟合


2、训练集和测试集的错误率都较大,且两者相近,说明模型存在较大偏差,可能出现了欠拟合


3、训练集和测试集的错误率都较小,且两者相近,说明方差和偏差都较小,这个模型效果比较好。


所以我们最终总结,方差一般指的是数据模型得出来了,能不能对未知数据的扰动预测准确。而偏差说明在训练集当中就已经误差较大了,基本上在测试集中没有好的效果。


所以如果我们的模型出现了较大的方差或者同时也有较大的偏差,该怎么去解决?


2.3.1.3 解决方法


对于高方差,有以下几种方式:


  • 获取更多的数据,使得训练能够包含所有可能出现的情况
  • 正则化(Regularization)
  • 寻找更合适的网络结构


对于高偏差,有以下几种方式:


  • 扩大网络规模,如添加隐藏层或者神经元数量
  • 寻找合适的网络架构,使用更大的网络结构,如AlexNet
  • 训练时间更长一些
  • 不断尝试,直到找到低偏差、低方差的框架。


2.3.2 正则化(Regularization)


正则化,即在成本函数中加入一个正则化项(惩罚项),惩罚模型的复杂度,防止网络过拟合


2.3.2.1 逻辑回归的L1与L2正则化


逻辑回归的参数W数量根据特征的数量而定,那么正则化如下


逻辑回归的损失函数中增加L2正则化


J(w,b) = \frac{1}{m}\sum_{i=1}^mL(\hat{y}^{(i)},y^{(i)})+\frac{\lambda}{2m}{||w||}^2_2J(w,b)=m1∑i=1mL(y^(i),y(i))+2mλ∣∣w∣∣22


其中的L2范数可以理解:


\frac{\lambda}{2m}{||w||}^2_2=\frac{\lambda}{2m}\sum_{j=1}^{n_x}w^2_j = \frac{\lambda}{2m}w^Tw2mλ∣∣w∣∣22=2mλ∑j=1nxwj2=2mλwTw


解释:所有w参数的平方和的结果


逻辑回归的损失函数中增加L1正则化


J(w,b) = \frac{1}{m}\sum_{i=1}^mL(\hat{y}^{(i)},y^{(i)}) + \frac{\lambda}{2m}{||w||}_1J(w,b)=m1∑i=1mL(y^(i),y(i))+2mλ∣∣w∣∣1


其中L2范数可以理解为:


\frac{\lambda}{2m}{||w||}_1 = \frac{\lambda}{2m}\sum_{j=1}^{n_x}{|w_j|}2mλ∣∣w∣∣1=2mλ∑j=1nx∣wj∣


注:其中,λ 为正则化因子,是超参数。由于 L1 正则化最后得到 w 向量中将存在大量的 0,使模型变得稀疏化,因此 L2 正则化更加常用。


2.3.2.2 正则化项的理解


在损失函数中增加一项,那么其实梯度下降是要减少损失函数的大小,对于L2或者L1来讲都是要去减少这个正则项的大小,那么也就是会减少W权重的大小。这是我们一个直观上的感受。


接下来我们通过方向传播来理解这个其中的L2,对于损失函数我们要反向传播求参数梯度:


(1) dW = \frac{\partial L}{\partial w}+ \frac{\lambda}{m} {W}dW=∂w∂L+mλW


前面的默认损失函数的梯度计算结果默认为backprop,那么更新的参数就为


(2) W := W - \alpha dWW:=W−αdW 那么我们将第一个公式带入第二个得到


-->W := W - \alpha(\frac{\partial L}{\partial w} + \frac{\lambda}{m}W)−−>W:=W−α(∂w∂L+mλW)
-->=W - \frac{\alpha \lambda}{m}W - \alpha*\frac{\partial L}{\partial w}−−>=W−mαλW−α∗∂w∂L


所以每次更新的时候都会让W(1 - \frac{\alpha \lambda}{m})W(1−mαλ),这个系数永远小于1,所以我们通常称L2范数为权重衰减。


2.3.2.3 神经网络中的正则化


神经网络中的正则化与逻辑回归相似,只不过参数W变多了,每一层都有若干个权重,可以理解成一个矩阵


image.png


我们把w[l]w[l]理解某一层神经元的权重参数,其中这是加入了L2范数,可以是


{

image.png

}^2_F = \sum^{n^{[l-1]}}_{i=1}\sum^{n^{[l]}}_{j=1}(w^{[l]}_{ij})^2∥∥w[l]∥∥F2=∑i=1n[l−1]∑j=1n[l](wij[l])2


对于矩阵的L2范数,有个专业名称叫弗罗贝尼乌斯范数(Frobenius Norm)


2.3.2.4 正则化为什么能够防止过拟合


正则化因子设置的足够大的情况下,为了使成本函数最小化,权重矩阵 W 就会被设置为接近于 0 的值,直观上相当于消除了很多神经元的影响,那么大的神经网络就会变成一个较小的网络。


image.png


在加入正则化项后,当λ增大,导致W^[l]W[l]减小,Z^{[l]} = W^{[l]}a^{[l-1]} + b^{[l]}Z[l]=W[l]a[l−1]+b[l]便会减小。由上图可知,在 z 较小(接近于 0)的区域里,函数近似线性,所以每层的函数就近似线性函数,整个网络就成为一个简单的近似线性的网络,因此不会发生过拟合。


2.3.3 Droupout正则化



Droupout论文地址:http://jmlr.org/papers/volume15/srivastava14a.old/srivastava14a.pdf


image.png


Droupout:随机的对神经网络每一层进行丢弃部分神经元操作。


image.png


对于网络的每一层会进行设置保留概率,即keep_prob。假设keep_prob为0.8,那么也就是在每一层所有神经元有20% 的概率直接失效,可以理解为0.



2.3.3.1 Inverted droupout


这种方式会对每层进行如下代码操作


# 假设设置神经元保留概率
keep_prob = 0.8
# 随机建立一个标记1 or 0的矩阵,表示随机失活的单元,占比20%
dl = np.random.rand(al.shape[0], al.shape[1]) < keep_prob
# 让a1对应d1的为0地方结果为0
al = np.multiply(al, dl)
# 为了测试的时候,每一个单元都参与进来
al /= keep_prob


训练练的时候只有占比为pp的隐藏层单元参与训练。


增加最后一行代码的原因,在预测的时候,所有的隐藏层单元都需要参与进来,就需要测试的时候将输出结果除以以pp使下一层的输入规模保持不变。


假设keep_prob=p=0.8


z^{l}=w^{l}a^{l-1}+b^{l}zl=wlal−1+bl ,当$l-1$层有比例为 $1-p=0.2$单元drop后,a^{l-1}al−1大约会变为原来的80%,为了保证ll层的zz值期望(可以理解为均值)不变,所以要在a^{l-1}al−1与dropout矩阵乘积后的权重进行扩大,要乘以\frac{1}{p}=10/8p1=10/8(增大)


注:原始:(1+1+1+1+1+1+1+1+1+1)/10 = 1,现在其中20%失效,则平均值为0.8,所以0.8 * (10/8) = 1. 相当于其中8个神经元参数增大了(10/8)倍


2.3.3.2 droupout为什么有效总结


加入了 dropout 后,输入的特征都存在被随机清除的可能,所以该神经元不会再特别依赖于任何一个输入特征,也就是不会给任何一个输入特征设置太大的权重。通过传播过程,dropout 将产生和 L2 正则化相同的收缩权重的效果。


对于不同的层,设置的keep_prob大小也不一致,神经元较少的层,会设keep_prob为 1.0,而神经元多的层则会设置比较小的keep_prob


通常被使用在计算机视觉领域,图像拥有更多的特征,场景容易过拟合,效果被实验人员证明是很不错的。


调试时候使用技巧:


dropout 的缺点是成本函数无法被明确定义,因为每次会随机消除一部分神经元,所以参数也无法确定具体哪一些,在反向传播的时候带来计算上的麻烦,也就无法保证当前网络是否损失函数下降的。如果要使用droupout,会先关闭这个参数,保证损失函数是单调下降的,确定网络没有问题,再次打开droupout才会有效。


2.3.4 其它正则化方法



  • 早停止法(Early Stopping)


  • 数据增强


2.3.4.1 早停止法(Early Stopping)


通常我们在训练验证的时候,发现过拟合。可以得到下面这张损失图


image.png


通常不断训练之后,损失越来越小。但是到了一定之后,模型学到的过于复杂(过于拟合训练集上的数据的特征)造成测试集开始损失较小,后来又变大。模型的w参数会越来越大,那么可以在测试集损失减小一定程度之后停止训练。


但是这种方法治标不治本,得从根本上解决数据或者网络的问题。


目录
相关文章
|
7月前
|
机器学习/深度学习 算法
深度学习正则化
深度学习正则化
35 0
|
10月前
|
机器学习/深度学习 算法 网络架构
深度学习中的正则化的应用(最全)
深度学习中的正则化的应用(最全)
254 0
|
11月前
|
机器学习/深度学习 算法 Serverless
瞎聊深度学习——神经网络基础(概念,正则化)
瞎聊深度学习——神经网络基础(概念,正则化)
|
11月前
|
机器学习/深度学习 算法 网络架构
【深度学习】3、正则化技术全面了解(二)
【深度学习】3、正则化技术全面了解(二)
94 0
|
11月前
|
机器学习/深度学习 算法
【深度学习】3、正则化技术全面了解(一)
【深度学习】3、正则化技术全面了解(一)
130 0
|
机器学习/深度学习 资源调度 自然语言处理
深度学习基础入门篇[六(1)]:模型调优:注意力机制[多头注意力、自注意力],正则化【L1、L2,Dropout,Drop Connect】等
深度学习基础入门篇[六(1)]:模型调优:注意力机制[多头注意力、自注意力],正则化【L1、L2,Dropout,Drop Connect】等
|
机器学习/深度学习 算法
【算法系列】深度学习中的正则化
【算法系列】深度学习中的正则化
【算法系列】深度学习中的正则化
|
机器学习/深度学习 算法 网络架构
【深度学习】正则化入门
【深度学习】正则化入门
【深度学习】正则化入门
|
机器学习/深度学习 算法 TensorFlow
深度学习正则化(二)
深度学习正则化(二)
150 0
深度学习正则化(二)
|
机器学习/深度学习 人工智能 算法
深度学习教程 | 网络优化:超参数调优、正则化、批归一化和程序框架
本节介绍超参数调试、批归一化和深度学习编程框架三个部分,内容包括:超参数优先级与调参技巧,超参数的合适范围确定,Batch Normalization,softmax回归,深度学习框架等。
235 1
深度学习教程 | 网络优化:超参数调优、正则化、批归一化和程序框架