Add .md files for chapter 14 & 15

This commit is contained in:
Chenglei QIAO (z624235) 2018-10-25 08:27:57 +08:00
parent 9f4ed1f53d
commit 4ea76492e9
4 changed files with 73 additions and 0 deletions

View File

@ -0,0 +1,56 @@
# 第十五章 正则化
## 15.1 什么是正则化?
## 15.2 正则化原理?
## 15.3 为什么要正则化?
除了正则化和随机失活dropout正则化还有几种方法可以减少神经网络中的过拟合:
深度学习可能存在过拟合问题——高方差,有两个解决方法,一个是正则化,另一个是准备更多的数据,这是非常可靠的方法,但你可能无法时时刻刻准备足够多的训练数据或者获取更多数据的成本很高,但正则化通常有助于避免过拟合或减少你的网络误差。
如果你怀疑神经网络过度拟合了数据,即存在高方差问题,那么最先想到的方法可能是正则化,另一个解决高方差的方法就是准备更多数据,这也是非常可靠的办法,但你可能无法时时准备足够多的训练数据,或者,获取更多数据的成本很高,但正则化有助于避免过度拟合,或者减少网络误差,下面我们就来讲讲正则化的作用原理。
## 15.4 为什么正则化有利于预防过拟合?
<div align="center">![](./img/ch15/ch15_1.png)</div>
<div align="center">![](./img/ch15/ch15_2.png)</div>
左图是高偏差右图是高方差中间是Just Right这几张图我们在前面课程中看到过。
## 15.5 为什么正则化可以减少方差?
## 15.6 L2正则化的理解
## 15.7 理解dropout正则化
Dropout可以随机删除网络中的神经单元他为什么可以通过正则化发挥如此大的作用呢
直观上理解不要依赖于任何一个特征因为该单元的输入可能随时被清除因此该单元通过这种方式传播下去并为单元的四个输入增加一点权重通过传播所有权重dropout将产生收缩权重的平方范数的效果和之前讲的L2正则化类似实施dropout的结果实它会压缩权重并完成一些预防过拟合的外层正则化L2对不同权重的衰减是不同的它取决于激活函数倍增的大小。
## 15.8 有哪些dropout正则化方法
## 15.9 如何实施dropout正则化?
如何实施dropout呢方法有几种接下来我要讲的是最常用的方法即inverted dropout反向随机失活出于完整性考虑我们用一个三层网络来举例说明。编码中会有很多涉及到3的地方。我只举例说明如何在某一层中实施dropout。
## 15.10 Python实现dropout正则化
## 15.11 正则化和dropout 有什么不同?
dropout的功能类似于正则化与正则化不同的是应用方式不同会带来一点点小变化甚至更适用于不同的输入范围。
第二个直观认识是我们从单个神经元入手如图这个单元的工作就是输入并生成一些有意义的输出。通过dropout该单元的输入几乎被消除有时这两个单元会被删除有时会删除其它单元就是说我用紫色圈起来的这个单元它不能依靠任何特征因为特征都有可能被随机清除或者说该单元的输入也都可能被随机清除。我不愿意把所有赌注都放在一个节点上不愿意给任何一个输入加上太多权重因为它可能会被删除因此该单元将通过这种方式积极地传播开并为单元的四个输入增加一点权重通过传播所有权重dropout将产生收缩权重的平方范数的效果和我们之前讲过的正则化类似实施dropout的结果是它会压缩权重并完成一些预防过拟合的外层正则化。
事实证明dropout被正式地作为一种正则化的替代形式对不同权重的衰减是不同的它取决于倍增的激活函数的大小。
总结一下dropout的功能类似于正则化与正则化不同的是被应用的方式不同dropout也会有所不同甚至更适用于不同的输入范围。
## 15.12 dropout有什么缺点
dropout一大缺点就是代价函数J不再被明确定义每次迭代都会随机移除一些节点如果再三检查梯度下降的性能实际上是很难进行复查的。定义明确的代价函数J每次迭代后都会下降因为我们所优化的代价函数J实际上并没有明确定义或者说在某种程度上很难计算所以我们失去了调试工具来绘制这样的图片。我通常会关闭dropout函数将keep-prob的值设为1运行代码确保J函数单调递减。然后打开dropout函数希望在dropout过程中代码并未引入bug。我觉得你也可以尝试其它方法虽然我们并没有关于这些方法性能的数据统计但你可以把它们与dropout方法一起使用。
## 15.13 其他正则化方法?
**一.数据扩增**
假设你正在拟合猫咪图片分类器,如果你想通过扩增训练数据来解决过拟合,但扩增数据代价高,而且有时候我们无法扩增数据,但我们可以通过添加这类图片来增加训练集。例如,水平翻转图片,并把它添加到训练集。所以现在训练集中有原图,还有翻转后的这张图片,所以通过水平翻转图片,训练集则可以增大一倍,因为训练集有冗余,这虽然不如我们额外收集一组新图片那么好,但这样做节省了获取更多猫咪图片的花费。
除了水平翻转图片,你也可以随意裁剪图片,这张图是把原图旋转并随意放大后裁剪的,仍能辨别出图片中的猫咪。
通过随意翻转和裁剪图片,我们可以增大数据集,额外生成假训练数据。和全新的,独立的猫咪图片数据相比,这些额外的假的数据无法包含像全新数据那么多的信息,但我们这么做基本没有花费,代价几乎为零,除了一些对抗性代价。以这种方式扩增算法数据,进而正则化数据集,减少过拟合比较廉价。
像这样人工合成数据的话,我们要通过算法验证,图片中的猫经过水平翻转之后依然是猫。大家注意,我并没有垂直翻转,因为我们不想上下颠倒图片,也可以随机选取放大后的部分图片,猫可能还在上面。
对于光学字符识别我们还可以通过添加数字随意旋转或扭曲数字来扩增数据把这些数字添加到训练集它们仍然是数字。为了方便说明我对字符做了强变形处理所以数字4看起来是波形的其实不用对数字4做这么夸张的扭曲只要轻微的变形就好我做成这样是为了让大家看的更清楚。实际操作的时候我们通常对字符做更轻微的变形处理。因为这几个4看起来有点扭曲。所以数据扩增可作为正则化方法使用实际功能上也与正则化相似。
**二.early stopping**
还有另外一种常用的方法叫作early stopping运行梯度下降时我们可以绘制训练误差或只绘制代价函数J的优化过程在训练集上用0-1记录分类误差次数。呈单调下降趋势如图。
因为在训练过程中我们希望训练误差代价函数J都在下降通过early stopping我们不但可以绘制上面这些内容还可以绘制验证集误差它可以是验证集上的分类误差或验证集上的代价函数逻辑损失和对数损失等你会发现验证集误差通常会先呈下降趋势然后在某个节点处开始上升early stopping的作用是你会说神经网络已经在这个迭代过程中表现得很好了我们在此停止训练吧得到验证集误差它是怎么发挥作用的
在机器学习中,超级参数激增,选出可行的算法也变得越来越复杂。我发现,如果我们用一组工具优化代价函数,机器学习就会变得更简单,在重点优化代价函数时,你只需要留意和,的值越小越好,你只需要想办法减小这个值,其它的不用关注。然后,预防过拟合还有其他任务,换句话说就是减少方差,这一步我们用另外一套工具来实现,这个原理有时被称为“正交化”。思路就是在一个时间做一个任务,后面课上我会具体介绍正交化,如果你还不了解这个概念,不用担心。
但对我来说early stopping的主要缺点就是你不能独立地处理这两个问题因为提早停止梯度下降也就是停止了优化代价函数因为现在你不再尝试降低代价函数J所以代价函数的值可能不够小同时你又希望不出现过拟合你没有采取不同的方式来解决这两个问题而是用一种方法同时解决两个问题这样做的结果是我要考虑的东西变得更复杂。
如果不用early stopping另一种方法就是正则化训练神经网络的时间就可能很长。我发现这导致超级参数搜索空间更容易分解也更容易搜索但是缺点在于你必须尝试很多正则化参数的值这也导致搜索大量值的计算代价太高。
Early stopping的优点是只运行一次梯度下降你可以找出的较小值中间值和较大值而无需尝试正则化超级参数的很多值。
如果你还不能完全理解这个概念,没关系,下节课我们会详细讲解正交化,这样会更好理解。
虽然正则化有缺点可还是有很多人愿意用它。吴恩达老师个人更倾向于使用正则化尝试许多不同的值假设你可以负担大量计算的代价。而使用early stopping也能得到相似结果还不用尝试这么多值。
这节课我们讲了如何使用数据扩增以及如何使用early stopping降低神经网络中的方差或预防过拟合。

