一、BP神经网络入门-人工神经元
要说BP神经网络,那得从人工神经元开始。
我们都知道,神经元的生物原理无非就是信号传递。而人工神经元就是模拟生物学中单个神经元的结构,如下:

如图所示,单个神经元,它以权重w接收各个输入,这时候就是神经元的值了:
w
1
∗
x
1
+
w
2
∗
x
2
w_1*x_1+w_2*x_2
w1∗x1+w2∗x2
好了,接下来呢,神经元传递出去的值,是经过激活后的值,最早的是使用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(w1∗x1+w2∗x2+b)
其中,
sigmoid
=
1
1
+
e
−
x
\text{sigmoid} = \dfrac{1}{1+e^{-x}}
sigmoid=1+e−x1
为什么激活时需要加上一个阈值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(w∗x+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,梯度很小就意味着可能达到局部最低点附近了。
梯度下降算法的流程如下:
- 初始化参数:用随机值初始化需要优化的参数(权重和阈值),设定学习率。
- 计算梯度:对目标函数求偏导,得到当前参数对应的梯度。
- 更新参数:沿着梯度的反方向,按公式 新参数=原参数−学习率×梯度 更新参数。
- 终止判断:重复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神经网络》

12万+

被折叠的 条评论
为什么被折叠?



