标准BP算法详细解析

下面的过程参考西瓜书

注意是标准BP噢,意思是一个单拿出一个样本来看的bp,单位是一个样本噢~

一、图解以及符号定义

我要再啰嗦一遍,写成我习惯的方式:  

二、过程解释 

①表示的是第一层第i个权值向量和第j个输入相乘的权值

②表示的是第二层第j个权值向量和第y个输入相乘的权值,很明显,只有一个输出所以j=1,y取值1~S

由此我们可以继续得到下面这些参数:

 a:隐藏层的输入

隐藏层的输出:

解释一下b和f:

b是偏置值:

f是sigmoid激活函数 

再看从隐藏层到输出层的过程:

上面其实就是正向传播的过程,重点来了,下面是反向传播的过程。

我们需要根据输出来修改每一层的权值向量了,这里分为两类讨论,一类是修改输出层的权值向量,另一类是修改中间层(隐藏层)的权值向量,以上面为例,这两类分别就是修改W(2)和修改W(1)。

三、反向传播

 

我们知道误差与输出y(2)有关,而输出与输入a(2)有关,输入又与w(2)有关,所以根据链式求导法则:

同理更新b,

到此为止,第一类更新就写完了,下面要写修改中间层的权值更新了。

 

四、python代码实现

import numpy as np

x=np.array([
    [1,2,3],
    [4,5,6]
],dtype=np.float64)

w1=np.random.rand(3,4)#第一层四个神经元,三个特征
b1=np.random.rand(1,4)

w2=np.random.rand(4,2)#输出层有两个神经元,上一层每个神经元生成一个特征,共四个特征
b2=np.random.rand(1,2)

lr=0.1#学习率

#真正的y
y=np.array([
    [8,2]
],dtype=np.float64)
def sigmoid(x):
    return 1/(1+np.exp(-x))

for index,i in enumerate(x):
    #对x中的每一个样本进行正`向传播
    #中间层的输入
    a1=np.dot(i,w1)#[1,4]
    #隐藏层的输出
    y1=sigmoid(a1+b1)#[1,4]
    #输出层的输入
    a2=np.dot(y1,w2)#[1,2]
    #输出层的输出
    y2=sigmoid(a2+b2)#[1,2]
    #反向传播
    g=np.multiply((y-y2),np.multiply(y2,(1-y2)))
    #更新输出层的权值w和偏置值b
    w2=w2+lr*np.dot(y1.T,g)
    b2=b2+lr*g
    print("第"+str(index+1)+"个样本")
    print("更新后的输出层权重w2",w2)
    print("更新后的输出层b2",b2)
    print("下面开始更新中间层权重w1和偏置值b1")
    w1=w1+lr*i.reshape(3,1)*np.multiply(np.multiply(y1,(1-y1)),np.dot(w2,g.T).T)
    b1=b1+lr*np.multiply(np.multiply(y1,(1-y1)),np.dot(w2,g.T).T)
    print("更新后的输出层权重w1", w1)
    print("更新后的输出层b1", b1)

公式都懂,但是这个向量化的过程着实是让我费了一番功夫。

用书上公式来讲吧:

实在是难以描述,我们看到西瓜书的102页上的图

以及103页的公式,很明显bh影响的只是权值的行,对于每一列的乘积是一样的,哎,不讲了,不好说。总之代码是对的。

------------------------------------------------第二天更新--------------------------------------------------

不描述出来还是咽不下这口气,下面的图示可能只有我能看懂吧,哈哈

正向传播:

反向传播更新输出层权重:

反向传播更新中间层权重: 

上面公式推导倒不是很难,主要是代码向量化的过程,不想看算法推导的直接用上面python代码就好。

  • 6
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CtrlZ1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值