一、前馈神经网络基本模型

前馈神经网络是最基本的神经网络,其中的一些基本概念在神经网络的研究中被广泛的使用。

一个前馈神经网络可以看做是一个函数


fθ:x→y

其中输入 x∈Rn,输出 y∈Rm,函数的行为通过参数 θ∈Rp 来决定。

构造一个神经网络,需要的各个要素如下:

1、神经元模型

神经元模型是构建神经网络的基本模块。神经元模型的要素如下:

  1. 每个神经元的输入为一个向量 x∈Rn,输出为一个标量
  2. 决定神经元行为的参数包括一组权值向量 ω∈Rn 和一个偏置项 b
  3. 每个神经元的输出可以表示为f(∑i=1nxi⋅ωi+b) 其中f:R→R 被称为激活函数
  4. 每个神经元需要满足以上三个条件,可以有多种数学形式。

2、神经网络的基本架构

神经网络的基本架构是以神经元为基础构建的层状网络。基本架构的要素如下:

  1. 神经元被组织成层状结构,每层的神经元数量根据需要设定。一层中神经元的个数被称为该层的宽度,每一层神经元的宽度不要求保持一致
  2. 最后一层神经元被称为输出神经元
  3. 输出神经元之前的各层神经元被称为“隐藏层
  4. 神经网络中包含的神经元层数被称为网络的深度
  5. 除了输入层外,每一层神经元以前一层神经元的输出网络输入
  6. 输出层神经元的输出作为整个神经网络的输出,是根据输出做出的预测或者判断
  7. 如前所述:一个前馈神经网络可以看做是一个函数fθ:x→y ,函数的行为通过参数θ∈Rp 来决定。根据上面的要素,我们把参数 θ 叙述为所有神经元的权重 ω 和偏置 b
  8. 设计神经网络的一项重要工作就是设计网络的基本架构:即有多少层神经元,每层神经元的宽度。

3、前馈神经网络的矩阵表示

  1. 我们将输入用一个列向量 x∈Rn 来表示,假设第一层神经元有 p1 个神经元,每个神经元有对应于输入向量的权重向量(行向量)ω∈Rn,则p1个神经元的权重向量组成了一个矩阵ω1∈Rp1×n。
  2. 第一层神经元的输出用一个列向量表示a1∈RP1,且有 a1=f(ω1⋅x+b1),其中b1∈Rp1是第一层神经元的偏置向量(列向量)
  3. 第二层神经元的情况与第一层的类似,只是第二层神经元以第一层神经元的输出作为输入,即a2=f(ω2⋅a1+b2)。我们可以将两层神经元的总的计算式写成o2=f(ω2⋅f(ω1⋅x+b1)+b−2)

4、对网络输出的评价

网络的输出是否符合我们的需求,如何评价?

  1. 在训练神经网路的数据中,对于一个特定的输入xi,或有一个我们期望的输出yi。一般情况下我们将数据表示如下:D={(x1,y1),(x2,y2),...,(xn,yn)},其中yi是xi的期望的输出
  2. 对于一个特定的输入xi,假设我们神经网络给出输出为y^i
  3. 那么我们对神经网络输出的评价就是评估y^i在多大程度上对y进行的预测。我们称完成这一评估的函数为代价函数
  4. 代价函数l(yi,y^i)用于计算y与y^之间的距离。根据不同的任务类型,如二元分类、多元分类或者回归等,可以选用不同的代价函数。
  5. 在实际应用中,通常计算多个数据点的y与y^之间的距离,而不仅仅是一个数据点的

5、对神经网络的训练

  1. 我们假设θ是网络的所有参数的集合,即所有神经元的权重和偏置。θ以随机值被初始化。我们将整个神经网络以一个函数fNN来表示。
  2. l为上面所述的代价函数。l(y^,y)=l(fNN(x,θ),y)
  3. 在训练的流程中,我们首先计算代价函数的梯度,即∇l(fNN(x,θ),y)
  4. 我们通过以下式子更新神经网络的参数: θs=θs−1−α⋅∇l(fNN(x,θ),y) 其中s代表步数。通过不断迭代,直到找到合适的参数集θ

