深度学习笔记-深度学习实战

深度学习实战

前面总结了吴恩达的深度学习课程笔记,博主把后续的深度学习课程笔记总结记录到个人博客里面,以供学习和交流使用。今天总结的是深度学习的超参数调试、正则化和梯度检验

改善神经网络

依次通过数据集、偏差方差、正则化、梯度爆炸和消失来掌握深度学习的基础理论。

数据集

我们需要将数据集分为训练数据集(Train dataset)、验证数据集(Validation/Dev dataset)和测试数据集(Test dataset),如下图所示:

训练数据集:训练模型时使用的数据集。 验证数据集:这个数据集主要在于当我们有多个模型时,我们需要选择最优的模型,验证数据集帮助我们挑选最优的模型算法(最优模型)。 测试数据集:测试数据集是用来评估模型准确度,主要是通过测试数据集对于挑选的最优模型进行无偏估计。 一般在机器学习早期,一般将数据集分为70%(train dataset)/30%(test dataset) or 60%(train dataset)/20%(dev dataset)/20%(test dataset),这主要是早期label数据量较少,这样划分是比较常用的数据划分。但是在现在的大数据时代,比如我们拥有100万lable数据实例,我们一般98%(train dataset)/1%(dev dataset)/1%(test dataset) or 99.5%(train dataset)/0.4%(dev dataset)/0.1%(test dataset) 无论如何划分数据,一定要使得数据的分布一致

偏差和方差

偏差:描述的是预测值(估计值)的期望与真实值之间的差距。偏差越大,越偏离真实数据。 方差:描述的是预测值的变化范围,离散程度,也就是离其期望值的距离。方差越大,数据的分布越分散。

Demo 假如我们现在识别一个cat的图片,人识别的错误率为0.001%,我们在train和dev的的错误率为: 1.高方差 Train set error: 1% Dev set error: 11% 2.高偏差 Train set error: 15% Dev set error: 16% 3.高偏差高方差 Train set error: 15% Dev set error: 30% 4.低偏差低方差(最优) Train set error: 0.5% Dev set error: 1%

人识别错误率的分析是我们假设预测的,一般我们称为最优误差即贝叶斯误差,如果我们的最优误差是15%,上面的例子中最优的是2。高偏差最直接的效果是会造成model无法对数据进行很好的拟合即模型为线性较为简单,而高方差最直接的效果是造成model对数据的拟合效果超过了泛华的拟合效果,model的泛华能力较低。在机器学习中我们要做到的是降低我们的偏差和方差,市值达到一个平衡状态。怎么降低偏差和方差呢? 高偏差(训练数据集)->选择一个新的网络模型(含有更多的深度学习层数和隐藏节点数的模型)->重复迭代训练直到偏差降下来为止即模型拟合数据(偏差降到可接受的范围)->检查方差是不是过高(验证数据集)->如果方差过高,我们需要收集更多的数据集or正则化

正则化

L2正则化

我们先来看一下LR的损失函数的计算,

minJ(w,b)=\frac 1m \sum_{i=1}^{m}L({ypred}^i-y^i)

为了该模型加上L2正则化后变为,其中w输入nx空间

minJ(w,b)=\frac 1m \sum_{i=1}^{m}L({ypred}^i-y^i)+\frac {\lambda}{2m}||w||^2_2\\\\ \frac {\lambda}{2m}||w||^2_2=\frac {\lambda}{2m} \sum_{j=1}^{nx}w^2_j=\frac {\lambda}{2m} w^Tw

其中正则化的lambda为正则化参数属于深度学习超参数的一种,深度学习网络是如何来实现L2正则化的呢?

J(w^{[1]},b^{[1]},w^{[2]},b^{[2]},......,w^{[l]},b^{[l]})=\frac 1m \sum_{i=1}^{m}L({ypred}^i-y^i)+\frac {\lambda}{2m}\sum_{j=1}^{l}||w^{j}||^2\\\\ l为深度学习层数,w:(n^{l-1},n^{l})分别代表了(前一层隐藏单元的神经元的数量,当前层神经元的数量)\\\\ ||w^{j}||^2=\sum_{i=1}^{n^{l-1}}\sum_{j=1}^{n^{l}}(w_{ij})^2

我们下面来看看如何实现防止过拟合的,为什么加上L2正则化后会对深度学习模型有效的防止过拟合。主要的原理在于正则化实际上对损失函数进行惩罚,所谓的惩罚就是对模型复杂度而言,模型复杂度越复杂那么对他惩罚越严重,复杂度越小惩罚越轻。深度学习算法采用BP进行逐步迭代求解参数w和b,那么我们加入正则化后如何进行处理呢?

dw^l=\frac {\partial {J(w,b)}}{\partial {w}}+{\lambda}{2m}||w||^2_2\\\\ dw^l=\frac {\partial {J(w,b)}}{\partial {w}}+\frac{\lambda}{m}w^{[l]}\\\\ w^{[l]}:=w^{[l]}-{\alpha}dw^{[l]}\\\\ w^{[l]}:=(1-\frac{\alpha\lambda}{m})w^{[l]}-\alpha \frac {\partial {J(w,b)}}{\partial {w}}\\\\ a=(1-\frac{\alpha\lambda}{m})

