bp算法推导过程(代码片段)

zhuimengzhe zhuimengzhe     2023-02-21     321

关键词:

BP 算法推导过程

技术分享图片

一.FP过程(前向-计算预测值)

定义sigmoid激活函数
import numpy as np
def sigmoid(z):
    return 1.0 / (1 + np.exp(-z))

输入层值和 标签结果

l = [5.0, 10.0]
y = [0.01,0.99]
alpha=0.5

初始化 w,b 的值

w = [0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.65]
b = [0.35, 0.65]

计算隐层的结果

[ h1 = Sigmod( Net_h1) =Sigmod(w1*l1+ w2*l2+b1*1) ]

h1 = sigmoid(w[0] * l[0] + w[1] * l[1] + b[0])
h2 = sigmoid(w[2] * l[0] + w[3] * l[1] + b[0])
h3 = sigmoid(w[4] * l[0] + w[5] * l[1] + b[0])
[h1,h2,h3]
#[0.9129342275597286, 0.9791636554813196, 0.9952742873976046]
[0.9129342275597286, 0.9791636554813196, 0.9952742873976046]

计算输出层的结果

[ o1 = Sigmod( Net_o1) =Sigmod(w7*h1+ w9*h2+w11*h3+b2*1) ]

o1 = sigmoid(w[6] * h1 + w[8] * h2+ w[10] * h3 + b[1])
o2 = sigmoid(w[7] * h1 + w[9] * h2+ w[11] * h3 + b[1])
[o1,o2]
#[0.8910896614765176, 0.9043299248500164]
[0.8910896614765176, 0.9043299248500164]

计算整体loss误差值 (平方损失函数)

[ loss=E_total=E_o1+E_o2=frac12*(y_1-o1)^2+frac12*(y_2-o2)^2 ]

E_total=1/2*(y[0]-o1)**2+1/2*(y[1]-o2)**2
E_total
#0.3918291766685041
0.3918291766685041

二.BP过程 (反向-更新参数值)

技术分享图片

更新w7的值:

w7的值只和o1的损失函数有关系,所以整体Loss对w7求偏导,E_o2 会约掉
target 代表目标值

[ Loss=E_total=E_o1+E_o2 ]

[ E_o1=frac12*(target_o1-out_o1)^2 =frac12*(target_o1-Sigmod(net_o1))^2 ]

[ E_o1 =frac12*(target_o1-Sigmod(w7*h1+ w9*h2+w11*h3+b2*1))^2 ]

同过复合函数链式求导发展的如下公式

[ ext整体损失 对w7 求偏导 : fracpartial E_totalpartial w7 =fracpartial E_totalpartial out_o1 *fracpartial out_o1partial net_o1 *fracpartial net_o1partial w7 ]

第一步: E_total 对 Out_o1 求导

[ ext原函数 : E_total =frac12(target_o1-out_o1)^2+E_o2 ]

[ fracpartial E_totalpartial out_o1=2*frac12*(target_o1-out_o1)^2-1*-1+0 ]

(y[0]-o1)*(-1) #0.8910896614765176
0.8810896614765176

第二步: Out_o1 对 net_o1 求导
详见sigmod 函数求导公式

[ ext原函数 out_o1=frac11+e^-net_o1 ]

[ fracpartial out_o1partial net_o1=out_o1(1-out_o) ]

o1*(1-o1) #0.09704887668618288
0.09704887668618288

第三步: Net_o1 对 w7 求导

[ ext原函数 : net_o1 =w7*out_h1+ w9*out_h2+w11*out_h3+b2*1 ]

[ fracpartial net_o1partial w7=1*out_h1*w7^(1-1)+0+0+0 ]

1*h1*1 #0.9129342275597286
0.9129342275597286

组合整个求导过程

[ ext整体损失 对w7 求偏导 : fracpartial E_totalpartial w7 =-1*(target_o1-out_o1)*out_o1*(1-out_o1)*out_h1 ]

