神经元:

受生物学的启发,人工神经网络是生物神经网络的一种模拟和近似。它从结构、实现机理和功能上模拟生物神经网络,传统的生物神经元模型由树突、细胞核、细胞体、突触和神经末梢组成,如图所示。

人工神经网络回归预测模型python 人工神经网络拟合_人工神经网络回归预测模型python

如图下图所示,神经元的输入xi对应生物神经元的树突。输入xi向细胞体传播脉冲,相当于输入权值参数wi,通过细胞核对输入的数据和权值参数进行加权求和。传播细胞体的脉冲相当于人工神经元的激活函数,最终输出结果y作为下一一个神经元的输入。

人工神经网络回归预测模型python 人工神经网络拟合_反向传播算法_02


上述是人工神经网络的最基本的处理单元---------神经元,由连接、求和节点和激活函数组成:

连接:神经元中数据的流动表达方式。

求和节点:对输入信号和权值的乘积进行求和。

激活函数:一个非线性函数,对输出信号进行控制(激活函数原理与代码在下一节讲解)

为了方便理解,我们对神经元抽象,得到神经元的基本模型:
x1,x2,x3…,xn为输入信号的各个分量
w1,w2,w3…,wn为神经元的各个突触的权值
b为神经元的偏置参数

人工神经网络回归预测模型python 人工神经网络拟合_人工神经网络_03

f为激活函数,一般为非线性函数,如Sigmoid、Tanh 函数等;
y为该神经元的输出。

所以神经元的基本模型为:

人工神经网络回归预测模型python 人工神经网络拟合_神经网络_04


上述神经元的基本模型比较复杂,我们使用数学表达式对神经元的基本模型继续进行抽象,得到神经元的数学基本表达式为:

人工神经网络回归预测模型python 人工神经网络拟合_人工神经网络回归预测模型python_05


假设W=[w1,w2,…,wn]为权值向量,X=[x1,x2,…x n]为输入向量。一个神经元的基本功能是对输入向量X与权值向量W内积求和后并加上偏置参数b,经过非线性的激活函数f,得到y作为输出结果。因此神经元又可以使用矩阵形式表达为:

人工神经网络回归预测模型python 人工神经网络拟合_神经网络_06

多层神经网络

    人工神经网络由许多的神经元组合而成,神经元组成的信息处理网络具有并行分布结构,因此有了更复杂的人工神经网络。

    一个人工神经网络由多个神经元结构组成,每一层的神经元都拥有输入和输出,每一层都是由多个神经元组成。第l-1层网络神经元的输出是第I层神经元的输入,输入的数据通过神经元上的激活函数来控制输出数值的大小。该输出数值是一个非线性值,通过激活函数求得数值,根据极限值来判断是否需要激活该神经元。

    一般多层人工神经网络ANN由输入层、输出层和隐藏层组成。

                1. 输入层(Input Layer):接收输入信号作为输入层的输入。

                2. 输出层(Output Layer):信号在神经网络中经过神经元的传输、内积、激活后,形成输出信号进行输出。

                3. 隐藏层(Hidden Layer):隐藏层也被称为隐层,它介于输入层和输出层之间,是由大量神经元并列组成的网络层,通常一个人工神经网络可以有多个隐层。

人工神经网络回归预测模型python 人工神经网络拟合_反向传播算法_07


如图所示,一个三层的人工神经网络模型,从左到右开始,第1层为输入层,输入向量为[x1,x2,3];第2层为带有4个节点的隐层:第3层为输出层,输出向量为[y1,y2]。

在学习人工神经网络之前,我们需要了解如下内容。

    1.人工神经网络输入层与输出层的节点数往往是固定的,根据数据本身而设定,隐层数和隐层节点则可以自由指定。
    2.人工神经网络模型图中的箭头代表预测过程时数据的流向,与学习训练阶段的数据流动方向不同。
    3.人工神经网络的关键不是节点而是连接,每层神经元与下一层的多个神经元相连接,每条连接线都有独自的权重参数。此外,连接线上的权重参数是通过训练得到的。
    4.人工神经网络中不同层的节点间使用全连接的方式,也就是1-1层的所有节点对于l层的所有节点都会有相互连接。例如当前层有3个节点,下一层4个节点,那么连接线有3X4=12条,共12个权重值和4个偏置,偏置的数量依赖于下一层节点的数量而定。

训练与预测

                                                        

人工神经网络回归预测模型python 人工神经网络拟合_神经网络_08

现在问题转变为:如何改变神经网络中的参数W和b,让损失函数的值最小?

      如何求损失函数的最小值,最终演化成为一个优化问题。对神经网络的优化就是对参数的优化,减少损失,直至损失收敛。为了解决该优化问题,可以使用梯度下降算法来优化网络中的参数W和b。于是又引入了反向传播算法,最终可以使用反向传播算法求得网络模型所有参数的梯度,通过梯度下降算法对网络的参数进行更新。

向前传播算法:

向前传播(Feed Forward)算法在神经网络的训练和预测阶段会被反复使用,是神经网络中最常见的算法。其计算方式简单,只需要根据神经网络模型的数据流动方向对输入的数据进行计算,最终得到输出的结果。

如图所示为一个简单的人工神经网络模型,其输入层有2个节点,隐层、输出层均有3个节点。下面我们通过矩阵的方式对向前传播算法进行解析。

