在神经网络中,为了最小化损失函数
loss(w)
l
o
s
s
(
w
)
,我们会逐一对各个
wi
w
i
进行求偏导,然后沿着梯度方向更新各个
wi
w
i
的值。但是直接求导的话这整个过程会产生重复计算。
例如
z=f(g(x))=f(y)
z
=
f
(
g
(
x
)
)
=
f
(
y
)
,则
dzdx=dzdydydx
d
z
d
x
=
d
z
d
y
d
y
d
x
,假设
x
x
是第层权值,
y
y
是第层的权值,如果依次求
z
z
对于的导数需要计算两次
dzdy
d
z
d
y
和一次
dydx
d
y
d
x
。而这时我们可以利用动态规划的思想先计算
dzdy
d
z
d
y
并保存下来记为
t
t
,这时候再计算,这样就不会出现导数的重复计算。
以上就是Backpropagation算法的思想。
这里举一个具体例子(假设我们现在处于反向传播过程中,现在要更新
w1
w
1
):
这里要求 ∂Etotal∂w1 ∂ E t o t a l ∂ w 1 ,即最后神经网络输出的损失函数值对当前 w1 w 1 的偏导数,下面对它展开:
这里,上面的 w1 w 1 即为图中的 w1 w 1 , hi+1vnet h v i + 1 n e t 表示 hi+1v h v i + 1 结点中线性加权后的结果, hi+1vout h v i + 1 o u t 表示 hi+1v h v i + 1 结点的最终输出, hi+1vnet h v i + 1 n e t 在经过激励函数后变成 hi+1vout h v i + 1 o u t 。通常而言,展开后的第一项 ∂Etotal∂hout ∂ E t o t a l ∂ h o u t 就是 error e r r o r 项(误差项),而前两项的乘积 ∂Etotal∂hnet ∂ E t o t a l ∂ h n e t 就可以记为 δ δ 。下同。下面开始推导。
第一项:
这里, Ei+2t E t i + 2 表示 hi+1v h v i + 1 结点来自 hi+2t h t i + 2 的损失值, Ei+2t+1 E t + 1 i + 2 表示它来自 hi+2t+1 h t + 1 i + 2 的损失值。注意, ∂Etotal∂(hi+2tnet) ∂ E t o t a l ∂ ( h t i + 2 n e t ) 在误差反向传播到 i+1 i + 1 层的时候,就已经被计算出来并且保存为 δi+2t δ t i + 2 了。
第二项:
这里,对于一个结点而言,它的净输入(线性加权总和)经过激励函数 f f 后即可以得到它的输出,于是这个导函数即为激励函数的导数。综合上述的第一项和第二项,我们可以看到相邻两层的值有如下关系式: δi+1v=(∑δi+2twv−t)⋅f′(hi+1v) δ v i + 1 = ( ∑ δ t i + 2 w v − t ) ⋅ f ′ ( h v i + 1 ) ,这里的 (∑δi+2twv−t) ( ∑ δ t i + 2 w v − t ) 也就是我们所谓的 errori+2t e r r o r t i + 2 。神经网络输出层的 error e r r o r 值就是真实值和预测值的误差。
第三项:
这里,一个结点的线性加权总和对于它某个参数 w w 的导数值为上层某一个结点的输出,而这个输出在前向传播过程就被计算出来了。
综上所述:
小结一下, ∂Etotal∂w1 ∂ E t o t a l ∂ w 1 ,也就等于 i+2 i + 2 层结点的 errori+2t e r r o r t i + 2 ,乘以,当前 i+1 i + 1 层激励函数的导数,乘以,它前面第 i i 层对应结点的输出的总乘积。
至此, w1 w 1 的梯度方向的导数就算出来了,我们再加上学习速率后,就可以更新 w1 w 1 :
最后,我们就可以根据这个将最基本的BP神经网络推导一翻啦~