一、前馈神经网络基本模型
前馈神经网络是最基本的神经网络,其中的一些基本概念在神经网络的研究中被广泛的使用。
一个前馈神经网络可以看做是一个函数
构造一个神经网络,需要的各个要素如下:
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 代表步数。通过不断迭代,直到找到合适的参数集θ
在此,我们先暂时不去讨论
6、代价函数的若干类型
针对不同的问题,我们可以选择不同的代价函数。以下是几种常用的代价函数形式:
二元交叉熵
该代价函数主要用于二元分类问题。
假设网络的参数为
我们对等式两边同时取对数,然后取负号可得到:
我们将等式的右边,即
该代价函数主要用于解决二元分类问题,即输出只有0和1两种情况的问题。
交叉熵
对于多元分类问题,即输出
我们对两边取对数,可得:
去掉算式前面的常数项,然后取负号得到
我们将
方差
即以期望输出与实际输出之间的方差作为代价函数:
代价函数小结
- 如果针对二元分类问题,通常使用二元交叉熵函数作为代价函数:
−∑i=1nyilogf(xi,θ)+(1−yi)(1−f(xi,θ))
在此情况下,输出层一般使用sigmoid函数作为激活函数 - 针对多元分类问题,通常使用交叉熵函数作为代价函数:
−logP(D|θ)=−∑i=1nyilogf(xi,θ)
在此情况下,输出层一般使用softmax(柔性最大值)函数作为激活函数 - 对于回归(regression)问题,通常使用方差函数作为代价函数:
∑i=1n(yi−f(xi,θ))2
在此情况下,对输出层的类型不加限制
7、激活函数的若干类型
对于激活函数,我们首先列举一些性质:
- 在理论上,如果激活函数是非线性的,两层神经网络就能够拟合任何函数。因此,我们需要采用非线性函数作为激活函数
- 为了方便神经网络的训练,激活函数一般需要连续可导
- 为了神经网络的稳定,激活函数一般值域有限
- 较平滑的函数会表现得更好
- 一般是基于原点对称的函数
常使用的激活函数如下:
Sigmoid函数
函数形式如下:
该函数通常被同于结合二元交叉熵代价函数来解决二元分类问题
Softmax函数
该函数主要用于输出层,将输出层第
该函数分母的求和在所有神经元上进行,相当于将输出层所有神经元的输出值求和后,和等于1。
该激活函数常配合交叉熵代价函数用于解决多元分类问题。
Rectified Linear Unit(ReLU)
该激活函数常常被用于隐藏层,由于该函数导数为固定值,所以非常方便于使用基于梯度的学习算法。
Hyperbolic Tangent(双曲正切)
该函数也通常用于隐藏层的激活函数。