3.5 神经网络的学习
每个特定的神经网络的网络结构是事先设计好的,包括有多少个神经元、这些神经元之间的相互连接关系。如果是分层网络,还需要设计好输入层、隐藏层(可以有多个)和输出层。但是,光设计好这些是不够的,一个神经网络中还有大量的参数需要确定,包括神经元之间的每条连接的连接权重、每个输出的阈值。这些参数是在网络的训练阶段完成设置的。
神经网络的学习是指从训练数据中自动调整模型中的参数,最终获得最优参数的过程。根据训练数据集是否有标记以及训练评价方法,学习方式主要有以下三类。
监督学习:训练数据集包括输入和通过标记给出的正确输出。通过这种方式,网络可以比较计算结果和正确输出之间的误差值,并据此修正网络参数来缩小误差值。大部分机器学习是监督学习,如支持向量机、逻辑回归算法等。
无监督学习:训练数据集仅包括输入,没有正确答案,网络自动完成输入数据的运算分类,如主成分分析算法、聚类算法等是典型的无监督学习算法。
强化学习:训练数据集包括输入,以及为训练行为给出的奖惩策略。如果训练行为正确,视情给予相应的奖励,否则就是惩罚。
人工神经网络,尤其是深度学习神经网络,必须要有大量的训练数据和测试数作为支撑。没有大量的数据对网络模型进行训练测试,就无法得到实用的网络模型。因此,人工神经网络的特征就是可以“从数据中学习”。
3.5.1 数据驱动
千百年来,人类解决问题是以知识、经验和直觉为依据的。机器学习的方法是要尽可能避免人为介入,尝试从收集的海量数据中寻找规律,找出解决问题的方法,这就是数据驱动。
数据驱动的提法另外一个原因是相对于信息化建设的需求牵引原则。信息化的任务是将人员的人工管理转变为计算机管理,因此,要建设一个具备哪些能力的系统是可以说清楚的,能力包括具有哪些功能,达到什么样的指标。这就是所谓的用户需求。开发者必须让信息系统实现用户所要求的所有功能和性能要求。以深度学习为特征的智能系统所做的功能基本上是以前人们没有做的,有些是以前想做而做不到的,有些干脆是没有想过的。现在技术的进步允许处理海量数据,就有机会分析数据,找出数据中蕴藏的规律。这样的做法显然不是需求牵引,只能是数据驱动。
从数据中找规律通常的做法是先对数据提取特征,比如对图像数据,提取反映图像本质的特征量。传统的机器学习由人设计并标注特征,工作量非常大,人为标注的优劣对模型最终的结果影响巨大。如果提取的特征有偏差,最后的结果一定出问题。
深度学习所采用的网络层级远比机器学习要多,因此需要确定的参数成千上万,数据量也更大,再由人来设计标注特征不切实际,深度学习的特征选取和标注是由机器自动完成的。深度学习有时被称为端到端的机器学习,即输入原始数据就可以获得目标结果,中间不再需要人的介入。
机器学习使用的数据根据用途分为训练数据和测试数据。机器学习模型首先使用训练数据进行学习,寻找出最优参数,将神经网络模型固定下来;然后使用测试数据对训练得到的模型进行测试,评判模型的实际效果。使用训练数据对模型进行测试除了验证模型的准确性外,还可以提高模型的泛化能力,这是把训练数据与测试数据分列的主要原因。
3.5.2 损失函数
对于同一个结构的神经网络,如果网络参数(权重和阈值)不同,即使输入的是同一个数据集,达到的输出结果显然是不同的。这些不同的输出值就有优劣之分,自然我们要寻找的是,使得输出值最接近期望值的那组参数。
用来计算评估实际输出值与期望输出值(正确答案)之间的差异的函数称损失函数,或称误差函数。使用哪些函数作为损失函数呢?
原则上只要是能够计算实际输出值与期望输出值之间差异的函数都可以作为损失函数,但通常使用的损失函数是均方差函数和交叉熵误差函数,这两种函数各有用途。
(1)对于多分类问题(n个训练数据分成m个类),一般使用交叉熵损失函数
(2)对于递归问题,通常使用均方差(最小二乘)损失函数
其中,r表示网络的期望输出,y表示网络的实际输出。
均方差损失函数非常普通,容易理解,BP网络通常使用它。其中的系数1/2是为了计算方便,最小二乘法的平方和是为了避免误差值的代数和出现正负抵消而影响误差值的实际总和,网络实际输出值是由激活函数计算得出的位于0到1之间的一个值。
交叉熵损失函数中的实际输出是通过似然函数softmax计算得到的一个概率值。交叉熵损失函数有些费解,需要一些信息论的知识。
先介绍信息的定义。
1928年哈特莱(R.V.L. Hartley)定义的信息是“信息是被消除的不确定性”。有些抽象,举个例子。
中国足球队与韩国足球队比赛,结果说“韩国队赢了”,这是一条信息,如果再说“中国队输了”,因为没有再消除不确定性,所以不是信息。但如果说“中国队以0:1惜败”则又是信息了,继续说“中国队在加时遭韩国队绝杀,以0:1惜败”,这还是一条信息。
信息有了明确的定义,如何比较不同信息之间所含的信息量的大小呢?这就是信息的度量问题。
对信息进行量化的想法还是哈特莱提出的。
他提出,如果信息源有m种消息,且每个消息是以相等可能产生的,则该信源的信息量定义为:
I=log2m
【例1】中国女排与美国女排比赛,结果有两种,中国队胜,美国队胜。比赛结果为信源m,此时m=2,信息量I=log22=1,单位是比特(bit)。
【例2】2018年俄罗斯世界杯有32支球队争夺冠军,如何用信息量来描述哪支球队获得冠军?
如果按照哈特莱的算法(每支球队获得冠军的概率相等),各支球队获得冠军的信息量是:
I=log2 32=log2 25=5
这是不严谨的,因为32支球队获得冠军的概率是不同的。国际足联在对32支球队分组前,先根据FIFA排名将其划分成四档:
第一档:德国、巴西、葡萄牙、阿根廷、比利时、波兰、法国、俄罗斯;
第二档:西班牙、秘鲁、瑞士、英格兰、哥伦比亚、墨西哥、乌拉圭、克罗地亚;
第三档:丹麦、冰岛、哥斯达黎加、瑞典、突尼斯、埃及、塞内加尔、伊朗;
第四档:塞尔维亚、尼日利亚、澳大利亚、日本、摩洛哥、巴拿马、韩国、沙特。
概率不同如何计算信息量?这是香农的贡献,根据“事件出现的概率越小,信息量越大”原理,事件Xi的信息量定义为:(P(Xi)表示事件Xi发生的先验概率)
H(Xi)=−log2 P(Xi)
综合各队近期表现、球员实力、比赛经验,认为巴西队最终夺冠的概率最高,有1/16的可能性,那么,巴西队夺冠的信息量是:
如果认为韩国队夺冠的概率只有巴西队的,那么,韩国队夺冠的信息量是:
前面说明的是单个事件的信息量,对于一个样本整体,如何来描述其信息量呢?
香农用熵来描述一个样本整体的信息量,也就是其杂乱程度或意外程度的数值。
信息熵的定义是,对于任一随机变量X,其信息熵为:
就是把每个可能项的概率值乘以该可能项所含的信息量,然后累加。由于0≤P(x)≤1,logP(x)≤0,加“-”保证得到正值。
前面第2个例子“谁是世界杯冠军”的信息量公式应该是:
H=−(p1log2 p1+p2log2 p2+…+p32log2 p32)
其中,p1, p2, …, p32分别是32支球队夺冠的概率。
可以检验,当各支球队夺冠概率相差越大,熵越小,夺冠概率相差越小,熵越大,等概率时的熵为5,这是最大值。
归纳一下:
越是难以分出各球队夺冠概率的大小,说明我们掌握的信息越少,竞争形势越混乱,此时的熵越大。
如果能够确定有球队夺冠概率很大(或很小),说明我们掌握的信息较多,竞争形势较明朗,此时的熵就小。
因此,信息量大小与熵的大小成反比。
理解了信息熵概念再介绍交叉熵就容易了。
先看只有一组训练数据的情况,回顾一下自然对数函数负值部分的图像,如图3-9所示。
图3-9 自然对数函数y=lnx的图像
此时,交叉熵误差函数定义为:
yk为神经网络的实际输出,取值区间[0, 1];rk为期望输出,只取0或1两个值。因此,只有当分类正确时,rk为1,否则为0。比如,假设数据标签为“A”,对于一个输入,神经网络认为数据为“A”的输出(可能性)为0.6,则交叉熵误差为−ln 0.6=0.51,如果输出为0.1,则交叉熵误差为−ln 0.1=2.3。显然离正确值差距越大,其交叉熵值越大。
由于在不正确分类时,rk=0,上述公式实际上是对正确分类的输出数据的对数值求和,因此,交叉熵误差值只与由正确分类的输出结果有关。
由对数函数性质可知,正确分类(rk为1)的输出值yk越大(接近1),ln yk越接近0,此时,交叉熵误差值最小;当yk越小(接近0),ln yk越接近1,此时,交叉熵误差值最大。yk越接近rk,交叉熵误差值越小,反之越大。所以,交叉熵误差值可以作为损失函数。
由此可知,交叉熵误差值越小,结果越好,交叉熵误差值越大,结果越差。
再看训练数据分成N个组的情况,此时交叉熵误差为:
ynk为第n组数据的第k个元素的网络输出;rnk为第n组数据的第k个元素的理想输出。除以N是求单组数据的“平均误差”。至此,交叉熵损失函数就解释清楚了。
损失函数是调整网络参数的工具。如何通过计算损失函数的值来调整参数值呢?
参数值通常是微调的,所以想到对损失函数E求关于参数值W(权重)的导数。损失函数对参数的导数值的正、负和0值,可以指明参数的变化方向,以保证损失函数逐步收敛:
3.5.3 激活函数
激活函数是人工神经网络的重要组成部分,负责对输入信号进行非线性变换,可以拟合各种曲线,并输出最终结果。如果没有经过激活函数处理,神经网络的每一层节点的输入都是上层输出的线性函数,很容易验证,无论神经网络有多少层,输出都是输入的线性组合,网络仅能够表达线性映射,此时即便有再多的隐藏层,整个网络跟单层神经网络也是等价的。因此,激活函数提供了网络的非线性建模能力。
激活函数中的“激活”一词是指对网络中的某个神经元是否被接收到的所有输入信号之和所激活,或者说,这个神经元所接收到的信号是起作用,还是被忽视。激活函数将神经元的所有输入,包括输入值、连接权重,经过代数运算,得到一个综合的激活值,激活函数根据这个激活值离阈值的远近,决定这个神经元输出0~1或-1~1的数值。
不是任何函数都适合做神经元的激活函数的。那么激活函数应该具有哪些性质呢?
可导性:由于人工神经网络的误差反向传递算法需要对损失函数求导数,因此,激活函数必须是可导的;
单调性:只有当激活函数是单调的,才能保证根据输出的误差值,逐步调整网络参数,达到误差收敛的效果;
非线性性:如果使用线性函数作为激活函数,增加网络层数将变得没有意义。这是因为,假设用线性函数f(x)=cx作为激活函数,后续再增加一层,其运算近似于y(x)=f(f(x))=c2x,这样的结果可以直接设f(x)=c2x,从而使增设一层网络变得没有意义;输出值的范围:原则上对激活函数的输出值是没有限定的。但是,如果激活函数输出值为有限时,基于梯度的优化方法会更加稳定,因为特征的表示受有限权重的影响更显著;如果激活函数输出值为无限时,模型的训练会更加高效,不过在这种情况下,一般需要更小的学习率。另外,激活函数的值域最好是在概率空间[0, 1]范围内,否则不能直接作为输出层的输出值,还需要通过softmax函数来计算分类的概率。
1. 阶梯函数
M-P模型和感知器使用如下的阶梯函数作为激活函数(见图3-10)。
图3-10 阶梯函数
其中,xi为网络的输入,wi为连接权重,h为阈值。
2. sigmoid函数
最初的神经网络就是将感知器的激活函数中的阶梯函数换成sigmoid函数(见图3-11),从而将神经元的输出从二值改成了0~1的连续值:
图3-11 sigmoid函数
使用阶梯函数作为激活函数的想法很自然,满足条件(阈值)函数取值为1,不满足函数取值为0。但是,在数据分析中,很多判断只能是一个概率值,无法给出明确的二值逻辑值,所以阶梯函数在很多场合是不适应的,于是又引入了sigmoid函数。
尽管因为其一些固有的缺陷,现在的神经网络已经很少使用sigmoid函数了,但是,不可否认,当初想到构造这样一个函数还是很不简单的,其最初的启发个人猜测是来自于伯努利试验。
来看伯努利试验:如果每次试验只有“成功(取值为1)”与“失败(取值为0)”两种结果,成功的概率P是一个常数,这种试验成为伯努利试验。1次伯努利试验的概率是:
因为只能给出一种结果的概率值,所以来看每次试验的成功与失败的比值,
令:
p是伯努利试验成功的概率,以此作为激活函数更符合对分类判断可能性的描述。
下面来比较一下阶梯函数与sigmoid函数的不同之处。
阶梯函数在阈值处出现陡变,在阈值处不连续,无法求导数值,在其他地方导数值为0,函数值非0即1。
sigmoid函数是一条光滑的曲线,在区间(0, 1)连续取值,处处可以求导数,导数值为正数。
误差反向传递算法需要对损失函数求导数,因此,阶梯函数就无法完成参数自动学习调整的任务,而sigmoid函数是可以的。
进一步,阶梯函数只能输出0或1两个值,而sigmoid函数可以输出区间(0, 1)上的任意值,因此,对结果的描述更加精细。
sigmoid函数是不是没有毛病了呢?下面来继续分析sigmoid函数的特性。
为了推导方便,将sigmoid函数写成如下形式:
可以对sigmoid函数求一阶导数:f′(x)=f(x)(1−f(x)),因此可以作为误差反向传递算法(见第3.6节)训练使用。
如图3-12所示,首先,sigmoid函数的一阶导数(梯度值)≤0.25,而且,变量取值只在区间[−5, 5]之间梯度值较大,其余区域梯度值会很小,有可能引发梯度消失问题(见第3.6节);其次,sigmoid函数还包含指数函数,运算量很大;第三,sigmoid函数的值域是(0, 1),函数值都是正值,算法不是一个对称算法,并不是所有情况下都希望下一个神经元只能接受正值输入,而且算法收敛缓慢。所以,现在深度学习中已不常使用。
图3-12 sigmoid函数及其导数的图像
3. tanh函数
杨立昆先生建议采用双曲正切函数tanh来解决sigmoid的非对称问题。tanh函数的图像形状与sigmoid函数很像,区别是值域从(0, 1)扩大到(−1, 1),这是一个对称区间。
tanh函数的导数为:
f'(x)=1-(f(x))2
tanh函数的值域是以0为中心的区间(-1, 1),因此优化更容易,但同样存在梯度消失和运算效率问题。因此,必须寻找新的激活函数来解决梯度消失问题和运算效率问题。
4. ReLU函数
激活函数ReLU(Rectified Linear Unit,修正线性单元)是一个非常简单的函数,但有着不简单的效果。
图3-13 tanh函数及其导数的图像
修正线性单元ReLU的定义为:f(x)=m ax(x, 0),或定义成:
即如果输入值大于0,直接输出该值,否则输出0(函数及其导数的图像见图3-14)。
图3-14 ReLU函数及其导数的图像
显然,ReLU函数的作用是,当x>0时,f(x)>0,模型会更新参数,否则不会更新。再来看看这个函数的导数:
这个导数函数是一个标准的阶梯函数。
不难看出,ReLU函数计算显然简单,而且不会出现梯度问题。文献“Krizhevsky, ImageNet Classification with Deep Convolutional Neural Networks, 2012”已经证明,与sigmoid和tanh相比,ReLU的收敛速度提高了6倍。
但是,ReLU函数在解决了梯度消失和计算效率问题的同时,又出现了下列两个问题:
• ReLU的取值范围为(0, ∞),已经超出概率空间[0, 1],因此不能直接作为输出值出现在输出层,还需要使用softmax函数(见3.5.3节似然函数)来计算分类的概率;
• ReLU的另一个问题是“死神经元”问题。当x≤0时,对应的梯度值为0,神经元无法更新;当x>0时,因为ReLU函数的梯度值可以很大,可能导致权重w调整步伐过大,使得某个神经元跳过调整,以后的梯度都是0,神经元不会再被激活;
• 和Sigmoid激活函数类似,ReLU函数的输出同样不以零为中心。
尽管存在这些问题,ReLU目前仍是最常用的激活函数,在搭建人工神经网络时推荐优先尝试。
下列函数可以解决ReLU的死神经元问题:
• Maxout
• Leaky ReLU
• Parametric ReLU(PReLU)
• Randomized leaky Rectified Linear Units(RReLU)
5. maxout函数
maxout函数是一种新型的激活函数,是一个可学习的分段线性函数,是从k个候选输出值中选取最大的一个作为这个值的唯一输出。
实际上,是将网络的中间层所有m个元素分成d个小组,每个小组有k个元素,每个小组只取其最大值作为这个小组的代表输出。
如图3-15所示,首先将中间层分成若干个(图中为d个)元素相等(图中为k个)的小组,设zpl为中间层的第p小组的第l个元素,其计算公式为:
图3-15 maxout函数示意图
于是,被选作第p小组唯一的输出为:
6. ReLU函数的衍生函数
由于函数ReLU在x<0时梯度为0,这样,这个神经元有可能再也不会被任何数据激活。如图3-16所示的3个函数都是对函数ReLU的负数端进行了改进,因此都属于ReLU的衍生函数。
图3-16 ReLU及其衍生函数示意图
Leaky ReLU函数:
其导数为:
当x<0时,Leaky ReLU函数让变量乘以一个很小的常数a,例如a=0.01,这样就可以得到0.01的正梯度,从而避免出现死神经元问题。
PReLU函数:y=max(αx, x),a是一个超参数,不是一个固定值,是由误差反向传播算法计算出来的,从理论上看比Leaky ReLU函数设计得更合理些。PReLU激活函数出自于微软研究院何凯明等人的论文《Delving Deep into Rectifiers: Surpassing Human-LevelPerformance on ImageNet Classification》。
理论上来讲,ReLU函数的衍生函数有ReLU的所有优点,且不会有死神经元问题,但是在实际操作当中,并没有完全证明它们总是好于ReLU函数。
3.5.4 似然函数
机器学习的目的是让机器的实际输出与期望输出尽可能地接近。判断实际输出与期望输出是否足够接近的常用手段有两种:计算二者差异程度的误差函数,或者是计算二者接近程度的似然度。所谓似然度就是二者的相似程度。
这两种方法的目的或结果是一致的,差别是分析问题的角度不同。一个是从两者的相差程度来衡量它们的接近程度,另一个是从两者的相似程度来计算它们的接近程度。当然希望二者的误差函数值能够最小,或者二者的似然度最大。
与计算实际输出值与期望输出值之间差异的误差函数类似,似然度是通过计算似然函数获得的。在介绍似然函数之前,需要介绍最大似然估计,为此,还需引入先验概率和后验概率概念。
先验概率:在一个事件发生前,人们根据已有的经验或知识预测该事件发生的概率。如,掷六面骰子,掷出点数为1的概率为1/6。再如,已知机场已经实行了流量控制,根据自己以往乘坐飞机的经验,预测自己今天乘坐的那个航班延误的概率。
后验概率:在一个事件发生后,人们分析计算导致该事件发生的各种原因的各自概率。如已知连续掷两次骰子的点数和为8,求其中1次点数和为3,1次点数和为5的概率。再如,已知自己乘坐的航班已经延误,计算因为机场流控造成这个航班延误的概率和因为机械故障造成航班延误的概率。
先验概率是根据经验或知识来预测未来事件出现的可能性,后验概率是在事件已发生后,分析计算导致事件发生的各种原因的可能性。在分析计算后验概率时,会用到先验概率的知识。
例:已知连续投掷两次骰子的点数之和为8,求其中一次为点数和3,另一次点数和为5的概率。
其中,按照经验,掷出2+6、3+5、4+4等的概率是一样的,是先验概率。
有了先验概率和后验概率知识后,理解最大似然估计就比较容易了。
先举个例子,一天,一个猎人带着他的一帮朋友去林子里打猎,看到远处树梢上有只野鸡,猎人要求大家一起向这只可伶的野鸡开枪。一声令下,枪声一片,野鸡应声落树。走近细看,一枪爆头!是谁打了神准的这一枪?大家一致认为是猎人,因为他的枪法最好,一枪爆头只有他能做到。大家的思维方式不自觉地用到了最大似然估计。
用数学描述最大似然估计就是:给定一组样本数据,一个计算模型,在这个计算模型中有一些未确定的参数。利用样本数据,对各种参数组合进行分别测试,通过模型计算比较哪种参数组合得到的概率值最大,即找出一种参数组合,可以得出引发该事件的概率最大。
在统计中,似然函数是一种关于统计模型中的参数的函数,表示模型中参数的似然性,是根据参数的作用对结果进行区分。在数据可用之前,使用概率来描述对于一组参数可能出现的结果。在数据可用之后,使用似然把结果描述成参数的函数。当给定输出x时,关于参数θ的似然函数L(θ)(在数值上)等于给定参数θ后变量X的概率:
L(θ)=P(X=x|θ)
进一步:
其中,X=(x1, x2, …, xn)
下面来解释公式:的含义:
对于似然函数L(θ)而言,我们希望求出一组参数θ,使得在这组参数下,似然函数值L(θ)为最大。
实际上是求似然函数L(θ)关于变量θ的最大值,可以使用对函数L(θ)求关于变量θ的导数的方法:
为了计算方便,改用求似然函数的对数函数的最大值。这是因为在(0, 1)区间内,对数函数单调递增,所以与原函数的极值点是相同的。
在机器学习中,因解决的问题种类不同,选用不同的似然函数,来计算多层感知器最终的输出结果。
(1)多分类问题。通常用softmax函数作为似然函数:
上式表示,输出层有n个神经元,第k个神经元输出的概率是p(yk),然后在这n个p(yk)值中比较,哪个值最大,最终将最大值作为最后的输出值。
分母是对输出层所有单元(q=1, …, n)的激活值进行求和,起到归一化作用,输出层中每个单元的取值都是介于0和1之间的概率值,取概率最大值作为最终分类结果输出。
softmax函数实际就是一个归一化函数,将一个向量u=[u1, u2, …, un]T归一化成和为1的概率向量p=[p(y1), p(y2), …, p(yn)]T。
上面的描述有些难懂,来看一个softmax函数简单的例子。
如果有3个输出值3、1、-3,使用softmax函数将其转换为概率输出值,然后再比较选择一个可能性最大的值作为最终的输出值,如图3-17所示。有些书将softmax函数作为输出层专用的激活函数介绍,也是有道理的。
图3-17 softmax函数示意图
如果某一个分量zj的似然函数值大过其他分量的函数值,那么softmax就输出这个分量。因此,y1就是最终的输出值。
需要注意的是,softmax函数包含e的指数函数,如果eui中的ui值过大,eui会非常大,有溢出的可能。
(2)递归问题。有时会使用线性输出函数作为似然函数。
线性输出函数会把激活值作为结果直接输出。输出层各单元的取值仍是介于0和1之间。
3.5.5 梯度与梯度下降法
量微积分中,标量场的梯度是一个向量场。如图3-18和图3-19所示,标量场中某一点的梯度指向是指在这一点标量场变化最大的方向(不一定是直接指向最低点的方向),图中虚线是函数的等高线。简单地说,一个点的梯度指示的方向是该点函数值减小最大的方向。
图3-18 函数f(x, y)=x2+2y2示意图
图3-19 函数f(x, y)=x2+2y2梯度下降示意图
对于单变量函数,其梯度就是函数的导数。对于三个变量的函数,梯度是对各个变量求函数的偏导数:
深度神经网络的参数非常多,因此,损失函数的梯度往往是一个维数很大的矩阵,相应的计算量必然非常大。
假设误差函数为E(w0, w1, …, wn),w0, w1, …, wn为神经网络中的参数,其梯度值定义为:
在机器学习中,自动调整参数的过程是,损失函数的取值从当前位置沿梯度方向前进一小段距离(距离大小由学习率决定),然后在新的地方重新求梯度,再沿着新梯度方向前进,如此反复,沿不断修正的梯度方向小步前进,逐渐减小损失函数值,直至达到预期范围。这个过程就是机器学习参数自动调整的梯度下降法。梯度下降法是机器学习中最优化问题的常用方法,特别在神经网络的学习中经常使用。
为了简单说明原理,假设只有一个权重参数w,损失函数与权重就可以用二维坐标系表示了。如图3-20所示,梯度下降法就是通过计算实际输出与期望输出之间的误差函数E=r−y2对权重的梯度,调整连接权重w0,得到新的连接权重w1,不断迭代调整权重,直至误差达到允许范围,得到最优的连接权重w最优。
图3-20 梯度下降法
具体采用什么样的方法计算误差非常关键。在误差反向算法中,误差计算函数一般采用最小二乘损失函数:
其中,r是期望输出,y是实际输出,加系数1/2是为了后面计算方便。
梯度下降法的目的是通过迭代调整权重w,使得误差越来越小:
E(w)→0(w→w最优)
如何调整权重使其达到最优?
对损失函数求导,可以得到图3-20中每个给定点(wi, Ei)的梯度值。当误差值较大时,其梯度值也较大,这时需要增大参数的调整幅度Δw;当误差较小时,其梯度值也较小,这时减小参数的调整幅度Δw。梯度大说明误差大,误差大,调整幅度就要大,这符合常识。
梯度下降法的调整方法是以目标的负梯度方向对权重进行调整的,其公式为:
η为学习率,这个超参数决定了参数调整幅度∆w的大小,参数调整幅度是学习率与梯度的乘积。
调整权重时用到了梯度,这要求激活函数和损失函数可以求导。回忆M-P模型,使用的激活函数是阶梯函数,是不连续的,更不可导。
为了使误差能够传播,Rumelhart等人使用可导函数sigmoid作为激活函数。
通常取λ=1,f′(u)=f(u)(1−f(u))
但是,一个函数的梯度为0,即f′(x)=0,无法确定在此点函数f(x)的值是极大值还是极小值,这需要通过再求二阶导数得出结论。用数学方式描述就是:
当f′(x)=0时,如果f′′(x)>0,x是一个局部极小值点,如果f′′(x)<0,x是一个局部极大值点,但是,如果f′′(x)=0,仍然无法确定x处函数值的属性。
对一个有n个变量的函数f(x1, x2, …, xn),其所有二阶偏导数组成的矩阵称为海森矩阵(Hessian matrix):
当A为正定矩阵时,f有极小值;当A为负定矩阵时,f有极大值。
3.5.6 学习率
学习率是指用来确定权重调整幅度大小的一个超参数,通常用字母η表示。所谓超参数,就是在开始学习过程之前设置值的参数,而不是通过训练得到的参数数据,所以,超参数通常需要尝试多个值,以便找到一个可以使学习顺利完成的参数值。
机器学习的参数调整需要通过多次迭代,不断逼近目标值。第t次调整连接权重的公式为:
从这个公式可知,学习率η和梯度是决定连接权重调整幅度大小的关键因素。梯度是由众多的连接权重和误差计算公式决定的,而学习率是一个影响全局的重要参数。就像我们在上课学习时,如果老师授课的进度太快,学生跟不上学习进度。如果教师授课的进度太慢,课程结束时学生发现学到的东西太少。
超参数学习率的数值设置很重要但又难以选择,多数是根据经验来确定的,这样就有可能选到一个不适当的值。
如果学习率η设置过大,导致每次权重调整的幅度Δw过大,有可能会错过权重的最优值,致使误差无法收敛;如果学习率η设置过小,虽然可以确保不会错过任何局部极小值,但也意味着将花费更长的时间来进行收敛。
于是想到,改变以往训练前设定一个学习率,用这个学习率贯穿整个学习过程的做法,在学习过程中动态调整学习率,试图选到一个适当的学习率。
动态调整学习率有一种做法是,首先设定一个较大的值,再逐渐减小这个值,这种方法称为学习率衰减(learning rate decay)。在实际生活中,学习一种知识,开始时通常会学到很多新知识,以后学到的新知识会逐渐减少。
学习率衰减法的做法是将网络中所有参数的学习率步调一致地降低。而AdaGrad算法就做得更加精细,针对每个参数,赋予其定制的学习率,算法名称中的Ada就是取值英文单词“Adaptive”,即自适应的意思。
AdaGrad算法就是将每一个参数的每一次迭代的梯度取平方累加后再开方,用全局学习率除以这个数,作为学习率的动态更新。AdaGrad方法的计算公式为:
t代表迭代次数,ε一般是一个极小值,比如为10-6,作用是防止分母为0。
AdaGrad计算公式与前面的连接权重调整公式相比,学习率多了一个梯度平方和的根式,这样,梯度越大学习率会越小,梯度越小学习率越大。而且,公式可以对每个参数逐个迭代求最佳学习率。
AdaGrad的缺点是在训练的中后期,分母上梯度平方的累加将会越来越大,从而梯度趋近于0,使得训练提前结束。
因为学习率的重要性,所以引起了很多学者的兴趣,不断提出了很多动态调整方法,除AdaGrad外,AdaDelta方法、Adam方法、Momentum方法也很有名,它们各有所长。
3.5.7 学习规则
各种人工神经网络在学习训练过程中,如何调整神经网络的参数,有各自的一套方法和规则,这些调整参数的方法和规则称为神经网络的学习规则。
人工神经网络在学习训练过程中调整的参数主要包括神经元之间的连接权重和属于神经元自身的阈值。
常用的神经网络学习规则包括误差修正学习规则、Hebb学习规则、竞争学习规则以及随机学习规则等。
1. 误差修正学习规则
误差修正学习规则也称Delta学习,其基本思想是,设定神经网络的期望输出r,然后根据计算出的网络实际输出y和期望输出r之间的差值,迭代调整参数。
每次迭代时,神经元i与神经元j之间的连接权重调整计算公式为:
wij(t+1)=wij(t)+η(rj(t)−yj(t))xi(t)
wij(t)表示时刻t的权重,wij(t+1)表示对时刻t的权重修正一次后得到的新权重,η为学习率,rj(t)为神经元j的期望输出,yj(t)为神经元j的实际输出,xi(t)为神经元i的输入。
调整的目标是使神经元j的实际输出与期望输出之间的误差平方为最小:
这实际上是求上述凸函数的最优化问题。
2. Hebb学习规则
1949年,赫布(Donald Hebb)提出,在同等条件下,出现兴奋状态多的神经元的组合会得到加强,而出现兴奋状态少的神经元的组合则会减弱。这就是后天学习可以增强智力和能力的理论依据。
Hebb学习规则:当某一突触两端的神经元同时处于兴奋状态时,那么该连接的权重应该增强。用数学方式描述调整权重wij的方法为:
wij(t+1)=wij(t)+ηxi(t)xj(t) (η>0)
xi、xj分别为神经元i、j的输出。因此,权重的调整值为:
∆wij=ηxi(t)xj(t)
Hebb规则不是普适的,刺激效应会有衰减现象。即同一刺激对生物体的重复作用,可能造成机体的习惯化。习惯化将减弱机体对刺激的反应,这与Hebb规则正好相反。
3. 竞争学习规则
竞争学习规则就是“胜者为王”的规则。网络中的某一组神经元,通过竞争,争取唯一一个对外界刺激的响应权力。
这个规则分为三个步骤:
(1)向量归一化:由于不同的模式单位不统一,因此在数据处理前,会将模式向量进行规范化;
(2)寻找获胜神经元:当网络得到一个输入模式向量时,竞争层的所有神经元都计算权重与输入模式的乘积值,对这些值进行比较,最大者为获胜神经元;
(3)获胜神经元输出为1,其余输出为0。只有获胜神经元才有权调整其权重。
4. 随机学习规则
随机学习规则不仅能够接受能量函数减小(性能得到改善)的变化,还可以以某种概率分布接受能量函数增大的变化。
接受使能量函数变大的变化是为了避免陷入局部极值问题,模拟退火算法(Simulated Annealing,SA)就是一种典型的随机学习算法。