《深度学习工程师-吴恩达》02改善深层神经网络--深度学习的实用层面 学习笔记

深度学习的实用层面 学习笔记

 

1.重点归纳

1)数据划分

(1)一般情况下我们会把数据分为训练集、验证集和测试集,但有些时候不需要无偏估计时只划分为训练集和测试集。

(2)数据集比较少时,可以按60%,20%,20%的比例划分数据集。

(3)数据集很大时,并不需要大量的数据(验证集)来选择模型,也不需要大量的数据(测试集)来评估模型。如100万的数据集可以按98%,1%,1%来划分数据集。

2)偏差&方差

(1)高偏差是欠拟合

(2)高方差是过拟合

(3)使用最优误差或贝叶斯误差来衡量偏差/方差是否高

3)初始模型训练完后,我们首先检查算法的偏差高不高,解决了模型偏差高的问题后,使用验证集评估方差。

(1)如果偏差高,可以尝试以下方法:

  • 扩大网络规模
  • 增加训练时间
  • 尝试更先进的优化算法

(2)如果方差高,可以尝试以下方法:

  • 采用更多数据
  • 使用正则化来减少过拟合
  • 尝试其他新网络架构有时可以同时减少方差和偏差

4)如果λ足够大,权重矩阵W被设置为接近于0的值,就是把隐藏单元的权重设为0。

(1)神经网络会被简化变成一个很小的网络,小到如同一个逻辑回归单元(但深度却很大),它会让过拟合的模型接近于欠拟合的模拟。小一点的λ值就可以获得一个适合的模型(低偏差低方差)

(2)tanh激活函数,z取值0附近的值时更接近线性,更多或更小的取值时,tanh输出为非线性。如果正则化参数很大,w变小,z也会变小,实际取值范围很小,激活函数会相对呈线性。

5)dropout会遍历网络的每一层,并设置消除神经网络中节点的概率,我们会消除一些节点,得到规模更小的网络,然后用backprop方法进行训练。每次训练都忽略不同的节点,这些节点对应的权重在对应的训练中不会被更新,每次被忽略的节点都不一样。

(1)我们不愿意给任何一个输入加上太多的权重,因为它可能会被清除。通过传播权重,dropout将产生收缩权重的平方范数的效果,和我们之前讲过的L2正则化类似。

(2)dropout是一种正则化方法,有助于防止过拟合,因此除非算法过拟合,否则不需要使用dropout。在计算机视觉方面应用比较广,因为我们通常没有足够的数据,在其他领域应用比较少。

6)其他正则化方法

(1)增加训练样本(如把图片反转、旋转、拉伸、裁剪等)

(2)early stopping

7)标准化输入可以加速神经网络训练

(1)如果在非归一化输入的代价函数上运行梯度下降法,必须使用一个非常小的学习率

(2)在归一化后的输入代价函数上运行梯度下降法时,能够更直接地找到最小值,可以使用较大的学习率,而不需要像非归一化时那样往复。直观理解是代价函数会更圆一些,而且更容易优化。

8)梯度爆炸&梯度消失

假设一个深度网络使用线性函数作为激活函数,y=w[l]w[l-1]w[l-2]w[3]w[2]w[1]

(1)梯度爆炸:假设所有与w的数值都大于1,那么最终的输出就是wl-1,实际上它呈指数级增长。对于一个深度的网络来说,y值将爆炸式增长。

(2)梯度消失:如果权重w小于1,激活函数的值将以指数级下降。

2.训练/开发/测试集

1)创建高质量的训练数据集、验证集合测试集有助于提高效率,通常把数据集一部分作为训练集、一部分作为验证集、最后一部分作为测试集。

(1)通过训练集训练数据。

(2)通过验证集选择最好的模型,并选定最终的模型。

(3)然后再测试集上进行评估。

2)在小数据集上数据划分(如1万条)

(1)如果没有验证集时,70%作为训练集,30%作为测试集。

(2)60%作为训练集、20%作为验证集、20%作为测试集。

3)在大数据集上数据划分(如100万)

(1)验证集合测试集占数据总量的比例会趋向于变得更少。

(2)验证集的目的就是验证不同的算法检验哪种更有效,验证集要足够才能评估,1万条数据便足以进行评估。

(3)测试集的主要目的是正确评估分类器的性能,可能只需要1万条数据就便足以评估单个分类器。

(4)98%作为训练集,1%作为验证集,1%作为测试集。

(5)对于数据量过百万的情况,训练集可以占到99.5%。

4)要确保验证集合测试集的数据来自同一分布

(1)为了拥有更多的数据集,数据可能来源不同而导致数据分布不同(如部分图片很清晰,部分图片很模糊)

5)如果不需要无偏评估,也可以不设置测试集。

