深度神经网络(多层感知机)反向传播算法(BP-back propagation)实现备忘录

在AI-100第六周多层感知机和深度神经网络学习中,有一个算例(两层网络,1个两维的输入数据,每层神经元数量都是2个,激活函数为sigmoid函数,损失函数为二次损失),可以通过手工计算各层前馈运算值,通过损失函数计算各权重参数的梯度(损失函数的反向传播算法),更新完各层权重参数后,再次前馈-反向-前馈-反向……-前馈,直到模型输出值与标签值基本相等。

深度神经网络(多层感知机)反向传播算法(BP-back propagation)实现备忘录_第1张图片深度神经网络(多层感知机)反向传播算法(BP-back propagation)实现备忘录_第2张图片

 深度神经网络(多层感知机)反向传播算法(BP-back propagation)实现备忘录_第3张图片

 深度神经网络(多层感知机)反向传播算法(BP-back propagation)实现备忘录_第4张图片

 深度神经网络(多层感知机)反向传播算法(BP-back propagation)实现备忘录_第5张图片

 深度神经网络(多层感知机)反向传播算法(BP-back propagation)实现备忘录_第6张图片深度神经网络(多层感知机)反向传播算法(BP-back propagation)实现备忘录_第7张图片深度神经网络(多层感知机)反向传播算法(BP-back propagation)实现备忘录_第8张图片

首先,自己手动计算了前馈各层输出值,如下:

深度神经网络(多层感知机)反向传播算法(BP-back propagation)实现备忘录_第9张图片

 其次,利用第一层的输出计算损失函数对第二层的各权重的梯度

深度神经网络(多层感知机)反向传播算法(BP-back propagation)实现备忘录_第10张图片

 最后,根据方向传播公式,利用模型的输入数据和第二层的梯度系数和权重计算第一层各神经元的权重梯度(心得:以第一层的第一个神经元为例,它的梯度系数为<第二层与其相连接的所有神经元的梯度系数×权重×第一层该神经元输出函数导数>的加和)

深度神经网络(多层感知机)反向传播算法(BP-back propagation)实现备忘录_第11张图片

 用jupyter notebook 实现上述计算,并进行多轮前馈-反向-前馈计算,查看模型的输出结果。

import numpy as np

x=np.array([[0.5],[1]])
t=np.array([[1],[0]])
y=np.array([[0],[0]])
h1=np.array([[0],[0]])
w1=np.array([[0.1,0.3],[0.2,0.4]])
w2=np.array([[0.6,0.8],[0.7,0.9]])
bias1=np.array([[0.5],[0.5]])
bias2=np.array([[1],[1]])

#激活函数sigmoid
def sigmoid(x):
    s = 1 / (1 + np.exp(-x))
    return s

def QianKui():
    global h1,y
    h1=sigmoid(np.matmul(w1,x)+bias1)
    y=sigmoid(np.matmul(w2,h1)+bias2)
    #print(h1,y)
    
def BackPropagation():
    global h1,y,w1,w2,bias1,bias2
    #第二层
    delte_2=(y-t)*y*(1-y)  #δ2--第二层神经元的梯度系数;np.array的“*”就是Hadamard乘积
    delte_bias2=delte_2     #Δb2
    delte_w2=np.matmul(delte_2,h1.T) #Δw2
    #print("δ2,Δw2:",delte_2,delte_w2)
    #print("delte_2,delte_w2:",delte_2,delte_w2)
    
    #第一层
    sigma_logit_1=h1*(1-h1)  #σ(logit_1)函数的导数
    delte_1=np.matmul(w2.T,delte_2)*sigma_logit_1 #δ1--第二层神经元的梯度系数;np.array的“*”就是Hadamard乘积
    delte_bias1=delte_1
    delte_w1=np.matmul(delte_1,x.T)
    #print("δ1,Δw1:",delte_1,delte_w1)
    #print("delte_1,delte_w1:",delte_1,delte_w1)
    
    
    #更新各层权重
    w1=w1-delte_w1
    bias1=bias1-delte_bias1
    #print("new--w1&bias1:",w1,bias1)
    
    w2=w2-delte_w2
    bias2=bias2-delte_bias2
    #print("new--w2&bias2:",w2,bias2)
    
QianKui()
print(h1,y)
BackPropagation()

for i in range(100000):
    QianKui()
    #print(y)
    BackPropagation()
    #print('........................')
    
print(y)
print(w1)    
print(bias1)
print(w2,bias2)

 深度神经网络(多层感知机)反向传播算法(BP-back propagation)实现备忘录_第12张图片

经过十万步的往复,最终y的值与标签值只有千分之二的误差了。

你可能感兴趣的:(深度神经网络(多层感知机)反向传播算法(BP-back propagation)实现备忘录)