机器学习 | BP 神经网络
人工神经网络 (Artificial Neural Networks, ANN):神经网络是由具有适应性的简单单元组成的广泛并行互联的网络,它的组织能够模拟生物神经系统对真实世界物体所做出的交互反应。
1 神经元模型
人工神经网络的最小单位是神经元,其结构模拟了生物的神经元,具体结构如下:
(来源:维基百科,使用 CC BY-SA 3.0 协议)
图中左侧
写成向量形式:
其中激活函数
函数名 | 表达式 | 取值范围 |
---|---|---|
Sigmoid | ||
ReLU | ||
tanh |
2 网络结构
ANN 的结构种类有很多种,本轮讨论最经典的结构:多层前馈神经网络。它的结构特点是每层神经元与下一层神经元完全互联,神经元之间不存在同层连接,也不存在跨层连接。它包含三个层次,分别为输入层、隐藏层、输出层,输入层神经元接受外界输入,隐层和输出层神经元对信号进行处理加工,由输出层神经元输出。
一个简单的多层前馈神经网络如下:
从左到右分别是输入层、隐藏层、输出层,箭头上的数字代表连接权重
实际情况下,神经网络的结构不会这么简单,它的输入和输出节点数都可能很多,这样它的求解能力更强。例如下面的这个神经网络,接下来的文章将会以它作为例子:
该神经网络输入层有
- 输入层:输入和输出第
个神经元的数据记为 . - 输入层
隐藏层:输入层第 个神经元 隐藏层第 个神经元的连接权值记为 . - 隐藏层:输入第
个神经元的值记为 ,偏置为 ,输出为 . - 隐藏层
输出层:隐藏层第 个神经元 输出层第 个神经元的连接权值记为 . - 输出层:输入第
个神经元的值记为 ,偏置为 ,输出为 .
其中,激活函数
综上,该神经网络接受的输入为
:输入层到隐藏层的权值矩阵 :隐藏层的偏置向量 :隐藏层到输出层的权值矩阵 :输出层的偏置向量
参数量为
3 误差逆传播算法
神经网络要学习的实际上就是网络中的参数值,具体来说就是连接权值与偏置。我们需要找到一个合理的方法,通过输入的训练样本数据和样本标记,让神经网络自适应地学习出可以正确分类训练样本。后续就可以使用训练得到的参数,对实际数据进行分类。
误差逆传播 (error BackPropagation, BP) 算法是一个非常有代表的学习算法,利用它进行学习的神经网络叫做 BP 神经网络。
它分为两个阶段:
- 数据流的正向传播:将数据样本输入神经网络,求解出输出。
- 误差信号的反向传播:将输出与样本标签对比,将误差反向传播到每一个节点得到它们需要更新的梯度。
对于每一个训练样例,都会进行上面两个操作(实际的顺序和批次方式可以变化),对于正向传播过程,没有什么难点,就是
该算法核心在于误差的反向传播。首先需要计算误差值,这里使用均方误差 (Mean Squared Error, MSE). 对于第
表达式中的
只是为了便于求导时消去 ,它对误差的相对大小没有影响。 下面我们默认讨论第
个训练样本 ,省略 角标。
3.1 更新
对于
BP 算法使用梯度下降策略进行更新,给定学习率
对于
对于第一项:
对于第二项:
这里能直接转换成这个样子的原因是,对于 Sigmoid 函数,它的导数值 .
对于第三项:
为了简便,我们将第一项与第二项的积记为
综上:
3.2 更新
对于
链式求导:
对于第二项:
综上:
3.3 更新
对于
链式求导:
这里为什么多出来了个一个求和?原因是输入层
对于求和符号里的第三项:
对于求和符号外面的第一项:
对于求和符号外面的第二项:
为了简便,我们把求和符号和外面的第一项记为
综上:
3.4 更新
对于
链式求导:
对于求和符号外面的第一项:
综上:
3.5 总结
BP 算法的流程如下:
- 输入:训练集
; 学习率 . 过程:
- 在
范围随机初始化网络中的所有参数 - repeat
for all do 使用当前参数计算出当前样本输出 计算出 计算出 并更新参数值 end for- until 达到停止条件
- 在
- 输出:参数确定的 BP 神经网络
其中:
4 代码实现
以下是我使用 C++ 编写的简单神经网络的源代码,可以和上文的公式对照学习:
本文采用 CC BY-SA 4.0 许可,本文 Markdown 源码:Haotian-BiJi