View File

@ -0,0 +1,17 @@
# 第十四章 超参数调整
## 14.1 调试处理
关于训练深度最难的事情之一是你要处理的参数的数量从学习速率到Momentum动量梯度下降法的参数。如果使用Momentum或Adam优化算法的参数也许你还得选择层数也许你还得选择不同层中隐藏单元的数量也许你还想使用学习率衰减。所以你使用的不是单一的学习率。接着当然你可能还需要选择mini-batch的大小。
结果证实一些超参数比其它的更为重要,我认为,最为广泛的学习应用是,学习速率是需要调试的最重要的超参数。
除了还有一些参数需要调试例如Momentum参数0.9就是个很好的默认值。我还会调试mini-batch的大小以确保最优算法运行有效。我还会经常调试隐藏单元我用橙色圈住的这些这三个是我觉得其次比较重要的相对于而言。重要性排第三位的是其他因素层数有时会产生很大的影响学习率衰减也是如此。当应用Adam算法时事实上我从不调试我总是选定其分别为0.90.999和,如果你想的话也可以调试它们。
但希望你粗略了解到哪些超参数较为重要,无疑是最重要的,接下来是我用橙色圈住的那些,然后是我用紫色圈住的那些,但这不是严格且快速的标准,我认为,其它深度学习的研究者可能会很不同意我的观点或有着不同的直觉。
## 14.2 有哪些超参数
每个步骤中的超参数整理
## 14.3 如何选择调试值?
## 14.4 为超参数选择合适的范围
## 14.5 如何搜索超参数?
最后,关于如何搜索超参数的问题,我见过大概两种重要的思想流派或人们通常采用的两种重要但不同的方式。
一种是你照看一个模型通常是有庞大的数据组但没有许多计算资源或足够的CPU和GPU的前提下基本而言你只可以一次负担起试验一个模型或一小批模型在这种情况下即使当它在试验时你也可以逐渐改良。比如第0天你将随机参数初始化然后开始试验然后你逐渐观察自己的学习曲线也许是损失函数J或者数据设置误差或其它的东西在第1天内逐渐减少那这一天末的时候你可能会说它学习得真不错。我试着增加一点学习速率看看它会怎样也许结果证明它做得更好那是你第二天的表现。两天后你会说它依旧做得不错也许我现在可以填充下Momentum或减少变量。然后进入第三天每天你都会观察它不断调整你的参数。也许有一天你会发现你的学习率太大了所以你可能又回归之前的模型像这样但你可以说是在每天花时间照看此模型即使是它在许多天或许多星期的试验过程中。所以这是一个人们照料一个模型的方法观察它的表现耐心地调试学习率但那通常是因为你没有足够的计算能力不能在同一时间试验大量模型时才采取的办法。
另一种方法则是同时试验多种模型你设置了一些超参数尽管让它自己运行或者是一天甚至多天然后你会获得像这样的学习曲线这可以是损失函数J或实验误差或损失或数据误差的损失但都是你曲线轨迹的度量。同时你可以开始一个有着不同超参数设定的不同模型所以你的第二个模型会生成一个不同的学习曲线也许是像这样的一条紫色曲线我会说这条看起来更好些。与此同时你可以试验第三种模型其可能产生一条像这样的学习曲线红色曲线还有另一条绿色曲线也许这条有所偏离像这样等等。或者你可以同时平行试验许多不同的模型橙色的线就是不同的模型。用这种方式你可以试验许多不同的参数设定然后只是最后快速选择工作效果最好的那个。在这个例子中也许这条看起来是最好的下方绿色曲线
所以这两种方式的选择,是由你拥有的计算资源决定的,如果你拥有足够的计算机去平行试验许多模型,那绝对采用鱼子酱方式,尝试许多不同的超参数,看效果怎么样。但在一些应用领域,比如在线广告设置和计算机视觉应用领域,那里的数据太多了,你需要试验大量的模型,所以同时试验大量的模型是很困难的,它的确是依赖于应用的过程。但我看到那些应用熊猫方式多一些的组织,那里,你会像对婴儿一样照看一个模型,调试参数,试着让它工作运转。尽管,当然,甚至是在熊猫方式中,试验一个模型,观察它工作与否,也许第二或第三个星期后,也许我应该建立一个不同的模型(绿色曲线),像熊猫那样照料它,我猜,这样一生中可以培育几个孩子,即使它们一次只有一个孩子或孩子的数量很少。

BIN
img/ch15/ch15_1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

BIN
img/ch15/ch15_2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB