吴恩达深度学习课程疑难点笔记系列-改善深层神经网络-第1周

时光怂恿深爱的人放手 提交于 2020-01-14 00:26:34

本笔记系列参照吴恩达深度学习课程的视频和课件,并在学习和做练习过程中从CSDN博主何宽分享的文章中得到了帮助,再此表示感谢。


本周主要学习的内容有:
训练/开发/测试机、偏差/方差、机器学习基础、正则化、为什么正则化可以减少过拟合?、Dropout正则化、理解Dropout、其它正则化方法、正则化输入、梯度消失与梯度爆炸、神经网络的权重初始化、梯度的数值逼近、梯度检验、关于梯度检验实现的注记。


本周学习的主要疑难点:
1.偏差和方差
偏差和方差是针对泛化(Generalization)而言的,模型训练的过程是一个不断减小误差函数(Loss Function)的过程。而模型在训练数据集上取得的最小误差函数值与一般数据集(或者测试数据集)上取得的最小误差函数值的差异叫泛化误差(generalization error)。
泛化误差可以分解为偏差、方差和噪声之和。具体数学公式的推导可以查看西瓜书2.5节的推导过程。

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

我们可以从图1来理解偏差和方差的区别
在这里插入图片描述
1图1
从上图中我们可以分析得出:

  • 偏差描述的是根据样本拟合出模型的输出预测结果的期望与样本真实结果的差距,简单讲,就是在样本上拟合的好不好。要减少偏差,就得复杂化模型,增加模型的参数,但这样容易过拟合 (overfitting),过拟合对应上图是“high variance”,点很分散。“low bias”对应就是点都打在靶心附近,所以瞄的是准的,但手不一定稳。
  • 方差描述的是样本上训练出来的模型在测试集上的表现,要减少方差,就要简化模型,减少模型的参数,但这样容易欠拟合(unfitting),欠拟合对应上图是high bias,点偏离中心。low variance对应就是点都打的很集中,但不一定是靶心附近,手很稳,但是瞄的不准。

因此偏差和方差的选择是一个折中的问题,图2就描述了这样的一个权衡
在这里插入图片描述
2图2
假设我们现在有一组训练数据,需要训练一个模型(基于梯度的学习,不包括最近邻等方法)。在训练过程的最初,偏差很大,因为我们的模型还没有来得及开始学习,也就是与“真实模型”差距很大。然而此时方差却很小,因为训练数据集(training data)还没有来得及对模型产生影响,所以此时将模型应用于“不同的”训练数据集也不会有太大差异。而随着训练过程的进行,偏差变小了,因为我们的模型变得“聪明”了,懂得了更多关于“真实模型”的信息,输出值与真实值之间更加接近了。但是如果我们训练得时间太久了,方差就会变得很大,因为我们除了学习到关于真实模型的信息,还学到了许多具体的,只针对我们使用的训练集(真实数据的子集)的信息。而不同的可能训练数据集(真实数据的子集)之间的某些特征和噪声是不一致的,这就导致了我们的模型在很多其他的数据集上就无法获得很好的效果,也就是所谓的overfitting(过拟合)。

最后总结,误差反映的是整个模型的准确度,偏差反映的是模型在样本上的输出与真实值之间的误差,即模型本身的精准度,方差反映的是模型每一次输出结果与模型输出期望之间的误差,即模型的稳定性。噪声反应模型学习不了的部分,或者说影响模型学习的部分。
在机器学习的过程中,一方面尽可能的增大数据集或者选取到比较好的数据集,另一个方面是在训练的过程中平衡模型的方差和偏差,使模型既不欠拟合也不过拟合。


2.初始化权重要点:不同初始化方法(随机初始化、He初始化等)会导致不同模型训练结果。随机出书可以解决输出一致性,并且可以确保不同的隐藏单元学到的东西不同。切记初始化值不能太大,采用ReLU激活函数的神经网络,可以选用He 初始化

3.正则化
在训练模型的时候我们可能经常碰到过拟合的现象,而过拟合现象的主要原因就是方差太高,我们可以采用正则化的方法抑制这种现象。常用的正则化方法有:L1正则化、L2正则化、Dropout正则化、early stopping正则化、Data augmentation正则化等

  • L1 正则化:根据权重的绝对值的总和来惩罚权重。在依赖稀疏特征的模型中,L1 正则化有助于使不相关或几乎不相关的特征的权重正好为 0,从而将这些特征从模型中移除。与 L2 正则化相对
  • L2正则化:根据权重的平方和来惩罚权重。L2 正则化有助于使离群值(具有较大正值或较小负值)权重接近于 0,但又不正好为 0。(与 L1 正则化相对。)在线性模型中,L2 正则化始终可以改进泛化。

L1正则化用于稀疏特征的模型,下面我用一个简单的示意公式来表示:
Jregularized=Junregularized+λjwj(1)J_{regularized}=J_{unregularized}+{\lambda}\sum\limits_j{|w_j|} \tag{1}
对公式(1)求导,最后权重更新的公式可以简单表示为:
W[l]=W[l]α(frombackprop)K(2)W^{[l]} = W^{[l]}-\alpha(from_backprop)-K\tag{2}

