Deeplearning.ai课程笔记-改善深层神经网络

大部分笔记内容来源参考笔记:深度学习课程笔记

一. 改善过拟合问题

Bias/Variance

偏差->导致欠拟合
方差->导致过拟合

训练集误差(training set error):根据最优误差(贝叶斯误差,目前的理想的误差大小)来判断训练集误差,训练集误差接近最优误差则偏差大,若训练集误差较大则偏差小
然后
验证集误差(dev set error):验证集误差接近训练集误差,则方差低。反之,方差高。

首先要拟合训练集降低偏差;然后还要控制方差不能太高。

正则化Regularization

有许多不同的正则化函数,其中介绍了L1 regularizaion、L2 regularization、dropout正则化等,用的比较多的是L2 regularization。

1. L2 regularization

下图为:L2正则化的使用。用在代价函数中

L2:
\[ \frac{\lambda}{2m}\sum_{i=1}^{n}||W^{[l]}||_2^2 \]

L1:
\[ \frac{\lambda}{2m}\sum_{i=1}^{n}||W^{[l]}||_1 \]
\(\lambda\)是正则化参数,也是一个超参数。

下面的这个是要正则化的参数W,指的是:所有w参数的平方和
\[ ||W^{[l]}||_2^2 \]

上图的含义是指将每个参数w逐渐的减少

当w约等于0时,也就是说这个隐藏单元的作用消失了,就意味着正则化使得神经网络变简单了。这也叫做“权重损失”。在正则化过程中,渐渐的从图三的神经网络转变成图一的简单网络,中间会有一个刚刚好的结果。

2. Dropout正则化

dropout正则化通过随机使一些节点失活来使神经网络简单化。

每一层都可以设置keep-prob的值使每一层失活率不同

代码实现:
a_3是指第三层的a的矩阵
keep_prob是概率值   例:keep_prob = 0.8 说明有80%的节点不失活

d_3 = np.random.rand(a_3.shape[0],a_3.shape[1]) < keep_prob
#d_3是一个和a_3相同维度的布尔矩阵

a_3 = np.multipy(a_3,d_3)   #也就是a_3=a_3*d_3
#这个操作决定哪些节点失活了,a_3中乘了false的节点失活

a_3 = a_3/keep_prob         
#inverted dropout反向随机失活的使用,此运算可以很好的计算平均值,避免以后还要计算

其他方法

1. 数据变形

数据扩增(Data Augmentation):通过图片的一些变换(翻转,局部放大后切割等),得到更多的训练集和验证集。
缺点:新增的数据质量不够高,不如全新的数据好
优点:代价几乎为0

2. Early stopping

将训练集和验证集进行梯度下降时的成本变化曲线画在同一个坐标轴内,当训练集误差降低但验证集误差升高,两者开始发生较大偏差时及时停止迭代,并返回具有最小验证集误差的连接权和阈值,以避免过拟合。

缺点:无法同时达成偏差和方差的最优。

优点:迅速,不像L2正则化那样需要大量的时间计算\(\lambda\)超参的合适值。

二. 特征缩放

1. 归一化

就是将训练集中某一列数值特征(假设是第i列)的值缩放到0和1之间。

\[x=\frac{{x_{i}-min(x_{i})}}{{max(x_{i})-min(x_{i})}}\]

2. 标准化

将各个特征值尽量的在一个较小的区间内移动,如果分布太过分散会导致在用梯度下降等算法时迭代次数过多,导致训练时间很长。

截屏2020-01-15下午4.37.28

三. 初始化参数

梯度消失、梯度爆炸

在深层次的神经网络中,可能因为w的权重全部或大部分大于1或小于1使得传递过去的值不停的呈指数级增加或减少,从而出现梯度消失、梯度爆炸的情况。

合理的初始化参数可以有效缓解这种情况:

WL = np.random.randn(WL.shape[0], WL.shape[1]) * np.sqrt(1/n)

n是输入的神经元个数,即WL.shape[1]

四. 梯度检验

梯度检验只用与debug时,可以使用这种方法来判断反向传播进行梯度下降时,是否出现了错误。

对于那些参数如w、b的偏导数
\[ w = w-dw \]
在用梯度下降时有时要判断dw是否正确,用梯度检验的方法。

梯度检验其实就是用导数的定义来解:
\[ d\theta=\frac{f(\theta+\omega-f(\theta-\omega))}{2\omega} \]
计算这个结果是否等于dw