在此,我们先暂时不去讨论∇l(fNN(x,θ),y)的计算,计算这一式子有好几种方法。

6、代价函数的若干类型

针对不同的问题,我们可以选择不同的代价函数。以下是几种常用的代价函数形式:

二元交叉熵

该代价函数主要用于二元分类问题。D={(x1,y1),(x2,y2),...,(xn,yn)},其中yi是xi的期望的输出,x∈Rn且y∈{0,1},即期望输出是一个二元的量。

假设网络的参数为θ,网络的输出用f(x,θ)来表示。根据最大似然的思想,我们要找到使得P(D|θ)取最大值的那个参数集θ。我们有


P(D|θ)=∏i=1nf(xi,θ)yi⋅(1−f(xi,θ))1−yi


我们对等式两边同时取对数,然后取负号可得到:



−logP(D|θ)=−∑i=1nyilogf(xi,θ)+(1−yi)(1−f(xi,θ))


我们将等式的右边,即

−∑ni=1yilogf(xi,θ)+(1−yi)(1−f(xi,θ))作为代价函数。

该代价函数主要用于解决二元分类问题,即输出只有0和1两种情况的问题。

交叉熵

对于多元分类问题,即输出y∈{0,1,...,k},每一种输出值代表一个分类。我们假设第k种分类的格式是nk,有∑ki=1ni=n。在这种情况下,依然是用上述最大似然估计的思路,我们可以得到:


P(D|θ)=n!n1!⋅n2!⋅⋅⋅nk!∏i=1nf(xi,θ)yi


我们对两边取对数,可得:



logP(D|θ)=logn!−logn1!n2!⋅⋅⋅nk!+∑i=1nyilogf(xi,θ)


去掉算式前面的常数项,然后取负号得到



−logP(D|θ)=−∑i=1nyilogf(xi,θ)

我们将−∑ni=1yilogf(xi,θ)称为交叉熵函数,可以用作多元分类问题的代价函数。

方差

即以期望输出与实际输出之间的方差作为代价函数:


∑i=1n(yi−f(xi,θ))2

代价函数小结

  1. 如果针对二元分类问题,通常使用二元交叉熵函数作为代价函数:
    −∑i=1nyilogf(xi,θ)+(1−yi)(1−f(xi,θ))
    在此情况下,输出层一般使用sigmoid函数作为激活函数
  2. 针对多元分类问题,通常使用交叉熵函数作为代价函数:
    −logP(D|θ)=−∑i=1nyilogf(xi,θ)
    在此情况下,输出层一般使用softmax(柔性最大值)函数作为激活函数
  3. 对于回归(regression)问题,通常使用方差函数作为代价函数:
    ∑i=1n(yi−f(xi,θ))2
    在此情况下,对输出层的类型不加限制

7、激活函数的若干类型

对于激活函数,我们首先列举一些性质:

  1. 在理论上,如果激活函数是非线性的,两层神经网络就能够拟合任何函数。因此,我们需要采用非线性函数作为激活函数
  2. 为了方便神经网络的训练,激活函数一般需要连续可导
  3. 为了神经网络的稳定,激活函数一般值域有限
  4. 较平滑的函数会表现得更好
  5. 一般是基于原点对称的函数

常使用的激活函数如下:

Sigmoid函数

函数形式如下:


y=11+e−(ω⋅x+b)

该函数通常被同于结合二元交叉熵代价函数来解决二元分类问题

Softmax函数

该函数主要用于输出层,将输出层第j个神经元的输出定义为

aj=eωj⋅x+b∑keωk⋅x+b


该函数分母的求和在所有神经元上进行,相当于将输出层所有神经元的输出值求和后,和等于1。

该激活函数常配合交叉熵代价函数用于解决多元分类问题。

Rectified Linear Unit(ReLU)



f(x)=max(0,ωx+b)


该激活函数常常被用于隐藏层,由于该函数导数为固定值,所以非常方便于使用基于梯度的学习算法。

Hyperbolic Tangent(双曲正切)



y=tanh(ωx+b)


该函数也通常用于隐藏层的激活函数。