L2正则化公式:
Jregularized=1mi=1m(y(i)log(a[L](i))+(1y(i))log(1a[L](i)))cross-entropy cost+1mλ2lkjWk,j[l]2L2 regularization cost(3)J_{regularized} = \small \underbrace{-\frac{1}{m} \sum\limits_{i = 1}^{m} \large{(}\small y^{(i)}\log\left(a^{[L](i)}\right) + (1-y^{(i)})\log\left(1- a^{[L](i)}\right) \large{)} }_\text{cross-entropy cost} + \underbrace{\frac{1}{m} \frac{\lambda}{2} \sum\limits_l\sum\limits_k\sum\limits_j W_{k,j}^{[l]2} }_\text{L2 regularization cost} \tag{3}

参考:https://blog.csdn.net/red_stone1/article/details/80755144

对公式进行求导,最后权重更新的公式为:
W[l]=(1αλm)W[l]α(frombackprop)(4)W^{[l]} = (1-\alpha \frac{\lambda}{m})W^{[l]}-\alpha(from_backprop) \tag{4}

从公式(2)(4)我们可以看出:
–L1正则化实际上是模型每迭代一次后,让权重减小了一个常量K,而L1正则化在0处具有不连续性,这会导致与0相交的减法结果变为0.例如,如果减法使权重从+0.1变为-0.2,L1便会将权重重设为0.就这样,L1使权重变为0了。
–L2正则化可以理解为每次移除模型权重的x%,而在这样的计算最后进行数十亿次减法计算,最后得出的值也绝不会正好为0,因此,L2通常不会使权重变为0。

  • 丢弃正则化(Dropout):丢弃正则化在每次迭代都会随机移除一些节点,所以代价函数J变得无法明确定义。在计算机视觉领域应用丢弃正则化比较多,并且,不要在模型的测试阶段使用丢弃,因为那样会干扰预测。图3和图4显示使用丢弃正则化后模型的迭代过程
    在这里插入图片描述
    3图3
    在这里插入图片描述
    4图4
    通常我们再前向传播和后向传播中均使用丢弃正则化,在训练期间,每个丢弃层除以‘keep_prob’以保持同样的激活函数输出值。例如,假如keep_prob=0.5,模型将关闭一半节点,所以输出值会被缩放0.5倍,因为只有一半的节点还能进行输出。而除以keep_prob则会让模型恢复之前的期望输出。具体操作如图5所示。
    在这里插入图片描述
    5图5
    例如,对于l=3的神经网络层,设置keep_prob=0.8,则这层20%的神经节点将会被丢弃,实现代码如下
d3 = np.random.rand(a3.shape[0],a3.shape[1]) < keep_prob #随机设置一个d3向量,小于keep_prob的值为0,大于keep_prob的值为1
a3 = np.multiply(a3,d3) # 丢弃a3中小于0.2的输出,也就是说关闭l=3神经网络层20%的神经节点
a3 /= keep_prob
  • data augmentation正则化:将现有数据集,进行翻转、裁剪等以增大数据,改善模型训练方差。
  • early stopping正则化:early stopping 可以只运行一次梯度下降,就可以找出w的较小值,中间值和较大值。(具体分析原因后面的课程笔记我会添加上)
    在这里插入图片描述
    6图6

4.正则化输入(normalizing inputs)
正则化输入相当于将输入进行特征缩放以及方差统一,这样得到的代价函数就会变得规整,利于迭代,而不像之前那样狭长。具体变化过程如图7、图8所示:
在这里插入图片描述
7图7
在这里插入图片描述
8图8

5.梯度检验(Gradient checking)
在开发模型时,我们需要使用梯度数值逼近的方法来检验模型的反向传播是否正确。
首先看下梯度数值逼近的公式
Jθ=limε0J(θ+ε)J(θε)2ε(5) \frac{\partial J}{\partial \theta} = \lim_{\varepsilon \to 0} \frac{J(\theta + \varepsilon) - J(\theta - \varepsilon)}{2 \varepsilon} \tag{5}
ε\varepsilon趋近于0时,我们就可以得到J函数在θ\theta处的导数值,梯度检验就是确认Jθ\frac{\partial J}{\partial \theta}是不是正确,我们可以通过计算J(θ+ε)J(\theta + \varepsilon)J(θε)J(\theta -\varepsilon),得到一个θ\theta处的逼近梯度值dθapproxd\theta_{approx}
dθapprox=J(θ+ε)J(θε)2ε(6)d\theta_{approx}=\frac{J(\theta + \varepsilon)-J(\theta -\varepsilon)}{2\varepsilon}\tag{6}

而我们设计的模型在θ\theta处的导数可以用dθd\theta表示。
最后我们比较这两个值看他们是否相近来判断模型的反向传播是否正确,即
difference=dθdθapprox2dθ2+dθapprox2(7) difference = \frac {\| d\theta - d\theta_{approx} \|_2}{\| d\theta \|_2 + \| d\theta_{approx} \|_2 } \tag{7}
如果difference的值≤10710^{-7},则模型的反向传播算法非常好,如果≤10510^{-5},则模型的反向传播算法一般,如果≤10310^{-3},则模型可能有bug。

进行梯度检验时需要注意的几点:
(1)不要在训练中使用梯度检验,它只用于调试
(2)如果算法的梯度检验失败,要检查所有项
(3)记住正则化,因为如果模型采用了正则化,其代价函数相应增加了正则化项,因此梯度也跟随变化了。
(4)进行梯度检验时不能与丢弃正则化一起使用
(5)在随机初始化时运行梯度检验,然后在做了一些训练后再进行一次梯度检验。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!