神经网络问题研究及彻底分析:
1.根据期望输出和对应的输入,来构建三层网络模型,分析权值调整的全部过程。
问题分析及研究过程:
1.三层模型,实际上只有两层计算,因为最下一层为数据输入层,第二层做数据处理后传递给第三层,第三层继续处理数据后输出预测值。
2.通过期望输出和第三层预测值的差值,改变第一到第二层,第二到第三层的权值即可。
3.分析此题结构:
首先数据输入为X=(-1,1,3),我们把他看作一个向量。
第一层到第二层有权值V使得:
Ypre=VX+b
由于此题b=0
Ypre=VX
Y=sigmoid(Ypre)
第二层到第三层有权值W使得:
Opre=WY+b
由于此题b=0
Opre=WY
O=sigmoid(Opre)
课程给出的LOSS函数为:
L(y)=1/n∗∑ (d−O(y))2
O(y)=sigmoid(WY)
由于本题有两个特征,所以,L函数为:
L(y)=1/2∗∑ (d−sigmoid(WY))2
根据此函数对W求导才可以修正W的权值,所以L函数对W的偏导数为:
sigmoid(z)′=sigmoid(z)∗(1−sigmoid(z))
WYw′=Y
L(y)w′=1/2∗2(d−sigmoid(WY))
∗sigmoid(WY)∗(1−sigmoid(WY))∗Y
L(y)w′=(d−O(y))∗O(y)∗(1−O(y))∗Y
对应的调参过程就应该是:
W=W−learnrate∗L(y)w′
梯度下降调整参数应该是w=w-learnrate*dw(老师ppt上好像是加号,有理解的朋友可以尽管找小康交流哈,我属实不知道老师错没错)
接下来分析第一层的V权值怎么调节:
由于之前的推算我们知道对于类似loss的函数:
L(x)=1/2∗∑ (y实际−sigmoid(VX))2
他对应对V的偏导数应该形如:
L(x)v′=(y实际−f(VX))∗f(VX)∗(1−f(VX))∗X
f(x)=sigmoid(VX)
那么问题的核心其实很简单,我们如何获取这个y实际。因为我们只知道期望输出要求第三层接近d(0.95,0.05)。仔细思考后,小康发现了一个浅显易懂的求解方式,而非课本上繁琐的一堆看不懂的推论。
偏导数结构;
(实际值和预测值的差值)∗预测值∗(1−预测值)∗X
根据结构找元素:
1.预测值其实就是
Ypre=VX
Y=sigmoid(VX)
2.实际值和预测值的差值:
由于第三层中求出了第三层代价函数对W的偏导数值。
那么dw*W就是第二层和第三层的实际值和预测值的差值,即:
(d−O(y))∗O(y)∗(1−O(y))∗Y∗W
所以第一层到第二层对V的偏导数就是
(d−O(y))∗O(y)∗(1−O(y))∗Y∗W
∗sigmoid(VX)∗(1−sigmoid(VX))
第一层权值V的修正就是;
v=v−learnrate∗dv
程序代码实现:
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的值:
评论(0)