一、前馈神经网络基本模型
前馈神经网络是最基本的神经网络,其中的一些基本概念在神经网络的研究中被广泛的使用。
一个前馈神经网络可以看做是一个函数
fθ:x→y
其中输入
x∈Rn,输出
y∈Rm,函数的行为通过参数
θ∈Rp 来决定。
构造一个神经网络,需要的各个要素如下:
1、神经元模型
神经元模型是构建神经网络的基本模块。神经元模型的要素如下:
- 每个神经元的输入为一个向量 x∈Rn,输出为一个标量
- 决定神经元行为的参数包括一组权值向量 ω∈Rn 和一个偏置项 b
- 每个神经元的输出可以表示为f(∑i=1nxi⋅ωi+b) 其中f:R→R 被称为激活函数
- 每个神经元需要满足以上三个条件,可以有多种数学形式。
2、神经网络的基本架构
神经网络的基本架构是以神经元为基础构建的层状网络。基本架构的要素如下:
- 神经元被组织成层状结构,每层的神经元数量根据需要设定。一层中神经元的个数被称为该层的宽度,每一层神经元的宽度不要求保持一致
- 最后一层神经元被称为输出神经元
- 输出神经元之前的各层神经元被称为“隐藏层
- 神经网络中包含的神经元层数被称为网络的深度
- 除了输入层外,每一层神经元以前一层神经元的输出网络输入
- 输出层神经元的输出作为整个神经网络的输出,是根据输出做出的预测或者判断
- 如前所述:一个前馈神经网络可以看做是一个函数fθ:x→y ,函数的行为通过参数θ∈Rp 来决定。根据上面的要素,我们把参数 θ 叙述为所有神经元的权重 ω 和偏置 b
- 设计神经网络的一项重要工作就是设计网络的基本架构:即有多少层神经元,每层神经元的宽度。
3、前馈神经网络的矩阵表示
- 我们将输入用一个列向量 x∈Rn 来表示,假设第一层神经元有 p1 个神经元,每个神经元有对应于输入向量的权重向量(行向量)ω∈Rn,则p1个神经元的权重向量组成了一个矩阵ω1∈Rp1×n。
- 第一层神经元的输出用一个列向量表示a1∈RP1,且有 a1=f(ω1⋅x+b1),其中b1∈Rp1是第一层神经元的偏置向量(列向量)
- 第二层神经元的情况与第一层的类似,只是第二层神经元以第一层神经元的输出作为输入,即a2=f(ω2⋅a1+b2)。我们可以将两层神经元的总的计算式写成o2=f(ω2⋅f(ω1⋅x+b1)+b−2)
4、对网络输出的评价
网络的输出是否符合我们的需求,如何评价?
- 在训练神经网路的数据中,对于一个特定的输入xi,或有一个我们期望的输出yi。一般情况下我们将数据表示如下:D={(x1,y1),(x2,y2),...,(xn,yn)},其中yi是xi的期望的输出
- 对于一个特定的输入xi,假设我们神经网络给出输出为y^i
- 那么我们对神经网络输出的评价就是评估y^i在多大程度上对y进行的预测。我们称完成这一评估的函数为代价函数。
- 代价函数l(yi,y^i)用于计算y与y^之间的距离。根据不同的任务类型,如二元分类、多元分类或者回归等,可以选用不同的代价函数。
- 在实际应用中,通常计算多个数据点的y与y^之间的距离,而不仅仅是一个数据点的
5、对神经网络的训练
- 我们假设θ是网络的所有参数的集合,即所有神经元的权重和偏置。θ以随机值被初始化。我们将整个神经网络以一个函数fNN来表示。
- l为上面所述的代价函数。l(y^,y)=l(fNN(x,θ),y)
- 在训练的流程中,我们首先计算代价函数的梯度,即∇l(fNN(x,θ),y)
- 我们通过以下式子更新神经网络的参数: θ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
代价函数小结
- 如果针对二元分类问题,通常使用二元交叉熵函数作为代价函数:
−∑i=1nyilogf(xi,θ)+(1−yi)(1−f(xi,θ))
在此情况下,输出层一般使用sigmoid函数作为激活函数 - 针对多元分类问题,通常使用交叉熵函数作为代价函数:
−logP(D|θ)=−∑i=1nyilogf(xi,θ)
在此情况下,输出层一般使用softmax(柔性最大值)函数作为激活函数 - 对于回归(regression)问题,通常使用方差函数作为代价函数:
∑i=1n(yi−f(xi,θ))2
在此情况下,对输出层的类型不加限制
7、激活函数的若干类型
对于激活函数,我们首先列举一些性质:
- 在理论上,如果激活函数是非线性的,两层神经网络就能够拟合任何函数。因此,我们需要采用非线性函数作为激活函数
- 为了方便神经网络的训练,激活函数一般需要连续可导
- 为了神经网络的稳定,激活函数一般值域有限
- 较平滑的函数会表现得更好
- 一般是基于原点对称的函数
常使用的激活函数如下:
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)
该函数也通常用于隐藏层的激活函数。