【机器学习】一文理解BP神经网络 附代码

本文将用尽可能通俗的语言讲解模型、公式,大量贴图(图文并茂),用异或的例子向刚入坑的朋友们来介绍BP神经网络概念、意义,后面会附上如何构建自己的神经网络,如何用python、R语言的代码实现。

在我认为,理解一个模型首先从“是什么,能干什么?”入手,由问题导向解决问题。

BP神经网络基于多层感知机(MLP),MLP是多层的全连接的前馈网络,是一种算法结构,由于仿照神经元的结构,被称为神经网络(还包括CNN,RNN,Transformer等)。

简而言之能解决现实生活中非线性的“分类”和“拟合”的问题。(后面我们会动手画一个神经网络来介绍如何分类

而BP是一种针对MLP的误差逆传播优化算法,能够具体求解神经网络中的参数。那么一个神经网络模型是由什么构成的呢?

【机器学习】一文理解BP神经网络 附代码_第1张图片

可以看到,一个神经网络由输入层(蓝色),中间为隐藏层,最后是输出层,而输入和节点之间连接的线上做了线性变换,例如隐藏层第一个节点记作L1,输入为L1=WX+b1,W被称作权重,B为偏置。

上面讲到神经网络可以解决非线性问题,但如果每条线都是类似y=ax+b的线性变换,那么最后的输出也将是线性的。所以在中间层要做非线性变换,设计一个函数使输出为f(L1)。这个函数被叫做激活函数。

上例子,如果我们将异或这一操作,X OR Y看作一个函数 f(x1,x2)=y,y∈(0,1),当y=1是为蓝色,y=0时为红色我们在图上进行表示

【机器学习】一文理解BP神经网络 附代码_第2张图片

显然在这种情况下找不到一条线来将红点蓝点分开(非线性可分),那么我们看构建如下的神经网络模型能否解决该问题。

【机器学习】一文理解BP神经网络 附代码_第3张图片

隐藏层的激活函数为阶跃函数,当输入值<=0时输入0,当输入值>1时输入1,由图我们可以看到,每一条线上的权重以及每一层的偏置,根据图中的例子大家可以动手算一下是否可以实现异或这一操作。

具体的python实现大家可以看下面这篇博客,其中用到了sigmoid这一激活函数。

代码-----神经网络实现异或逻辑操作

由于单层的感知机无法解决线性不可分问题,因此需要构建多层神经网络,但在人工神经网络(artificial neural network, ANN)发展初期,由于无法实现对多层神经网络(包括异或逻辑)的训练而造成了一场ANN危机。

最后BP算法的出现,才让训练带有隐藏层的多层神经网络成为可能。因此异或的实现在ANN的发展史是也是具有里程碑意义的。异或之所以重要,是因为它相对于其他逻辑关系,例如与(AND), 或(OR)等,但异或是线性不可分的。

上面提到,神经网络的学习训练中困难主要蕴含在权重和阈值中,多层网络使用上面简单感知机的权重调整规则显然不够用了,那么BP算法(误差逆传播)是如何求得参数的呢?

【机器学习】一文理解BP神经网络 附代码_第4张图片【机器学习】一文理解BP神经网络 附代码_第5张图片 

误差E=Σ(Y-y)^2,通过梯度下降的过程来理解,我们要对每一层的Wi,Bi求偏导数p,更新的W0=W1-p|W1,只有当偏导数为0的时候W才不会更新,对第k+1层求导如下

【机器学习】一文理解BP神经网络 附代码_第6张图片

通过每一层之间的求导,我们可以找到第n层和第n-1层偏导数之间的关系,通过链式求导法则,构建一个递推式如下图:

【机器学习】一文理解BP神经网络 附代码_第7张图片

同理,偏置b的求解如下:

【机器学习】一文理解BP神经网络 附代码_第8张图片

(具体的推导过程,大家可以看一下小破站大海老师的原理讲解)

由原理我们发现,BP算法是一个反向的推导过程,因此叫做逆传播、反向传播

详细的实现代码大家可以参考这一篇,后期我会给大家写一个自己实现的过程记录。

神经网络学习(3)————BP神经网络以及python实现_就是这个七昂的博客-CSDN博客_bp神经网络python

或者你也可以选择调用sklearn中的mlp包来快速地进行使用

from sklearn.neural_network import MLPRegressor
model = MLPRegressor(hidden_layer_sizes=(30,), random_state=10,learning_rate_init=0.01)  # BP神经网络回归模型,具体参数大家百度
model.fit(X,y)  # 训练模型
pre = model.predict(X_pre)#进行预测

在R语言中,这样来使用

library(neuralnet)
library(RSNNS)
library(forecast)
# fit 
fit <- nnetar(data,p = 9,size = 10,repeats = 50,lambda = 0)//p是滞后阶数可以不设置
plot(fit)
#plot(forecast(fit,5))//预测未来五天的值

在理解原理的基础上,让我们一起来动手实现自己的BP神经网络吧!欢迎大家一起探讨、交流!☺

你可能感兴趣的:(机器学习,神经网络,cnn,人工智能,机器学习,算法)