《机器学习》读书笔记,第四章人工神经网络

时间:2022-12-25 16:31:07
人工神经网络(Artificial Neural Networks, ANN)提供了一种普遍而实用的方法从样例中学习值为实数、离散值或向量的函数。
像反向传播(BACKPROPAGATION)这样的算法,使用梯度下降来调节网络参数以最佳拟合由输入-输出对组成的训练结合。
ANN学习对于训练数据中的错误健壮性很好,且已被成功地应用到很多领域,例如视觉场景分析(interpreting visual scenes)、语音识别以及机器人控制等。

4.1简介
    对于某些类型的问题,如学习解释复杂的现实世界中的传感器数据,人工神经网络是目前知道的最有效的学习方法。

    生物学动机
        人工神经网络ANN的研究在一定程度上受到了生物学的启发,因为生物的学习系统是由相互连接的神经元组成的异常复杂的网络。
        而人工神经网络与此大体相似,它是由一系列简单的单元相互密集连接构成的,其中每一个单元有一定数量的实值输入(可能是其他单元的输出),并产生单一的实数值输出(可能成为其他很多单元的输入)。

        为了加深对这种类比的认识,让我们考虑一些来自生物学的事实。
        例如,据估计人类的大脑是由大约10^11个神经元相互连接组成的密集网络,平均每一个神经元与其他10^4个神经元相连。
        人脑神经元的活性通常被通向其他神经元的连接所激活或抑制。
        目前知道的最快的人脑神经元转换时间是在10^-3秒级别——与计算机的转换时间10^-10秒相比慢很多。
        然而人类能够以惊人的速度做出复杂度惊人的决策。例如,人类通过视觉认出自己的母亲大约需要10^-1秒。
        注意,在这10^-1秒的间隔内,被激发的神经元序列不长于数百步,因为单个神经元的转换速度已知。
        这个事实使很多人推测,生物神经系统的信息处理能力一定得益于对分布在大量神经元上的信息表示的高度并行处理。
        ANN系统的一个动机就是获得这种基于分布表示的高度并行算法。
        大多数的ANN软件在串行机器上仿真分布处理,然而更快版本的算法也已经在高度并行机制和特别为ANN应用设计的专用硬件上实现了。

        由于ANN只是在一定程度上受生物神经系统的启发,所以ANN并未模拟生物神经系统中的很多复杂特征,而且已经知道ANN的很多特征与生物系统也是不一致的。
        例如,我们考虑的ANN每个单元输出单一的不变值,然而生物神经元输出的是复杂的时序脉冲。

        长期以来,人工神经网络领域的研究者分为两个团体。
        一个团体的目标是使用ANN研究和模拟生物学习过程。
        另一个团体的目标是获得高效的机器学习算法,不管这种算法是否反映了生物过程。
        在本书中,我们的兴趣与后一团体一致,所以我们不会再把注意力用在生物模型上。

4.2神经网络表示
    ALVINN系统简介——反向传播算法来学习驾驶汽车。
    本章集中讨论以反向传播算法为基础的最常见和最实用的ANN方法。
    反向传播算法假定网络是一个固定结构,对应一个有向图,可能包含环。
    ANN学习就是为图中的每一条边选取权值。
    尽管某种类型的循环是允许的,大多数的实际应用都采用无环的前馈网络,与ALVINN使用的网络结构相似。

4.3适合神经网络学习的问题
    ANN学习非常适合于这样的问题:训练集合为含有噪声的复杂传感器数据,例如来自摄像机和麦克风的数据。
    它也适用于需要较多符合表示的问题,例如第三章讨论的决策树学习任务。
    这种情况下,ANN和决策树学习经常产生精度大体相当的结果。
    反向传播算法是最常用的ANN学习技术。它适合具有以下特征的问题:
        -实例是用很多属性-值的键值对表示的:要学习的目标函数是定义在可用向量描述的实例之上的,向量由预先定义的特征组成,例如ALVINN例子中的像素值。这些输入属性之间可以高度相关,也可以相互独立。输入值可以是任何实数。

        -目标函数的输出可能是离散值、实数值或者由若干实数属性或离散属性组成的向量:例如,在ALVINN系统中,输出是30个属性的向量,每一个分量对应一个建议的驾驶方向。每个输出值是0和1之间的某个实数,对应于在预测相应驾驶方向时的置信度(confidence)。我们也可以训练一个单一网络,同时输出行驶方向和建议的加速度,这只要简单地把编码这两种输出预测的向量连接在一起就可以了。

        -训练数据可能包含错误:ANN学习算法对于训练数据中的错误有非常好的健壮性。

        -可容忍长时间的训练:网络训练算法通常比像决策树学习这样的算法需要更长的训练时间。训练时间可能从几秒钟到几个小时,这要看网络中权值的数量、要考虑的训练实例的数量以及不同学习算法参数的设置等因素。

        -可能需要快速求出目标函数值:尽管ANN的学习时间相对较长,但对学习到的网络求值以便把网络应用到后续的实例通常是非常快速的。例如,ALVINN在车辆向前行驶时,每秒应用它的神经网络若干次,以不断地更新驾驶方向。

        -人类能否理解学到的目标函数不是重要的:神经网络方法学习到的权值经常是人类难以解释的。学到的神经网络比学到的规则难以传达给人类。

    这一章的其余部分是这样组织的:先讨论训练单个单元的学习算法,同时介绍组成神经网络的几种主要单元,包括感知器(perception)、线性单元(linear unit)和sigmoid单元(sigmoid unit)。
    然后给出训练这些单元组成的多层网络的反向传播算法,并考虑几个一般性的问题,比如ANN的表征能力、假设空间搜索的本质特征、过度拟合问题以及反向传播算法的变体。
    本章也给出了一个应用反向传播算法识别人脸的详细例子,指导读者如何取得这个例子的数据和代码并进一步实验。

4.4感知器
    一种类型的ANN系统是以被称为感知器(perception)的单元为基础的。
    感知器以一个实数值向量作为输入,计算这些输入的线性组合,然后如果结果大于某个阈值,就输出1,否则输出-1。
    更精确地,如果输入为x1到xn,那么感知器计算的输出为:
    o(x1,...,xn) = 1 if w0 + w1 * x1 + ... + wn * xn > 0 else -1
    其中每一个wi是一个实数常量,或叫做权值(weight),用来决定输入xi对感知器输出的贡献率。请注意,数量(-w0)是一个阈值,它是为了使感知器输出1,
    输入的加权和w1x1 + w2x2 + ... + wnxn必须超过的阈值。

    为了简化表示,我们假想有一个附加的常量输入x0=1,那么我们就可以把上边的不等式写为向量w与向量x的点乘。
    o(x) = sgn(w·x)
    其中,sgn(y) = 1 if y>0 else -1

    学习一个感知器意味着选择权w0,...wn的值。所以感知器学习要考虑的候选假设空间H就是所有可能的实数值权向量的集合。

4.4.1感知器的表征能力
    我们可以把感知器看作是n维实例空间(即点空间)中的超平面决策面。
    对于超平面一侧的实例,感知器输出1,对于另一侧的实例输出-1。
    这个决策超平面方程是w · x = 0。
    当然,某些正反样例集合不可能被任一超平面分割。
    那些可以被分割的称为线性可分(linearly separable)样例集合。

    单独的感知器可以用来表示很多布尔函数。
    例如,假定1真-1假,那么使用一个有两个输入的感知器来实现与函数(AND)的一种方法是设置权w0 = -0.8并且w1=w2=0.5。
    如果用这个感知器来表示或函数(OR),那么只需要改变它的阈值w0 = -0.3。
    事实上,AND和OR可被看作m-of-n函数的特例:也就是要使函数输出为真,那么感知器的n个输入中至少m个必须为真。
    OR函数对应于m=1,AND函数对应于m=n。任意m-of-n函数可以很容易地用感知器表示,只要设置所有输入的权为同样的值,然后据此恰当地设置阈值。

    感知器可以表示所有的原子布尔函数(primitive boolean function):与、或、与非(NAND)和或非(NOR)。
    然而遗憾的是,一些布尔函数无法用单一的感知器表示,例如异或函数(XOR),它当且仅当x1!=x2时输出为1。

    感知器表示与、或、与非、或非的能力是很重要的,因为所有的布尔函数都可表示为基于这些原子函数的互联单元的某个网络。
    事实上,仅用两层深度的感知器网络就可以表示所有的布尔函数,在这些网络中输入被送到多个单元,这些单元的输出被输入到第二级,也就是最后一级。
    一种方法是用析取范式(disjunctive normal form)(也就是对输入和它们的否定的先进行合取,再对这组合取式进行析取)来表示布尔函数。
    注意,要把一个AND感知器的输入求反,只要简单地改变相应输入权的符号。

    因为阈值单元的网络可以表示大量的函数,而单独的单元不能做到这一点,所以通常我们感兴趣的是学习阈值单元组成的多层网络。

4.4.2感知器训练法则
    研究网络之前,先介绍如何学习单个感知器的权值。

    已知有几种解决这个学习任务的算法。这里我们考虑两种:感知器法则和delta法则(delta rule)(是第一章中用来学习评估函数的最小均方法LMS的一个变体)。
    这两种算法保证收敛到可接受的假设,在不同的条件下收敛到的假设略有不同。
    这两种方法对于ANN是很重要的,因为它们提供了学习多个单元构成的网络的基础。

    为了得到可接受的权向量,一种办法是从随机的权值开始,反复地应用这个感知器到每个训练样例,只要它误分类样例就修改感知器的权值。
    重复这个过程,直到感知器正确分类所有的训练样例。
    每一步根据感知器训练法则(perception training rule)来修改权值,也就是修改与输入xi对应的权wi,法则如下:
    wi = wi + delta(wi)
    其中,delta(wi) = eta(t - o)xi
    这里t是当前训练样例的目标输出,o是感知器的输出,eta是一个正的常数称为学习速率(learning rate)。
    学习速率的作用是缓和每一步调整权的程度。
    它通常被设为一个小的数值,而有时会使其随着权调整次数的增加而衰减。

    为什么这个更新法则会成功收敛到正确的权值呢?
    为了得到直观的感觉,考虑一些特例。
    假定训练样本已被感知器正确分类。
    这时t-o是0,这时delta(wi)为0,所以没有权值被修改。
    而如果当目标输出是1时,感知器输出一个-1,这种情况下为使感知器输出1,权值必须被修改以增大w·x的值。

    事实上可以证明,在有限次地使用感知器训练法则后,上面的训练过程会收敛到一个能正确分类所有训练样例的权向量,前提是训练样例线性可分,并且使用了充分小的eta。
    如果数据不是线性可分的,那么不能保证训练过程收敛。