(1)如果只有验证集没有测试集(此时验证集称为测试集,测试集被当成简单交叉验证集使用),我们在训练集上尝试训练不同的模型,在验证集上评估这些模型,并选出适用的模型。

3.偏差/方差

1)高方差 (过拟合)

(1)训练集上误差较小,验证集上误差较大

(2)例子:训练误差1%,验证集误差11%

2)高偏差(欠拟合)

(1)训练集上误差较大,验证集上误差也较大

(2)例子:训练误差15%,验证集误差16%

3)高方差&高偏差

(1)训练误差较大,验证集上的误差比训练集的误差更大

(2)例子:训练误差15%,验证集误差30%

4)低方差&低偏差

(1)训练误差很低,验证集误差也很低

(2)例子:训练误差0.5%,验证集误差1%

5)如果最优误差或贝叶斯误差非常高,例如误差为15%,则误差为15%的模型属于低误差

4.机器学习基础

1)初始模型训练完后,我们首先检查算法的偏差高不高

如果偏差高甚至无法拟合训练集,尝试不同的方法来解决偏差高的问题

  • 选择一个新网络架构,如含有更多隐层或者隐层单元的网络。扩大网络规模一般能拟合训练集
  • 花费更多时间训练算法
  • 尝试更先进的优化算法

2)解决了模型偏差高的问题后,使用验证集评估方差

       如果高方差,尝试不同的方法来解决过拟合问题

  • 最好的解决方法就是采用更多数据,会有一定的帮助
  • 使用正则化来减少过拟合
  • 尝试其他新网络架构有时可以同时减少方差和偏差

3)注意点

(1)高偏差和高方差是两种不同的情况,不同的情况解决的方法完全不同,使用训练集验证偏差问题,使用验证集验证方差问题。如果算法存在高偏差问题,使用更多的数据训练其实没有什么用。

(2)在机器学习初期,没有办法只减低偏差或方差而不影响另外一个,因此需要考虑如何平衡偏差和方差。在深度学习以及大数据时代,通常只要持续训练一个更大的网络, 便可以在不影响方差的同时减少偏差;而采用更多的数据通常可以在不过多影响偏差的同时减少方差。

5.正则化

1)更多的训练数据和添加正则化都可以解决高方差问题(过拟合)

2)L1正则化趋向于令w有很多0,人们越来越倾向于使用L2正则化

  • L1正则化:损失函数中
  • L2正则化:损失函数中
  • λ为正则化系数,通常使用验证集来获取最好的参数值,是需要设置的超参数

6.为什么正则化可以减少过拟合

1)如果λ足够大,权重矩阵W被设置为接近于0的值,就是把隐藏单元的权重设为0。

  • 神经网络会被简化变成一个很小的网络,小到如同一个逻辑回归单元(但深度却很大),它会让过拟合的模型接近于欠拟合的模拟。小一点的λ值就可以获得一个适合的模型(低偏差低方差)
  • 我们直觉上认为大量隐藏单元被完全消除了,实际上神经网络的所有隐藏单元依然存在,但是它们的影响变小了,神经网络变得更简单了。

2)另一种解释

(1)tanh激活函数,z取值0附近的值时更接近线性,更多或更小的取值时,tanh输出为非线性。

(2)如果λ很大,激活函数的参数会相对小。,如果w很小,z也会很小。如果z的值最终取值0附近的数值,g(z)大致呈线性,因此每层几乎都是线性,那么整个网络就是一个线性网络。

(3)如果正则化参数很大,w变小,z也会变小,实际取值范围很小,激活函数会相对呈线性。

7.Dropout正则化

1)dropout会遍历网络的每一层,并设置消除神经网络中节点的概率,我们会消除一些节点

    

     得到一个节点更少,规模更小的网络

    

     然后用backprop方法进行训练。对于其他的样本也照旧采用设置一定消除概率来达到在训练过程中忽略一些节点。每次训练都忽略不同的节点,这些节点对应的权重在对应的训练中不会被更新,每次被忽略的节点都不一样。

2)Inverted dropout实施

        a3 = np.random.rand(5,2)

        print(a3)

        d3 = np.random.rand(a3.shape[0], a3.shape[1]) < 0.8

        print(d3)

       a3 = np.multiply(a3, d3)

       print(a3)

       a3 = a3 / 0.8

       print(a3)

3)在测试阶段不应用dropout函数,如果测试阶段应用dropout函数,预测会受到干扰。

8.理解Dropout

1)应用dropout时,每次迭代之后,神经网络都会变得比以前更小,因此采用一个较小的神经网络和使用正则化的效果是一样的。

