神经网络和后向传播算法
目录
1 简介
在分析过回归和分类问题过程中,我们的基本思路是通过对一些固定的基函数进行线性组合,然后针对某个损失函数进行最优化处理。这个分析方法帮助我们揭示了机器学习的基本原理,但是并不代表这些方法在实际应用过程中就有很大价值。它们的实用性因为维度诅咒问题 大打折扣。为了对大规模数据使用这些模型,我们需要针对数据调整基函数。基函数的优化在理论和工程领域都具有举足轻重的作用。
支持向量机(Support vector machines,SVM)通过定义以数据为中心的基函数来解决这个问题,在训练过程中选择这些基函数的子集达到优化目的。SVM 的一个优点是目标函数是凸的,因此可以按照凸优化的一套理论快速的获取最优解。相关向量机(Relevance Vector Machine, RVM)和 SVM 一样也是从一套固定的基函数中搜取一个子集。不同之处在于,RVM 可以生成基于概率的输出。但是,这样做会导致训练过程中,RVM 需要面对非凸目标函数的优化问题。
不同于 SVM 或者 RVM 在优化过程中会改变基函数的个数,另一个办法是固定基函数的个数,在训练过程中优化这些基函数的系数,即:使这些基函数的系数自适应于训练数据。截止目前,模式识别问题中,最成功的固定基函数个数的模型是前向神经网络(feed-forward neural networks),也叫作多层感知机(multilayer perceptron)。在许多应用场景中多层神经网络都可以产生非常紧凑的模型,并且训练速度也很快。当然,这是需要付出代价的:在神经网络中,我们需要面对的很多问题不再是凸优化问题。这意味着:这些自适应基函数系数往往有很多局部最优解,我们要从这些局部最优解中找到那个全局最优解。
本文首先考虑神经网络的数学模型及其对应的网络结构。然后,讨论非线性优化问题的最优解。对非线性问题的优化要求评估对数似然函数相对于网络系数的导数,这可不是一个小问题。对于较大规模的神经网络,网络系数构成的矩阵规模往往非常大(这样的矩阵往往是 Jacobian 矩阵或者 Hessian 矩阵)。所幸,我们有错误后向传递算法(error backpropagation)。这一算法可以高效的完成对导数矩阵的评估。最后我们考虑神经网络的多种正则化方法,并讨论这些方法之间的联系。
2 前向网络函数
回归或者分类问题的数学模型可以表示为:
y(x,w)=f(M∑j=1wjϕj(x))其中在分类问题中f(⋅)是非线性激活函数,在回归问题中f(⋅)是恒等函数。在神经网络中,我们的目标是在训练过程中调整基函数ϕj(x)对应的参数使得模型达到最优。当然基函数的选择有好多种,基函数可以是输入的非线性函数。首先我们构建M个输入的线性组合:
aj=D∑i=1w1jixi+w1j0其中j=1,…,M,上标1表示神经网络的第一层。其中w1ji是权重,w1j0是偏差。这些aj叫做激活子,每一个激活子在下一层网络中通过一个可微的非线性激活函数h(⋅)生成zj:
zj=h(aj)这些量对应式 (1)中的基函数输出。在神经网络中我们称zj为隐单元。非线性函数h(⋅)通常是具有S形状的函数比如 logistic 函数或者 tanh 函数。这些函数再一次的通过线性组合生成输出:
ak=M∑j=1w2kjzj+w2k0其中k=1,…,K,并且K是输出的个数。式 (4)对应第二层网络的变换。最后输出单元通过激活函数生成输出yk。激活函数的选择依赖于数据的内在特征以及问题模型。对于回归问题,激活函数是恒等函数,即:
yk=ak对于二进制分类,输出激活函数是 logistic 函数:
yk=σ(ak)σ(a)=11+exp(−a)对于结果大于 2 的分类问题,使用 softmax 激活函数。综合式 (2)和 (4)我们得到整个网络函数的数学模型为:
yk(x,w)=σ(M∑j=1w2kjh(D∑i=1w1jixi+w1j0)+w2k0)从式 (8)整体看来,这个网络就是从输入x到输出y的一个非线性函数,参数为w。整个函数可以表示如图1所示。
Figure 1: 式~(8)所示的网络模型
图1 和式 (8)表达的是一个同一概念:前向神经网络。在这个网络中信息从做到右传播。式 (8)还可以写成更简洁的形式:
yk(x,w)=σ(M∑j=0w2kjh(D∑i=0w1jixi))接下来我们考虑一下式~(9)中的系数个数,首先我们需要明白对于~(9)所示的网络模型,找到一个最优解w意味着找到了一堆最优解。考虑对 (9)所示的网络模型有M个隐藏单元,这些隐藏单元采用tanh函数作为激活函数,这些隐藏单元和输入输出采用全连接。如果我们改变某一个隐藏单元对应的所有权重的符号(取反),则对于特定输入,激活单元的输出也取反。因为tanh(−a)=−tanh(a),所以通过改变所有权重的符号和激活函数的符号,输入输出对应的网络模型没有发生变化。这样我们就找到了两个不一样的权重系数但是对应的映射关系是一样的。对于M个隐藏单元,有M个可以翻转符号的机会。因此任意给定的权重矢量都是2M个等效的权重矢量中的一个。另一方面考虑M隐藏单元的排列,我们会有M!倍个解。因此对于每一个可能的解,我们都有M!2M个等效的解。
3 训练网络
所谓的训练网络过程就是通过各种方法求得图 1 所示的网络中最优权重系数的过程。所谓的最优是针对各种误差函数而言的,一种常用的函数是平方和误差函数,给定一个大小为N的输入序列xn,n=1,…,N,还有其对应的目标矢量tn,那么误差函数可以表示为:
E(w)=12N∑n=1‖y(xn,w)−tn‖23.1 回归问题
也可以从概率的角度证明通过最大化似然函数等效于式 (10)所示的误差函数,为了保证行文的流畅,我不准备岔开细讲。接下来我们针对式 (10)做优化。首先考虑回归问题,像之前那样我们可以把输出的激活函数定为恒等函数:
yk=ak这个时候式 (10)对ak求偏导就有:
∂E∂ak=yk−tk这个特性非常重要,将在错误后向传输算法中发挥重要作用。
3.2 二类分类问题
对于二类分类问题,我们有一个目标变量t,t=1对应第一类,t=0对应第二类。同样,像之前那样我们可以把输出的激活函数定为 logistic 函数:
y=σ(a)=11+exp(−a)因此0≤y(x,w)≤1,我们可以把y(x,w)解释为p(t=1|x)的条件概率,则p(t=0)|x的条件概率是1−y(x,w)。那么目标变量的条件分布是一个伯努利分布:
p(t|x,w)=y(x,w)t(1−y(x,w))1−t假设训练集合是一些列相互独立的观察,误差函数(负对数似然函数)就是一个熵函数:
E(w)=−N∑n=1(tnlnyn+(1−tn)ln(1−yn))其中yn=y(xn,w).
3.3 多个二类分类问题
假设我们有K个二类分类问题,我们可以使用一个有K个输出的网络来模拟。这K各输出都使用 logistic 激活函数。每一个输出都是一个二类标签tk∈{0,1},k=1,…,K。假设这K个输出是相互独立的,则目标输出的分布可以表示为:
p(t|x,w)=K∏k=1yk(x,w)tk(1−yk(x,w))1−tk考虑负对数似然函数,误差函数可以表示为:
E(w)=−N∑n=1K∑k=1(tnklnynk+(1−tnk)ln(1−ynk))其中ynk=yk(xn,w)。
3.4 多类分类问题
对于有多个类分类问题(每一个输入可能会被标记为K个中的一个),二进制目标变量tk∈{0,1}有1K的概率标记正确。网络输出可以解释为:
yk(x,w)=p(tk=1|x)误差函数为:
E(w)=−N∑n=1K∑k=1tknlnyk(xk,w)其对应的输出激活函数是 softmax 函数:
yk(x,w)=exp(ak(x,w))∑jexp(aj(x,w))其中0≤yk≤1,∑kyk=1。
3.5 激活函数选择
针对不同的问题类型,我们需要选择不同的激活函数和误差函数:
- 对于回归问题,激活函数选择恒等函数,误差函数选择平方和误差;
- 对于二类分类问题,激活函数选择 logistic 函数,误差函数为熵函数;
- 对于多类分类问题,激活函数选择 softmax 函数,误差函数为多类熵函数;
无论哪种误差函数,误差函数相对于激活单元输出的导数都具有式 (12)的形式。这位我们实用误差后向传递算法提供了基础。
3.6 寻找w
从几何直观上理解E(w)的最小化问题会更容易。假设E(w)如图2所示.
Figure 2: E(w)示意图
在图2中,如果我们在w的空间上移动一小步从w到w+δw,那么误差函数也会相应的发生变化δE≈δwT∇E(w),其中矢量∇E(w)指向错误增大速率最大的方向。因为E(w)是w的平滑连续函数。误差函数的最小值出现在梯度为零的位置:
∇E(w)=0否则,我们可以把w向−∇E(w)方向移动一小步减小误差,直到∇E(w)=0。我们的目的是为了找到w使得E(w)取最小值。但是正如图2 所示,E(w)不是凸的,所以存在很多局部最小值。对于一个局部最小值,我们之前也分析过,有M!2M个等效的解。
在寻找E(w)最小值的过程中,解析解是不用指望了。我们只能通过数值计算来得到最小值对应的w。非线性函数的优化问题是一个古老的问题,有很多现成的方法可以使用。许多方法都需要选择一些w的初始值,然后逐步的移动w:
w(τ+1)=w(τ)+Δw(τ)其中τ是迭代的步长。不同的算法会采用不同的Δw(τ)。对于每一次迭代,这些算法都需要在w(τ+1)处重新评估∇E(w)。
为了理解梯度信息的作用,我们把误差函数进行泰勒展开。通过把误差函数进行泰勒展开,我们可以获得一个误差函数的局部近似:
E(w)≈E(ˆ(w))+(w−ˆw)Tb+12(w−ˆw)TH(w−ˆw)在展开的过程中我们删掉了高阶项。其中b是误差函数在ˆw出的梯度:
b=∇E|w=ˆwH是 Hessian 矩阵,其定义为:
H=∇∇E(H)ij=∂∂wi∂wj|w=ˆw把式 (23)所示的泰勒近似对w求梯度则有:
∇E≈b+H(w−ˆw)对于足够接近w的点ˆw,式 (23)和 式 (27)具有很好的精度。假设式 (23)在w∗处有一个最小值,则∇E=0,式 (23)变为:
E(w)=E(w∗)+12(w−w∗)TH(w−w∗)其中H是在w∗处的 Hessian 矩阵。为了从几何直观上解释式 (28),我们对H进行 SVD 分解,则有:
Hui=λiui其中ui是规范正交基中的矢量。我们把w−w∗展开为特征向量的线性组合,则:
w−w∗=∑iαiui这个过程可以看做把坐标系统转换到以w∗为中心的过程。坐标轴的方向也旋转为特征矢量所指的方向,记得对多维高斯随机变量的分析 么?
通过以上一些列变换,式 (28)变为:
E(w)=E(w∗)+12∑iλiα2i3.7 计算复杂度
现在我们回头看看式 (23),误差函数通过b和H确定,这里一共有W(W+3)/2个独立的元素(因为H是对称的),W是w的维度。因此式 (23)最小值的确定依赖于O(W2)个参数。如果我们不利用梯度信息我们必须优化O(W2)个方程,每一个都要O(W)个步骤。因此如果不利用梯度信息,计算出式~(23)最小值的计算复杂度是O(W3)。
现在考虑到梯度信息,因为每一次评估∇E带来W个新的信息,我们希望在O(W)个梯度评估中找到误差函数最小值。在即将介绍的反向传递算法中,每一次评估∇E确实只需要O(W)步计算。因此综合看来找到误差函数最小值只需要O(W2)的计算量。因此,梯度信息的使用使得训练大规模神经网络成为可能。
3.8 梯度下降法
利用梯度信息的最简单方法是更新∇E(w)时选择一个小的步长,指向梯度减小的方向:
w(τ+1)=w(τ)−η∇E(w(τ))其中η>0是所谓的学习速率。每一次更新,对于新的权重矢量w(τ+1)都需要从新计算梯度。因为误差函数与所有的训练数据集合有关,所以每一步更新∇都需要重新操作所有的训练数据。这种算法叫做批量处理算法。每一步更新权重矢量(w)都朝向误差函数降低的最小的方向。这叫做最大梯度下降法。
对于批量优化算法,有许多高效的方案比如共轭梯度,准牛顿迭代。这些方法都比简单的梯度下降法要鲁棒且高效。但是不管哪种实现方法都不能改变神经网络优化的非凸性质。为了克服这个问题,我们可以同时跑多次梯度下降法,每次用不同的初始值。最后对收敛的多个w进行性能对比。
批量处理算法的缺点是显而易见的:需要一次性缓存大量数据。如果能够在线实时更新就好了。实际上,基于最大似然函数的误差函数是有一些列误差项求和获得的:
E(w)=N∑n=1En(w)在线的梯度下降法,一次根据一个数据点更新w:
w(τ+1)=w(τ)−η∇En(w(τ))式~(34)所示的更新过程一次只处理一个数据。
4 错误后向传递算法
本节的任务是找到一个评估误差函数E(w)梯度的高效算法。这个算法叫做错误后向传递算法。接下来我们推导后向传递算法。这个推导过程适用于任何前向网络,任何非线性可微的激活函数和大多数误差函数。
许多误差函数都可以表示称一些项的求和:
E(w)=N∑n=1En(w)这里我们考虑评估误差函数中的一项∇En(w)。考虑线性模型:
yk=∑iwkixi其中yk是输入变量xi的线性组合。对于误差函数,我们定义为:
En=12∑k(ynk−tnk)2其中ynk=yk(xn,w).这个误差函数相对于wji的梯度是:
∂En∂wji=(ynj−tnj)xni在一个通用的前向网络中,每一个单元计算的更新公式为:
aj=∑iwjizi其中zi是输入或者是激活单元。式 (39)是一个通用的式子。式 (39)通过一个非线性的更新函数h(⋅)输出:
zj=h(aj)式 (40)(39)的过程叫做前向传递过程,在这个过程中信息在网络中向前传递。
现在我们考虑En相对于wji的导数:
∂En∂wji=∂En∂aj∂aj∂wji引入记号:
δj=∂En∂aj使用~(39),我们得到:
∂aj∂wji=zj结合 (42)(43)(41),有:
∂En∂wji=δjzi在前面我们知道,对于输出单元而言:
δk=yk−tk为了求得隐藏单元的δ,我们实用链式法则:
δj=∂En∂aj=∑k∂En∂ak∂ak∂aj式 (46)可以通过图3来表示。
Figure 3: 式 (46)图示
注意,节点单元k可能包含其他隐藏单元。
5 一个简单的例子
接下来,我们给出一个简单的例子来展示后向错误传递算法。我们考虑和图 1 类似拓扑结构的神经网络。误差函数为平方和误差函数,输出单元采用线性激活函数,即:yk=ak, 其中,隐藏节点的激活函数为:
h(a)=tanh(a)其中,tanh(a)定义为:
tanh(a)=ea−e−aea+e−a对于tanh(a)函数,一个重要的特性为:
h′(a)=1−h(a)2我们考虑标准的误差函数:
En=12K∑k=1(yk−tk)2其中,yk是输出单元k的激活函数。对于每个训练集合的模式,我们执行前向传递算法:
aj=D∑i=0w1jixizj=tanh(aj)yk=M∑j=0w2jkzj接下来,我们计算δ:
δk=yk−tk然后,向后传递δ,对于隐藏节点使用:
δj=(1−z2j)K∑k=1wjkδk最后,误差函数相对于第一层和第二层权重的导数为:
∂En∂w1ji=δjxi∂En∂w2kj=δkzj