4.4.3梯度下降和delta法则
    尽管当训练样例线性可分时,感知器法则可以成功地找到一个权向量,但如果样例不是线性可分时它将不能收敛。因此,人们设计了另一个训练方法来克服这个不足————delta法则。
    如果训练样本不是线性可分的,那么delta法则会收敛到目标概念的最佳近似。

    delta法则的关键思想是使用梯度下降(gradient descent)来搜索可能的权向量的假设空间,以找到最佳拟合训练样例的权向量。
    这个法则很重要,因为它为反向传播算法提供了基础,而反向传播算法能够学习多个单元的互联网络。
    另一方面,对于含多种不同类型的连续参数化假设的假设空间,梯度下降是必须遍历这样的假设空间的所有学习算法的基础。

    最好把delta训练法则理解为训练一个无阈值的感知器,也就是一个线性单元(linear unit),它的输出o如下:
    o(x) = w · x    (都是向量)

    于是,线性单元对应于感知器的第一阶段,不带阈值。

    为了推导线性单元的权值学习法则,先指定一个度量标准来衡量假设(权向量)相对于训练样例的训练误差(training error)。
    尽管有很多方法定义这个误差,一个常用的特别方便的度量标准为:
    E(w) = (1/2) * sum(d属于D) ((td - od) ** 2)
    
    其中,D是训练样例集合,td是训练样例d的目标输出,od是线性单元对训练样例d的输出。
    在这个定义中E(w)是目标输出td和线性单元输出od的差异的平方在所有的训练样例上求和后的一半。
    这里我们把E定位w的函数,是因为线性单元的输出o依赖于这个权向量。
    当然E也依赖于特定的训练样例集合,但我们认为它们在训练期间是固定的,所以不必麻烦地把E写为训练样例的函数。
    第六章给出了贝叶斯论证:对于给定的训练数据,使E最小化的假设,就是H中最可能的假设。

    1.可视化假设空间
    图见书66页,为了确定一个使E最小化的权向量,梯度下降法搜索从一个任意的初始权向量开始,以很小的步伐反复修改这个向量。
    每一步都沿误差曲面产生最陡峭下降的方向修改权向量,持续这个过程直到得到全局的最小误差点。

    2.梯度下降法则的推导
    通过计算E相对向量w的每个分量的导数来得到这个方向。
    这个向量导数被称为E对于w的梯度,该梯度本身是一个向量,它的成员是E对每个wi的偏导数。
    当梯度被解释为权空间的一个向量时,它确定了使E最陡峭上升的方向。
    所以这个向量的反方向给出了最陡峭下降的方向。
    (推导见书67页,程序可参见我自己写的梯度下降)

    总而言之,训练线性单元的梯度下降算法如下:
        选取一个初始的随机权向量;
        应用线性单元到所有的训练样例,然后计算每个权值的修正量;
        通过每个权值的修正量来更新对应的权值,如此重复。
    误差曲面仅包含一个全局的最小值时,无论训练样例是否线性可分,这个算法会收敛到具有最小误差的权向量,条件是必须使用一个足够小的学习速率。
    学习速率如果太大,梯度下降搜索就会越过误差曲面最小值而不是停留在那一点。
    因此,对此算法的一种常用的赶紧方法是随着梯度下降步数的增加逐渐减小学习速率。

    3.梯度下降的随机近似
    梯度下降是一种重要的通用学习范型。它是搜索庞大假设空间或无限假设空间的一种策略,它可以应用于满足以下条件的任何情况:
    a.假设空间包含连续参数化的假设(例如,一个线性单元的权值)
    b.误差对于这些假设参数可微
    应用梯度下降的主要实践问题是:
    a.有时收敛过程非常慢
    b.如果在误差曲面上有多个局部极小值,那么不能保证这个过程会找到全局最小值

    缓解这些困难的一个常见方法是增量梯度下降(incremental gradient descent)或随机梯度下降(stochastic gradient descent)。
    标准梯度下降训练法则在对训练样例的集合D中的所有训练样例求和后计算权值更新,而随机梯度下降的思想是根据每个单独样例的误差增量计算权值更新,得到近似的梯度下降搜索。
    随机梯度下降迭代计算训练样例集D的每个样例d,在每次迭代过程中按照关于Ed(w)的梯度来改变权值。
    在迭代所有训练样例时,这些权值更新的序列给出了对于原来的误差函数E(w)的梯度下降的一个合理近似。
    通过使学习速率足够小,可以使随机梯度下降以任意成都接近于真实梯度下降。
    标准梯度下降和随机梯度下降之间的关键区别是:
    a.标准的梯度下降是在权值更新前对所有样例汇总误差,而随机梯度下降的权值是通过考查每个训练样例来更新的。
    b.在标准的梯度下降中,权值更新的每一步对多个样例求和,这需要更多的计算。另一方面,因为使用真正的梯度,标准梯度下降对每一次权值更新经常使用比随机梯度下降更大的步长。
    c.如果E(w)有多个局部极小值,随机的梯度下降有时可能避免陷入局部极小值中,因为它使用不同的样例的梯度,而不是所有样例的误差函数的梯度来引导搜索。

    在实践中,无论是随机的还是标准的梯度下降方法都被广泛应用。

    公式 delta(wi) = eta * (t - o) * xi(t、o和xi分别是目标值、单元输出和第i个训练样例的输入)中的训练法则被称为增量法则,
    或叫LMS法则(least-mean-square最小均方)、Adaline法则或Windrow-Hoff法则。
    注意,增量法则与4.4.2的感知器训练法则相似。
    两个看起来完全一致的表达式事实上是不同的,因为在增量法则中o是指线性单元的输出o(x) = w点乘x,而对于感知器法则,o是指阈值输出的o(x) = sgn(w点乘x)。

4.4.4小结
    我们已经研究了迭代学习感知器权值的两个相似的算法。
    这两个算法的关键差异是感知器训练法则根据阈值化(thresholded)的感知器输出的误差更新权值,然而增量法则根据输入的非阈值化(unthresholded)线性组合的误差来更新权。

    这两个训练法则间的差异反映在不同的收敛条件上。
    感知器训练法则经过有限次的迭代收敛到一个能理想分类训练数据的假设,但条件是*训练样例线性可分*。
    增量发则渐进收敛到最小误差假设,可能需要极长的时间,但无论训练样例是否线性可分都会收敛。

    学习权向量的第三种方法是线性规划(linear programming)。线性规划是解线性不等式方程组的一种通用的有效方法。
    注意每个训练样例对应一个形为,w点乘x>0,或,w点乘x<=0,的不等式,并且它们的解就是我们期望的权向量。
    遗憾的是,这种方法仅当训练样例线性可分时有解。
    无论如何,这种线性规划的方法不能扩展到训练多层网络。相反,基于增量法则的梯度下降方法可以被简单地扩展到多层网络。

