一、计算图
计算图可以用于表示一个复杂的函数,它通过将复杂函数分解为简单的计算来得到最后的计算结果
下面用一个简单的例子来介绍计算图
为了方便表示,在此说明一下:
-
矩形节点:输入功能或者输出功能
-
圆形节点:接受一个数据的输入并按照节点运算规则计算,并将计算结果输出到下一个节点
函数: f ( x , y , z ) = ( x + y ) z f(x, y, z)=(x+y)z f(x,y,z)=(x+y)z 的计算图表示如下:
顺着计算图的箭头方向进行计算的过程被称为前向传播,在这个例子中,前向传播的最后结果是12
看到这里,你可能会奇怪,为什么一个简单函数需要分解为好几步计算,事实上,上面的节点可以反复使用,当函数稍微复杂时,采用公式直接计算就不如上面的简洁明了
更重要的是在神经网络的反向传播算法中,需要计算梯度,这涉及到了导数,一般的人计算稍微复杂的导数都要花上点时间,更不要说计算机了,通过计算图的形式计算梯度,计算机可以快速地得出结果
二、反向传播
1、基本概念
前向传播是通过神经网络不断计算,向前推进,最后在输出层得到计算结果,但是这个计算结果可能与标准结果存在一定的误差,为了衡量这个误差,引入了损失函数的概念,通过损失函数来定义误差的概念,为了减小这个误差,以表达到优化的目的,采用了反向传播算法(Backpropagation Algorithm)来优化每层网络的参数,利用梯度下降算法,可以得到损失函数在局部的最小值,如果这个损失函数是凸函数,那么这个局部最小值就是全局最小值
梯度下降算法迭代公式:
w = w − α ∂ J ( w , b ) ∂ w w=w-\alpha \frac {\partial J(w,b) }{\partial w} w=w−α∂w∂J(w,b)
这个公式的难点在于如何计算梯度,因为梯度计算涉及到了求偏导,对于复杂的神经网络来说,求导不是一件容易的事
接下来看一个例子,使用计算图来计算偏导数
注:例子中没有使用偏导符号,是因为在计算图里面,每个节点都是一些最简运算,都是一对一的,所以使用求导运算,为了方便好看,我就没有写偏导符号,直接写求导符号了,这对最后结果没有任何影响,只是表示符号不一样而已
2、例子
以Logistic回归中的预测函数为例:
输出: y ^ = σ ( z ) \hat y=\sigma (z) y^=σ(z)
其中: σ ( z ) = 1 1 + e − z , z = w T x + b \sigma (z)=\frac {1}{1+e^{-z}},z=w^Tx+b σ(z)=1+e−z1,z=wTx+b
为了方便观察,这里我们取:$w^T=[2.00,-3.00],\ x^T=[-1.00, -2.00],b=-3.00 $
画出计算图的正向传播过程,如下图所示:
对于反向传播,我们需要使用求导的链式法则: d y ^ d w 0 = d y ^ d z d z d w 0 \frac {d\hat y}{dw_0}=\frac {d