- 前言
- 梯度的直观解释
- 用链式法则计算 f(x)
- 公式与代码
1.前言
在人工神经网络这篇文章中,除了介绍简单的神经网络,还举了一个非常详细的关于反向传播算法的传播过程,但这一次,希望通过更加直观的例子,来了解反向传播,同时会用到链式法则。深入理解反向传播的过程及其中的微妙变化,有助于我们更好的理解神经网络和调试我们的代码。
我们这次的核心问题就是:给定一个函数
f(x)
,其中
x
是一个输入向量,希望求得这个函数对应的梯度
其中
f(x)
一般对应着算法使用的损失函数,而
x
则代表了输入的训练数据和神经网络的权重,正如你所知,训练数据是给定不变的,但是权重是可以改变的,我们通过调整权重参数,让神经网络学习出一套分类的判定标准。在实际应用中,我们会使用BP算法来求出参数
但有时,我们想要看一下我们的神经是什么样子的,也可以对x对梯度。
2.梯度的直观解释
假设有一个函数
f(x,y)=xy
,如果你学过微积分,一定知道对
x
求偏导,就是把除了x以外的所有参数,无论是
定义:其实导数定义的就是一个函数的在一点处的变化率。
那导数代表了什么呢?
The derivative on each variable tells you the sensitivity of the whole expression on its value.
翻译过来就是:导数反应了每个变量对函数值的影响程度。
我们先前说了梯度代表了方向,那梯度和导数的关系是怎么样的呢?
其实
∇f
就是用偏导数表示的向量(有方向的),用上一个函数就是:
3.用链式法则计算 f(x)
为了理解链式法则,我们先用一个简答的例子:
先前我们已经知道怎么计算偏导数了:
用更复杂的例子,sigmoid函数大家都挺熟悉的:
4.公式与代码
我们写代码的人可能最怕的就是看到一大堆的数学公式了,但是我们并不需要自己手动算他们,所以知道他们怎么用代码写出来就OK了,举个例子:
x = 3 # example values
y = -4
# forward pass
sigy = 1.0 / (1 + math.exp(-y)) # sigmoid in numerator #(1)
num = x + sigy # numerator #(2)
sigx = 1.0 / (1 + math.exp(-x)) # sigmoid in denominator #(3)
xpy = x + y #(4)
xpysqr = xpy**2 #(5)
den = sigx + xpysqr # denominator #(6)
invden = 1.0 / den #(7)
f = num * invden # done!
参考
cs231n