神经网络学习引入-反向传播

反向传播技术是神经网络的核心技术之一。

如果一个运算我们能够使用计算图表式出来,那么我们就能够利用反向传播的方法,即从后往前递归地调用链式法则来计算梯度。

一个简单的函数 f ( x , y , z ) = ( x + y ) z f(x,y,z)=(x+y)*z 的计算图如下所示。
在这里插入图片描述
假设输入为:x=-2, y=5, z=-4, 则输出f(x,y,z)=-12(图中绿色数字标出),令中间变量q=x+y,则q=3。

由x,y先计算出q,再由q,z计算得到f(x,y,z)这样从输入开始逐步计算最终得到输出的传播方式就叫做前向传播。

现在的问题是我们希望分别知道x,y,z的偏导数。(当然这个函数很简单,使用高等数学的方法直接求导也并不难,此处只是作为一个例子,因为在深层神经网络中,计算图会变得更为复杂,这也就是为什么我们要使用反向传播的方法来求出梯度)

根据链式法则: f x = f q q x \frac{\partial f}{\partial x}=\frac{\partial f}{\partial q}*\frac{\partial q}{\partial x}

反向传播:
利用链式法则,我们可以把结果传递给前面直接相连的节点,逐步得到原始输入对应的梯度。

主要工作:在每一个节点上计算我们所需的本地梯度,然后跟踪这个梯度。在反向传播过程中,我们接收从上游传回来的这个梯度值,直接用这个值乘以本地梯度,然后得到我们想要传回连接点的值。在下一节点进行反向传播时,我们不考虑除了直接相连的节点之外的任何东西。

回到例子中进行解释,计算的梯度在图中使用红色字标出。输出f的梯度显然为1,q和z分别都接收到来自f节点的回传梯度1。
由f=qz,可以得到 f q = z \frac{\partial f}{\partial q}=z ,故节点q的本地梯度为1*-4 = -4
同理,节点z的本地梯度为13 = 3
对于x + y = q, q x = 1 \frac{\partial q}{\partial x}=1 ,故x的本地梯度为1
-4(-4是q回传的梯度)=-4
同理y节点的本地梯度也为-4

这样就计算得到了 f x = 4 \frac{\partial f}{\partial x}=-4 , f y = 4 \frac{\partial f}{\partial y}=-4 , f z = 3 \frac{\partial f}{\partial z}=3

顺便:常见求导
在这里插入图片描述

扫描二维码关注公众号,回复: 5069541 查看本文章

再看一个复杂一点的例子: f ( w , x ) = 1 1 + e ( w 0 x 0 + w 1 x 1 + w 2 ) f(w,x)=\frac{1}{1+e^{-(w_{0}x_{0}+w_{1}x_{1}+w_{2})}}

计算图如下所示
在这里插入图片描述
可以按照上述方法逐步计算,计算产生的数值图中均有标出,此处想说的是,我们可以把多个小的节点,作为一个大的节点看待,计算大的节点的本地梯度再回传给相连的节点。

比如经常使用到的sigmoid函数: f ( x ) = 1 1 + e x f(x)=\frac{1}{1+e^{-x}}
该例子其实就是一个sigmoid函数的一种形式,sigmoid函数的导数其实是高数考试一个常考的点,我们知道:

那么如果我们将后面的和sigmoid函数有关的节点看作一个大的节点:
在这里插入图片描述
根据公式,我们可以知道整个sigmoid节点的本地梯度应该是

( 1 0.73 ) ( 0.73 ) 1 ( 1 = 0.1971 (1-0.73)*(0.73)*1(此处的1是输出回传的梯度)=0.1971

由于计算过程我们选择只保留小数点后两位,所以整个sigmoid节点的本地梯度为0.2,与我们图中逐步计算得到的结果相同,这是一种整体的思想。

一些特别的门的梯度求解:比如max函数求取输入参数中的最大值,那么这类计算的梯度又该如何计算?
答案是我们需要具体问题具体分析,比如max(x,y),当输入x=0,y=4时,max(0,4)=4。则x的导数就是0,y的导数则为1。

多元链式法则:当一个节点连接到多个节点时,将回流回来的各个参数相加。

多位参数的梯度计算:如果输入和输出分别是向量而不是数,则梯度应该是一个雅可比矩阵,其中矩阵的每一行中的每一个元素对应输出向量每一元素对输入向量的每一元素分别求偏导的结果。

但是实际应用中为了加快处理,我们常会使用批处理的方法,比如一次处理128个向量,假设输入和输出都是含有4096个元素的向量,那么对单一向量,产生的梯度雅可比矩阵的大小是[40964096],在批处理中,我们则需要为其准备[4096128,4096*128]大小的梯度矩阵。进行这个规模的矩阵运算显然不是很现实,正如上述定义所说,雅可比矩阵的每一个元素是输出向量每一元素对输入向量的每一元素分别求偏导的结果,于是正确的做法应该是单独求出每一个元素的值再将其填入矩阵回流到上一节点。

显然,我们可以感觉到,前向传播和反向传播的计算就像是封装两个API,coding时我们也是这么做的,前向传播计算的返回结果是损失值(loss),反向传播返回结果是梯度(gradient)。

猜你喜欢

转载自blog.csdn.net/AG9GgG/article/details/84791108
今日推荐