吴恩达的deeplearning.ai与网易云课堂合作推出了一个微专业课程《深度学习工程师》,整个课程分四个大部分
- 神经网络和深度学习
- 改善深层神经网络:超参数调试、正则化以及优化
- 结构化机器学习项目
- 卷积神经网路
- 序列模型
这里主要总结第二部分改善深层神经网络:超参数调试、正则化以及优化,一共有三周的学习内容:
- 深度学习的使用层面
- 优化算法
- 超参数调试、Batch正则化和程序框架
我这里只做一些总结笔记,并没有详细的解释,可能对于在读博客的你并没有太大的帮助,因为主要是针对于我自己的,方便回顾,而不是作为一个教程存在。
2. 改善深层神经网络:超参数调试、正则化以及优化
2.1 深度学习的使用层面
- 数据集的划分,通常会有训练集,验证(开发)集和测试集,训练完的模型需要看泛化能力好不好,如果过拟合了,在训练集上一级棒,有新的数据就一塌糊涂,所以要有一个验证集的存在,验证训练结果,帮助参数调整。需要注意的是划分后的数据集要有相同的分布。
- 高偏差(High Bias)就是欠拟合,模型过于简单,在训练集和验证集上误差都高。高方差(High Variance)就是过拟合,模型过于复杂,在训练集上误差低,验证集上误差高。
- 正则化
- 正则项(L1和L2)用来防止过拟合问题,L1会让W变得稀疏,L2比较常用。对神经网络来讲,平方形式的正则项被称为费罗贝尼乌斯范数Frobenius norm(因为一些我们不需要知道的原因…)。L2正则化也会被称为权值衰减(Weigth Decay)
- 正则化之所以能防止过拟合的问题,是因为比较大的 λ \lambda λ,会使W相对比较小,这样就会使Z比较小,以tanh激活函数为例,z比较小的部分线性化比较好,整个网络更接近线性化,而不会复杂化,如此就防止了过拟合。
- dropout(随机失活)也算是正则化,实现的时候注意因为有些神经元失活,会引起期望值改变,所以需要有Inverted dropout技巧来校正期望值。另外,在测试的时候是没有必要让神经元失活的,也就是不需要dropout。
- Data augmentation, Early stopping都是比较常用的防止过拟合的方法
- 加快训练速度,通常会做归一化处理(Normalization)
1 - 零均值化。
2 - 归一化方差(Normalize the variances)。 - 梯度消失(vanishing)和梯度爆炸(exploding),改善的方法就是合理选择初始化权重
- 用梯度的数值计算结果与反向传播对比进行梯度验证
2.2 优化算法
- Mini-batch梯度下降
- 梯度下降算法的每一次迭代都需要在整个训练集上进行,当训练集很大的时候,速度慢而且占内存。把整个训练集分为多个子集(Mini-batch),然后一个batch一个batch训练,整个训练集迭代一次叫一个epoch。这个方法不但速度快而且占用内存小。
- 但是使用Mini-batch时,成本函数会在波动中下降,因为每个Mini-batch可能都不太一致。
- Mini-batch的单个batch样本怎么选呢,如果size=m,那就是整个就是一个batch。如果size=1,也就是每个单独的样本就是一个batch,也称为随机梯度下降。一般选2的指数,64、128、256、512比较常见,当然也要看训练处理器(CPU或者GPU)的内存大小。
- 指数加权平均(Exponentially weighted averages)
v t = β v t − 1 + ( 1 − β ) θ t v_t = \beta v_{t-1} + (1-\beta)\theta_t vt=βvt−1+(1−β)θt
Bias correction用来修正计算初期的偏差(不一定要用) - 动量梯度下降(Momentum)
V d W = β V d W + ( 1 − β ) d W V_{dW} = \beta V_{dW} + (1-\beta)dW VdW=βVdW+(1−β)dW
V d b = β V d b + ( 1 − β ) d b V_{db} = \beta V_{db} + (1-\beta)db Vdb=βVdb+(1−β)db
W = W − α V d W , b = b − α V d b W = W - \alpha V_{dW}, b=b-\alpha V_{db} W=W−αVdW,b=b−αVdb
通常 β = 0.9 \beta=0.9 β=0.9 是个效果很好的选择 - RMSprop
S d W = β S d W + ( 1 − β ) d W 2 S_{dW} = \beta S_{dW} + (1-\beta)dW^2 SdW=βSdW+(1−β)dW2
S d b = β S d b + ( 1 − β ) d b 2 S_{db} = \beta S_{db} + (1-\beta)db^2 Sdb=βSdb+(1−β)db2
W = W − α d W S d W , b = b − α d b S d b W = W - \alpha {{dW} \over \sqrt{S_{dW}}}, b=b-\alpha {{db} \over \sqrt{S_{db}}} W=W−αSdWdW,b=b−αSdbdb
和动量梯度下降类似,都是用来消除梯度下降过程中的波动问题,同时加快下降速度,而且允许尝试大一些的学习率 α \alpha α - Adam优化算法
结合了RMSprop和Momentum,被证明在各种深度学习网络中效果都很好 - 学习率衰减
训练到后期,通常损失函数会在最优值附近波动,减小学习率会让其波动范围变小。但前期训练我们希望学习率大一些,收敛速度快一些。 - 局部最优问题
在高维度的空间,更容易出现的是鞍点(saddle point)而不是局部最优点,局部最优要求在各个方向上导数方向一致,概率是很小的。
2.3 超参数调试、Batch正则化和程序框架
- 调试处理
一级超参:学习率 α \alpha α
二级超参:Momentum β \beta β , 隐含层神经元个数,Mini-batch的大小
三级超参:神经网络层数量,学习率衰减参数
视频建议随机组合来找出到底哪个超参主要影响,同时要注意参数的缩放尺度,比如在对数尺度上效果会好一些,还有由粗到细的区域搜索。 - Batch Normalization
- 基本的想法是对隐含层的每一层都做归一化处理。可以归一化 z 或者归一化激活后的 a,视频推荐归一化 z。隐含层和输入层不一样的是,某些情况下,可能我们不希望均值为0,方差为1,而是可以调整的。
- 计算均值和方差,减去均值,除以标准差,通常深度学习框架会提供计算函数
- 为什么BN有效呢?有个概念叫Covariate Shift,意思就是说输入数据的分布有变化,那么训练出来的网络也要重新训练。细化地对每一层网络来说,它的前一层激活函数输出就是本层的输入,这个输入的分布是会一直改变的,利用BN正则化可以约束其在某个均值和方差内波动,那么虽然变化,分布不会变化太大,有利于加速训练过程。另外,BN有一定的正则化效果,但不显著。
- Softmax回归
- 之前提到的Logistic Regression是二分类(Binary Classification),更一般化的形式Softmax Regression可以处理多分类问题。使用Softmax Regression的层,叫Softmax层,使用Softmax激活函数。
- Hard max是指直接把值最大的那个概率设为1,其他全为0。
- 用Softmax层作为输出层的损失函数一般选择交叉熵(Cross Entropy)
- 深度学习框架
主流的框架各有各的好处,而且日新月异,优缺点可以上网搜索,每个人需求不同,选择也不同。