神经网络BP三层模型易懂分析

举报
小康不会AI 发表于 2022/09/21 16:39:02 2022/09/21
【摘要】 神经网络问题研究及彻底分析: 1.根据期望输出和对应的输入,来构建三层网络模型,分析权值调整的全部过程。 问题分析及研究过程:1.三层模型,实际上只有两层计算,因为最下一层为数据输入层,第二层做数据处理后传递给第三层,第三层继续处理数据后输出预测值。2.通过期望输出和第三层预测值的差值,改变第一到第二层,第二到第三层的权值即可。3.分析此题结构:首先数据输入为X=(-1,1,3),我们把他...

神经网络问题研究及彻底分析:

1.根据期望输出和对应的输入,来构建三层网络模型,分析权值调整的全部过程。


image.png

问题分析及研究过程:

1.三层模型,实际上只有两层计算,因为最下一层为数据输入层,第二层做数据处理后传递给第三层,第三层继续处理数据后输出预测值。
2.通过期望输出和第三层预测值的差值,改变第一到第二层,第二到第三层的权值即可。
3.分析此题结构:
首先数据输入为X=(-1,1,3),我们把他看作一个向量。
第一层到第二层有权值V使得:

Y p r e = V X + b Ypre=VX+b

由于此题b=0

Y p r e = V X Ypre=VX

Y = s i g m o i d ( Y p r e ) Y=sigmoid(Ypre)


第二层到第三层有权值W使得:

O p r e = W Y + b Opre=WY+b

由于此题b=0

O p r e = W Y Opre=WY

O = s i g m o i d ( O p r e ) O=sigmoid(Opre)


课程给出的LOSS函数为:

L ( y ) = 1 / n   ( d O ( y ) ) 2 L(y)=1/n*\sum\ (d-O(y)) ^2

O ( y ) = s i g m o i d ( W Y ) O(y)=sigmoid(WY)

由于本题有两个特征,所以,L函数为:

L ( y ) = 1 / 2   ( d s i g m o i d ( W Y ) ) 2 L(y)=1/2*\sum\ (d-sigmoid(WY)) ^2


6b5bb541669bc2629705b7f0131566d.jpg

根据此函数对W求导才可以修正W的权值,所以L函数对W的偏导数为:

s i g m o i d ( z ) = s i g m o i d ( z ) ( 1 s i g m o i d ( z ) ) sigmoid(z)'=sigmoid(z)*(1-sigmoid(z))


W Y w = Y WYw'=Y


L ( y ) w = 1 / 2 2 ( d s i g m o i d ( W Y ) ) L(y)w'=1/2*2 (d-sigmoid(WY))

s i g m o i d ( W Y ) ( 1 s i g m o i d ( W Y ) ) Y *sigmoid(WY)*(1-sigmoid(WY))*Y


L ( y ) w = ( d O ( y ) ) O ( y ) ( 1 O ( y ) ) Y L(y)w'=(d-O(y))*O(y)*(1-O(y))*Y

对应的调参过程就应该是:

W = W l e a r n r a t e L ( y ) w W=W-learnrate*L(y)w'


梯度下降调整参数应该是w=w-learnrate*dw(老师ppt上好像是加号,有理解的朋友可以尽管找小康交流哈,我属实不知道老师错没错)

0008ae9f3f58e492fefdd1504a2d145.jpg

接下来分析第一层的V权值怎么调节:

由于之前的推算我们知道对于类似loss的函数:

L ( x ) = 1 / 2   ( y 实际 s i g m o i d ( V X ) ) 2 L(x)=1/2*\sum\ (y实际-sigmoid(VX)) ^2

他对应对V的偏导数应该形如:

L ( x ) v = ( y 实际 f ( V X ) ) f ( V X ) ( 1 f ( V X ) ) X L(x)v'=(y实际-f(VX))*f(VX)*(1-f(VX))*X

f ( x ) = s i g m o i d ( V X ) f(x)=sigmoid(VX)

那么问题的核心其实很简单,我们如何获取这个y实际。因为我们只知道期望输出要求第三层接近d(0.95,0.05)。仔细思考后,小康发现了一个浅显易懂的求解方式,而非课本上繁琐的一堆看不懂的推论。

偏导数结构;

(实际值和预测值的差值) 预测值 1 预测值) X (实际值和预测值的差值)* 预测值*(1-预测值)*X


根据结构找元素:

1.预测值其实就是

Y p r e = V X Ypre=VX

Y = s i g m o i d ( V X ) Y=sigmoid(VX)

2.实际值和预测值的差值:
由于第三层中求出了第三层代价函数对W的偏导数值。
那么dw*W就是第二层和第三层的实际值和预测值的差值,即:

( d O ( y ) ) O ( y ) ( 1 O ( y ) ) Y W (d-O(y))*O(y)*(1-O(y))*Y *W

所以第一层到第二层对V的偏导数就是

( d O ( y ) ) O ( y ) ( 1 O ( y ) ) Y W (d-O(y))*O(y)*(1-O(y))*Y *W

s i g m o i d ( V X ) ( 1 s i g m o i d ( V X ) ) *sigmoid(VX)*(1-sigmoid(VX))

第一层权值V的修正就是;

v = v l e a r n r a t e d v v=v-learnrate*dv


f18d948a739339b176dbbd109b81585.jpg

程序代码实现:

import  numpy as np
def sigmoid(z):
    return  1/(1+np.exp(-z))
np.set_printoptions(suppress=True)
x=np.array([-1,1,3]).reshape(3,1)
v1=np.array([3,1,-2]).reshape(1,3)
y1pre=np.dot(v1,x)[0][0]
y1=sigmoid(y1pre)
v2=np.array([-1,2,0]).reshape(1,3)
y2pre=np.dot(v2,x)[0][0]
y2=sigmoid(y2pre)
y=np.array([-1,0.0003,0.9526]).reshape(3,1)
w1=np.array([-2,1,0]).reshape(1,3)
o1pre=np.dot(w1,y)[0][0]
o1=sigmoid(o1pre)
w2=np.array([3,1,-2]).reshape(1,3)
o2pre=np.dot(w2,y)[0][0]
o2=sigmoid(o2pre)
#print(o1pre,o1,o2pre,o2)
do1=(0.95-o1)*o1*(1-o1)
do2=(0.95-o2)*o2*(1-o2)
# print(do1,do2)
dy1=(do1*1+do2*1)*(1-y1)*y1
dy2=(do1*0+do2*(-2))*(1-y2)*y2
print(dy1,dy2)
learnrate=0.5
ndw1=learnrate*do1*y
# print(ndw1)
ndw2=learnrate*do2*y
# print(ndw2)
w12=w1.T-ndw1
# print(w12)
w22=w2.T-ndw2
# print(w22)
ndw11=learnrate*dy1*x
# print(ndw11)
ndw22=learnrate*dy2*x
# print(ndw22)
v12=v1.T-ndw11
print(v12)
v22=v2.T-ndw22
print(v22)

最后得到修改一次后w1,w2,v1,v2的值:

image.png

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。