人工神经网络回归预测模型python 人工神经网络拟合_人工神经网络_09


假设z表示为第1层网络第i个神经元的输入,w为第l层网络第i个神经元到第1+1层网络中第j个神经元的连接,那么根据神经元基本公式有:

                                                    

人工神经网络回归预测模型python 人工神经网络拟合_人工神经网络_10


对图的神经网络的参数进行向量化,表示为:

                                                    

人工神经网络回归预测模型python 人工神经网络拟合_神经网络_11


那么有:

                                                    

人工神经网络回归预测模型python 人工神经网络拟合_反向传播算法_12


因此,单层神经网络的向前传播算法可以使用矩阵表达为:                                                    

人工神经网络回归预测模型python 人工神经网络拟合_人工神经网络回归预测模型python_13

反向传播算法:

          为什么会有反向传播(Back Propagation, BP) 算法呢?如图所示,假设神经网络中的一个参数吃,发生了小幅度的改变,那么这个改变将会影响后续激活值的输出,下一层根据这个激活值继续往后传递该改变。如此- - 层一层地往后传递, 直到损失函数接收到该改变为止。最终这个小幅度的改变影响了整个网络,犹如在水面上划了一下,水波向外扩散影响了整个湖面的平静。

人工神经网络回归预测模型python 人工神经网络拟合_人工神经网络_14


          为了知道这个改变的幅度,我们选择从网络的最后一层(输出层)开始,利用损失函数向前求得每一层每一个神经元的误差,从而获得这个参数的梯度( 原始的小幅度的改变值)。

          虽然在神经网络中,求网络参数的梯度不一定使用反向传播算法,并且反向传播算法有收敛慢、容易陷入局部最小解等缺点,但是其易用性、准确率却是其他求解梯度算法无法比拟的。因此在现代神经网络中,反向传播算法被广泛使用。

          为了便于理解反向传播算法,这里举一个不太恰当的例子。现在有一个口述绘画游戏,第1个人看一幅画(输入数据),描述给第2个人(隐层) …依次类推,到最后一个人(输出)的时候,画出来的画肯定与原画不太像(误差较大)。下面开始反向传播算法,我们把画拿给最后-一个人看(计算损失函数),然后最后一个人告诉前面一个人下次描述时需要注意哪些地方画错了(通过损失计算梯度) …同样依次类推,直到第1个人。当然该例子可能会与真正的反向传播算法有一定的差别。

假设神经网络模型的参数为

人工神经网络回归预测模型python 人工神经网络拟合_反向传播算法_15

,那么反向传播算法的精髓是:通过链式求导法则,求出网络模型中的每个参数的导数

人工神经网络回归预测模型python 人工神经网络拟合_人工神经网络回归预测模型python_16


人工神经网络回归预测模型python 人工神经网络拟合_反向传播算法_17


1.理解计算图
计算图可以看作一种用来描述计算函数的语言,图中的节点代表函数的操作,边代表函数的输入。如图所示,计算图的函数为:

                                        

人工神经网络回归预测模型python 人工神经网络拟合_反向传播算法_18

反向传播算法希望通过链式法则得到f的各个参数的梯度:

人工神经网络回归预测模型python 人工神经网络拟合_反向传播算法_19

BP神经网络推导:

人工神经网络回归预测模型python 人工神经网络拟合_人工神经网络_20


人工神经网络回归预测模型python 人工神经网络拟合_人工神经网络回归预测模型python_21


人工神经网络回归预测模型python 人工神经网络拟合_人工神经网络_22


人工神经网络回归预测模型python 人工神经网络拟合_反向传播算法_23

计算BP1输出层误差

人工神经网络回归预测模型python 人工神经网络拟合_神经网络_24

计算BP2第l层误差

人工神经网络回归预测模型python 人工神经网络拟合_神经网络_25


人工神经网络回归预测模型python 人工神经网络拟合_人工神经网络回归预测模型python_26

BP3损失函数关于偏置b的偏导

人工神经网络回归预测模型python 人工神经网络拟合_神经网络_27


人工神经网络回归预测模型python 人工神经网络拟合_人工神经网络回归预测模型python_28

BP4损失函数关于权值w的偏导

人工神经网络回归预测模型python 人工神经网络拟合_人工神经网络_29

反向传播算法流程

利用反向传播算法的4个基本方程,可以很清晰地对反向传播算法流程进行总结。
●输入(Input); 输入层输入向量x。向前传播(Feed Forward):计算z,输出层误差(Output Error):根据公式BP1计算误差向量
●反向传播误差(Backpropagate Error): 根据公式BP2逐层反向计算每一层的误差
●输出(Output):根据公式BP3和BP4输出损失函数的偏置。
在训练阶段,反向传播算法的工作方式就是把数据传入神经网络,然后经过一次向前传播后,得到每- -层 的输出数据。接着开始从输出层往前计算每一层的误 差,直到第一层(输入层)为止。最后根据每一层的误差数据计算每 - -个损失函数关于偏置和权重参数的偏导,而这个偏导就是网络中参数的变化率。有了这个变化率之后,我们就可以利用梯度下降算法更新一次网络中的参数。如此循环迭代,利用反向传播算法来求得网络参数的变化率,并用于更新网络的参数,最终使得损失函数收敛到局部最小值,训练阶段结束。