在神经网络实施梯度检验的实用技巧和注意事项

  1. 不要在训练中使用梯度检验,它只用于调试(debug)。使用完毕关闭梯度检验的功能;
  2. 如果算法的梯度检验失败,要检查所有项,并试着找出 bug,即确定哪个 dθapprox[i] 与 dθ 的值相差比较大;
  3. 当成本函数包含正则项时,也需要带上正则项进行检验;
  4. 梯度检验不能与 dropout 同时使用。因为每次迭代过程中,dropout 会随机消除隐藏层单元的不同子集,难以计算 dropout 在梯度下降上的成本函数 J。建议关闭 dropout,用梯度检验进行双重检查,确定在没有 dropout 的情况下算法正确,然后打开 dropout;

五. 优化算法

深度学习难以在大数据领域发挥最大效果的一个原因是,在巨大的数据集基础上进行训练速度很慢。而优化算法能够帮助快速训练模型,大大提高效率。

1. mini-Batch梯度下降法

  • mini-batch 的大小为 1,即是随机梯度下降法(stochastic gradient descent),每个样本都是独立的 mini-batch;
  • mini-batch 的大小为 m(数据集大小),即是 batch 梯度下降法——这就是一般情况下用的梯度下降。
  1. 如果训练样本的大小比较小,如 m ⩽ 2000 时,选择 batch 梯度下降法;

  2. 如果训练样本的大小比较大,选择 Mini-Batch 梯度下降法。为了和计算机的信息存储方式相适应,代码在 mini-batch 大小为 2 的幂次时运行要快一些。典型的大小为 \(2^6\)​、\(2^7\)\(2^8\)\(2^9\)。mini-batch 的大小要符合 CPU/GPU 内存。

mini-batch 的大小也是一个重要的超参数,需要根据经验快速尝试,找到能够最有效地减少成本函数的值。

2. 动量梯度下降法

指数加权平均

\(V_t=\beta V_{t-1}+(1-\beta)\theta_t\)

指数加权平均求的是前\(\frac{1}{(1-\beta)}\)天的平均

指数平均加权并不是最精准的计算平均数的方法,你可以直接计算过去 10 天或 50 天的平均值来得到更好的估计,但缺点是保存数据需要占用更多内存,执行更加复杂,计算成本更加高昂。

指数加权平均数公式的好处之一在于它只需要一行代码,且占用极少内存,因此效率极高,且节省成本

指数平均加权的偏差修正

截屏2020-01-15下午6.34.07

动量梯度下降法公式

先将导数值用指数平均加权求平均,然后用该值去更新参数值

截屏2020-01-15下午9.10.30

3. RMSprop算法

截屏2020-01-15下午9.25.22

RMSProp 有助于减少抵达最小值路径上的摆动,并允许使用一个更大的学习率 α,从而加快算法学习速度。并且,它和 Adam 优化算法已被证明适用于不同的深度学习网络结构。

4. Adams算法

Adams算法就是将Momentum 和 RMSProp 算法结合在一起。

具体过程如下(省略了 l):

截屏2020-01-15下午9.30.53

注意:一定要偏差修正

Adam 优化算法有很多的超参数,其中

  • 学习率 α:需要尝试一系列的值,来寻找比较合适的;
  • β1:常用的缺省值为 0.9;
  • β2:Adam 算法的作者建议为 0.999;
  • ϵ:不重要,不会影响算法表现,Adam 算法的作者建议为\(10^{-8}\)

β1、β2、ϵ 通常不需要调试。

5. 学习率衰减

对于学习率\(\alpha\)这个超参数,如果设置一个固定的学习率 α,在最小值点附近,由于不同的 batch 中存在一定的噪声,因此不会精确收敛,而是始终在最小值周围一个较大的范围内波动。

而如果随着时间慢慢减少学习率 α 的大小,在初期 α 较大时,下降的步长较大,能以较快的速度进行梯度下降;而后期逐步减小 α 的值,即减小步长,有助于算法的收敛,更容易接近最优解。

注意:衰减率也是超参数

截屏2020-01-15下午9.45.25

