姓名:吴丞楚
学号:20012100032
学院:竹园三号书院
【嵌牛导读】对梯度下降法的具体应用
【嵌牛鼻子】深度学习 神经网络 梯度下降
【嵌牛提问】如何将梯度下降算法应用到神经网络
说了这么多,你可能会以为接下来我将介绍牛顿定理,摩擦力和重力对球体的影响。事实上,我们只是做了一个假设,并不是真的要用这个球的运动来寻找最小值。提到球只是用来激发我们的想象力,而不是束缚我们的思维。因此与其陷进物理学⾥凌乱的细节,不如我们就这样问⾃⼰:如果我们扮演⼀天的上帝,能够 构造⾃⼰的物理定律,能够⽀配球体可以如何滚动,那么我们将会采取什么样的运动学定律来 让球体能够总是滚落到⾕底呢?
为了使这个问题更明确,让我们讨论当我们将球在v1方向上移动Δv1,在v2方向上移动Δv2。微积分告诉我们C的改变量为:
我们需要找到一种方法,找到一个Δv2和Δv2,使得ΔC为负值,即球总是在往低处移动。因此,我们需要定义Δv为v的变化向量,Δv=(Δv1,Δv2)T。我们还需要定义C的梯度为偏导数的向量:(∂C∂v1,∂C∂v2)T。我们用∇C表示梯度向量:
后面我们将会用∇C和Δv来重写ΔC,在此之前,我想先解释一下令人困惑的梯度这个概念。当我们第一眼看到∇C的时候,可能会尝试想去理解这个符号的意义。那它究竟是什么意思?事实上,你可以把它简单的当作是上述梯度向量的一个记号。也有很多其它的数学上不同视⻆对于∇的专业解释(⽐如,作为⼀个微分操作),但我们不需要这些观点。
有了这些定义,(7)式中的ΔC可以被重新写作:
这个等式帮助我们理解为什么∇C被称为梯度向量:∇C,∇C把v的变化关联到C的变化,就像我们期望的用梯度来表示。但是,这个等式真的让我们激动的是因为,它可以让我们知道如何选择Δv来使得ΔC为负值。特别的,假设我们选择:
其中η是一个很小的,正的参数(被称为学习速率)。然后等式(9)就变为ΔC≈−ηΔC⋅ΔC=−η‖∇C‖2。因为‖∇C‖≥0,这使得ΔC≤0,也就是说C将总是减小。(当然要在方程9的近似约束下)。这个属性正是我们期望的!因此,我们使用方程(10)来定义球在梯度下降算法中的下降”定律”。也即是我们使用方程(10)来计算Δv的值,然后根据下面的值来移动球的位置v:
然后我们再一次使用这个更新规则,就可以计算它下一次下降的位置。如果我们一直这样做,C将一直减小知道我们希望它到达全局最小值。
总结一下,我们使用的梯度下降算法的工作就是重复计算梯度∇C,然后沿着相反方向移动,滚下山谷。我们可以可视化这一过程:
注意到梯度下降规则并不满足真实的物理规则。在真实世界中,球有动量,动量可能允许它偏移斜坡,甚至向上滚。只有在摩擦力的影响下它才可能滚到山谷。相比之下,我们选择Δv规则就像在说”只能往下滚!”,这是一个好的方法去寻找最小值。
为了使梯度下降正确地工作,我们需要选择一个足够小的学习速率η,使得等式(9)可以很好的近似。如果不这样,我们可能将会以ΔC>0结束,这显然是不好的。同样,我们又不希望η太小,这样会使的Δv变化太小,梯度下降算法就会下降得特别慢。在实际实现中,η通常是变化的,这使得等式(9)能够保持很好的近似度,同时算法又不会太慢。稍后我们将看到它如何工作。
我已经解释过当C只有两个变量时的梯度下降算法了。但是,事实上,即使C有许多变量,也是这么一回事。假设C是一个有m个变量的函数v1,v2...,vm,然后当Δv=(Δv1,...,Δvm)TC时C的变化量ΔC为:
其中梯度∇C为向量:
和前面的两个变量时的情况一样,我们可以选择:
将是我们可以在C为多个变量时,通过重复下面这一个更新规则,来找到我们的全局最小值:
你可以认为这个更新规则就是我们的梯度下降算法。它提供了重复改变位置v来使得函数C取最小值的方法。这个规则并不总是有效的,它有时候也会出错并使得我们无法通过梯度下降来寻找C的最小值,后面我们将讨论这个问题。但是,实际使用中,梯度下降往往工作的很好,并且发现它是在神经网络中寻找代价函数最小值的好方法,对网络的学习很有用。
的确,在这种情况下,梯度下降是寻找最小值的最优策略。假设我们尝试移动Δv,最大程度的减小C.这等价于最小化ΔC≈∇C⋅Δv。我们限制步长为一个很小的固定值:‖Δv‖=ϵ,ϵ>0。换句话说,我们想在步长固定时,找到使得C下降得最快的方向。可以证明,使得∇C⋅Δv最小化的Δv是Δv=−η∇C,其中η=ϵ/‖∇C‖,它是由步长限制‖ΔC‖=ϵ所决定的。因此,梯度下降可以看作一种使得C下降最快的方向上做微小移动的方法。
人们已经研究了梯度下降的许多变化形式,包括一些更接近真实的球的物理运动的形式。这种模拟球的形式有许多优点,但是也有一个重大的缺点:它最终必须计算C的二偏导,这将花费巨大的代价。为了理解为什么这么做代价很高,假设我们需要计算所有的二阶偏导∂2C/∂vj∂vk。如果我们有百万个变量vj,那么我们需要计算数万亿级别(百万的平方)的二阶偏导。那将会花费巨大。说了这么多,有一些技巧可以避免这些问题,寻找梯度下降算法的代替发也是一个很活跃的研究领域。但这本书我们将使用梯度下降法(和变种)来作为我们神经网络学习的主要方法。
我们如何将梯度下降算法应用到一个神经网络?其思想是,使用梯度下降算法找到权重wk和偏差bl,使得代价公式(6)的值最小。为了了解这是如何实现的,让我们重申一下梯度下降算法的更新规则,用权重和偏差代替变量vj。换句话说,我们的”位置“现在由wk和bl组成,梯度向量对应的元素变为∂C/∂wk和∂C/∂bl。以向量中元素的形式写出梯度下降的更新规则,我们有:
通过迭代使用这个更新规则,我们可以“滚下山谷”,找到期望的最小的代价函数。换句话说,这个规则可以用来学习神经网络。
在应用梯度下降时有许多挑战,我们将在后面的深入探讨这个问题。现在,我仅仅关注一个问题,在提出问题之前,我们先回顾一下公式(6)中的二次代价函数。这个代价函数有着C=1n∑xCx的形式,也就是它是遍及每个训练样本代价Cx=‖y(x)−a‖22的均值。在实际中,为了计算梯度∇C,我们需要单独计算每一个输入样本x的梯度∇Cx,然后再求平均∇C=1n∑x∇Cx。不幸的是,当训练样本过大时,这会使得训练花费的时间很长。
有一种叫做随机梯度下降的方法可以用来加速学习。这个思想就是通过随机选取小的训练样本来计算∇Cx来近似估计∇C。通过平均这一个小的样本就可以快速的估计出梯度∇C,这有助于帮助我们加速梯度下降,进而更快的学习。更精确地说,随机梯度下降是通过随机选取一个小数量地训练样本m作为输入。 我们将这些随机的输入样本记为X1,X2,...,Xm,并把它们称为一个小批量数据。假设提供的样本容量m是足够使得∇Cxj与计算所有得样本∇Cx的值约等,即
其中第二个求和公式是对所有的训练样本而言。通过上式我们得到:
也就是我们可以通过计算样本大小为m<全部样本的小批量数据的梯度,来估计整体的梯度。为了明确地将其和神经网络联系起来,假设wk和bl分别为神经网络的权值和偏差。然后随机梯度下降通过随机选取一个训练样本作为输入,然后通过下式训练:
其中两个求和符号是在随机选取的小批量的训练样本上进行的。然后我们使用另一组随机的训练样本去训练,以此类推,直到我们用完了所有的训练输入,这样被称为一个训练迭代期。然后我们会开始一个新的训练迭代期。
另外,对于改变代价函数⼤⼩的参数,和⽤于计算权重和偏置的⼩批量数据的更新规则,会有不同的约定。在等式(6)中,我们通过因子1n来改变整个代价函数的大小,人们有时候忽略1n,对单个训练样本的代价求和而不是平均。这对我们提前不知道训练样本总数的时候特别有效,比如学习数据是实时产生的。同样,在式子(20)(21)中的1m也可以舍去。但是需要注意的是,这样会导致学习速率的改变,对不同工作进行对比时,需要注意是求平均还是求和。