吴恩达 deep learning 深度学习的使用层面

训练/验证/测试集

吴恩达 deep learning 深度学习的使用层面
训练集:执行训练算法
验证集:进行交叉验证,选取最终模型
测试集:无偏评估算法的运行状况
小数据集:无验证集 7:3 有验证集6:2:2
大数据集:百万级别 98:1:1 超百万 99.5%:0.25%:0.25% 或 99.5%:0.4%:0.1%
吴恩达 deep learning 深度学习的使用层面

  • 确保验证集和测试集的数据来自同一分布,因为要用验证集来评估不同的模型,尽可能的优化性能,如果验证集合测试集来自同一分布,深度学习算法需要大量的训练数据,为了获得更大规模的训练数据集,就会采用网页抓取的方式获取训练数据,代价就是训练集与测试集和验证集有可能来自不同的分布,但只要确保验证集和测试集来自同一分部,机器学习算法会变得更快
  • 但不需要无偏评估是可以不用测试集

偏差/方差

吴恩达 deep learning 深度学习的使用层面
吴恩达 deep learning 深度学习的使用层面
高偏差:

  • 具有更多隐藏层或者隐藏单元的网络
  • 训练更长时间
  • 更适合解决该问题的新网络架构
    高方差:
  • 更多的数据
  • 正则化
  • 更合适的网络架构

正则化

吴恩达 deep learning 深度学习的使用层面
L1 正则化:λ2mw1=λ2mj=1nxwj\dfrac{\lambda}{2m}||w||_{1}=\dfrac{\lambda}{2m}\sum\limits_{j=1}^{n_{x}}|w_{j}|
L2 正则化:λ2mw22=λ2mj=1nxwj2=λ2mwTw\dfrac{\lambda}{2m}||w||_{2}^{2} = \dfrac{\lambda}{2m}\sum\limits_{j=1}^{n_{x}} w_{j}^{2}=\dfrac{\lambda}{2m}w^{T}w
吴恩达 deep learning 深度学习的使用层面
神经网络正则化 w[l]F2=i=1n[l1]j=1n[l](wij[l])2||w^{[l]}||_{F}^{2}=\sum\limits_{i=1}^{n^{[l-1]}}\sum\limits_{j=1}^{n^{[l]}}(w_{ij}^{[l]})^{2}
吴恩达 deep learning 深度学习的使用层面
λ\lambda足够大的时候w接近于零,方差减小,这就使得高方差向高偏差接近
吴恩达 deep learning 深度学习的使用层面
**函数中的z太大或者太小时会呈现线性,只有当λ\lambda的值合适的时候,z的值才会位于**函数的非线性部分,当z较小的时候,就会位于**函数的线性部分,从而降低模型的非线性程度
当使用正则化后J会呈现单调递减

Dropout正则化

吴恩达 deep learning 深度学习的使用层面
dropout会遍历网络的每一层,并设置消除神经网络中节点的概率,最后得到一个节点更少、规模更小的网络,然后使用反向传播的方法进行训练,对于每个样本都将采用一个精简后的网络训练

反向随机失活
吴恩达 deep learning 深度学习的使用层面
keep_prob表示保留节点的概率
a3/=keep-prob这一步的作用是为了不影响z[4]的期望值
在测试阶段不要使用dropout,如果在测试阶段使用dropout预测会受到干扰,预测结果会变得随机

吴恩达 deep learning 深度学习的使用层面
对于单个神经元,由于加入了dropout,每个特征都可能被删除,所以该神经元不会特别依赖任何一个特征,因此产生了L2正则化这会收缩权重的效果
对于不同的层应当根据神经元的个数进行设置keep_prob的大小
dropout的缺点是代价函数J不再被明确定义,因为每次迭代都会随机消除一些神经元,所以无法绘制J下降的图

其他正则化方法

吴恩达 deep learning 深度学习的使用层面
数据扩增:通过图片的一些变换,得到更多的数据
吴恩达 deep learning 深度学习的使用层面
Early Stoping:在验证误差上升之前停止迭代,优点是只用运行一次就可以找到w的较小值、中间值和较大值,缺点是无法结局偏差和方差之间的最优

归一化

吴恩达 deep learning 深度学习的使用层面
使用相同的μ\muσ2\sigma^{2}来归一化测试集
吴恩达 deep learning 深度学习的使用层面
如果不适用归一化,在某些位置,必须使用一个非常小的学习率,才能找到最优解,使用归一化后,无论从哪个位置开始迭代,都可以在相对较少的迭代中找到最优解,并可以使用较大的步长

梯度消失和梯度爆炸

吴恩达 deep learning 深度学习的使用层面
上图中假设使用线性**函数
W[l]>IW^{[l]}>I的时候 y^=W[L][1.50 01.5]L1X\hat y = W^{[L]}\left[ \begin{array}{l} 1.5 & 0 \\\ 0 & 1.5\end{array} \right]^{L-1}X y^\hat y的值将爆炸式增长
W[l]<IW^{[l]}<I的时候 y^=W[L][0.50 00.5]L1X\hat y = W^{[L]}\left[ \begin{array}{l} 0.5 & 0 \\\ 0 & 0.5\end{array} \right]^{L-1}X y^\hat y的值将指数级递减
这同样适用于导数或梯度函数

神经网络的权重初始化

吴恩达 deep learning 深度学习的使用层面
当**函数是ReLu的时候 Var(wi)=2nVar(w_{i})=\dfrac{2}{n}
当**函数是tanh的时候 Var(wi)=1nVar(w_{i})=\dfrac{1}{n}
如果**函数的输入特征均值为0 方差是1,z也会调整到相似的范围,这样虽然没有解决梯度消失和梯度爆炸的问题,但延缓了问题出现速度

梯度的数值逼近

吴恩达 deep learning 深度学习的使用层面
单边误差逼近
吴恩达 deep learning 深度学习的使用层面
双边误差逼近
可以看到双边逼近误差0.001比单边逼近误差0.0301要小很多

梯度检验

吴恩达 deep learning 深度学习的使用层面
神经网络有大量的参数,需要将这些参数联结起来,再进行梯度检验
吴恩达 deep learning 深度学习的使用层面
使用双边误差逼近计算近似梯度
使用dθapproxdθ2dθapprox2+dθ2\dfrac {||d\theta_{approx}-d\theta||_{2}}{||d\theta_{approx}||_{2}+||d\theta||_{2}}来判断梯度是否正确
吴恩达 deep learning 深度学习的使用层面
Notes:

  • 不要在训练中使用梯度校验,它只用于调试
  • 如果梯度校验出现错误,要检查每一项去消除错误
  • 记住正则化
  • 不要和dropout一起工作
  • 在随机初始化过程中运行梯度检验