DeepLearning.AI 改善深层神经网络:超参数调试、正则化以及优化 Week3 6 -11

改善深层神经网络:超参数调试、正则化以及优化 Week3 6 -11

目录

  • Batch Norm 为什么奏效
  • 测试时的Batch Norm
  • Softmax 回归
  • 如何训练一个Softmax分类器
  • 深度学习框架

Batch Norm 为什么奏效

  1. 从表象上理解,Andrew告诉了我们Batch归一化的能够加快学习效率的一个原因是:通过归一化操作,我们所有的数据的均值为0,方差为1(或者是一个我们规定好的固定值),这样我们的大小不同的数据的取值约束于一个固定范围内,这样有利于加快学习效率。
    举个例子,比如:我们有一些数据的取值范围为 [ 0 , 1 ] [0,1] ,有一些数据取值是 [ 1 , 1000 ] [1,1000] ,如果同时训练这样两组数据集,可能因为取值相差较大而导致学习效率降低。如果我们采用Batch Norm,就可以把他们约束于一个取值区间内,从而提高学习效率。
  2. Batch Norm能够奏效的另一个原因是它使得权重比你的网络更滞后或者更深层,使得后面的权重对前面权重的变化更具有鲁棒性。为了理解这个概念我们举一个例子来说明,如下图所示:
    在这里插入图片描述
  • 上图逻辑回归最简单的一个应用,就是对于判断是否为猫的一个二分类问题。如左图,我们可以看到,数据集里面的猫都是一些黑猫,所以我们在神经网络的某一个隐藏层就认为黑色是猫的一个重要特征,但是我们知道猫不只有黑色还有白色,花猫等等。所以我们在一些具有其他毛色猫的测试集测试的时候效果就不会太好。为了能够在更多颜色的猫上能够取得更好效果就需要加入其他猫色的猫的训练集加以训练。这种训练样本(黑猫)和测试样本(各种颜色的猫)分布的变化称之为covariate shift。下面我们看看神经网络为什么会存在covariate shift的问题,下图是一个深层神经网络(或许这不算很多层,不过这只是给例子罢了)。
    在这里插入图片描述
  • 在图中第三个隐藏层也就是箭头所指的那一层,它受到来自第二层的输出的影响,我们现在不采用Batch归一化方法,回到猫的分类问题中,我们可以想到猫的特征,尖尖的耳朵,宝石一样的眼睛,小胡子等等,这些特征经过训练保存在第二层中,所以我们可以认为有这些特征,那是猫的可能性就会大,但是又由于这里的猫都是黑猫,所以系统可能认为黑色也是猫重要的特征,所以和其他一样,把黑色作为猫的一个特征,给黑色较高的权重,因为这种较高的权重存在,所以在输入下一层的时候就会更多的影响下一层的判断,从而最后导致covariate shift的产生,这就是我们说的后面权重受到前面权重影响的鲁棒性较差,也就是容错能力较差。(PS:这部分是我看完mooc自己的理解不知道对不对,如有纰漏还请多指正!)
  • 我们再来谈一下为什么使用Batch归一化可以改善上述问题,因为Batch归一化可以保障无论怎么变化,第二个隐藏层的均值和方差与前一层保持相同,所以即使该层的每个单元的值会改变,但是限制了这一层的隐藏单元数值的变换范围,进而影响数值分布的程度,所以第三层来自第二层的输入会更加稳定,换句话说Batch归一化通过对隐藏层数值均值和方差的限定,使得其变化被控制在了很小的范围内,从而限制了由于前层权重更新在当前层引起的数值分布变化的程度,使得隐藏层数值更加稳定,减弱了前层参数作用和后层参数作用的联系,使得各层相对独立,可以自己学习,从而有助于加速整个网络的学习。
  1. 另外,Batch Norm也起到轻微的正则化效果。
  • batch归一化对Z的缩放是由某一mini-batch计算的均值和方差来决定的,而不是整个数据集的均值和方差,所以这样的均值和方差是含有一些噪声的。
  • 类似dropout,batch归一化也有正则化效果,由于添加噪声,使得后部单元不能过分依赖任何一个输入单元,但由于噪声很小,所以正则化效果也很微弱,实际中可以同时使用dropout和batch归一化。
  • Batch-size变大噪声会变小,相应的正则化效果会减弱

