上节课2-1 Coursera吴恩达《改善深度神经网络》 第一周课程笔记-深度学习的实践方面我们主要介绍了如何建立一个实用的深度学习神经网络。包括Train/Dev/Test sets的比例选择,Bias和Variance的概念和区别:high bias对应欠拟合,high variance对应过拟合。接着,我们介绍了防止过拟合的两种方法:正则化(如L2 regularization)和Dropout。然后,介绍了如何进行标准化输入,以加快梯度下降速度和精度。然后,我们介绍了梯度消失和梯度爆炸的概念和危害,并提出了如何使用梯度初始化来降低这种风险。最后,我们介绍了梯度检验,来验证梯度下降算法是否正确。本节课,我们将继续讨论深度神经网络中的一些优化算法,通过使用这些技巧和方法来提高神经网络的训练速度和精度。
目录
《2.1Mini-batch梯度下降法》Mini-batch gradient descent
《2.2理解Mini-batch梯度下降法》Understanding mini-batch gradient descent
《2.3指数加权平均》Exponentially weighted averages
《2.4理解指数加权平均》Understanding exponetially weighted averages
《2.5指数加权平均的偏差修正》Bias correction in exponentially weighted average
《2.6动量梯度下降法》Gradient descent with momentum
《2.8Adam优化算法》Adam optimization algorithm
《2.10局部最优问题》The problem of local optima
《2.1Mini-batch梯度下降法》Mini-batch gradient descent
本周将学习优化算法,这能让你的神经网络运行得更快。机器学习(machine learning)的应用是一个高度依赖经验的过程,伴随着大量迭代的过程,你需要训练诸多模型,才能找到合适的那一个,所以,优化算法能够帮助你快速训练模型。
其中一个难点在于,深度学习(deep learning)没有在大数据领域发挥最大的效果,我们可以利用一个巨大的数据集来训练神经网络,而在巨大的数据集基础上进行训练速度很慢。因此,你会发现,使用快速的优化算法,使用好用的优化算法能够大大提高你和团队的效率,那么,我们首先来谈谈mini-batch梯度下降法(Mini-batch Gradient Descent,MBGD)。如下图:
向量化能够让你有效地对所有m个样本进行计算,允许你处理整个训练集,而无需某个明确的公式。把训练样本放到矩阵X中,有
同样,y也是这样,放到矩阵Y中:
所以X的维度是(n_x,m),Y的维度是(1,m),向量化可以相对较快地处理所有m个样本,但是如果m很大时(500万或者5000万或者更大),处理速度仍然缓慢。在对整个训练集执行梯度下降法时,你必须处理整个训练集,然后才能进行一步梯度下降法,然后你需要再重新处理500万个训练样本,才能进行下一步梯度下降法。所以如果你在处理完整个500万个样本的训练集之前,先让梯度下降法处理一部分,你的算法速度会更快。你可以把训练集分割为小一点的子集训练,这些子集被取名为mini-batch。如果你的总训练样本个数m=5000000,维度是(n_x,m),假设每一个子集中只有1000个样本,把其中的x^(1)到x^(1000)到取出来,将其称为第一个子训练集,也叫做mini-batch,然后你再取出接下来的1000个样本,从x^(1001)到x^(2000),然后再取1000个样本,以此类推。我们将每一个mini-batch记为X^{t},维度是(n_x,1000),对应每个mini-batch的输出记为Y^{t},维度是(1,1000),此时t=1,2,...,5000。
先确定一下符号,之前我们使用了上角小括号(i)表示训练集里的值,所以x^(i)是第个训练样本。我们用了上角中括号[l]来表示神经网络的层数,z^[l]表示神经网络中第l层的z值,我们现在引入了大括号{t}来代表不同的mini-batch,所以我们有X^{t}和Y^{t},检查一下自己是否理解无误。
解释一下这个算法的名称,batch梯度下降法(Batch Gradient Descent,BGD)指的是我们之前讲过的梯度下降法算法,就是同时处理整个训练集,这个名字就是来源于能够同时看到整个batch训练集的样本被处理。
那么究竟mini-batch梯度下降法的原理是什么?看下面一张幻灯片:
在训练集上运行mini-batch梯度下降法,你运行for t=1……5000,因为我们有5000个各有1000个样本的组,在for循环里你要做得基本就是对X^{t}和Y^{t}执行一步梯度下降法。首先输入是X^{t},执行正向传播:
然后执行:
大写Z因为这是一个向量内涵,以此类推,直到
这就是你的预测值。注意这里你需要用到一个向量化的执行命令,这个向量化的执行命令,一次性处理1000个而不是500万个样本。接下来你要计算损失成本函数J,因为子集规模是1000,所以:
如果你用到了正则化,你也可以使用正则化的术语(因为这是一个mini-batch的损失,J加入上角标t):
你会注意到这跟之前执行梯度下降法如出一辙,之前的对象是X和Y,现在是X^{t}和Y^{t}。
接下来,执行反向传播来计算J^{t}的梯度,然后更新权重:
这是使用mini-batch梯度下降法训练样本的一步,代码中被称为进行“一代”(1 epoch)的训练。一代这个词意味着只是一次遍历了训练集。
使用batch梯度下降法,一次遍历训练集只能让你做一个梯度下降,使用mini-batch梯度下降法,一次遍历训练集,能让你做5000个梯度下降。当然正常来说你想要多次遍历训练集,还需要为另一个while循环设置另一个for循环。所以你可以一直处理遍历训练集,直到最后你能收敛到一个合适的精度。
如果你有一个丢失的训练集,mini-batch梯度下降法比batch梯度下降法运行地更快,所以几乎每个研习深度学习的人在训练巨大的数据集时都会用到,下一个视频中,我们将进一步深度讨论mini-batch梯度下降法,你也会因此更好地理解它的作用和原理。
《2.2理解Mini-batch梯度下降法》Understanding mini-batch gradient descent
上个视频知道如何利用mini-batch梯度下降法来开始处理训练集和开始梯度下降,即使你只处理了部分训练集,即使你是第一次处理,本视频中,我们将进一步学习如何执行梯度下降法,更好地理解其作用和原理。
如上图,使用batch梯度下降法时,每次迭代你都需要历遍整个训练集,可以预期每次迭代成本都会下降,所以如果成本函数J是迭代次数的一个函数,它应该会随着每次迭代而减少,如果J在某次迭代中增加了,那肯定出了问题,也许你的学习率太大 。使用mini-batch梯度下降法,如果你作出成本函数在整个过程中的图,则并不是每次迭代都是下降的,你很可能会看到这样的结果,走向朝下,但有更多的噪声。之所以出现细微振荡的原因是不同的mini-batch之间是有差异的。例如可能第一个子集是好的子集,而第二个子集包含了一些噪声,出现细微摆动是正常的。
你需要决定的变量之一是mini-batch的大小,m就是训练集的大小,极端情况下:如果为m,即为batch梯度下降法(BGD),只包含一个子集;如果为1,即为随机梯度下降法(SGD),每次只处理一个训练样本,每个样本就是一个子集,共有m个子集。
看在两种极端下成本函数的优化情况,如果这是你想要最小化的成本函数的轮廓,最小值在那里,batch梯度下降法从某处开始,相对噪声低些,幅度也大一些,你可以继续找最小值。(蓝色)
相反,在随机梯度下降法中,从某一点开始,我们重新选取一个起始点,每次迭代,你只对一个样本进行梯度下降,大部分时候你向着全局最小值靠近,有时候你会远离最小值,因为那个样本恰好给你指的方向不对,因此随机梯度下降法是有很多噪声的,平均来看,它最终会靠近最小值,不过有时候也会方向错误,因为随机梯度下降法永远不会收敛,而是会一直在最小值附近波动,但它并不会在达到最小值并停留在此。(紫色)
实际上你选择的mini-batch大小在二者之间,大小在1和m之间。batch梯度下降法的主要弊端在于特别是训练样本数量巨大时,单次迭代耗时太长,如果训练样本不大,该算法运行地很好。而使用随机梯度下降法,如果你只要处理一个样本,那这个方法没有问题,通过减小学习率,噪声会被改善或有所减小,但随机梯度下降法的一大缺点是,你会失去所有向量化带给你的加速,因为一次性只处理了一个训练样本,这样效率过于低下,所以实践中最好选择不大不小的mini-batch尺寸,实际上学习率达到最快。你会发现两个好处,①你得到了大量向量化,上个视频中我们用过的例子中,如果mini-batch大小为1000个样本,你就可以对1000个样本向量化,比你一次性处理多个样本快得多。②你不需要等待整个训练集被处理完就可以开始进行后续工作,再用一下上个视频的数字,每次训练集允许我们采取5000个梯度下降步骤,所以实际上一些位于中间的mini-batch大小效果最好。
用mini-batch梯度下降法,多次迭代,它不会总朝向最小值靠近,但它比随机梯度下降要更持续地靠近最小值的方向,它也不一定在很小的范围内收敛或者波动,如果出现这个问题,可以慢慢减少学习率(learning rate)。(绿色)
如果mini-batch大小既不是1也不是m,应该取中间值,那应该怎么选择呢?其实是有指导原则的。看下图:
首先,如果总体样本数量m不太大时,例如m<2000,建议直接使用Batch gradient descent。然后,如果总体样本数量m很大时,建议将样本分成许多mini-batches。推荐常用的mini-batch size为64,128,256,512。这些都是2的幂。之所以这样设置的原因是考虑到电脑内存设置和使用的方式,计算机存储数据一般是2的幂,这样设置可以提高运算速度。最后,注意确保X^{t}和Y^{t}符合CPU/GPU内存。事实上mini-batch大小是另一个重要的变量,你需要做一个快速尝试,才能找到能够最有效地减少成本函数的那个,Andrew一般会尝试几个不同的值,几个不同的2次方,然后看能否找到一个让梯度下降优化算法最高效的大小。希望这些能够指导你如何开始找到这一数值。
这个视频学会了如何执行mini-batch梯度下降,令算法运行得更快,特别是在训练样本数目较大的情况下。不过还有个更高效的算法,比梯度下降法和mini-batch梯度下降法都要高效的多,Andrew在接下来的视频中将为大家一一讲解。
《2.3指数加权平均》Exponentially weighted averages
在理解其他几个优化算法之前,你需要用到指数加权平均(exponentially weighted averages),在统计中也叫做指数加权移动平均(exponentially weighted moving averages),我们首先讲这个,然后再来讲更复杂的优化算法。
这是去年伦敦的每日温度,用数据作图,得到上面的散点图,起始日在1月份,结束日在12月末,这样的数据看起来有点杂乱,如果要计算趋势的话,即温度的局部平均值(移动平均值)。例如我们设V_0 = 0,当成第0天的气温值,每天需要使用0.9的加权前一天的数值,再加上当天温度的0.1倍(公式如上图)。现在将0.9记为β,0.1记为(1-β),则
可以看成v_t是1/(1-β)天的平均值。当β=0.9时,是这10天的平均值,就是上图的红线部分。当β=0.98时,是这50天的平均值,就是上图的绿线部分。
β值越大,你得到的曲线要平坦一些,原因在于你多平均了几天的温度,所以这个曲线,波动更小,更加平坦,缺点是曲线进一步右移,因为现在平均的温度值更多,要平均更多的值,指数加权平均公式在温度变化时,适应地更缓慢一些,所以会出现一定延迟。如果β=0.5,
则平均了2天的温度,得到黄线如下:
由于仅平均了两天的温度,平均的数据太少,所以得到的曲线有更多的噪声,有可能出现异常值(outliers),但是这个曲线能够更快适应温度变化。
所以指数加权平均数经常被使用,再说一次,它在统计学中被称为指数加权移动平均值,我们就简称为指数加权平均数。通过调整这个参数β,或者说后面的算法学习,你会发现这是一个很重要的参数,可以取得稍微不同的效果,往往中间有某个值效果最好,β为中间值时得到的红色曲线,比起绿线和黄线更好地平均了温度。
现在你知道计算指数加权平均数的基本原理,下一个视频中,我们再聊聊它的本质作用。
《2.4理解指数加权平均》Understanding exponetially weighted averages
上个视频中,我们讲到了指数加权平均数,这是几个优化算法中的关键一环,而这几个优化算法能帮助你训练神经网络。本视频中,我希望进一步探讨算法的本质作用。回忆一下这个计算指数加权平均数的关键方程:
我们进一步分析,来理解如何计算出每日温度的平均值。
当β=0.9时,t从0到1到2到3,t的值在不断增加,为了更好的分析,使t从大到小开始写:
将所有括号展开:
这是一个加和并平均,100号数据,就是当日温度。计算v_100是通过把两个函数(数日的温度离散点,指数衰减函数)对应的元素相乘,然后求和。所有的这些系数0.1+0.1*0.9+0.1*0.9*0.9*+0.1*0.9*0.9*0.9+...相加起来和为1或者逼近1,称之为偏差修正(bias correction),下个视频会涉及。因为有修正偏差,这才是指数加权平均数。
实际上,我们可以使用这样的语句来实现指数加权平均算法:
指数加权平均数公式的好处之一在于,它占用极少内存,电脑内存中只占用一行数字而已,然后把最新数据代入公式,不断覆盖就可以了,正因为这个原因,其效率,它基本上只占用一行代码,计算指数加权平均数也只占用单行数字的存储和内存,当然它并不是最好的,也不是最精准的计算平均数的方法。如果你要计算移动窗,你直接算出过去10天的总和,过去50天的总和,除以10和50就好,如此往往会得到更好的估测。但缺点是,如果保存所有最近的温度数据,和过去10天的总和,必须占用更多的内存,执行更加复杂,计算成本也更加高昂。
所以在接下来的视频中,我们会计算多个变量的平均值,从计算和内存效率来说,这是一个有效的方法,所以在机器学习中会经常使用,更不用说只要一行代码,这也是一个优势。
现在你学会了计算指数加权平均数,你还需要知道一个专业概念,叫做偏差修正(bias correction),下一个视频我们会讲到它,接着你就可以用它构建更好的优化算法,而不是简单直接的梯度下降法。
《2.5指数加权平均的偏差修正》Bias correction in exponentially weighted average
偏差修正(biascorrection)可以让平均数运算更加准确,来看看它是怎么运行的。
在之前的视频中,红色曲线对应β=0.9,绿色曲线对应β=0.98,如果你执行这里的公式,当β=0.98时,得到的不是绿色曲线,而是紫色曲线。可以注意到紫色曲线的起点较低,我们来看看怎么处理。因为v_0=0,实际上计算的v_1值会小很多,所以第一天温度的估测不准。同样的v_2也不能很好的估测前两天的温度。
有个方法修正这种问题,是进行偏移校正(bias correction)。在估测初期,不用v_t,而是用
其中,t是现在的天数。刚开始时t比较小,这样修正的就更大一些,紫色曲线上移;随着t增大,紫色曲线和绿色曲线基本重合。不过在开始学习阶段,你才开始预测热身练习,偏差修正可以帮助你更好预测温度,偏差修正可以帮助你使结果从紫线变成绿线。
在机器学习中,在计算指数加权平均数的大部分时候,大家不在乎执行偏差修正,因为大部分人宁愿熬过初始时期,拿到具有偏差的估测,然后继续计算下去。如果你关心初始时期的偏差,在刚开始计算指数加权移动平均数的时候,偏差修正能帮助你在早期获取更好的估测。
所以你学会了计算指数加权移动平均数,我们接着用它来构建更好的优化算法吧 !
《2.6动量梯度下降法》Gradient descent with momentum
有一种算法叫做Momentum,或者叫做动量梯度下降法,运行速度几乎总是快于标准的梯度下降算法,简而言之,基本的想法就是计算梯度的指数加权平均数,并利用该梯度更新权重,在本视频中,我们要一起拆解单句描述,看看到底如何计算。如果你要优化的成本函数,形状如下图,红色点代表最小值位置。
假设你从这里(蓝色点)开始梯度下降法(gradient descent),如果进行梯度下降法的一次迭代,无论是batch或mini-batch下降法,也许会指向这里,现在在椭圆的另一边,计算下一步梯度下降,结果或许如此,然后再计算一步,再一步,计算下去,你会发现梯度下降法要很多计算步骤对吧?慢慢摆动(oscillate)到最小值(minimum),这种上下波动减慢了梯度下降法(gradient descent)的速度,你就无法使用更大的学习率,如果你要用较大的学习率(紫色箭头),结果可能会偏离函数的范围,为了避免摆动过大,你要用一个较小的学习率。
另一个看待问题的角度是,在纵轴上,你希望学习慢一点,因为你不想要这些摆动,但是在横轴上,你希望加快学习,快速从左向右移,移向最小值,移向红点。所以使用动量梯度下降法,你需要做的是,在每次迭代中,确切来说在第t次迭代的过程中,你会计算微分dW和db,你要做的是计算公式:
然后重新赋值权重:
这样就可以减缓梯度下降的幅度。
例如,在上几个导数中,你会发现这些纵轴上的摆动平均值接近于零,所以在纵轴方向,你希望放慢一点,平均过程中,正负数相互抵消,所以平均值接近于零。但在横轴方向,所有的微分都指向横轴方向,因此横轴方向的平均值仍然较大,因此用算法几次迭代后,你发现动量梯度下降法,最终纵轴方向的摆动变小了,横轴方向运动更快,因此你的算法走了一条更加直接的路径,在抵达最小值的路上减少了摆动。(红线)
从动量的角度来看,以权重W为例,V_dW可以成速度V,dW可以看成是加速度a。指数加权平均实际上是计算当前的速度,当前速度由之前的速度和现在的加速度共同影响。而0<β<1,又能限制速度V_dW过大。即当前速度是渐变的,而不是瞬变的,是动量的过程。这保证了梯度下降的平稳性和准确性,减少振荡,较快地达到最小值处。
最后,看看算法应该如何实现:
现在有两个超参数,学习率α和参数β(控制指数加权平均数),常用0.9,之前是平均过去十天的温度,现在是平均10次迭代的梯度。一般效果不错,你也可以尝试不同的值,不过0.9是很棒的鲁棒数(robust value)。关于偏差修正,在实际操作中一般不用,因为10次迭代之后,因为你的移动平均已经过了初始阶段。实际中,在使用梯度下降法或动量梯度下降法时,人们不会受到偏差修正的困扰。
如果你查阅了动量梯度下降法相关资料,经常会看到(1-β)一个被删除了,最后得到:
这样的话,学习率也会相应变化。实际上,两者效果都不错,只是影响学习率α的最佳值。Andrew一般选择不删除的那个公式。
《2.7RMSprop》RMSprop
上个视频看到动量(Momentum)可以加快梯度下降,还有一个叫做RMSprop的算法,全称是root mean square prop算法,它也可以加速梯度下降,我们来看看它是如何运作的。假设纵轴代表参数b,横轴代表参数W,可能有W1,W2等重要的参数,为了便于理解,使用b和W。具体操作如下:
如果你想减缓b方向的学习(纵轴方向),同时加快,至少不减慢横轴方向的学习,RMSprop算法可以实现这一点。在t次迭代中,其权重W和常数项b的更新表达式为:(注意平方是针对整个符号而言的,dW的平方)
下面解释一下原理。我们希望在横轴(W方向)学习速度快,而在纵轴(b方向)减缓摆动,所以有了S_dW和S_db,所以我们W要除以一个较小的数(S_dW会相对较小),同理b要除以较大的数(S_db较大),这样就可以减缓纵轴上的变化。这些微分中,db较大,dW较小,也可观察函数的倾斜程度,纵轴要大于在横轴,公式处理的结果就是纵轴上的更新要被一个较大的数相除,就能消除摆动,而水平方向的更新则被较小的数相除。
RMSprop的影响就是你的更新最后会变成这样(绿色线),纵轴方向上摆动较小,而横轴方向继续推进。还有个影响就是,你可以用一个更大学习率,然后加快学习,而无须在纵轴上垂直方向偏离。
再说明一点,实际中dW和db是一个高维的参数向量,因为你对微分进行平方,然后使用平方根,这就是RMSprop,全称均方根(root mean square)。操作规程中,可以在S_dW和S_db的分母加上很小很小的值(10^-8),可以确保数值稳定。RMSprop跟Momentum有很相似的一点,可以消除梯度下降中的摆动,包括mini-batch梯度下降,并允许你使用一个更大的学习率,从而加快你的算法学习速度。
我们讲过了Momentum,我们讲了RMSprop,如果二者结合起来,你会得到一个更好的优化算法,在下个视频中我们再好好讲一讲为什么。
《2.8Adam优化算法》Adam optimization algorithm
在深度学习的研究中 ,RMSprop以及Adam优化算法(Adam优化算法也是本视频的内容),就是少有的经受住人们考验的两种算法,已被证明适用于不同的深度学习结构,这个算法值得推荐,因为很多人都试过,并且用它很好地解决了许多问题。Adam优化算法基本上就是将Momentum和RMSprop结合在一起,那么来看看如何使用Adam算法 。
使用Adam算法,①初始化(initialize):
在t次迭代中,需要计算微分,一般使用mini-batch梯度下降法。②计算Momentum指数加权平均数:
③使用RMSprop进行更新:
④使用Adam算法,一般要计算偏差修正:
⑤最后,更新权重:
所以Adam算法结合了Momentum和RMSprop梯度下降法,并且是一种极其常用的学习算法,被证明能有效适用于不同神经网络,适用于广泛的结构。
下面看看该算法中的超参数调试:
在使用Adam算法的时候,一般使用默认值(default value),β_1=0.9,β_2=0.999(Adam论文的作者,也就是Adam算法的发明者推荐),ε=10^-8(Adam论文的作者推荐)。然后尝试不同的学习率,看看哪个效果最好。但也可以调整β_1和β_2(但Andrew认识的业内人士很少这么做)。
这就是关于Adam优化算法的全部内容,有了它,你可以更加快速地训练神经网络,在结束本周课程之前,还要学习一下超参数调整,以及更好地理解神经网络的优化问题有哪些。下个视频中,将讲讲学习率衰减。
《2.9学习率衰减》Learning rate decay
加快学习算法的一个办法就是随时间慢慢减少学习率,我们将之称为学习率衰减(learning rate decay),我们来看看如何做到,首先通过一个例子看看,为什么要计算学习率衰减。
假设你使用mini-batch梯度下降法,mini-batch数量不大,64或者128个,在迭代过程中会有噪音(蓝色线),下降朝向这里的最小值,但是不会精确地收敛,所以算法最后在附近摆动,并不会真正收敛,因为α是固定值,不同的mini-batch中有噪音。但要慢慢减少学习率α的话,在初期的时候,α学习率还较大,学习还是相对较快,但随着α变小,步伐也会变慢变小,所以最后曲线(绿色线)会在最小值附近的一小块区域里摆动,而不是在训练过程中,大幅度在最小值附近摆动。所以慢慢减少α的本质在于,在学习初期,你能承受较大的步伐,但当开始收敛的时候,小一些的学习率能让你步伐小一些。
这样可以做到学习率衰减,记得一代要遍历一次数据,如果你有以下这样的训练集:
将学习率设为:
其中decayrate为衰减率,epoch-num为训练的代数,α_0为初始学习率。(注意衰减率是一个需要调整的超参数)这里假设衰减率=1:
除了这个公式,还有其他学习率衰减的公式:
具体公式:
其中,k为可调参数,t为mini-bach number。有时候也可以进行手动衰减。学习率衰减的确大有裨益,有时候可以加快训练,但不是Andrew尝试的要点。这就是学习率衰减,最后我还要讲讲神经网络中的局部最优(local optimal)以及鞍点(Saddle point),所以能更好理解在训练神经网络过程中,你的算法正在解决的优化问题,下个视频我们就好好聊聊这些问题。
《2.10局部最优问题》The problem of local optima
在深度学习研究早期,人们总是担心优化算法会困在极差的局部最优,不过随着深度学习理论不断发展,人们对局部最优的理解也发生了改变。现在展示一下现在我们怎么看待局部最优以及深度学习中的优化问题。
曾经人们在想到局部最优时脑海中出现的图(上图左),坐标轴为W1和W2,平面的高度是成本函数J。在图中似乎各处都分布着局部最优。梯度下降法或者某个算法可能困在一个局部最优(local optima)中,而不会抵达全局最优(global optima)。如果你要作图计算一个数字,比如说这两个维度,就容易出现有多个不同局部最优的图,而这些低维的图曾经影响了我们的理解,但是这些理解并不正确。事实上,如果你要创建一个神经网络,通常梯度为零的点并不是这个图中的局部最优点,实际上成本函数的零梯度点,通常是鞍点(saddle point)。在高维空间的函数,如果梯度为0,它可能是凸函数也可能是凹函数。设想在2万维的空间中,要得到局部最优,所有2万个方向都是凸函数,这发生的几率也许很小(2^-20000)。因此在高维空间,更可能碰到鞍点,而不是局部最优点,图像如上图右。
如果局部最优不是问题,那么问题是什么?结果是平稳段会减缓学习,平稳段是一块区域,其中导数长时间接近于0,如果你在此处,梯度会从曲面从从上向下下降,因为梯度等于或接近0,曲面很平坦,你得花上很长时间慢慢抵达平稳段的这个点,因为左边或右边的随机扰动,我们可以沿着这段长坡走,直到这里,然后走出平稳段(红色笔)。如下图所示:
所以此次视频的要点是,首先,你不太可能困在极差的局部最优中,条件是你在训练较大的神经网络,存在大量参数,并且成本函数J被定义在较高的维度空间。
第二点,平稳段是一个问题,这样使得学习十分缓慢,这也是像Momentum或是RMSprop,Adam这样的算法,能够加速学习算法的地方。在这些情况下,更成熟的优化算法,如Adam算法,能够加快速度,让你尽早往下走出平稳段。因为你的网络要解决优化问题,说实话,要面临如此之高的维度空间,没有人有那么好的直觉,知道这些空间长什么样,而且我们对它们的理解还在不断发展,不过Andrew希望这一点能够让你更好地理解优化算法所面临的问题。
Summary
我们主要介绍了深度神经网络的优化算法。包括对原始数据集进行分割,使用mini-batch 梯度下降算法,然后介绍了指数加权平均(Exponentially weighted averages)的概念以及偏移校正(bias correction)方法。接着,我们介绍了三种常用的加速神经网络学习速度的三种算法:动量梯度下降(Momentum)、RMSprop和Adam算法。其中,Adam结合了动量梯度下降和RMSprop各自的优点,实际应用中表现更好。然后,我们介绍了另外一种提高学习速度的方法:学习率衰减(learning rate decay),通过不断减小学习因子,减小步进长度,来减小梯度振荡。最后,我们对深度学习中局部最优(local optima)的概念作了更深入的解释。
说明:记录学习笔记,如果错误欢迎指正!转载请联系我。