Loading...
墨滴

zcongfly

2021/12/19  阅读:53  主题:自定义主题1

试着用人话讲一下BP神经网络

BP(back propagation)神经网络是1986年由Rumelhart和McClelland为首的科学家提出的概念,是一种按照误差逆向传播算法训练的多层前馈神经网络,是应用最广泛的神经网络模型之一。

听着好复杂的样子......

小拾最近学了下相关的算法,发现网上的大多数解释都把这个概念复杂化了,就想着把整个流程用人话给讲解一遍 (如果你也同意是人话),也算是对自己上一阶段的一个总结。

基本概念

熟悉生物学的都知道,膝跳反射是一种最为简单的反射类型,其完成过程仅由两个神经元(感觉神经元和运动神经元)组成。感觉神经元接收刺激,产生兴奋,引发内外正负电位的变换并释放神经递质,神经递质将信息带给运动神经元,引发膝跳反射。

图1 膝跳反射
图1 膝跳反射

需要注意的是,并不是任何强度的刺激都能成功引起膝跳反射,只有当刺激强度引起的内外电位差超过了某一阈值,该神经元才被“激活”,进而释放出神经递质,引起兴奋或者抑制。

因此,在神经网络的相关算法中,需要定义一个激活函数 (Activate function),当传导过来的变量信息超过给定的阈值 (Threshold),激活函数便开始进行下一步的处理和运算。

图2 M-P神经元模型
图2 M-P神经元模型

例如图2中,输入 个变量并各自赋予一个连接权值 ,当输入的变量之和超过阈值时,执行激活函数:

每一个神经元都可以给定一个激活函数,各个神经元之间按照一定的规则顺序相连,并赋予不同的连接权重。每一个神经元都有其特定的运算规则,上一个神经元的输出即作为下一个神经元的输入,这样的很多个神经元连接在一起,便形成一个庞大的神经网络,因此,神经网络几乎可以完成大多数复杂问题的模拟。

“与、或、非”的运算

为了进一步讲清楚神经网络的传递过程,这里采用吴恩达[1]老师课程中的例子,用神经网络模拟一次“与、或、非”的运算。

首先引入一个经典的Sigmoid函数:

函数的图像是这样子滴:

图3 Sigmoid函数
图3 Sigmoid函数

观察函数图像,容易发现它的两个典型特征:①.纵轴 的取值范围在0~1之间,且以0.5为分界点;②.横轴 以0为分界点,且当 时, 的值就已经无限趋近于0或1。

有什么用呢?

假设有这样一个神经元,将它的激活函数设置为Sigmoid函数,那么,从上游神经元传来的输入变量经激活函数处理后,只要输入变量绝对值大于1,输出结果就无限趋近于0或者1,分别代表是或者不是,也就是我们常说的0-1变量。

也有人直接将 值直接作为事件发生的概率,只要概率大于0.5,就认为该事件可能发生,换句话说,只要 ,就可以认为输出值为1。

再回到逻辑“与”的运算,假设 ,构造这样一个神经元:

图5 神经元模拟“与”运算
图5 神经元模拟“与”运算

在该神经元中,偏置变量(这里对阈值 做了一定处理)+1、变量 分别赋予连接权重-30、20、20,那么,神经元输出函数可表示为:

的取值即对应的结果如下表:

0 0 Sigmoid(-30)=0
0 1 Sigmoid(-10)=0
1 0 Sigmoid(-10)=0
1 1 Sigmoid(10)=1

表中可以看出,只有当 同时取1时,输出结果才是1。同样的,改变三个变量对应的权值,可以分别实现“或”、“非”运算:

图6 神经元模拟“或”(左)、“非”(右)运算
图6 神经元模拟“或”(左)、“非”(右)运算

这是单个神经元配合Sigmoid函数实现的功能,任意调整三个变量的连接权重,可以让单个神经元实现不同的功能。那么,如果我要实现当 相等时输出1,不相等时输出0(“同或”运算,用符号“XNOR”表示),该怎么做呢?

你也可以尝试调整一下三个变量的连接权重,看看能不能通过单个神经元实现 (实际上是不可能的) 。这里给出一种实现“同或”运算的方式,那就是将模拟“与”、“或”、“非”三种运算的神经元进行一个组合:

图7 “同或”运算(蓝色的为(NOT $ x_1 $)AND(NOT $ x_1 $))
图7 “同或”运算(蓝色的为(NOT )AND(NOT ))

