PART 2 - W1 改善DNN:超参数调试、正则化以及优化
2019.10.14
第一章 深度学习的实用层面
1.1 训练/开发/测试
建模时所用的超参的设定取决于诸多因素,如:(1)具体的场景,如图像识别、自然语言处理;(2)数据规模,包括样本的规模和特征的规模;等。因此,在模型开发过程中,通常较难一开始就会设定出一组合适的训练参数,而是通过不断地调试,找到最合适的参数。
训练集/验证集/测试集 的划分:要保证验证集和测试集是同一分布。
1.2 偏差/方差
老生常谈的几点
1. 欠拟合导致偏差,过拟合导致方差
2. 观察训练集和测试集的误差,可以确定模型处于欠拟合还是过拟合的状态,从而确定当前的误差主要是方差还是偏差导致的。
1.3 机器学习基础
1. 调参首先要确认当前模型是偏差状态还是方差状态;
2. 更复杂的网络降低偏差,更大的数据降低方差;
3. 只要正则化合适,更大的网络基本没有坏处,除了需耗费更多的训练时间。
1.4 正则化
1.4.1 正则化项的概念
1. 对于神经网络,有最常用的两种正则化方法:
L1正则化:在损失函数里加入所有w的绝对值和b的绝对值之和(的平均值),其中b项有时候省略
L2正则化:在损失函数里加入所有w的平方和b的平方之和(的平均值)
2. 正则化项前面的系数:表示了在整个损失函数中正则化项的权重
1.4.2 正则化项与梯度下降
L2正则:w的梯度会随着w本身不断减小(接近与0)而不断减小,因此其向0的逼近是逐渐减速的,会导致w成为比较小但不为0的数。结论:L2正则会导致最终训练出的参数都接近0,但大部分并不为0
L1正则:w的梯度下降方向在大于0时为-1,小于0时为1,因此会迅速收敛到0。结论:L1正则会导致大部分w都为0,少部分不为0
1.5 为什么正则化可以减少过拟合(减小方差)
1. 正则可以弱化(L2)或去除(L1)部分神经元之间的连接,从而使整个网络结构变得简单。
2. 正则化使得w变小,进而使得加权求和的值变小,进而使得喂入激活函数的值在零附近的“近似线性区域”,从而简化了整个网络的映射关系。
1.6 dropout(随机失活)正则化
dropout操作:在训练一个神经网络时(在喂入一组数据前),对各个隐藏层的神经元随机去除一部分。比如假设隐藏层本来全是4个神经元,设置去除比例为0.25,则每层变为3个神经元。然后在被简化的网络上进行FP和BP,并调整对应的w和b。
作用:dropout把神经网络暂时进行了简化,比如dropout之前,层与层之间是4*4的参数矩阵,dropout后变成了3*3,有利于防止过拟合。
注:=只是在训练时进行dropout,预测时使用完整的网络。
1.7 理解dropout(直观)
1. dropout使得网络不会只重视少量输入(最初的输入特征或上一层的输出),而是相对平等地对待所有特征。试想:假设把某个输入的w调得过大,结果下一轮时这个节点被drop掉了,使得网络的预测效果大打折扣。因此,网络会倾向于把每个w都调得不那么大(每个特征都发挥作用,但都不大),而不是少量特征的w很大,而其余的w很小(只有少数特征发挥决定性作用)。从这个角度看,dropout的作用很像L2正则化。
2. 每层可以设置不同的keep_prob参数,一般经验是:输入层keep_prob保持为1,若层神经元数较多则把keep_prob参数设置的较小一些,反之则较大一些。
3. dropout本质是正则化,因此其作用是为了防止过拟合。
4. dropout正则化目前被广泛应用到计算机视觉领域,其它领域则鲜有使用。
1.8 其它正则化方法
1.8.1 扩充数据集
以图像识别为例,把原始样本的图片进行左右反转、倾斜、裁边等操作,即可构造大量样本。更大的数据集可以降低过拟合(正则化方法就是指降低过拟合的方法)。但这类方法在其它领域不怎么好用。
1.8.2 early stopping
1. 概念:整个迭代训练过程中,训练集的误差持续下降,测试集或验证集的误差则先下降后增大,可以认为拐点就是开始过拟合的点。early stopping则是使用某种方式持续关注这种变化的趋势,并适时停止训练。
2. 优缺点(与L2正则化对比):
优点:early stopping不涉及具体的罚项,因此也没有相应的参数lambda,少一个需要调的超参。相比较来说L2正则则要尝试大量的lambda来确定最优值,增大了训练成本。
缺点:L2正则化每设定一个lambda值,就相当于确定了一个具体的带罚项的成本函数,接下来的训练则是一门心思减小成本函数。相当于防止过拟合和降低成本函数是分成前后两步干的。而early stopping则相当于把两步揉到一起干,在为了防止过拟合停止训练的时刻,也等于放弃了继续减小成本函数。
1.9 标准化输入
(原视频起名“正则化输入”,不是很合理)
神经网络的输入特征一定要进行标准化处理,即减去均值、除以方差。
若原始特征是正态分布,则标准化后为标准正太分布。
若不进行标准化操作,不同的特征可能分布在不同量级,如年龄和收入。若以原始特征作为输入,则对应的合适的w也可能差了量级,从而导致迭代优(梯度下降等)化难以进行。
1.10 梯度消失和梯度爆炸
直观理解:假设一个非常非常深的DNN,假设中间的层不做非线性变换,则FP可以表示为
暂时忽略b
假设每层的W都是大于1的,很多相乘之后变大更加的大,则对每个参数而言,(损失函数的)梯度都会特别大,这叫梯度爆炸
假设每层的W都是小于1的,则很多相乘后变得接近于0,对每个参数而言,梯度都会变得特别小,这叫梯度消失。
为什么会有都大于1或都小于1这种事呢,取决于初始化。假设初始化的W都非常小,一直处于梯度消失区,则训练变得基本没有进展;假设W都初始化的很大,则上来就梯度爆炸,对应的可能是损失函数在震荡而迟迟不能收敛。这也是为什么参数初始化如此重要了。
1.11 神经网络的权重初始化
1. 激活函数为tanh时,令W的方差为 :(Xavier初始化)
2. 激活函数是ReLU,权重w的初始化一般令其方差为 :
3. 另一种初始化w的方法,令其方差为 2/(n[l-1]+n[l]):
合适的初始化是为了避免梯度消失或梯度爆炸,更深的就不咋知道了。
原文链接:https://blog.csdn.net/cherry_yu08/article/details/79116862
1.12 梯度的数值逼近
在求解在处的导数时:
数学的解法:先求出f(x)的导函数f'(x),再把代入,求出f'()
数值的解法:搞一个较小的值,求出,让尽量的小就是所谓的数值逼近。
计算机解决数学问题,本质都是用数值的方法。
1.13 梯度检验
对于一个神经网络,梯度检验的步骤如下:
(0)先有一组确定好的参数值(比如初始化值)
(1)把所有的参数即所有的w和b整合成一个巨大的vector,表达为,此时的损失也可以表示为
(2)求出偏导构成的向量 (怎么事先求出来。。。)
(3)循环执行 assert
1.14 关于梯度检验的注意事项
1. 梯度检验是用来debug的,不是每轮梯度下降都进行梯度检验;
2. 如果有正则化项,进行梯度检验时不要遗漏;
3. 梯度检验时不应带dropout
4. 初始化后应该进行梯度检验,训练一段时间后或许应该重新检验一下。
(不会真正用到,毕竟都是调包侠)