(o1-y[0])*o1*(1-o1)*h1 #0.07806387550033887
0.07806387550033887

第四部分 更新前向分布算法 更新w7的值
η指 学习率

[ w7^+=w7+Δw7=w7-η*fracpartial E_totalpartial w7 ]

# w[6] = w[6]-alpha*(o1-y[0])*o1*(1-o1)*h1 # w7
# w[7] = w[7]-alpha*(o2-y[1])*o2*(1-o2)*h1 #w8
# w[8] = w[8]-alpha*(o1-y[0])*o1*(1-o1)*h2 #w9
# w[9] = w[9]-alpha*(o2-y[1])*o2*(1-o2)*h2 #w10
# w[10]=w[10]-alpha*(o1-y[0])*o1*(1-o1)*h3 #w11
# w[11]=w[11]-alpha*(o2-y[1])*o2*(1-o2)*h3 #w12

得到w7-w12的更新公式(后面一起更新)

# #提取公共部分
#t1=(o1-y[0])*o1*(1-o1)
#t2=(o2-y[1])*o2*(1-o2)

# w[6] = w[6]-alpha*t1*h1 #w7
# w[7] = w[7]-alpha*t2*h1 #w8
# w[8] = w[8]-alpha*t1*h2 #w9
# w[9] = w[9]-alpha*t2*h2 #w10
# w[10]=w[10]-alpha*t1*h3 #w11
# w[11]=w[11]-alpha*t2*h3 #w12
# print("新的w7的值:",w[6])
# w[6:]

更新w1的值:

[ ext整体损失 对w1 求偏导 : fracpartial E_totalpartial w1 =fracpartial E_totalpartial out_h1 *fracpartial out_h1partial net_h1 *fracpartial net_h1partial w1 ]

[ ext展开 : fracpartial E_totalpartial w1= (fracpartial E_o1partial out_h1+fracpartial E_o2partial out_h1) *fracpartial out_h1partial net_h1 *fracpartial net_h1partial w1 ]

第一步: E_o1对 out_h1 求偏导 and E_o2对 out_h1

[ fracpartial E_o1partial out_h1= fracpartial E_o1partial out_o1 *fracpartial out_o1partial net_o1 *fracpartial net_o1partial out_h1 ]

[ fracpartial E_o1partial out_h1= -(target_o1-out_o1) *out_o1(1-out_o1) *w7 ]

-(y[0]-o1)*o1*(1-o1)*w[6] # E_o1 对out_h1  0.03420350476244207
0.03420350476244207
-(y[1]-o2)*o2*(1-o2)*w[7] # E_o1 对out_h1 -0.003335375074384934
-0.003335375074384934

第二步 out_h1 对net_h1 求偏导(前面计算过)

h1*(1-h1)
0.07948532370965024

第三步 net_h1 对w1 求篇导

[ ext原函数 : net_h1 =w1*l1+ w2*l2+b1*1 ]

l[0]
5.0

最终整合 w1 的更新公式得

[ fracpartial E_totalpartial w1=[ -(target_o1-out_o1)*out_o1(1-out_o1)*w7 -(target_o2-out_o2)*out_o2(1-out_o2)*w8] *out_o1*(1-out_o1) *l1 ]


#w[0] = w[0]-alpha* w(-1*(y[0]-o1)*o1*(1-o1)*w[6]+-1*(y[1]-o2)*o2*(1-o2)*w[7])*h1*(1-h1)*l[0] # w1的更新值
# 提取公共部分



t1=(o1-y[0])*o1*(1-o1)
t2=(o2-y[1])*o2*(1-o2)