4.5多层网络和反向传播算法
    单个感知器仅能表示线性决策面。
    而反向传播算法所学习的多层网络能够表示种类繁多的非线性曲面。
    多层网络能够表示高度非线性的决策面。
    本节讨论如何学习这样的多层网络,使用的算法和前面讨论的梯度下降方法相似。

4.5.1可微阈值单元
    使用什么类型的单元来作为构建多层网络的基础?
    多个线性单元的连接仍产生线性函数,而我们更希望选择能够表征非线性函数的网络。
    感知器单元的不连续阈值使它不可微,所以不适合梯度下降算法。

    我们需要的是这样单元:它的输出是输入的非线性函数,并且输出是输入的可微函数。
    sigmoid单元应运而生,这是一种非常类似于感知器的单元,但它基于一个平滑的可微阈值函数。

    与感知器相似,sigmoid单元先计算它的输入的线性组合,然后应用一个阈值到此结果。
    然而对于sigmoid单元,阈值输出是输入的连续函数。更精确地讲,sigmoid单元这样计算它的输出:
    o = sigma(w · x)    (向量点乘)
    其中 sigma(y) = 1 / (1 + e**-y)

    sigma经常被称为sigmoid函数或者也可以成为logistic函数(logistic function)。
    注意,它的输出范围为0到1,随输入单调递增。
    因为这个函数把非常大的输入值域映射到一个小范围输出,它经常被成为sigmoid单元的挤压函数(squashing function)。
    sigmoid函数有一个有用的特征,就是它的导数很容易用它的输出表示:
    sigma(y)' = sigma(y) * (1 - sigma(y))
    后面的梯度下降学习法则使用了这个导数。
    有时也可以使用其他易计算导数的可微函数替代sigma。
    例如,sigmoid函数定义的e ** -y项可被替换为e ** -ky,其中k是某个正的常数,用来决定这个阈值函数的陡峭性。