6. 局部最优问题

  • 鞍点(saddle)是函数上的导数为零,但不是轴上局部极值的点。当我们建立一个神经网络时,通常梯度为零的点是鞍点,而非局部最小值。

  • 在训练较大的神经网络、存在大量参数,并且成本函数被定义在较高的维度空间时,困在所有维度导数都是0的这种极差的局部最优中是不大可能的,大多情况都是到达鞍点。

  • 鞍点附近的平稳段会使得学习非常缓慢,而这也是动量梯度下降法、RMSProp 以及 Adam 优化算法能够加速学习的原因,它们能帮助尽早走出平稳段。

六. 超参数选择

1. 超参数重要程度(不绝对)

截屏2020-01-15下午10.08.18

2. 调参技巧

系统地组织超参调试过程的技巧:

  • 随机选择点(而非均匀选取),用这些点实验超参数的效果。这样做的原因是我们提前很难知道超参数的重要程度,可以通过选择更多值来进行更多实验;
  • 由粗糙到精细:聚焦效果不错的点组成的小区域,在其中更密集地取值,以此类推;

3. 选择合适的标尺

  • 对于学习率 α,用对数标尺而非线性轴更加合理:0.0001、0.001、0.01、0.1 等,然后在这些刻度之间再随机均匀取值;
  • 对于 β,取 0.9 就相当于在 10 个值中计算平均值,而取 0.999 就相当于在 1000 个值中计算平均值。可以考虑给 1-β 取值,这样就和取学习率类似了。

七. Batch Normalization

作用:

  1. 会使参数搜索问题变得很容易,使神经网络对超参数的选择更加稳定,超参数的范围会更庞大,工作效果也很好,也会使训练更容易。
  2. 通过对隐藏层各神经元的输入做类似的标准化处理,提高神经网络训练速度;
  3. 可以使前面层的权重变化对后面层造成的影响减小,整体网络更加健壮。

之前的归一化是对特征值(也就是输入层),而Batch归一化用来归一Z的值(也就是隐藏层),虽然与归一化特征值类似,但batch norm不仅仅是零均值化、统一方差,而且添加了\(\gamma\)\(\beta\)两个参数,可以自定义均值和方差。设置 γ 和 β 的原因是,如果各隐藏层的输入均值在靠近 0 的区域,即处于激活函数的线性区域,不利于训练非线性神经网络,从而得到效果较差的模型。因此,需要用 γ 和 β 对标准化后的结果做进一步处理。

截屏2020-01-16上午7.30.11

使用 Batch Normalization 时,因为标准化处理中包含减去均值的一步,因此 b 实际上没有起到作用,其数值效果交由 β 来实现。因此,在 Batch Normalization 中,可以省略 b 或者暂时设置为 0。——所以使用Batach Norm后超参变为了\(W\)$\beta $\(\gamma\)

八. Softmax

1. 函数公式

之前介绍的分类例子都是二分类问题:神经网络输出层只有一个神经元,表示预测输出 ŷ,ŷ > 0.5 则判断为正类,反之判断为负类。

对于多分类问题,用 \(C\)表示种类个数,则神经网络输出层,也就是第 L 层的单元数量 \(n^{[L]}=C\)。每个神经元的输出依次对应属于该类的概率,所有神经元概率总和为1。 Softmax 回归就是这种分类模型,可以处理多分类问题。

与Softmax对应的还有一个hardmax函数,也是求多分类问题,但是在最后输出的时候hardmax不输出每个分类的概率,而是直接将概率最高的输出1,其余输出0。所以,与hardmax相比,softmax的输出确实更soft。

softmax与二分类不同的地方就是在最后一层改用了Softmax函数。
softmax输出层有k个节点,每个节点对应一个分类,每个节点输出的是概率值,根据输出层中概率值最大的节点来决定属于哪个分类。

Softmax激活函数:

(k是输出层的节点个数)
\[ t = e^{z^{[L]}} \]

\[ a^{[L]}=\frac{t}{\sum_{i=1}^{k}ti} \]

截屏2020-01-16上午8.45.19

2. cost functin

所有m个样本的cost function:
\[ J =\frac{1}{m}\sum_{i=1}^{m}log\hat y_i \]

3. Gradient descent with Softmax

多分类的 Softmax 回归模型与二分类的 Logistic 回归模型只有输出层上有一点区别。经过不太一样的推导过程,仍有:

\[dz^{[L]}=\hat y-y\]

反向传播过程的其他步骤也和 Logistic 回归的一致。

猜你喜欢

转载自www.cnblogs.com/z1xiang/p/12199656.html