w[0] = w[0] - alpha * (t1 * w[6] + t2 * w[7]) * h1 * (1 - h1) * l[0]
w[1] = w[1] - alpha * (t1 * w[6] + t2 * w[7]) * h1 * (1 - h1) * l[1]
w[2] = w[2] - alpha * (t1 * w[8] + t2 * w[9]) * h2 * (1 - h2) * l[0]
w[3] = w[3] - alpha * (t1 * w[8] + t2 * w[9]) * h2 * (1 - h2) * l[1]
w[4] = w[4] - alpha * (t1 * w[10]+ t2 *w[11]) * h3 * (1 - h3) * l[0]
w[5] = w[5] - alpha * (t1 * w[10]+ t2 *w[11]) * h3 * (1 - h3) * l[1]

w[6] = w[6]-alpha*t1*h1 
w[7] = w[7]-alpha*t2*h1 
w[8] = w[8]-alpha*t1*h2 
w[9] = w[9]-alpha*t2*h2 
w[10]=w[10]-alpha*t1*h3 
w[11]=w[11]-alpha*t2*h3
print("进行一次跌倒更新后的结果")
print(w)
进行一次跌倒更新后的结果
[0.0938660917985833, 0.13773218359716657, 0.19802721973428622, 0.24605443946857242, 0.2994533791079845, 0.3489067582159689, 0.3609680622498306, 0.4533833089635062, 0.4581364640581681, 0.5536287533891512, 0.5574476639638248, 0.653688458944847]

输入值为 0.01,0.99 的第一次迭代对照结果

0.0938660917985833, 0.13773218359716657, 0.19802721973428622, 0.24605443946857242, 0.2994533791079845, 0.3489067582159689, 0.3609680622498306, 0.4533833089635062, 0.4581364640581681, 0.5536287533891512, 0.5574476639638248, 0.653688458944847

输入值为 0.00,1.00 的第一次迭代对照结果

0.09386631682087375, 0.13773263364174748, 0.1980267403252208, 0.24605348065044158, 0.2994531447534454, 0.34890628950689084, 0.3605250660434654, 0.4537782320399227, 0.4576613303938861, 0.5540523264259203, 0.556964712705892, 0.6541190012244457

深度学习bp算法的推导(附加rnn,lstm的推导说明)

...equenceLabelling withRecurrentNeuralNetworks》详细介绍其关于BP算法的推导过程。     2)论文没有提到过偏差的处理,不过如果能耐心推导出论文给出的公式,那么这将十分简单。   &nbs 查看详情

误差逆传播(errorbackpropagation,bp)算法推导及向量化表示

...材NotesonConvolutionalNeuralNetworks,结果刚看到第2章教材对BP算法的回顾就犯难了,不同于之前我学习的对每一个权值分别进行 查看详情

bp神经网络公式推导及实现mnist(代码片段)

...经网络的基本思想:BP神经网络的学习采用误差反向传播算法,BP算法是一种有监督的学习方法,其主要思想是把整个学习过程分为正向传播、反向(逆向)传播和记忆训练三个部分。正向传播时,输入样本从输入层输入,经各隐含... 查看详情

bp算法完整推导2.0(上)

前面的笔记已经把BP算法给推导了,那4大公式,核心就是求偏导数的链式法则,这篇,再来跟着大佬来推一波,目的是为了加深印象.关于记忆这个话题,心理学家,其实早已经给出了答案,最好的记忆方式,就是重复,写了这么多的笔记,其实... 查看详情

神经网络——bp学习算法推导

...总和为,输出为综上各变量之间的关系为 式1BP学习算法是通过反向学习过程使误差最小,其目 查看详情

神经网络——bp学习算法推导

...总和为,输出为综上各变量之间的关系为 式1BP学习算法是通过反向学习过程使误差最小,其目 查看详情

bp算法基本原理推导----《机器学习》笔记

前言多层网络的训练需要一种强大的学习算法,其中BP(errorBackPropagation)算法就是成功的代表,它是迄今最成功的神经网络学习算法。今天就来探讨下BP算法的原理以及公式推导吧。神经网络先来简单介绍一下神经网络,引入基... 查看详情