4.5.2反向传播算法
    对于由一系列确定的单元互连形成的多层网络,反向传播算法可以用来学习这个网络的权值。
    它采用梯度下降方法试图最小化网络输出值和目标值之间的误差平方。

    因为我们要考虑多个输出单元的网络,而不是像以前只考虑单个单元,所以我们先重新定义误差E,以便对所有网络输出的误差求和。
    
    E(w) = (1/2) * sum(D){ sum(output){ (tkd- okd)^2}}公式见书71页。

    其中,outputs是网络输出单元的集合,tkd和okd是与训练样例d和第k个输出单元相关的输出值。
    反向传播算法面临的学习问题是搜索一个巨大的假设空间,这个空间由网络中所有的单元的所有可能的权值定义。
    这种情况可以用一个误差曲面来可视化表示。
    和训练单个单元的情况一样,梯度下降可被用来尝试寻找一个假设,使E最小化。

    在多层网络中,误差曲面可能有多个局部极小值。
    而梯度下降仅能保证收敛到局部极小值,而未必得到全局最小的误差。
    尽管有这个障碍,已经发行对于实践中很多应用,反向传播算法都产生了出色的结果。

    下面给出反向传播算法,这里描述的算法适用于包含两层sigmoid单元的分层前馈网络,并且每一层的单元与前一层的所有单元相连。
    这是反向传播算法的增量梯度下降(或随机梯度下降)版本。
    这里使用的符号与前一节使用的一样,并进行了如下的扩展:
        -网络中每个结点被赋予一个序号(例如一个整数),这里的“结点”要么是网络的输入,要么是网络中某个单元的输出。
        -x(ji)表示结点i到单元j的输入,w(ji)表示对应的权值。
        -delta(n)表示与单元n相关联的误差项。它的角色与前面讨论的delta训练法则中的(t-o)相似。后面我们可以看到delta(n) = -E'(net(n))

    从建立一个具有期望数量的隐藏单元和输出单元的网络并初始化所有网络的权值为最小的随机数开始。
    给定了这个固定的网络结构,算法的主循环就对训练样例进行反复迭代。
    对于每一个训练样例,它应用目前的网络到这个样例,计算出对于当前样例网络输出的误差,然后更新网络中所有的权值。
    对这样的梯度下降步骤进行迭代,直到网络的性能达到可接受的精度为止(经常需要上千次,多次使用同样的训练样例)。

    算法过程:
        BACKPROPAGATION(training_examples, etah, n(in), n(out), n(hidden))
            # training_examples中每一个训练样例是形式为<x向量, t向量>的序偶,其中x是网络的输入向量,t是目标输出值。
            # etah是学习速率。n(in)是网络输入的数量,n(hidden)是隐藏层单元数,n(out)是输出单元数。
            # 从单元i到单元j的输入表示为x(ji),单元i到单元j的权值表示为w(ji)
            创建具有n(in)个输入,n(hidden)个隐藏单元,n(out)个输出单元的网络
            初始化所有网络权值为小的随机值(例如-0.05和0.05之间的数)
            在遇到终止条件前:
                对于训练样例training_examples中的每个<x,t>:
                    把输入沿网络向前传播
                        1.把实例x输入网络,并计算网络中每个单元u的输出o(u)
                    使误差沿网络反向传播
                        2.对于网络的每个输出单元k,计算它的误差项delta(k)
                            delta(k) = o(k)*(1-o(k))*(t(k)-o(k))
                        3.对于网络的每个隐藏单元h,计算它的误差项delta(h)
                            delta(h) = o(h)*(1-o(h))*sum(k in outputs){w(kh)*delta(k)}
                        4.更新每个网络权值w(ji)
                            w(ji) = w(ji) + t
                            t = etah * delta(j) * x(ji)

    这里的梯度下降更新法则与delta训练法则相似。
    就像delta法则,它依照以下三者来更新每一个权:
        学习速率etah
        该权值涉及的输入值x(ji)
        这个单元输出的误差
    唯一不同的是delta法则中的误差项(t-o)被替换成一个更复杂的误差项delta(j)。
    为了直观的理解它,先考虑网络的每一个输出单元k的delta(k)是怎样计算的。
    很简单,delta(k)与delta法则中的(tk-ok)相似,但乘上了sigmoid挤压函数的导数ok(1-ok)。
    
    每个隐藏单元h的delta(h)的值具有相似的形式。。
    然而,因为训练样例仅对网络的输出提供了目标值tk,所以缺少直接的目标值来计算隐藏单元的误差值。
    因此采取以下间接办法计算隐藏单元的误差项:对受隐藏单元h影响的每一个单元的误差进行加权求和,每个误差delta(k)权值为w(kh),
    w(kh)就是从隐藏单元h到输出单元k的权值。
    这个权值刻画了隐藏单元h对于输出单元k的误差应“负责”的程度。

    算法随着每个训练样例的出现而递增地更新权。
    这一点与梯度下降的随机近似算法一致。
    要取得误差E的真实梯度,需要在修改权值之前对所有训练样例的delta(j)*x(ji)值求和。

    在典型的应用中,反向传播算法的权值更新迭代会被重复上千次。
    有很多终止条件可以用来停止这个过程。
        一种方法是在迭代的次数到了一个固定值时停止:或当在训练样例上的误差降到某个阈值以下时;
        或在分离的验证样例集合上的误差符合某个标准时。
    终止判据的选择很重要,太少的迭代可能无法有效降低误差,而太多迭代会导致对训练数据的过度拟合。

    1.增加冲量项
    反向传播算法的应用非常广泛,实际使用中开发了很多反向传播算法的变体。
    其中最常见的是修改算法中权值更新法则,使第n次迭代时的权值的更新,部分地依赖于发生在第n-1次迭代时的更新:
        t(n) = etah * delta(j) * x(ji) + alfa * t(n-1)
    
    这里t是算法主循环中的第n次迭代进行的权值更新,并且0<= alfa <1是一个称为冲量(momentum)的常数。
    注意到,这个公式右侧的第一项就是反向传播算法公式中原有的权值更新法则。
    而右边的第二项,被称为冲量项。
    为了理解这个冲量项的作用,设想梯度下降的搜索轨迹就好像一个(无冲量的)球沿误差曲面滚下。
    alfa的作用是增加冲量,使这个球从一次迭代到下一次迭代时以同样的方向滚动。
    冲量有时会使这个球滚过误差曲面的局部极小值或使其滚过误差曲面上的平坦区域。
    如果没有冲量,这个球有可能在这个区域停止。
    它也具有在梯度不变的区域逐渐增大搜索步长的效果,从而可以加快收敛。

    2.学习任意的无环网络
    上述算法的定义虽然仅适用于两层的网络,但简单推广后可应用到任意深度的前馈网络。
    公式中权值的更新法则不变,仅改变计算delta的过程。
    概括地说,第m层的单元r的delta(r)的值是由更深层的m+1层的delta值根据下式计算的:
        delta(r) = o(r) * (1 - o(r)) * sum(s in m+1){w(sr) * delta(s)}
    这个公式与算法的第三步相同,这里要说明的是对于网络中的任意数量的隐藏单元,该步骤要被重复很多遍。

    这个算法推广到任何有向无环结构也同样简单,而不论网络中的单元是否像我们目前假定的那样被排列在统一的层上。
    对于网络单元没有按此排列的情况,计算任意内部单元(也就是所有非输出单元)的delta的法则是:
        delta(r) = o(r) * (1-r(r)) * sum(s in Downstream(r)) {w(sr) * delta(s)}

    其中,Downstream(r)是在网络中单元r的直接的下游(immediately downstream)单元的集合,或者说输入中包括r的输出的所有单元。

4.5.3反向传播算法的推导
    反向传播算法的权值调整法则的推导,可跳过

4.6反向传播算法的说明
4.6.1收敛性和局部极小值
    反向传播算法实现了一种对可能的网络权值空间的梯度下降搜索,它迭代地减小训练样例的目标值和网络输出间的误差。
    因为对于多层网络,误差曲面可能含有多个不同的局部极小值,梯度下降可能陷入这些局部极小值中的任何一个。
    因此,对于多层网络,反向传播算法仅能保证收敛到误差E的某个局部极小值,不一定收敛到全局最小误差。

    尽管缺乏对收敛到全局最小误差的保证,反向传播算法在实践中仍是非常有效的函数逼近算法。
    为了对这个问题有一些直观的认识,考虑含有大量权值的网络,它对应着维数非常高的空间中的误差曲面(每个权值一维)。
    当梯度下降陷入相对某个权的局部最小值时,相对其他的权,这里未必是局部极小值。
    事实上,网络的权越多,误差曲面的维数越多,也就越可能为梯度下降提供更多的"逃逸路线",让梯度下降离开相对该单个权值的局部极小值。

    对局部极小值的第二种观点是需考虑随着训练中迭代次数的增加网络权值的演化方式。
    注意,在算法中,如果把网络的权值初始化为接近于0的值,那么在早期的梯度下降步骤中,网络将表现为一个非常平滑的函数,近似为输入的线性函数。
    这是因为sigmoid函数本身在权值靠近0时接近线性。
    仅当权值已经增长了一定时间之后,它们才会到达可以表示高度非线性网络函数的程度。
    可以预期在这个能表示更复杂函数的权空间区域存在更多的局部最小值。
    但希望当权到达这一点时它们已经足够靠近全局最小值,即便它是这个区域的局部极小值也是可以接受的。

    尽管有上面的评论,人们对用ANN表示的复杂误差曲面的梯度下降理解得还算不够,还不知道有何方法能确切地预测局部极小值什么时候会导致困难。
    用来缓解局部极小值问题的一些常见的启发式规则包括:
        -为梯度更新法则加一个冲量项。
        冲量有时可以带动梯度下降过程,冲过狭窄的局部极小值(然而,它也可能带动梯度下降冲过狭窄的全局最小值到其他局部极小值!)

        -使用随机的梯度下降而不是真正的梯度下降。
        梯度下降的随机近似对于每个训练样例沿一个不同的误差曲面有效下降,它依靠这些梯度的平均来近似对于整个训练集合的梯度。
        这些不同的误差曲面通常有不同的局部极小值,这使得下降过程不太可能陷入任意一个局部极小值。

        -使用同样的数据训练多个网络,但用不同的随机权值初始化每个网络。
        如果不同的训练产生不同的局部极小值,那么对分离的验证集合性能最好的那个网络将被选中。
        或者保留所有的网络,并且把它们当作一个网络"委员会",它们的输出是每个网络输出的平均值(可能加权)。