2)dropout功能类似于L2正则化,与L2正则化不同的是被应用的方式不同,dropout也会有所不同,甚至更适用于不同的输入范围。

  • 通过dropout,该单元的输入几乎被消除,它不依赖任何输入特征,因为特征都有可能被随机清除。
  • 我们不愿意给任何一个输入加上太多的权重,因为它可能会被清除。通过传播权重,dropout将产生收缩权重的平方范数的效果,和我们之前讲过的L2正则化类似。
  • 实施dropout的结果是它会压缩权重,并完成一些预防过拟合的外层正则化。
  • 事实证明dropout被正式地作为一种正则化的替代形式。L2对不同权重的衰减是不同的,它取决于倍增的激活函数的大小

3)实施dropout的细节

  • 不同层的keep-prob可以变化

包含更多权重参数的层的keep-prob可以小一点

  • 输入层也可以添加dropout,删除一个或多个输入特征。现实中我们通常不这么做,输入层的keep-prob通常设置1或者0.9。
  • 如果你担心某些层比其它层更容易发生过拟合,可以把某些层的keep-prob值设置得比其它层更低。

4)dropout是一种正则化方法,有助于防止过拟合,因此除非算法过拟合,否则不需要使用dropout。在计算机视觉方面应用比较广,因为我们通常没有足够的数据,在其他领域应用比较少。

5)dropout的缺点是代价函数J不再被明确定义,每次迭代都会随机移除一些结点。

9.其他正则化方法

1)对于图片识别训练,可以尝试一下方式增加图片,进而正则化数据集,减少过拟合

(1)水平翻转图片

(2)随意旋转和裁剪图片

(3)扭曲图片

2)early stopping

(1)在开始训练前,神经网络中的权重w解决0,随着训练次数的增加,w值越来越大。Early stopping要做就是在中间点停止迭代过程,防止过拟合。

(2)在训练神经网络时有时会使用它,但它也有一个缺点:防止过拟合时会停止最小化损失函数,最小化目标函数和防止过拟合不能采取不同的方式分别解决。

(3)如果不使用early stopping,另一种方法就是L2正则化,训练神经网络的时间就可能很长,但是超参数搜索空间更容易分解,超参数更容易搜索。使用L2正则化的缺点就是需要尝试很多不同的正则化参数λ来最优正则化参数。

10.标准化/归一化输入

1)其中一种加速训练神经网络的方法就是标准化/归一化输入:

(1)零均值化,使训练样本的均值为0

(2)归一化方差

2)为什么要标准化输入

(1)如果你使用非归一化的输入特征,代价函数是一个非常狭窄的,各个权重值的范围或比率非常不同。

  • 当不同特征的取值范围差别很大时,归一化就显得很重要了,如x1取值范围是[0,1],x2取值范围是[1,1000]
  • 当不同特征的取值访问差别不是很大时,归一化就没那么重要,如x1取值范围是[0,1],x2取值范围是[-1,1]

(2)如果在非归一化输入的代价函数上运行梯度下降法,必须使用一个非常小的学习率

(3)在归一化后的输入代价函数上运行梯度下降法时,能够更直接地找到最小值,可以使用较大的学习率,而不需要像非归一化时那样往复。直观理解是代价函数会更圆一些,而且更容易优化。

11.梯度消失于梯度爆炸

1)当需要深度网络时,导数/坡度有时会变得非常大或非常小(甚至以指数方式变小),这就加大了训练的难度。

2)梯度爆炸&梯度消失

假设一个深度网络使用线性函数作为激活函数,

(1)梯度爆炸:假设所有与w的数值都大于1,那么最终的输出就是wl-1,实际上它呈指数级增长。对于一个深度的网络来说,y值将爆炸式增长。

(2)梯度消失:如果权重w小于1,激活函数的值将以指数级下降。

3)对于深度很深的网络来说,梯度下降算法的步长会非常非常小,将花费很长时间来学习。

12.梯度的数值逼近

1)坡度消失和爆炸问题的解决

(1)最合理的设置就是w=1/n,n为神经元的输入特征数量

(2)对于relu激活函数w=2/n效果更好

(3)某层权重矩阵w[l] = np.random.randn(shape)*np.sqrt(2/n[l-1])

(4)如果激活函数的输入特征被归一化,z(激活函数输入参数)也会调整到相似范围,它就降低了坡度消失和爆炸的问题(没有彻底解决)。因为权重矩阵W设置了合理值,不比1大很多,也不比1小很多,梯度没有消失或爆炸过快。

2)其他权重初始化

(1)tanh激活函数(Xavier初始化):w[l] = np.random.randn(shape)*np.sqrt(1/n[l-1])

(2)其他:w[l] = np.random.randn(shape)*np.sqrt(2/(n[l-1]+ n[l]))

 

猜你喜欢

转载自blog.csdn.net/jliang3/article/details/85860092