赞
踩
反向传播神经网络
算法原理:
BP算法由信号的正向传播和误差的反向传播两个过程组成。
1、正向传播时,输入样本从输入层进入网络,经隐层逐层传递至输出层,如果输出层的实际输出与期望输出(导师信号)不同,则转至误差反向传播;如果输出层的实际输出与期望输出(导师信号)相同,结束学习算法。
2、反向传播时,将输出误差(期望输出与实际输出之差)按原通路反传计算,通过隐层反向,直至输入层,在反传过程中将误差分摊给各层的各个单元,获得各层各单元的误差信号,并将其作为修正各单元权值的根据。这一计算过程使用梯度下降法完成,在不停地调整各层神经元的权值和阈值后,使误差信号减小到最低限度。
函数的导数描述了函数局部的变化率。
权值和阈值不断调整的过程,就是网络的学习与训练过程,经过信号正向传播与误差反向传播,权值和阈值的调整反复进行,一直进行到预先设定的学习训练次数,或输出误差减小到允许的程度。
所以反向传播就是调整参数W和b的过程,使它的损失函数能够达到最小,但反向传播不是独立的,一定是伴随着正向传播的。
接下来讲解BP的整个过程原理,参考https://zhuanlan.zhihu.com/p/45190898
前向传播:未加偏置值b,f(x)为激活函数。
BP算法:w更新公式,C是损失函数,η是学习率
这里采用均方误差来讲述bp推导。t为预测值,y为真实值。t=f(al)=f(XLWL)
左边的数是一个非常重要的值,它是第 L层的误差向量。BP之所以叫做误差反向传播,就是来自于这个误差向量沿着从右往左的顺序的传播。
一个小例子
sigmoid函数:
这个是用的比较多的激活函数:
这个函数可以不用考虑小于零的情况,而大于零时,倒数等于1,向前传播时信号不会衰减。
他也不会只是一条直线,他是由直线组成的曲折边界。(凹凸)
首先用BP解决异或问题
import numpy as np
import matplotlib.pyplot as plt
#输入数据
X=np.array([[1,0,0],
[1,0,1],
[1,1,0],
[1,1,1]])
#标签
Y = np.array([[0,1,1,0]])#激活函数取值为0-1
#权值初始化,3行1列(因为有三个输入,一个输出),本来取值为0-1之间,减去0.5再乘2,取值范围-1到1
V = (np.random.random([3,4])-0.5)*2
W = (np.random.random([4,1])-0.5)*2
#学习率设置
lr = 0.11
def sigmoid(x):
return 1/(1+np.exp(-x))
def dsigmoid(x):
return x*(1-x)
def update():
global X,Y,V,W,lr
L1 = sigmoid(np.dot(X,V))#隐藏层输出(4,4)
L2 = sigmoid(np.dot(L1,W))#输出层输出(4,1)
L2_delta = (Y.T - L2)*dsigmoid(L2)#(4,4)
L1_delta = L2_delta.dot(W.T)*dsigmoid(L1)#(4,4)
W_C = lr*L1.T.dot(L2_delta)
V_C = lr*X.T.dot(L1_delta)
W = W + W_C
V = V + V_C
for i in range(20000):
update()
if i%500==0:
L1 = sigmoid(np.dot(X,V))
L2 = sigmoid((np.dot(L1,W)))
print('Error:',np.mean(np.abs(Y.T-L2)))
L1 = sigmoid(np.dot(X, V))
L2 = sigmoid((np.dot(L1, W)))
print(L2)
BP推导公式(部分)
输出:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。