4.6.2前馈网络的表征能力
    什么类型的函数可以使用前馈网络来表示呢?
    这个问题的答案依赖于网络的宽度和深度。
    尽管目前对一族函数可以用哪种类型的网络描述还知道得很少,但已经知道了三个一般性的结论:

        -布尔函数:任何布尔函数可以被具有两层单元的网络准确表示,尽管在最坏的情况下所需隐藏单元的数量随着网络输入数量的增加成指数级增长。
        为了说明这是如何实现的,考虑下面表示任意布尔函数的通用方案:对于每一个可能的输入向量,创建不同的隐藏单元,并设置它的权值使当且仅当这个特定的向量输入到网络时该单元被激活。
        这样就产生了一个对于任意输入仅有一个单元被激活的隐藏层。
        接下来把输出单元实现为一个仅由所希望的输入模式激活的或门(OR gate)。

        -连续函数:每个有界的连续函数可以由一个两层的网络以任意小的误差(在有限范数下)逼近。这个理论适用于在隐藏层使用sigmoid单元、在输出层使用(非阈值的)线性单元的网络。
        所需的隐藏单元数量依赖于要逼近的函数。

        -任意函数:任意函数可以被一个有三层单元的网络以任意精度逼近。
        与前面相同,输出层使用线性单元,两个隐藏层使用sigmoid单元,每一层所需的单元数量一般不确定。
        这一结论的证明方法为:首先说明任意函数可以被许多局部化函数的线性组合逼近,这些局部化函数的值除了某个小范围外都为0;
        然后说明两层的sigmoid单元足以产生良好的局部逼近。

    这些结论表明有限深度的前馈网络为反向传播算法提供了非常有表征力的假设空间。
    然而记住下面一点是重要的:梯度下降是从一个初始的权值开始的,因此搜索范围里的网络权向量可能不包含所有的权向量。

4.6.3假设空间搜索和归纳偏置
    把反向传播算法的假设空间搜索和其他学习算法采取的搜索相比较很有意义。
    对于反向传播算法,网络权的每一种可能赋值都表示了一个句法不同的假设,原则上都在学习器的考虑范围内。
    换句话说,这个假设空间是n个网络权值的n维欧氏空间。
    注意,这个空间是连续的,这与决策树学习和其他基于离散表示的方法的假设空间完全不同。
    假设空间的连续性以及误差E关于假设的连续参数可微这两个条件,导致了一个定义良好的误差梯度,为最佳假设的搜索提供了一个非常有用的结构。
    这个结构与基于符号的概念学习算法的“一般到特殊序”搜索的结构,或ID3等算法中对决策树的简单到复杂序搜索所用的结构都完全不一样。

    反向传播算法从观测数据中泛化的归纳偏置是什么呢?
    精确地刻画出反向传播学习的归纳偏置是有难度的,因为它依赖于梯度下降搜索和权空间覆盖可表征函数空间的方式的相互作用性。
    然而,可以把这一偏置粗略地刻画为在数据点之间平滑插值(smooth interpolation between data points)。
    如果给定两个正例,它们之间没有反例,反向传播算法会倾向于把这两个点之间的点也标记为正例。
    训练样例的特定样本产生了平滑变化的决策区域。

4.6.4隐藏层表示
    反向传播算法的一个迷人特性是,它能够在网络内部的隐藏层发现有用的中间表示。
    因为训练样例仅包含网络的输入和输出,权值调节的过程可以*地设置权值,来定义任何隐藏单元表示,
    这些隐藏单元表示在使误差平方E达到最小化时最有效。
    这能够引导反向传播算法定义新的隐藏层特征,这些特征在输入中没有明确表示出来,但却能捕捉输入实例中与学习目标函数最相关的特征。

    例如,见书78页。

    多层网络在隐藏层自动发现有用表示能力,是ANN学习的一个关键特性。
    与那些仅限于使用人类设计者提供的预定义特征学习方法相比,它提供了一种相当重要的灵活性
    ————允许学习器创造出设计者没有明确引入的特征。
    当然,这些创造出的特征一定是网络输入的sigmoid单元函数可以计算出的。
    注意,网络中使用的单元层越多,就可以创造出越复杂的特征。