因为a是小于1的数,整个权重处于衰减的过程。对于过拟合的神经网络,如果我们设置的超参数比较合理,那么a是一个很小的数,基本上约等于0,这就意味着会消除一些某些隐藏层的神经元的影响,使得神经网路的结构得到优化,从而使得一个从过拟合状态进行惩罚并纠正。(比如:lambda 设置的很大,w会很小,z的值也接近于0,那么在激活函数时它是线性函数,不适合过于复杂的决策。)

Dropout

Dropout会遍历神经网络每一层,然后按照一定概率随机删除一些神经元节点。

数据增强

比如将图像水平翻转,平移,裁切等操作,我们的目的使得模型的泛化能力增强,能适应各种数据。

Early Stopping

当我们需要在希望得到我们的误差时,我们可以通过Early Stopping来终止,来防止模型出现过拟合。

超参数初始化

我们都应该知道,BP是通过反向传播进行链式方式调整超参数通过SGD来找到全局中最优解。那么超参数的比如权重w的初始化会影响在空间中寻找的最优解,很容易造成梯度消失和梯度爆炸。所以我们在给定learning_rate下,要适当的对权重做出调整,那么如何去做?

权重初始化方法

1.通过初始化小的的随机数,比如:均值为0,方差为0.01的高斯分布。

W=0.01 * np.random.randn(D,H)

这种方式只适用于小的神经网络,对深度层数较多的神经网络不太适合,并且分布的方差随着输入数量的增大而增大。 2.正则化方差来提高权重收敛速率,初始权重的方式为正态分布

w = np.random.randn(n) / sqrt(n)

其中ReLu权值初始化方式为,方差为2.0/n,这会使得中间结果方差较小,神经元不会饱和,学习速度不会减慢。

w = np.random.randn(n) * sqrt(2.0/n)

甚至有的论文给出了,如下的推荐方式

\text{Var}(W) = \frac{2}{n_\text{in} + n_\text{out}}

3.Xavier权重初始化 Xavier初始化可以帮助减少梯度弥散问题, 使得信号在神经网络中可以传递得更深。是最为常用的神经网络权重初始化方法。算法根据输入和输出神经元的数量自动决定初始化的范围: 定义参数所在的层的输入维度为n,输出维度为m,那么参数将从

(-{\sqrt{6\over m+n}},{\sqrt{6\over m+n}})

均匀分布中采样。 4.MSRA Xavier该初始化方式为使每层方差一致,从而不会发生前向传播爆炸和反向传播梯度消失等问题。对于ReLU激活函数,其使一半数据变成0,初始时这一半的梯度为0,而tanh和sigmoid等的输出初始时梯度接近于1.因此使用ReLU的网络的参数方差可能会波动。Kaiming He论文中通过放大一倍来保持方差的平稳。这就是MSRA.

\text{Var}(W) = \frac{2}{n_\text{in}}

前向和后向推导的方差均控制在2n,综合起来使用均值为0,方差为

\sqrt{4\over n_{in}+n_{out}}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏杂七杂八

matlab留出法实现

留出法(hold-out) 方法:直接将数据集D划分为两个互斥的集合,其中一个集合作为训练集S,另一个作为测试集T,即.在S上训练出模型后,用T来评估其作为测...

5469
来自专栏SIGAI学习与实践平台

机器学习算法地图

很多同学在学机器学习和深度学习的时候都有一个感受:所学的知识零散、不系统,缺乏整体感,这是普遍存在的一个问题。在这里,SIGAI对常用的机器学习和深度学习算法进...

2783
来自专栏机器之心

深度 | 理解神经网络中的目标函数

选自Kdnuggets 作者:Lars Hulstaert 机器之心编译 参与:晏奇、李泽南 本文面向稍有经验的机器学习开发者,来自微软的 Lars Hulst...

2959
来自专栏用户2442861的专栏

神经网络与深度学习(4):改进神经网络的学习方法

本文总结自《Neural Networks and Deep Learning》第3章的内容。 

471
来自专栏生信小驿站

R 梯度提升算法①

它是一种传统而重要的Boost算法,在学习时为每一个样本赋上一个权重,初始时各样本权重一样。在每一步训练后,增加错误学习样本的权重,这使得某些样本的重要性凸显出...

803
来自专栏机器学习算法与Python学习

机器学习(20)之Adaboost算法原理小结

关键字全网搜索最新排名 【机器学习算法】:排名第一 【机器学习】:排名第二 【Python】:排名第三 【算法】:排名第四 前言 在(机器学习(17)之集成学习...

36310
来自专栏数据科学与人工智能

【算法】随机梯度算法

小编邀请您,先思考: 1 随机梯度下降算法怎么理解? 2 随机梯度下降算法有哪些变体? ? 随机梯度下降算法是深度学习中最常用的算法。算法就是不停地寻找某个节点...

41014
来自专栏人工智能

深度学习系列教程(八)TensorFlow 中的正则化方法

"玩转TensorFlow与深度学习模型”系列文字教程,本周带来TensorFlow 中的正则化方法! 大家在学习和实操过程中,有任何疑问都可以通过学院微信交流...

24310
来自专栏CVer

CS229 机器学习速查表

本文经机器之心(微信公众号:almosthuman2014)授权转载,禁止二次转载

791
来自专栏人工智能

深度学习系列教程(八)TensorFlow 中的正则化方法

"玩转TensorFlow与深度学习模型”系列文字教程,本周带来TensorFlow 中的正则化方法! 大家在学习和实操过程中,有任何疑问都可以通过学院微信交流...

24110

扫码关注云+社区