以下内容有任何不理解可以翻看我之前的博客哦:吴恩达deeplearning.ai专栏
文章目录
- 一个小型神经网络的例子
- 利用计算图逐步计算价值函数J
- 利用计算图求出价值函数的导数
计算图是深度学习中的一个关键概念,它也是Tensorflow等编程框架自动计算神经网络导数的方式。让我们举个例子。
一个小型神经网络的例子
这是一个很小型的神经网络,其中,激活值a满足:
a = w x + b a=wx+b a=wx+b
之后采用线性激活函数:
a = g ( z ) = z a=g(z)=z a=g(z)=z
其价值函数为:
J ( w , b ) = 1 2 ( a − y ) 2 J(w,b)=\frac{1}{2}(a-y)^2 J(w,b)=21(a−y)2
对于这种小网络,我们只有一个训练样例:
x = − 2 , y = 2 x=-2,y=2 x=−2,y=2
该网络的参数为:
w = 2 , b = 8 w=2,b=8 w=2,b=8
我们想要展示的是如何使用计算图来逐步计算价值函数J。
利用计算图逐步计算价值函数J
以下是这个例子的计算图,其实很简单:
这张图从左到右逐步展示了价值函数的计算过程,其中矩形之中描述的是计算步骤,而线段上面所写的是前一步计算出来的值。所以从左到右,依次计算量w*x的值,然后计算出了a的值,再计算出a-y的值,最后求得价值函数,为2。
计算图向我们展现了神经网络向前传播的步骤(图中还更进一步求了价值函数)。现在的问题是,如何利用计算图找到J关于w和b的导数 ∂ J ∂ w \frac{\partial J}{\partial w} ∂w∂J ∂ J ∂ b \frac{\partial J}{\partial b} ∂b∂J。
利用计算图求出价值函数的导数
事实证明,神经网络的前向传播是从左到右计算,而计算导数是从右向左的计算。
反向传播的第一步是询问d的值,它是价值函数的输入,d改变,J就跟着改变。例如,如果d改变了一内内,比如0.001,那么j将如何变化嘞。结果是在这种情况下,如果d从2变为了2.01,j则从2变味了2.02,那么可以得出结论就是J这里的导数为2,数学公式就是: ∂ J ∂ d = 2 \frac{\partial J}{\partial d}=2 ∂d∂J=2,这样就求出最右边的导数了。
下一步当然是继续向左进行,求一下 ∂ J ∂ a \frac{\partial J}{\partial a} ∂a∂J等于多少。利用与上面同样的方法,可以求出 ∂ d ∂ a = 1 \frac{\partial d}{\partial a}=1 ∂a∂d=1,再结合上 ∂ J ∂ d = 2 \frac{\partial J}{\partial d}=2 ∂d∂J=2,那么联立就可以得出 ∂ J ∂ a = 2 \frac{\partial J}{\partial a}=2 ∂a∂J=2。用数学化的方式来说,以上步骤其实是依靠链式法则进行微积分,高等数学应该学过。其实就是 ∂ J ∂ a = ∂ d ∂ a × ∂ J ∂ d \frac{\partial J}{\partial a}=\frac{\partial d}{\partial a}\times \frac{\partial J}{\partial d} ∂a∂J=∂a∂d×∂d∂J。
接下来就是一步步从右到左,最终可以得出:
∂ J ∂ w = − 4 \frac{\partial J}{\partial w}=-4 ∂w∂J=−4
事实证明,反向传播是计算导数的一个不错的方法,避免了你直接计算导数时过于复杂的复合求导。如果一个图具有n个节点(就是图中的矩形)和p个参数(我们这个例子中有两个参数),我们可以在n+p步中求出J对于所有参数的导数,而非n*p,这就表明即使在大型神经网络中你仍然可以进行求导运算。
为了给读者你造成不必要的麻烦,博主的所有视频都没开仅粉丝可见,如果想要阅读我的其他博客,可以点个小小的关注哦。