4.6.5泛化、过度拟合和停止判据
    在前面所述的反向传播算法的描述中,没有指定算法使用的最终条件。
    终止权值更新循环的合适条件的一种是,继续训练直到对训练样例的误差E降低至某个预先定义的阈值之下。
    事实上,这不是一个好策略,因为反向传播算法容易过度拟合训练样例,降低对于其他未见过实例的泛化精度。

    注意,尽管在训练样例上的误差持续下降,但在验证样例上测量到的误差E先下降,然后上升。
    造成这种现象,是因为这些权值拟合了训练样例的“特异性”(idiosyncrasy),而这个“特异性”对于样例的一般分布没有代表性。
    ANN中大量的权值参数为拟合这样的“特异性”提供了很大的*度。

    为什么过度拟合往往是发生在迭代后期,而非早期?
    设想网络的权值是被初始化为小随机值,使用这些几乎一样的权值仅能描述非常平滑的决策面。
    随着训练的进行,一些权值开始增长,以降低在训练数据上的误差,同时学习到的决策面的复杂度也在提高。
    于是,随着权值调整迭代次数的增加,反向传播算法获得的假设的有效复杂度也在增加。
    如果权值调整迭代次数足够多,反向传播算法经常会产生过度复杂的决策面,拟合了训练数据中的噪声和训练样例中没有代表性的特征。
    这个过度拟合问题与决策树学习中的过度拟合问题相似。

    有几种技术可以用于解决反向传播中过度拟合问题。一种方法被称为权值衰减(weight decay),它在每次迭代过程中以某个小因子降低每个权值。
    这等效于修改过E的定义,加入一个与网络权值的总量相应的惩罚项。
    此方法的动机在于保持权值较小,从而使学习过程向着复杂决策面的反方向偏置。

    解决过度拟合问题的一个最成功的方法就是在训练数据外再为算法提供一套验证数据。
    算法在使用训练集合驱动梯度下降搜索的同时,监视对于这个验证集合的误差。
    算法应该进行多少次权值调整迭代呢?
    应该使用在验证集合上产生最小误差的迭代次数,因为这是网络性能对于未见过实例最好表征。
    在这种方法的典型实现中,网络的权值被保留两份拷贝:
    一份用来训练,另一份拷贝作为目前为止性能最好的权,衡量的标准是它们对于验证集合的误差。
    一旦训练到的权值在验证集合上的误差比保存的权值的误差高,训练就被终止,并且返回保存的权值作为最终的假设。

    一般而言,过度拟合问题以及客服它的方法是一个棘手的问题。
    上面的交叉验证方法在可获得额外的数据提供验证集合时工作得最好。
    然而遗憾的是,过度拟合问题对小训练集合最为严重。
    在这种情况下,有时使用一种被称为“k-fold交叉验证”(k-fold cross-validation)的方法,
    这种方法进行k次不同的交叉验证,每次使用数据的不同分割作为训练集合和验证集合,然后对结果进行平均。

4.7举例:人脸识别
4.7.1任务
    这里的学习任务是对不同的人的不同姿态的摄影图像进行分类。
    样例是20个人不同的人,每个人大约有32张图像,对应这个不同的表情(快乐、沮丧、愤怒、中性)、他们面朝方向不同和他们是否戴太阳镜。
    人后面的背景、穿的衣服和人脸在图像中的位置也都有差异。

    从这些图像数据中可以学习很多不同的目标函数。
    例如,我们可以训练一个ANN,使输入给定的一幅图像时输出这个人的唯一标识(identity)、脸的朝向、性别、是否带太阳镜等。
    所有这些目标函数可以以很高的精度从这些数据中学习到,在本节后面的部分,我们考虑一个特定的任务:学习图像中人脸的朝向。

