梯度降低是优化中经常使用的一种寻优策略,很天然的被引入NN中。本文只对NN中的梯度降低进行介绍。梯度降低算法的核心就是不断计算当前损失函数的梯度,在NN中为了更好的计算梯度,引出了后向传播算法,其实就是为了计算梯度而已。html
Ok,假设咱们已经有了一个比较复杂的网络,其中参数theta是咱们想要求出来的值。git
寻找最好的函数 ,就是为神经网络选取一组最好的系数theta使得损失函数最小。但,显然咱们不能经过遍历的方式进行寻找系数。例如含有1000个neuron的两层神经网络结构中,第一层的输出为1000个值,对应第二层的每一个neuron就有1000个weights,因此须要的参数就是1000*1000+1000(偏置)。github
梯度降低算法是最优化求解中经常使用的经典算法,把损失函数做为所求参数的函数。而后经过利用函数的梯度和学习步长,不断迭代寻找最优参数,优势是适用面广,速度快,缺点是只能得到局部最优
例如,损失函数为L,参数集合为theta,是关于omega的函数。算法
每次沿着负梯度方向移动:网络
经过不断迭代,最终获得一个局部最优解。下面为一个例子:机器学习
总结: 函数
梯度降低十分经典,相关资料不少,这里不进行复述。这里主要讲讲梯度降低训练神经网络和神经网络中前向,后向传播算法的关系。post
首先,整个函数的损失函数为L,对损失函数进行求导,获得theta的初始导数,而后根据学习步长与导数不断更新。学习
为了更新,咱们须要求得损失函数的导数,须要用到链式法则,具体以下:优化
损失函数是全部损失的累加。可是损失函数对系数omega的导数不能直接求出,须要传递:
例如,求上图中红色三角区域内参数(w1和w2),经过链式法则咱们能够获得该梯度由两部分组成,具体以下:
全部参数 的导数(z对w的导数),这部分由前向传播 决定;激活函数输入 的梯度(c对z的导数),这部分由后向传播 决定,因此须要配合使用。其中还有其余层的梯度信息,暂时用问号代替。
惊喜的发现,全部参数的梯度 居然就是与权值相连的输入值 。问号 是指网络中全部与权值相连的如输入值,Amazing!
因此,咱们获得了所有参数的导数以后,就开始计算激活函数输入的导数:
计算包含两部分,一个是激活函数自己的导数,对于一个固定结构的神经网络,sigma(z)的导数是小于0的,很是小,这点致使了梯度消散的问题。
而损失函数L对a的导数则能够经过链式法则获得。其中W是已知的,只须要计算C与Z'和Z''的导数。
进一步概括以下:
首先sigma(z)的导数是常数,只须要计算C与Z'和Z''的导数.
记住C对z的导数结构,递归执行这个结构获得全部的结果,例如C对z' 的导数仍然是这个结构。
记住C对z的导数结构,递归执行这个结构获得全部的结果,例如C对z'的导数仍然是这个结构。
如何计算C与Z'和Z''的梯度?第一种状况 ,该计算发生在输出层 ,十分好计算。
如何计算C与Z'和Z''的梯度? 第二种状况 ,该计算发生在非 输出层。
进行递归形式的计算便可,直至递归至输出层.
例以下图中z'的导数,就是由后面两条红色线的路径结果获得。其格式与下列公式相同:
计算损失函数C与全部激活函数输入Z 的导数。递归地从输出层开始计算
最后将两部分结合到一块儿,获得损失函数与W的梯度。
这里面会出现一个问题:在隐层中a是0到1的数,C对z的导数中,导函数的值是0到0.2的值,不断的连乘,获得的结果就是梯度过小,出现梯度消失的问题。
总结:
其实,网络中就有两个函数:
和激活函数:
因此,在求导的时候,要先对z求导,而后对w求导。这中间用到了链式法则。
为了求得神经网络的最优系数,咱们须要使用梯度降低算法。而梯度降低算法中的梯度须要经过前向传播算法 和后向传播算法 共同计算。神奇的是梯度须要计算的值很是少(大多数已知),因此速度很是快。
看到一个比较直观的后向传播介绍:
做者:胡逸夫
连接:https://www.zhihu.com/question/27239198/answer/89853077
来源:知乎
著做权归做者全部。商业转载请联系做者得到受权,非商业转载请注明出处。
BackPropagation算法是多层神经网络的训练中举足轻重的算法。
简单的理解,它的确就是复合函数的链式法则,但其在实际运算中的意义比链式法则要大的多。
要回答题主这个问题“如何直观的解释back propagation算法?” 须要先直观理解多层神经网络的训练。
机器学习能够看作是数理统计的一个应用,在数理统计中一个常见的任务就是拟合,也就是给定一些样本点,用合适的曲线揭示这些样本点随着自变量的变化关系。
深度学习一样也是为了这个目的,只不过此时,样本点再也不限定为(x, y)点对,而能够是由向量、矩阵等等组成的广义点对(X,Y)。而此时,(X,Y)之间的关系也变得十分复杂,不太可能用一个简单函数表示。然而,人们发现能够用多层神经网络来表示这样的关系,而多层神经网络的本质就是一个多层复合的函数。借用网上找到的一幅图[1],来直观描绘一下这种复合关系。
其对应的表达式以下:
<img src="https://pic4.zhimg.com/e62889afe359c859e9a6a1ad2a432ebb_b.png" data-rawwidth="474" data-rawheight="128" class="origin_image zh-lightbox-thumb" width="474" data-original="https://pic4.zhimg.com/e62889afe359c859e9a6a1ad2a432ebb_r.png">上面式中的Wij就是相邻两层神经元之间的权值,它们就是深度学习须要学习的参数,也就至关于直线拟合y=k*x+b中的待求参数k和b。
上面式的Wij就是相邻两层神经元之间的权值,它们就是深度学习须要学习的参数,也就至关于直线拟合y=k*x+b中的待求参数k和b。
和直线拟合同样,深度学习的训练也有一个目标函数,这个目标函数定义了什么样的参数才算一组“好参数”,不过在机器学习中,通常是采用成本函数(cost function),而后,训练目标就是经过调整每个权值Wij来使得cost达到最小。cost函数也能够当作是由全部待求权值Wij为自变量的复合函数,并且基本上是非凸的,即含有许多局部最小值。但实际中发现,采用咱们经常使用的梯度降低法就能够有效的求解最小化cost函数的问题。
梯度降低法须要给定一个初始点,并求出该点的梯度向量,而后以负梯度方向为搜索方向,以必定的步长进行搜索,从而肯定下一个迭代点,再计算该新的梯度方向,如此重复直到cost收敛。那么如何计算梯度呢?
假设咱们把cost函数表示为
, 那么它的梯度向量[2]就等于
, 其中
表示正交单位向量。为此,咱们需求出cost函数H对每个权值Wij的偏导数。而
BP算法正是用来求解这种多层复合函数的全部变量的偏导数的利器 。
咱们以求e=(a+b)*(b+1)的偏导[3]为例。
它的复合关系画出图能够表示以下:
在图中引入了中间变量c,d。
为了求出a=2, b=1时,e的梯度,咱们能够先利用偏导数的定义求出不一样层之间相邻节点的偏导关系,以下图所示:
利用链式法则咱们知道:
以及
。
链式法则在上图中的意义是什么呢?其实不难发现,
的值等于从a到e的路径上的偏导值的乘积,而
的值等于从b到e的路径1(b-c-e)上的偏导值的乘积加上路径2(b-d-e)上的偏导值的乘积。也就是说,对于上层节点p和下层节点q,要求得
,须要找到从q节点到p节点的全部路径,而且对每条路径,求得该路径上的全部偏导数之乘积,而后将全部路径的 “乘积” 累加起来才能获得
的值。
你们也许已经注意到,这样作是十分冗余的,由于不少
路径被重复访问了 。好比上图中,a-c-e和b-c-e就都走了路径c-e。对于权值动则数万的深度模型中的神经网络,这样的冗余所致使的计算量是至关大的。
一样是利用链式法则,BP算法则机智地避开了这种冗余,它对于每个路径只访问一次就能求顶点对全部下层节点的偏导值。
正如反向传播(BP)算法的名字说的那样,BP算法是反向(自上往下)来寻找路径的。
从最上层的节点e开始,初始值为1,以层为单位进行处理。对于e的下一层的全部子节点,将1乘以e到某个节点路径上的偏导值,并将结果“堆放”在该子节点中。等e所在的层按照这样传播完毕后,第二层的每个节点都“堆放"些值,而后咱们针对每一个节点,把它里面全部“堆放”的值求和,就获得了顶点e对该节点的偏导。而后将这些第二层的节点各自做为起始顶点,初始值设为顶点e对它们的偏导值,以"层"为单位重复上述传播过程,便可求出顶点e对每一层节点的偏导数。
以上图为例,节点c接受e发送的1*2并堆放起来,节点d接受e发送的1*3并堆放起来,至此第二层完毕,求出各节点总堆放量并继续向下一层发送。节点c向a发送2*1并对堆放起来,节点c向b发送2*1并堆放起来,节点d向b发送3*1并堆放起来,至此第三层完毕,节点a堆放起来的量为2,节点b堆放起来的量为2*1+3*1=5, 即顶点e对b的偏导数为5.
举个不太恰当的例子,若是把上图中的箭头表示欠钱的关系,即c→e表示e欠c的钱。以a, b为例,直接计算e对它们俩的偏导至关于a, b各自去讨薪。a向c讨薪,c说e欠我钱,你向他要。因而a又跨过c去找e。b先向c讨薪,一样又转向e,b又向d讨薪,再次转向e。能够看到,追款之路,充满艰辛,并且还有重复,即a, b 都从c转向e。
而BP算法就是主动还款。e把所欠之钱还给c,d。c,d收到钱,乐呵地把钱转发给了a,b,皆大欢喜。
------------------------------------------------------------------
【参考文献】
[1]
技术向:一文读懂卷积神经网络CNN
[2]
Gradient
[3]
http://colah.github.io/posts/2015-08-Backprop/
其余推荐网页:
1.
tensorflow.org 的页面
2.
Neural networks and deep learning