测试时的Batch Norm

  • 在训练阶段我们对每一个mini batch 都选取了自己对应的均值 μ \mu 和方差 σ 2 \sigma^{2}, 那么对于测试集,我们要选取什么均值与方差呢?
  • 下列是一些Batch Norm的公式:
    μ = 1 m z i \mu =\frac{1}{m}\sum z _{i}
    σ 2 = 1 m ( z i μ ) \sigma ^{2}=\frac{1}{m}\sum (z_{i}-\mu )
    z n o r m ( i ) = z i μ σ 2 + ε z ^{(i)}_{norm}= \frac{z_{i}-\mu}{\sqrt{\sigma ^{2}+\varepsilon }}
    z ~ ( i ) = γ z n o r m ( i ) + β \tilde{z}^{(i)}= \gamma z_{norm}^{(i)}+\beta
    上述公式用于训练集的时候,计算每一个mini-Batch的 z ~ ( i ) \tilde{z}^{(i)}, 当计算测试集的均值和方差的时候我们采取的方法是计算出每一个mini-Batch的均值和方差 μ 0 , \mu_{0}, μ 1 , . . . \mu_{1},... μ n , \mu_{n}, σ 0 2 , \sigma_{0}^{2}, σ 1 2 , . . . \sigma_{1}^{2},... σ 0 n , \sigma_{0}^{n}, 然后计算所有均值和方差的平均值得到测试集的均值和方差即:
    μ = 1 n 0 n μ i \mu =\frac{1}{n}\sum_{0}^{n} \mu _{i}
    σ 2 = 1 n 0 n σ i 2 \sigma^{2} =\frac{1}{n}\sum_{0}^{n}\sigma_{i}^{2}
    然后再用后两个公式计算得测试集的 z ~ \tilde{z}

Softmax 回归

  • 在之前的逻辑回归中我们解决的是一个二分类问题,我们还希望能实现多分类问题这就是Softmax回归。在Softmax的输出层有n个输出,n等于所分类比数,Softmax回归中为我们提供了一个激活函数,这个激活函数作用于输出层,通过归一化,这个激活函数输出的是每一种类别对应的概率,下面我们将给出这个激活函数并通过一个例子来便于理解这个激活函数。
  • 激活函数:
    t = e ( z i ) t=e^{(z^{i})}
    归一化过程:
    a [ i ] = e ( z i ) t i a^{[i]}=\frac{e^{(z^{i})}}{\sum t_{i}}
  • 举个例子 Z = [ 5 2 1 3 ] Z=\begin{bmatrix} 5\\ 2\\ -1\\ 3 \end{bmatrix}
    根据激活函数我们可以求得
    t = [ e 5 e 2 e 1 e 3 ] = [ 148.4 7.4 0.4 20.1 ] t=\begin{bmatrix} e^{5}\\ e^{2}\\ e^{-1}\\ e^{3} \end{bmatrix}=\begin{bmatrix} 148.4\\ 7.4\\ 0.4\\ 20.1 \end{bmatrix}
    所有项的和为 t i = 176.3 {\sum t_{i}}=176.3
    经过归一化得到输出为:
    [ 148.4 / 176.3 7.4 / 176.3 0.4 / 176.3 20.1 / 176.3 ] = [ 0.842 0.042 0.002 0.114 ] \begin{bmatrix} 148.4/176.3\\ 7.4/176.3\\ 0.4/176.3\\ 20.1/176.3 \end{bmatrix}=\begin{bmatrix} 0.842\\ 0.042\\ 0.002\\ 0.114 \end{bmatrix}

如何训练一个Softmax分类器

  • Softmax回归为什么叫Softmax?
    这其实是对应Hardmax的一个概念,对于多分类最后结果,Hardmax选择可能性最大的一项设置为1,其余为0,而softmax则是列出属于各类的概率,方式相对温和一些故而得名。
  • 损失函数与成本函数
    L ( y ^ , y ) = j = 1 n y j l o g y j ^ L(\hat{y},y)=-\sum _{j=1}^{n} y_{j}log\hat{y_{j}}
    J ( ω 1 , b 1 . . . ) = 1 m i = 1 n L ( y ^ , y ) J(\omega _{1},b_{1}...)=\frac{1}{m}*\sum _{i=1}^{n} L(\hat{y},y)
    相信这两个公式很容易理解,在这里就不做过多的解释了。
  • 反向传播
    Andrew说在后面我们进行深度学习会采用框架,框架会帮我们处理求导,也就是反向传播的过程,所以我们就不必每次都去计算复杂的导数了。

深度学习框架

  • 为什么要学习深度学习框架
    一方面我们之后会学习更为复杂的神经网络,例如卷积神经网络和循环神经网络,自己去写神经网络既不现实也没有必要;另一方面从零实现神经网络会花费大量精力不现实。
  • 深度学习框架的选择标准
  1. 是否编程友好,是否有利于神经网络的开发、迭代以及为产品进行配置。
  2. 运行速度
  3. 框架能否保障长期开源可靠,是否具有良好的管理

猜你喜欢

转载自blog.csdn.net/scanf_yourname/article/details/85501170