4.7.2设计要素
    应用反向传播算法到一个给定任务时,必须决定几个设计要素。
    下面归纳出了学习人脸朝向这个学习任务的一些设计要素。

    输入编码
    ANN的输入必然是图像的某种表示,那么设计的关键是如何编码这幅图像。
    例如,我们可以对图像进行预处理,来分解出边缘、亮度一致的区域或其他局部图像特征,然后把这些特征输入网络。
    这种设计的一个问题是会导致每幅图像有不同数量的特征参数(例如,边缘的数量),然而ANN具有固定数量的输入单元。
    所以,我们的设计是把图像编码成固定的30*32像素的亮度值,每个像素对应一个网络输入。
    并且把范围是0到255的亮度值按比例线性缩放到0到1的区间内,以使网络输入与隐藏单元和输出单元在同样的区间取值。
    实际上,这里的30*32像素图像就是原来的120*128像素图像的低分辨率概括,每个低分辨率像素根据对应的若干高分辨率像素亮度的均值计算得到。
    使用这样的低分辨率图像,把输入个数和权值的数量减少到了一个更易于处理的规模,从而降低了运算要求,但同时也保留了足够的分辨率以正确分类图像。
    在ALVINN系统中,也使用了类似的的输入,差别在于ALVINN系统每一个低分辨率像素的亮度等于从高分辨率图像对应的区域中随机取一个像素的高度,而不是取平均像素亮度。
    其意义在于明显地减少了从高分辨率图像产生低分辨率图像所需的运算量。
    这个效率对于ALVINN系统是特别重要的,因为在自动驾驶车辆的过程中,ALVINN系统的网络必须在每秒钟处理很多幅图像。

    输出编码
    ANN必须输出四个值中的一个来表示输入图像中人脸的朝向(左右上前)。
    注意我们可以使用单一的输出单元来编码这四种情况的分类,例如,制定输出值0.2,0.4,0.6,0.8来编码这四个可能值。
    不过这里我们使用4个不同的输出单元,每个对应四种可能朝向中的一种,取具有最高值的输出作为网络的预测值。
    这种方法经常被称为n取1(1 of n)输出编码,原因有二:
    第一,这为网络表示目标函数提供了更大的*度(即在输出层单元中有n倍的可用权值)。
    第二,在n取1编码中,最高值输出和次高值输出间的差异可以作为对网络预测的置信度(不明确的分类可能导致结果相近或相等)。
    进一步的设计问题是”这4个输出单元的目标值应该是什么“?
    一个显而易见的办法是用4个目标值<1,0,0,0>,<0,1,0,0>...来编码朝向。
    我们这里使用0.1和0.9,而不是0和1表示,原因是sigmoid单元对于有权值不能产生这样的输出。
    如果我们企图训练网络来准确匹配目标值0和1,梯度下降将会迫使权值无限增长。
    而值0.1和0.9是sigmoid单元在有限权值情况下可以完成的。

    网络结构图
    反向传播算法可以被应用到任何有向无环sigmoid单元的网络,所以,我们面临的另一设计问题是,这个网络包含多少个单元以及如何互连。
    最普遍的一种网络结构是分层网络,一层的每个单元向下连接到下一层的每一个单元。
    目前的设计选择了这样的标准结构,使用两层sigmoid单元(一个隐藏层和一个输出层)。
    使用一或两层sigmoid单元是很普遍的,偶尔使用三层。
    使用更多的层是不常见的,因为训练时间会变得很长,而且三层sigmoid单元的网络已经能够表示数量相当大的目标函数。
    我们已经确定选择有一个隐藏层的分层前馈网络,那么其中应该包含多少个隐藏单元呢?
    在例子中,仅用了三个隐藏单元,就达到了对测试集合90%的精度。
    在另一个使用30个隐藏单元的实验中,得到的精度提高了一到两个百分点。
    尽管这两个实验得到的泛化精度相差很小,但后一个试验明显需要更多的训练时间。
    人民已经发现在很多应用中需要某个最小数量的隐藏单元来精确地学习目标函数,并且超过这个数量的多余的隐藏单元不会显著地提高泛化精度,
    前提条件是使用交叉验证法来决定应该进行多少次梯度下降迭代。
    如果没有使用交叉验证,那么增加隐藏单元数量经常会增加过度你和训练数据的倾向,从而降低泛化精度。

    学习算法的其他参数
    学习速率为0.3,冲量被设定为0.3。
    赋予这两个参数更低的值会产生大体相当的泛化精度,但需要更长的训练时间。
    如果这两个值被设定得太高,训练将不能收敛到一个具有可接受误差的网络。
    在这个试验中,使用完全梯度下降(与前述算法不同)
    输出单元的网络权值被初始化为小的随机值,然而输入单元的权值被初始化为0,因为这样可以是学习到的权值的可视化更易于理解,而对泛化精度没有明显影响。
    训练的迭代次数的选择可以通过分割可用的数据为训练集合和独立的验证集合来实现。
    梯度下降方法被用于最小化训练集合上的误差,并且每隔50次梯度下降迭代根据验证集合评估一次网络的性能。
    最终选择的网络是对验证集合精度最高的网络。
    
4.7.3学习到的隐藏层表示
    见书,分析案例结果

4.8人工神经网络的高级课题
4.8.1其他可选的误差函数
    只要函数E相对参数化的假设空间可微,那么就可以执行梯度下降。
    虽然基本的反向传播算法以网络误差平方和的形式定义E,但也有其他的定义,以便把其他的约束引入权值调整法则。
    如果定义一个新的E,那么就必须推导出一个新的权值调整法则供梯度下降使用。
    比如:
        -为权值增加一个惩罚项:
        把一个随着权向量幅度增长的项加入到E中。
        这导致梯度下降搜寻较小的权值向量,从而减小过度你和的风险。

        -对误差增加一个目标函数的斜率(slope)或倒数:
        某些情况下,训练信息中不仅有目标值,而且还有关于目标函数的导数。
        例如,一个字符识别的应用中,使用了一些训练导数来强迫网络学习那些在图像平移中不变的字符识别函数。

        -使网络对目标值的交叉熵(cross entropy)最小化:
        考虑学习一个概率函数,比如根据这个申请者的年龄和存款余额,预测一个借贷申请者是否会还贷。
        尽管这里的训练样例仅提供了布尔型的目标值,但基本的目标函数最好以申请者坏带的概率形式输出,而不是对每个输入实例都企图输出明确的布尔值。
        在这种情况下,我们希望网络输出一个概率估计,可以证明最小化交叉熵的网络可以给出最好的概率估计。

        -改变有效误差函数也可以通过权值共享(weight sharing)来完成,也就是把不同单元或输入相关联的权“捆绑在一起”:
        这里的想法是强迫不同的网络权值取一致的值,通常是为了实施人类设计者事先知道的某个约束。

4.8.2其他可选的误差最小化过程
    虽然梯度下降是搜寻使误差函数最小化的假设的最通用的方法之一,但它不总是最高效的。
    当训练复杂的网络时,不难见到反向传播算法要进行上万次的权值更新迭代的情形。
    由于这个原因,人们探索并提出了很多其他的权值优化算法。
    为了领会其他可能的方法,我们不妨把权值更新方法看做是要决定这样两个问题:
    选择一个改变当前权值向量的方向;选择要移动的距离。
    在反向传播算法中,这个方向是通过取梯度的负值来选择的,距离是通过常量的学习速率来决定的。

    一种被称为线搜索(line search)的优化方法采用了不同的方法选择权值更新的距离。
    每当选定了一条确定权值更新方向的路线,那么权更新的距离是通过沿这条线寻找误差函数的最小值来选择的。
    注意,这可能导致很大幅度,也可能是很小幅度的权值更新,要看沿这条线的最小误差点的位置。
    另一种方法是根据线搜索的思想建立的,被称为共轭梯度(conjugate gradient)法。
    这种方法进行一系列线性搜索来搜索误差曲面的最小值。
    这一系列搜索的第一步仍然使用梯度的反方向。
    在后来的每一步中,选择误差梯度分量刚好为0并保持为0的方向。

    虽然其他的误差最小化方法提高了训练网络的效率,但像共轭梯度这样的方法则对最终网络的泛化误差没有明显影响。
    对最终误差唯一可能的影响是,不同的误差最小化过程会陷入不同的局部极小值。