给定一组神经元,我们可以以神经元为节点来构建一个网络。不同的神经网络模型有着不同网络连接的拓扑结构。一种比较直接的拓扑结构是前馈网络。前馈神经网络(Feedforward Neural Network,FNN)是最早发明的简单人工神经网络。

介绍

在前馈神经网络中,不同的神经元属于不同的层,每一层的神经元可以接受到前一层的神经元信号,并产生信号输出到下一层。第0层叫做输入层,最后一层叫做输出层,中间的叫做隐藏层,整个网络中无反馈,信号从输入层到输出层单向传播,可用一个有用无环图表示。

前馈神经网络也成为多层感知器(Mutlti-Layer Perceptron,MLP)。但是多层感知器的叫法并不准确,因为前馈神经网络其实是由多层Logistic回归模型(连续的非线性模型)组成,而不是有多层感知器模型(非连续的非线性模型)组成。

下图为简单的前馈神经网络图:

多层前馈神经网络

神经网络中涉及的多个概念:

  • L:表示神经网络的层数
  • m^l:表示第 l 层神经元个数
  • f_l(.):表示第 l 层神经元的激活函数
  • W^l:表示第 l-1 层到第 l 层的权重矩阵
  • b^l:表示第 l-1 层到第 l 层的偏置
  • z^l:表示第 l 层神经元的净输入(净活性值)
  • a^l:表示第l层的神经元输出(活性值)

神经网络的信息传播公式如下(公式1-1)

公式1-1也可以合并写为(公式1-2):

或者(公式1-3)

这样神经网络可以通过逐层的信息传递,得到网络最后的输出a^L。整个网络可以看做一个符合函数

将向量x作为第一层的输入a^0,将第 l 层的输入a^0,将第L层的输出a^L 作为整个函数的输出。

其中W, b表示网络中所有层的连接权重和偏置。

参数学习

如果采用交叉熵损失函数,对于样本(x,y),其损失函数为(公式1-4):

其中 y 属于{0,1}^T为标签y对应的one-hot向量。

给定训练集D={(x^n,y^n)}, N >= n >=0,将每个样本x^n输入给前馈神经网络,得到网络输出为y^n,其在数据集D上的结构化风险函数为(公式1-5):

其中W和b分别表示网络中所有的权重矩阵和偏置向量, (||W||_F)^2是正则化项,用来防止过拟合,lambda是为正数的超参数,lambda越大,W越接近于0。这里的(||W||_F)^2一般使用Frobenius范数:

有了学习准则和训练样本,网络参数可以通过梯度下降法来进行学习。在梯度下降方法的每次迭代过程中,第l层的参数 W^l 和 b^l 参数更新方式为(公式1-6):

其中alpha为学习参数。

梯度下降法需要计算损失函数对参数的偏导数,如果通过链式法则逐一对每个参数进行求偏导效率比较低。在神经网络的训练中经常使用反向传播算法来高效的计算梯度。

反向传播算法

基于误差的反向传播算法(backpropagation,BP)的前馈神经网络训练过程可以分为以下三步:

  • 前馈计算每一层的净输入z^l 和激活值 a^l,直到最后一层
  • 反向传播计算每一层的误差项
  • 计算每一层参数的偏导数,并更新参数

其具体训练过程如下:

image

自动梯度计算

神经网络中的参数主要是通过梯度下降来进行优化的。当确定了风险函数及网络结构后,我们就可以手动用链式法则来计算风险函数对每个参数的梯度,并用代码进行实现。

目前几乎所有的深度学习框架都包含了自动梯度计算的功能,在使用框架进行神经网络开发时,我们只需要考虑网络的结构并用代码实现,其梯度可以自动进行计算,无需人工干预,这样开发效率就大大提高了。

自动梯度计算方法分为以下三种:

数值微分

数值微分(Numerical Differentiation)是用数值方法计算函数f(x)的导数。函数f(x)的点x的导数定义为:

要计算f(x)在点x的导数,可以对x加上一个很少的非零扰动,然后通过上述定义来直接计算函数f(x)的梯度。数值微分方法非常容易实现,但找到一个合适扰动非常难,如果扰动过小会引起数值计算问题,比如舍入误差;如果扰动过大,会增加截断误差,使得导数计算不准确,因此数值微分的实用性比较差,在实际应用中,常用以下公式来计算梯度可以减少截断误差。

  • 舍入误差:是指数值计算中由于数字舍入造成的近似值和精确值之间的差异,比如用浮点数来表示实数。
  • 截断误差:数学模型的理论解与数值计算问题的精确解之间的误差

符号微分

符号微分(Symbolic Differentiation)是一种基于符号计算的自动求导方法。符号计算,也叫代数计算,是指用计算机来处理带有变量的数学表达式。

符号计算的输入和输出都是数学表达式的化简、因式分解、微分、积分、解代数方程、求解常微分方程等运算。

比如数学表达式的化简

  • 输入:3x-x+2x+1
  • 输出:4x+1

符号计算一般来讲是对输入的表达式,通过迭代或递归使用一些事先定义的规则进行转换。当转换结果不能再继续使用变换规则时,便停止计算。

自动微分

自动微分(Automatic Differentiation,AD)是一种可以对一个(程序)函数进行计算导数的方法。符号微分的处理对象是数学表达式,而自动微分的处理对象是一个函数或一段程序。而自动微分可以直接在原始程序代码进行微分。自动微分的基本原理是所有的数值计算可以分解为一些基本操作,包含+,−,×, / 和一些初等函数exp, log, sin, cos 等。

自动微分也是利用链式法则来自动计算一个复合函数的梯度。我们以一个神经网络中常见的复合函数的例子来说明自动微分的过程。为了简单起见,令复合函数f(x;w, b) 为

其中x 为输入标量,w和b 分别为权重和偏置参数。

复合函数f(x;w,b) 可以拆解为:

image

继而就可以通过链式求导法则进行复合函数求导。


打开微信扫一扫,关注微信公众号【搜索与推荐Wiki】