直观感受,从左到右依次是 高偏差(欠拟合),合适,高方差(过拟合):
偏差(bias):反映模型在样本上的输出与真实值之间的误差,即模型本身的精准度,通过比较最优误差和训练集误差得出是否是高偏差,偏差高反映出欠拟合。
方差(variance):反映模型每一次在验证集上的输出结果与模型输出期望之间的误差,即模型的稳定性,通过比较验证集误差和训练集误差得出是否是高方差,方差高反映出过拟合。
例如:针对一个识别猫的图片,人眼的识别误差是0%,这是基本误差(Base Error)。那么,训练集误差如果高于0%太多,就是欠拟合(高偏差)。但如果基本误差本身就高(比如15%),训练集误差也是15%,那么这种就是合理的,并不是欠拟合。
下图展示了最优误差0%时的训练集误差和交叉验证集误差的几个例子:
情况1 | 情况2 | 情况3 | 情况4 | |
训练集误差 | 1% | 15% | 15% | 0.5% |
交叉验证集误差 | 11% | 16% | 30% | 1% |
判断结论 | 低偏差,高方差 | 高偏差,低方差 因为验证集错误率和训练集一致 |
高偏差,高方差 | 低偏差,低方差 |
高偏差说明欠拟合,可以采取的应对方法:
总之,解决高偏差是首要问题,至少要拟合训练集,将偏差降低到可接受的数值,然后再考虑高方差问题。
高方差说明过拟合,可以采取的应对方法:
反复调整网络,直至方差和偏差都在可接受范围内。
正则化可以防止过拟合。
L2正则化在成本函数J(w^[1],b^[1], ..., w^[L],b^[L])后面加上一项 lambd/2m……,其中,lambd是L2参数,也属于超参数,通过交叉验证集来配置lambd
L2正则化也称作权重衰减(weight decay),上图绿色字体部分说明了原因:通过L2正则化,权重w在每次更新时都比不用正则化更新的值小了(alpha*lambd / m) 倍的w,即相当于给矩阵乘以了(1 - alpha*lambd / m)倍的权重,该系数小于1。简单来说,L2正则化避免了权重w过大。
上图中的连续两个求和符号貌似写反了……
直观理解:当L2参数lambd非常大时,权重w趋近于0,即对应的神经元的权重趋于0,相当于消除了这些单元的影响,导致神经网络变小,小到如同一个逻辑回归单元(logistic regression),但深度依然很大(如下图左上角的神经网络),从而使一个过拟合的网络更接近于高偏差状态。而一个lambd的中间值,就可以使网络just right。权重小的神经元的影响变得更小。
另一个角度的直观理解:如下图,假设激活函数是a^[l]=tanh(z^[l]),当权重w由于L2正则化影响变小时,z^[l]=w^[l]a^[l-1]+b^[l]也很小,使tanh()函数都在进行线性计算,那么神经网络是一个线性网络,只能计算线性函数,不适用于复杂的决策,更不会过拟合。
b的影响可以忽略,因为它是标量。
Dropout(随机失活)概述:遍历神经网络的每一层,设置消除神经网络中节点的概率,消除某些节点和从该节点进出的连线,最后得到一个节点更少,规模更小的网络,然后back propagation方法进行训练。对于每个训练样本,都采用一个精简后的神经网络来训练它。对不同的训练样本,消除的单元也不同。
Dropout的一种常用实现方法:反向随机失活(inverted dropout),步骤如下:
以神经网络第三层(l=3)为例,神经单元被保留的概率用keep-prob表示,设keep-prob=0.8
d3 = np.random.rand(a3.shape[0], a3.shape[1]) < keep-prob
a3表示第三层的a值,即a^[3];
d3是 一个形状为 (a3.shape[0], a3.shape[1]) 的矩阵,矩阵里每个元素要么是True(rand生成的随机数小于keep-prob),要么是False(rand生成的随机数大于keep-prob)
a3 = np.multiply(a3, d3) # a3 *= d3
Python会把True和False自动翻译为1和0,因此乘法有效。
a3 /= keep-prob
注意:Dropout只在训练时使用,在测试阶段不使用Dropout,因为在测试阶段,不希望输出结果是随机的;如果在测试阶段使用Dropout,预测会受干扰。
直观感受:不能给任何神经单元加上太多权重,因为它有可能被随机清除,即不把所有赌注放在一个节点上。Dropout和L2正则化功能类似,Dropout也会压缩权重,它会使权重趋于分散,不会使某个权重过大。
不同层的keep-prob可以变化,如下图,对参数多的某一层,keep-prob可以设得较小,对于参数少的层,keep-prob可以为1,表示不消除任何单元。如下图:
Dropout在计算机视觉领域用得较多,因为计算机视觉中的输入量非常大,输入太多像素作为特征,以至于没有足够的数据存在产生过拟合现象。
紫色曲线表示交叉验证集误差,蓝色曲线表示训练集误差。
随着迭代进行,w值从最初的趋于0的小数变得越来越大,最终,当紫色曲线出现拐点开始上升时,过拟合现象出现。Early stopping就是提前停止迭代,得到一个中等大的权重w,避免出现过拟合。
Early stopping有一个缺点:降低成本函数的同时必须时刻关注验证集上的误差情况,这两项任务同时进行,为了避免过拟合而停止梯度下降时,也停止了优化成本函数。Early stopping导致我们不能采取不同方式来解决这两个问题。Early stopping的优点是只运行一次梯度下降,就能找到w的较小值、中间值和较大值。而L2正则化带来了额外的超参数lambd,必须尝试很多lambd的值,这导致高昂的计算代价,因此采用L2正则化方法的计算时间较长。
目的:确保所有输入特征的取值范围和分布都差不多,例如:避免x1取值在0到1,而x2取值在1到1000这种情况。
(一)零均值化(zero out the mean):
X是一个向量,等于每个训练数据x减去均值
完成以上操作后,就完成了零均值化(从左图变到了右图)
(二)归一化方差(normalize the variances)
上图中可看出:x1的方差比x2大很多(x1比x2分散),现在要做的就是让它们方差一样。
已经完成零均值化,因此,就是方差。
完成这步后,x1和x2的方差都是1,分布如下图:
注意:和是从训练集中计算获得,在归一化测试集时,也需要用和训练集相同的和,确保训练集和测试集的归一化是相同的。
使代价函数J优化起来更加快速。下图是非归一化和归一化的代价函数对比图:
设一个神经网络的层数很大,如L=150:
当选取的初始权重比1大时,经过L层的神经网络计算后,神经网络的激活函数将爆炸式增长;
当选取的初始权重比1小时,经过L层的神经网络计算后,神经网络的激活函数将以指数级递减;
以上规律也适用于与层数L相关的导数或梯度函数
解决方案:为神经网络进行合理的权重初始化,如:Xavier初始化。