【神经网络】3:BP神经网络解决异或问题
2018-01-21 11:34
465 查看
前言:依据当今神经网络的发展,80%以上的神经网络都是BP神经网络或者是它的升级版。
–—-—-—-—-—-—-—-—-—-—-—-—–—-—-—-—-—-—-—-——-—-—-–
–—-—-—-—-—-—-—-—-—-—-—-—–—-—-—-—-—-—-—-——-—-—-–
BP神经网络是1986年由Rumelhart和McClelland为首的科学家提出的概念;
BP——back propagation,也就是逆向传播的意思,通俗的说就是:用模型得到的预测值与真实值之间的误差,来影响改变之前各层间的权重
先介绍几个符号代表的意思:(都是向量式)
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_迭代计算,重复以上步骤,直到满足一定条件时,输出最后预测值
效果展示:
可以看到经过迭代,误差越来越小,最后逼近的值很接近标签项[0,1,1,0]
–—-—-—-—-—-—-—-—-—-—-—-—–—-—-—-—-—-—-—-——-—-—-–
–—-—-—-—-—-—-—-—-—-—-—-—–—-—-—-—-—-—-—-——-—-—-–
一、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]
相关文章推荐
- 线性神经网络(解决异或问题
- 机器学习+周志华+第五章习题+解决异或问题的单层RBF神经网络
- 【神经网络】1:单层感知器解决异或问题
- Tricks(四十)—— 神经网络解决与(或)及异或问题
- 【神经网络】BP算法解决XOR异或问题MATLAB版
- 神经网络学习笔记(十二):异或问题
- 神经网络解决分类问题步骤
- 【深度学习】神经网络异或问题
- 深度学习与神经网络学习与遇到的问题及解决(第一章)
- 【神经网络与深度学习】caffe静态链接库“Unknown layer type: Convolution (known types: )”和“ 磁盘空间不足”问题的解决办法
- 韩国庆尚大学jinju的神经网络解决XOR问题
- Tensorflow实例:神经网络解决二分类问题
- 线性神经网络处理异或问题
- TensorFlow训练神经网络解决二分类问题
- 深度神经网络:特点、问题及解决
- 机器学习笔记(XVII)神经网络(IV)BP算法和BP神经网络的一些问题
- Tensorflow简单神经网络解决Kaggle比赛Titanic问题
- 多层神经网络解决线性不可分问题【写给自己的博客】
- 基于Tensorflow的神经网络解决用户流失概率问题
- 机器学习/深度学习测试题(二)—— 单层线性神经网络求解异或问题