组合后的运算过程如下表所示:

0 0 Sigmoid(-30)=0 Sigmoid(10)=1 Sigmoid(10)=1
0 1 Sigmoid(-10)=0 Sigmoid(-10)=0 Sigmoid(-10)=0
1 0 Sigmoid(-10)=0 Sigmoid(-10)=0 Sigmoid(-10)=0
1 1 Sigmoid(10)=1 Sigmoid(-30)=0 Sigmoid(30)=1

上表解释了多个神经元之间的信息传递过程,这一过程有个专业的名词,叫前向传播(Forward propagation)。如果求解的问题再复杂些,则需要更多神经元的参与,理论上,只要神经元的数目足够多,就可以求解足够复杂的问题,这也是神经网络应用得如此广泛的原因。

感知学习

看到这里,你应该大致明白了神经网络算法的具体运算过程,说白了,前向传播算法就是将上一个神经元的输出作为下一个神经元的输入,一直传递到最后产生一个完整的输出。

如果是规则比较明确的问题倒还好办,确定各个神经元之间的连接权重和激活函数,剩下的交给程序就好了。但如果问题的规则比较模糊呢?或者说,对于一个优化问题,你凭什么说,按照你给的规则求解出的结果就是最优的呢?

一个好的算法除了具备正向求解的功能外,一般还要求具有自主寻找最优解的功能,这就引出了本篇文章的重头戏——感知学习。

在讲感知学习之前,先回顾下最简单的线性回归算法:我给你一系列点,要求你根据这一系列点,预测一下未来的1~3个点会出现在图上的什么位置。你大笔一挥给我画了一条直线,告诉我,未来的那几个点会在这条直线上。

图8 线性回归
图8 线性回归

为什么?

很简单啊,因为这条线与所给出的点之间的距离的误差平方和最小,这就是大名鼎鼎的最小二乘法。 (emmmm孺子可教也)

是的,不论是一个变量还是 个变量,不论是线性还是非线性,衡量你规则制定得是否合理的关键两字:误差,误差越小,说明对于所给出的样本点中,拟合效果越好。

(事实上,对于有限的样本集,误差也并非越小越好,如果你感兴趣,可以问问度娘“过拟合(Overfitting)”的概念。处理过拟合现象也有相应的方法,为简化问题,本文不考虑过拟合的情况)

我们用误差平方和(SSE)来衡量误差的大小,而使误差尽可能小也有一个经典的算法——梯度下降法(Gradient algorithm),又是熟悉的名字啊(其实最小二乘法也可以看成是特殊版的梯度下降法)。

图9 梯度下降法效果图
图9 梯度下降法效果图

梯度下降法的基本步骤就是,先根据最开始设置的规则求解出成本函数 (Cost function),这里的成本函数即设置为误差平方和,然后对各个权值求偏导并进行反复的更新迭代,直到新的成本函数值小于某个特定值。

式中 为给定数据集的样本值, 为前向传播算法计算得到的预测值( ), { }表示权值的集合。

梯度下降法的迭代公式为:

式中 被称为学习率,它的大小决定了梯度下降的收敛效果。

回到本文构建的神经网络,对于

这个函数,我们也需要遵照梯度下降法的原理,对 进行迭代,以找到误差最小的那个权值。

图10 BP网络即算法中的变量符号
图10 BP网络即算法中的变量符号

根据图10(摘自西瓜书[2])中的变量符号,对输出层的偏导进行推导,,由于篇幅所限,这里不再推导 (其实是因为公式太难打了) 。如果你数学比较好的话,你会得到这样一个神奇的式子:

式中 表示现有数据集中的真实值,注意到变量 既相当于输出层的输入变量,又是隐层的输出变量,换句话说, 就是隐层和输出层联系的桥梁。

由此引出反向误差传播算法(Back propagation),即从输出层入手,逐层反向求各个参数的偏导,然后按照梯度下降的规则进行迭代,从而找到最优参数。

(图源网络[3],侵删)

参考资料

[1]

吴恩达机器学习: coursera上的机器学习课程,B站上也有同名的搬运。

[2]

西瓜书: 周志华.机器学习[M].北京:清华大学出版社,2016.

[3]

图片来源: 文中图片一部分来源于吴恩达老师的课件截图,一部分来源于西瓜书。

zcongfly

2021/12/19  阅读:53  主题:自定义主题1

作者介绍

zcongfly