深度学习 - 前向传播和反向传播

英文原文
深度学习---反向传播的具体案例
BP(反向传播算法)公式推导及例题解析

深度学习 - 前向传播和反向传播_第1张图片
image.png

前向传播


input ->输入到-> ->输出->

->输入到->->输出->


用python写了个计算过程:

import math
import numpy as np

#前向传播
#[深度学习---反向传播的具体案例](https://zhuanlan.zhihu.com/p/23270674)
#流程:
#input(w1,w2)->net_h1->out_h1->out_h1(w5,w6)->net_o1->out_o1(o1)->e_o1

#第1层输入
i1 = .05 
i2 = .10
b1 = .35 #bias

#权重 weight
w1 = .15 
w2 = .20
w3 = .25
w4 = .30

#第2层:
net_h1 = w1*i1+w2*i2+b1*1
out_h1 = 1/(1+math.exp(-net_h1)) #out: sigmoid(x)

net_h2 = w3*i1+w4*i2+b1*1
out_h2 = 1/(1+math.exp(-net_h2))
print("net_h1:",net_h1)
print("out_h1:",out_h1)
print("net_h2:",net_h2)
print("out_h2:",out_h2)

b2 = .60 #bias
#权重
w5 = .40 #weight1
w6 = .45
w7 = .50
w8 = .55

#第3层:
net_o1 = w5*out_h1+w6*out_h2+b2
out_o1 = 1/(1+math.exp(-net_o1))

net_o2 = w7*out_h1+w8*out_h2+b2
out_o2 = 1/(1+math.exp(-net_o2))
print("net_o1:", net_o1)
print("out_o1:", out_o1)
print("net_o2:", net_o2)
print("out_o2:", out_o2)

#训练集正确输出
o1 = .01
o2 = 1 - o1

#误差
e_o1 = math.pow((o1-out_o1),2)/2
print("e_o1:",e_o1)
e_o2 = math.pow(o2-out_o2,2)/2
print("e_o2:",e_o2)
e_total = e_o1 + e_o2
print("e_total:",e_total)

打印结果:

net_h1: 0.3775
out_h1: 0.5932699921071872
net_h2: 0.39249999999999996
out_h2: 0.596884378259767
net_o1: 1.10590596705977
out_o1: 0.7513650695523157
net_o2: 1.2249214040964653
out_o2: 0.7729284653214625
e_o1: 0.274811083176155
e_o2: 0.023560025583847746
e_total: 0.2983711087600027

反向传播


反向传播是根据链式求导法则对参数(和)进行更新。

一、对权重更新

对于,想知道其改变对总误差有多少影响:

首先:


这个是应用了求导连锁律。因为对求偏导,所以后半式子视为常数0。

然后:


这一步是Sigmoid函数的求导。

资料参考:
Sigmoid函数的求导证明

好像有点复杂还不如我自己推导一下:


这里应用了连锁率,参考:

可以看做和的复合,根据复合函数求导的法则,先将对求导得,然后对求导得,两个导数相乘,并将结果中换成,从而

整理一下:



所以:

最后:


现在我们已经计算出所有偏导,可以计算:

为了减少误差,然后从当前的权重减去这个值(可选择乘以一个学习率,比如设置为0.5),得:

使用同样步骤计算出:。
隐藏层:

1. 分解之:

跟类似可知:


其中:
的值在上面算值时已求出。
的值也已经求出。
现在求:。
因为,
所以:

现在我们可以求出了。
同理可求出,然后得到.
2. 求:
因为,
所以:
3. 求:
因为,
所以:。
4. 现在可以更新:

5. 使用同样步骤计算出:。


现在,我们更新了所有的权重,经过多次迭代反向传播之后,错误倾斜率越来越小,也就是跟正确结果越来越接近。

二、对偏置更新

1. 更新b2

其中在上面更新时已经求得。

此时可求:

2. 更新b1
\frac{\partial E_{total}}{\partial b_{1}}=\frac{\partial E_{total}}{\partial out_{h1}}*\frac{\partial out_{h1}}{\partial b_1}=\frac{\partial E_{total}}{\partial out_{h1}}*\frac{\partial out_{h1}}{\partial net_{h1}}*\frac{\partial net_{h1}}{\partial b_{1}}

其中在上面更新时已经求得。

此时可求:。

3. 同理可对其他对应的更新,也就是说所有的使用独立的不同的。

三、根据上面推导可以轻松写出python程序

你可能感兴趣的:(深度学习 - 前向传播和反向传播)