前言:
依据当今神经网络的发展,80%以上的神经网络都是BP神经网络或者是它的升级版。
–-----------------------------------------------------------------------------—----------------------------------------
–-----------------------------------------------------------------------------—----------------------------------------
一、BP神经网络的介绍
作为最经典的神经网络,简单介绍一下:
- BP神经网络是1986年由Rumelhart和McClelland为首的科学家提出的概念;
- BP——back propagation,也就是逆向传播的意思,通俗的说就是:用模型得到的预测值与真实值之间的误差,来影响改变之前各层间的权重
1、BP算法介绍
先介绍几个符号代表的意思:(都是向量式)
- X——输入值(数据项);Y——真实值(标签项)
- V——输入层连接隐藏层的权重;W——隐藏层连接输出层的权重
- L1——隐藏层的值(输入层的值X经过权重V作用后的输出值)
- L2——预测值(隐藏层的值L1经过权重W作用后的输出值,也就是模型预测值)
BP算法的工作流程:
- 输入值X经过权重V的作用,再通过激活函数处理,得到隐藏层的输入值L1
- 同时L1也是隐藏层的输出值,L1经过权重W的作用,再经过激活函数处理,得到预测值L2
- 用梯度下降法计算输出层的误差改变量:真实值Y与预测值L2之间的误差与L2的负梯度相乘,得到输出层的误差改变量L2_delta
- 用梯度下降法计算隐藏层的误差改变量:用输出层的误差改变量L2_delta乘权重W再与L1的负梯度相乘,得到隐藏层的误差改变量L1_delta
- 各层误差改变量与学习率相乘,再与各层原有权重相加,得到更新后权重V_、W_
- 用更新后的权重V_、W_迭代计算,重复以上步骤,直到满足一定条件时,输出最后预测值
–-----------------------------------------------------------------------------—----------------------------------------
2、BP神经网络解决异或
# -*- coding:utf-8 -*-
# -*- author:zzZ_CMing
# -*- 2018/01/12;14:37
# -*- python3.5
import numpy as np
lr = 0.11 #学习速率
#输入数据分别:偏置值,x1,x2
X = np.array([[1,0,0],
[1,0,1],
[1,1,0],
[1,1,1]])
#标签
Y = np.array([[0,1,1,0]])
# 权重初始化,取值范围-1到1
V = np.random.random((3,4))*2-1
W = np.random.random((4,1))*2-1
#print('输入层连接隐藏层的权值V:',V)
#print('隐藏层连接输出层的权值W:',W)
def sigmoid(x):
return 1/(1+np.exp(-x))
def dsigmoid(x):
return x*(1-x)
#更新权重函数
def get_update():
global X,Y,W,V,lr
# L1:输入层传递给隐藏层的值;输入层3个节点,隐藏层4个节点
# L2:隐藏层传递到输出层的值;输出层1个节点
L1 = sigmoid(np.dot(X,V))
L2 = sigmoid(np.dot(L1,W))
# L2_delta:输出层的误差改变量
# L1_delta:隐藏层的误差改变量
L2_delta = (Y.T - L2)*dsigmoid(L2)
L1_delta = L2_delta.dot(W.T)*dsigmoid(L1)
# W_C:输出层对隐藏层的权重改变量
# V_C:隐藏层对输入层的权重改变量
W_C = lr * L1.T.dot(L2_delta)
V_C = lr * X.T.dot(L1_delta)
# 更新后的权重
W = W + W_C
V = V + V_C
def main():
for i in range(10000):
get_update()
if i%500 == 0:
L1 = sigmoid(np.dot(X, V))
L2 = sigmoid(np.dot(L1, W))
print('当前误差',np.mean(np.abs(Y.T - L2)))
L1 = sigmoid(np.dot(X, V))
L2 = sigmoid(np.dot(L1, W))
print('最后逼近值:',L2)
if __name__ == "__main__":
main()
效果展示:
可以看到经过迭代,误差越来越小,最后逼近的值很接近标签项[0,1,1,0]
系列推荐:
【监督学习】1:KNN算法实现手写数字识别的三种方法
–-----------------------------------------------------------------------------—----------------------------------------
【无监督学习】1:K-means算法原理介绍,以及代码实现
【无监督学习】2:DBSCAN算法原理介绍,以及代码实现
【无监督学习】3:Density Peaks聚类算法(局部密度聚类)
–-----------------------------------------------------------------------------—----------------------------------------
【深度学习】1:感知器原理,以及多层感知器解决异或问题
【深度学习】2:BP神经网络的原理,以及异或问题的解决
【深度学习】3:BP神经网络识别MNIST数据集
【深度学习】4:BP神经网络+sklearn实现数字识别
【深度学习】5:CNN卷积神经网络原理、MNIST数据集识别
【深度学习】8:CNN卷积神经网络识别sklearn数据集(附源码)
【深度学习】6:RNN递归神经网络原理、MNIST数据集识别
【深度学习】7:Hopfield神经网络(DHNN)原理介绍
–-----------------------------------------------------------------------------—----------------------------------------
TensorFlow框架简单介绍
–-----------------------------------------------------------------------------—----------------------------------------