神经元:
受生物学的启发,人工神经网络是生物神经网络的一种模拟和近似。它从结构、实现机理和功能上模拟生物神经网络,传统的生物神经元模型由树突、细胞核、细胞体、突触和神经末梢组成,如图所示。
如图下图所示,神经元的输入xi对应生物神经元的树突。输入xi向细胞体传播脉冲,相当于输入权值参数wi,通过细胞核对输入的数据和权值参数进行加权求和。传播细胞体的脉冲相当于人工神经元的激活函数,最终输出结果y作为下一一个神经元的输入。
上述是人工神经网络的最基本的处理单元---------神经元,由连接、求和节点和激活函数组成:
连接:神经元中数据的流动表达方式。
求和节点:对输入信号和权值的乘积进行求和。
激活函数:一个非线性函数,对输出信号进行控制(激活函数原理与代码在下一节讲解)
为了方便理解,我们对神经元抽象,得到神经元的基本模型:
x1,x2,x3…,xn为输入信号的各个分量
w1,w2,w3…,wn为神经元的各个突触的权值
b为神经元的偏置参数
f为激活函数,一般为非线性函数,如Sigmoid、Tanh 函数等;
y为该神经元的输出。
所以神经元的基本模型为:
上述神经元的基本模型比较复杂,我们使用数学表达式对神经元的基本模型继续进行抽象,得到神经元的数学基本表达式为:
假设W=[w1,w2,…,wn]为权值向量,X=[x1,x2,…x n]为输入向量。一个神经元的基本功能是对输入向量X与权值向量W内积求和后并加上偏置参数b,经过非线性的激活函数f,得到y作为输出结果。因此神经元又可以使用矩阵形式表达为:
多层神经网络
人工神经网络由许多的神经元组合而成,神经元组成的信息处理网络具有并行分布结构,因此有了更复杂的人工神经网络。
一个人工神经网络由多个神经元结构组成,每一层的神经元都拥有输入和输出,每一层都是由多个神经元组成。第l-1层网络神经元的输出是第I层神经元的输入,输入的数据通过神经元上的激活函数来控制输出数值的大小。该输出数值是一个非线性值,通过激活函数求得数值,根据极限值来判断是否需要激活该神经元。
一般多层人工神经网络ANN由输入层、输出层和隐藏层组成。
1. 输入层(Input Layer):接收输入信号作为输入层的输入。
2. 输出层(Output Layer):信号在神经网络中经过神经元的传输、内积、激活后,形成输出信号进行输出。
3. 隐藏层(Hidden Layer):隐藏层也被称为隐层,它介于输入层和输出层之间,是由大量神经元并列组成的网络层,通常一个人工神经网络可以有多个隐层。
如图所示,一个三层的人工神经网络模型,从左到右开始,第1层为输入层,输入向量为[x1,x2,3];第2层为带有4个节点的隐层:第3层为输出层,输出向量为[y1,y2]。
在学习人工神经网络之前,我们需要了解如下内容。
1.人工神经网络输入层与输出层的节点数往往是固定的,根据数据本身而设定,隐层数和隐层节点则可以自由指定。
2.人工神经网络模型图中的箭头代表预测过程时数据的流向,与学习训练阶段的数据流动方向不同。
3.人工神经网络的关键不是节点而是连接,每层神经元与下一层的多个神经元相连接,每条连接线都有独自的权重参数。此外,连接线上的权重参数是通过训练得到的。
4.人工神经网络中不同层的节点间使用全连接的方式,也就是1-1层的所有节点对于l层的所有节点都会有相互连接。例如当前层有3个节点,下一层4个节点,那么连接线有3X4=12条,共12个权重值和4个偏置,偏置的数量依赖于下一层节点的数量而定。
训练与预测
在设计人工神经网络模型结构前,我们需要对输入和输出的数据进行量化。假设输入的数据有k个,输出为n个分类,那么输入层的神经元节点数应设置为k,输出层的神经元节点数应设置为n。隐层神经元节点的数目不确定,但其数目越多,神经网络的非线性越显著,从而增强人工神经网络的健壮性。习惯上,一般第l层神经元的节点数为1-1层节点数的1~ 1.5倍。
人工神经网络的训练实际上是通过算法不断修改权值向量W和偏置b,使其尽可能与真实的模型逼近,以使得整个神经网络的预测效果最佳。
具体做法:首先给所有权值向量W和偏置b赋予随机值,使用这些随机生成的权重参数值来预测训练数据中的样本。样本的预测值为少,真实值为y。现在定义一个损失函数,目标是使预测值^y尽可能接近于真实值y,损失函数就是使神经网络的损失值和尽可能小。其基本公式为:
现在问题转变为:如何改变神经网络中的参数W和b,让损失函数的值最小?
如何求损失函数的最小值,最终演化成为一个优化问题。对神经网络的优化就是对参数的优化,减少损失,直至损失收敛。为了解决该优化问题,可以使用梯度下降算法来优化网络中的参数W和b。于是又引入了反向传播算法,最终可以使用反向传播算法求得网络模型所有参数的梯度,通过梯度下降算法对网络的参数进行更新。
向前传播算法:
向前传播(Feed Forward)算法在神经网络的训练和预测阶段会被反复使用,是神经网络中最常见的算法。其计算方式简单,只需要根据神经网络模型的数据流动方向对输入的数据进行计算,最终得到输出的结果。
如图所示为一个简单的人工神经网络模型,其输入层有2个节点,隐层、输出层均有3个节点。下面我们通过矩阵的方式对向前传播算法进行解析。
假设z表示为第1层网络第i个神经元的输入,w为第l层网络第i个神经元到第1+1层网络中第j个神经元的连接,那么根据神经元基本公式有:
对图的神经网络的参数进行向量化,表示为:
那么有:
因此,单层神经网络的向前传播算法可以使用矩阵表达为:
反向传播算法:
为什么会有反向传播(Back Propagation, BP) 算法呢?如图所示,假设神经网络中的一个参数吃,发生了小幅度的改变,那么这个改变将会影响后续激活值的输出,下一层根据这个激活值继续往后传递该改变。如此- - 层一层地往后传递, 直到损失函数接收到该改变为止。最终这个小幅度的改变影响了整个网络,犹如在水面上划了一下,水波向外扩散影响了整个湖面的平静。
为了知道这个改变的幅度,我们选择从网络的最后一层(输出层)开始,利用损失函数向前求得每一层每一个神经元的误差,从而获得这个参数的梯度( 原始的小幅度的改变值)。
虽然在神经网络中,求网络参数的梯度不一定使用反向传播算法,并且反向传播算法有收敛慢、容易陷入局部最小解等缺点,但是其易用性、准确率却是其他求解梯度算法无法比拟的。因此在现代神经网络中,反向传播算法被广泛使用。
为了便于理解反向传播算法,这里举一个不太恰当的例子。现在有一个口述绘画游戏,第1个人看一幅画(输入数据),描述给第2个人(隐层) …依次类推,到最后一个人(输出)的时候,画出来的画肯定与原画不太像(误差较大)。下面开始反向传播算法,我们把画拿给最后-一个人看(计算损失函数),然后最后一个人告诉前面一个人下次描述时需要注意哪些地方画错了(通过损失计算梯度) …同样依次类推,直到第1个人。当然该例子可能会与真正的反向传播算法有一定的差别。
假设神经网络模型的参数为
,那么反向传播算法的精髓是:通过链式求导法则,求出网络模型中的每个参数的导数和。
1.理解计算图
计算图可以看作一种用来描述计算函数的语言,图中的节点代表函数的操作,边代表函数的输入。如图所示,计算图的函数为:
f(x,y,z)=f(x+y)*z
反向传播算法希望通过链式法则得到f的各个参数的梯度:
BP神经网络推导:
计算BP1输出层误差
计算BP2第l层误差
BP3损失函数关于偏置b的偏导