一文彻底搞懂bp算法:原理推导+数据演示+项目实战(上篇)

参考技术A反向传播算法(BackpropagationAlgorithm,简称BP算法)是深度学习的重要思想基础,对于初学者来说也是必须要掌握的基础知识!本文希望以一个清晰的脉络和详细的说明,来让读者彻底明白BP算法的原理和计算过程。全文... 查看详情

bp神经网络算法推导

一、BP神经网络BP神经网络是一种按照误差逆向传播算法训练的多层前馈神经网络,是应用最广泛也是最简单的神经网络模型之一。1.1BP神经网络的结构神经网络结构如下其中x1,x2x_1,x_2x1​,x2​为输入,φ\\varphiφ为激活函数... 查看详情

bp算法的原理解释和推导

BP算法的原理解释和推导已知的神经网络结构:且已知的条件:a(j)=f(z(j))\\mathbfa^\\left(\\mathbfj\\right)=\\mathbff\\left(\\mathbfz^\\left(\\mathbfj\\right)\\right)a(j)=f(z(j))z(j)=W(j)a 查看详情

bp算法的原理解释和推导

BP算法的原理解释和推导已知的神经网络结构:且已知的条件:a(j)=f(z(j))\\mathbfa^\\left(\\mathbfj\\right)=\\mathbff\\left(\\mathbfz^\\left(\\mathbfj\\right)\\right)a(j)=f(z(j))z(j)=W(j)a(j−1)+b(j) 查看详情

backpropagation算法的推导与直观图解

...出一个简单的神经网络模型和Backpropagation(以下简称BP)算法的具体流程。第二部分以分别计算第一层和第二层中的第一个参数(parameters,在神经网络中也称之为weights)的梯度为例来解释BP算法流程,并给出了具体的推导过程。 查看详情

从0开始机器学习-神经网络反向bp算法!(代码片段)

最近一个月项目好忙,终于挤出时间把这篇BP算法基本思想写完了,公式的推导放到下一篇讲吧。一、神经网络的代价函数神经网络可以看做是复杂逻辑回归的组合,因此与其类似,我们训练神经网络也要定义代价函数,之后再... 查看详情

反向传播算法(过程及公式推导)

...们开始DL的研究之前,需要把ANN—人工神经元网络以及bp算法做一个简单解释。关于ANN的结构,我不再多说,网上有大量的学习资料,主要就是搞清一些名词:输入层/输入神经元,输出层/输出神经元,隐层/隐层神经元,权值,... 查看详情

神经网络的bp推导过程

神经网络的BP推导过程 下面我们从一个简单的例子入手考虑如何从数学上计算代价函数的梯度,考虑如下简单的神经网络,该神经网络有三层神经元,对应的两个权重矩阵,为了计算梯度我们只需要计算两个偏导数即可: 首先计... 查看详情

手推机器学习吴恩达神经网络bp反向传播矩阵推导(上篇)

前言在吴恩达斯坦福机器学习中关于BP算法(BackpropagationAlgorithm)只给出了最后的BP矩阵的推导结果,略去了中间的推导过程,初学者理解起来相当困难。本文给出了BP推导常遇到两种推导形式,并给出了详细... 查看详情

我对bp网络的简单的理解(代码片段)

最近在学习tf的神经网络算法,十多年没有学习过数学了,本来高中数学的基础,已经彻底还给数学老师了。所以我把各种函数、公式和推导当做黑盒子来用,理解他们能做到什么效果,至于他们是如何做到的,暂时不去深究,... 查看详情

bp算法完整推导2.0(下)

上篇主要阐述BP算法的过程,以及推导的4大公式的结论,现在呢要来逐步推导出这写公式的原理.当理解到这一步,就算真正理解BP算法了.也是先做一个简单的回顾一下,不是很细,重点在推导,不清楚就结合图像呀,其实很直观的.全篇其... 查看详情