BP神经网络-入门原理、公式推导、例子

一、BP神经网络入门-人工神经元

要说BP神经网络,那得从人工神经元开始。
我们都知道,神经元的生物原理无非就是信号传递。而人工神经元就是模拟生物学中单个神经元的结构,如下:
在这里插入图片描述
如图所示,单个神经元,它以权重w接收各个输入,这时候就是神经元的值了:
w 1 ∗ x 1 + w 2 ∗ x 2 w_1*x_1+w_2*x_2 w1x1+w2x2
好了,接下来呢,神经元传递出去的值,是经过激活后的值,最早的是使用sigmoid函数来作为激活函数,则总体传出去的值为:
y = sigmoid ( w 1 ∗ x 1 + w 2 ∗ x 2 + b ) y = \text{sigmoid}(w_1*x_1+w_2*x_2+b) y=sigmoid(w1x1+w2x2+b)
其中,
sigmoid = 1 1 + e − x \text{sigmoid} = \dfrac{1}{1+e^{-x}} sigmoid=1+ex1
为什么激活时需要加上一个阈值b呢,这是为了表示神经元自身的激活难度。
我们先看看sigmoid的图像:
在这里插入图片描述

可以看到,sigmoid就是一个S型单调递增曲线,它取值为(0,1)之间,而神经元传递出去的值
y =sigmoid(w1*x1+w2*x2+b)其实是神经元的激活概率,也就是神经元传递信号"1"的期望值。所以阈值b越大,那么激活值sigmoid自然也大,因此它就代表了神经元激活的容易程度。

二、BP神经网络-正式来看看模型结构

上面说了人工神经元的结构了,下面我们就来说说用人工神经元堆叠出来的BP神经网络了。它的模型结构如下:
在这里插入图片描述
这其实就非常容易理解,它其实还是这么一回事,我们先来看隐层,它的隐层的值就为:
h = tanh ( w ∗ x + b ) h= \text{tanh}(w*x+b) h=tanh(wx+b)
只是这里我们不再是单个神经元了,所以x和h都是向量。这里我们同时把激活函数替换为tanh,这是后来的习惯了,不再守着sigmoid函数,因为大家发现tanh比sigmoid效果更好。在matlab中一般用tansig来表示tanh,其实就是tanh型sigmoid函数。
在得到隐层后,我们可以继续把它作为输入,进一步前馈到下一层,得到输出:

y = w ^ ∗ h + b ^ y= \hat{w}*h+\hat{b} y=w^h+b^
大家可以看到,这里我们不再对它进行激活,或者说激活函数为恒等函数y=x,之所以不用tanh来激活,是如果用了tanh这类的S型函数,那么模型的输出范围就会被限制了。

三、BP神经网络-训练方法

上面我们已经得到了BP神经网络模型,下一步我们就可以用它来拟合任意的关系了。
假设我们有一批数据:
在这里插入图片描述
我们希望在BP的输入端输入x1、x2时,它能输出与我们的y一致。那要怎么办呢?只需要对BP神经网络模型中的w,b这些参数进行训练就可以了,通过调整w,b,来使模型的输出误差尽量小。
在这里插入图片描述
也就是,求一组w,b,使得上述的MSE最小化。
这个没办法求,只能用梯度下降之类的算法来进行优化,这个优化w,b的过程,就是BP神经网络的训练过程了。

四、说说梯度下降算法

‌梯度下降法‌(Gradient descent)是一种一阶‌优化算法‌,用来寻找函数的局部极小值,是机器学习中最常用的优化方法之一,它的原理如下:
在这里插入图片描述
如图所示,梯度下降算法先取一个初始值x0,然后进行迭代,每次都往梯度的反方向调整它,直到梯度很小。为什么梯度很小就停止训练呢?因为极值处的梯度为0,梯度很小就意味着可能达到局部最低点附近了。
梯度下降算法的流程如下:

  1. 初始化参数‌:用随机值初始化需要优化的参数(权重和阈值),设定学习率。
  2. 计算梯度‌:对目标函数求偏导,得到当前参数对应的梯度。
  3. 更新参数‌:沿着梯度的反方向,按公式 新参数=原参数−学习率×梯度 更新参数。
  4. ‌终止判断‌:重复2、3步,直到达到指定迭代次数或梯度过小,输出最终参数结果。

使用梯度下降法,就必须知道目标函数的梯度,对于BP神经网络,那就是MSE函数中各个参数的偏导数了,可以参考《老饼讲解-BP神经网络-梯度推导

五、BP神经网络-实践例子

虽然我们也可以用算法流程来编写一个BP神经网络,但这就需要计算复杂的梯度公式了,为防止劝退,这里我们直接用matlab的工具箱来训练一个BP神经网络。

load acetylene.mat                                     % 加载acetylene数据
setdemorandstream(88888);                              % 指定随机种子,这样每次训练出来的网络都一样
% 数据加载
X = [x1,x2,x3]';                                       % 将x1,x2,x3作为输入数据
Y = y';                                                % 将y作为输出数据

% 模型训练
net = newff(X,Y,4,{'tansig','purelin'},'trainlm');     % 初始化BP神经网络
net.trainparam.goal = 0.0001;                          % 训练目标:均方误差低于0.0001
net.trainparam.show = 400;                             % 每训练400次展示一次结果
net.trainparam.epochs = 15000;                         % 最大训练次数:15000.
[net,tr] = train(net,X,Y);                             % 调用matlab自带的train函数训练网络

% 模型预测
py = sim(net,X);                                       % 调用matlab的sim函数得到网络的预测值
figure;                                                % 新建画图窗口窗口
t = 1:length(py);                                      % 数据的序号
plot(t,Y,'*',t,py,'o')                                 % 画图,对比原来的y和网络预测的y
legend('真实值','预测值')                              % 展示图例

可以看到BP神经网络的拟合结果如下:
在这里插入图片描述
非常棒!BP神经网络的预测值与样本的真实值基本都是一致的,只有微小的误差。

结束语

好了,学多嚼不烂,简简单单入门就好啦。
更多内容可以参考:《老饼讲解-BP神经网络

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老饼讲解-BP神经网络

请老饼喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值