深度学习 - 前向传播和反向传播
2019-09-18 本文已影响0人
云上听风
英文原文
深度学习---反向传播的具体案例
BP(反向传播算法)公式推导及例题解析
前向传播
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
。
其中在上面更新时已经求得。
而
此时可求:。
3. 同理可对其他对应的更新,也就是说所有的使用独立的不同的。