【深度学习】2:BP算法原理,并解决异或问题

前言:

依据当今神经网络的发展,80%以上的神经网络都是BP神经网络或者是它的升级版。

---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------

一、BP神经网络的介绍

作为最经典的神经网络,简单介绍一下:

  • BP神经网络是1986年由Rumelhart和McClelland为首的科学家提出的概念;
  • BP——back propagation,也就是逆向传播的意思,通俗的说就是:用模型得到的预测值与真实值之间的误差,来影响改变之前各层间的权重

1、BP算法介绍

这里写图片描述

先介绍几个符号代表的意思:(都是向量式

  • X——输入值(数据项);Y——真实值(标签项)
  • V——输入层连接隐藏层的权重;W——隐藏层连接输出层的权重
  • L1——隐藏层的值(输入层的值X经过权重V作用后的输出值)
  • L2——预测值(隐藏层的值L1经过权重W作用后的输出值,也就是模型预测值)

BP算法的工作流程:

  1. 输入值X经过权重V的作用,再通过激活函数处理,得到隐藏层的输入值L1
  2. 同时L1也是隐藏层的输出值,L1经过权重W的作用,再经过激活函数处理,得到预测值L2
  3. 用梯度下降法计算输出层的误差改变量:真实值Y与预测值L2之间的误差与L2的负梯度相乘,得到输出层的误差改变量L2_delta
  4. 用梯度下降法计算隐藏层的误差改变量:用输出层的误差改变量L2_delta乘权重W再与L1的负梯度相乘,得到隐藏层的误差改变量L1_delta
  5. 各层误差改变量与学习率相乘,再与各层原有权重相加,得到更新后权重V_、W_
  6. 用更新后的权重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框架简单介绍
---------------------------------------------------------------------------------------------------------------------

  • 6
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值