查看原文
其他

老司机再讲深度学习,用白话文的方式教你轻松入门

2017-06-08 张玉宏 AI100


作者|张玉宏



我们之前给大家推送过老司机通俗易懂讲深度学习系列文章,不少小伙伴儿表示非常喜欢这类有趣的入门文章,所以今天继续给大家推送这个系列的两篇文章,看看老司机这次带来了哪些精彩内容。


(五)Hello World感知机,懂你我心才安息 


5.1 网之初,感知机


我们知道,《三字经》里开篇第一句就是:“人之初,性本善”。那么对于神经网络来说,这句话就要改为:“网之初,感知机”。感知机( Perceptrons ),基本上来说,是一切神经网络学习的起点。


很多有关神经网络学习(包括深度学习)的教程,在提及感知机时,都知道绕不过,但也仅仅一带而过。学过编程的同学都知道,不论是哪门什么语言,那个神一般存在的第一个程序——“Hello World”,对初学者有多么重要,可以说,它就是很多人“光荣与梦想”开始的地方。


感知机学习,就是神经网络学习的“Hello World”,所以对于初学者来说,也值得我们细细玩味。因此,下面我们就给予详细讲解。


5.2 感性认识“感知机”


在第3小节中,我们已经提到,所谓的感知机,其实就是一个由两层神经元构成的网络结构,它在输入层接收外界的输入,通过激活函数(含阈值)的变换,把信号传送至输出层,因此它也称之为“阈值逻辑单元(threshold logic unit)”。


麻雀虽小,五脏俱全。感知机虽然简单,但已初具神经网络的必备要素。在前面我们也提到,所有“有监督”的学习,在某种程度上,都是分类(classification)学习算法。而感知机就是有监督的学习,所以,它也是一种分类算法。下面我们就列举一个区分“西瓜和香蕉”的经典案例,来看看感知机是如何工作的[1]。


为了简单起见,我们就假设西瓜和香蕉都仅有两个特征(feature):形状和颜色,其它特征暂不考虑。这两个特征都是基于视觉刺激而得到的。


图5-1 感知机学习算法


假设特征x1代表输入颜色,特征x2代表形状,权重w1和w2默认值都为1,为了进一步简化,我们把阈值θ(亦有教程称之为偏值——bias)设置为0。为了标识方便,我们将感知器输出为“1”,代表判定为“西瓜”,而输出为“0”,代表判定为“香蕉”。当然了,如果有更多类别的物品,我们就用更多的数字来标记即可。


为了方便机器计算,我们对颜色和形状这两个特征,给予不同的值,以示区别。比如,颜色这个特征为绿色时,x1取值为1,而当颜色为黄色时,x1取值为-1;类似地,如果形状这个特征为圆形,x2取值为1,反之,形状为弯曲状时,x2取值为-1,如表5-1所示。


这样一来,可以很容易依据图5-1所示的公式,对于西瓜、香蕉做鉴定(即输出函数f的值),其结果分别如图5-2(a)所示:


图5-2 感知器的输出


从图5-2(a)所示的输出可以看到,对西瓜的判定输出结果是2,而香蕉的为-2。而我们先前预定的规则是:函数输出为1,则判定为西瓜,输出为0,则判定为香蕉,那么如何将2或-2这样的分类结果,变换成预期的分类表达呢,这个时候,就需要激活函数上场了!


这里,我们使用了最为简单的阶跃函数(step function)。在阶跃函数中,输出规则非常简单:当x>0时,f(x)输出为1,否则输出0。通过激活函数的“润滑”之后,结果就变成我们想要的样子(如图5-2-b所示)。就这样,我们就搞定了西瓜和香蕉的判定。


这里需要说明的是,对象的不同特征(比如水果的颜色或形状等),只要用不同数值区分表示开来即可,具体用什么样的值,其实并无大碍。


但你或许会疑惑,这里的阈值(threshold)θ和两个连接权值w1和w2,为啥就这么巧分别就是0、1、1呢?如果取其它数值,会有不同的判定结果吗?


这是个好问题。事实上,我们并不能一开始就知道这几个参数的取值,而是一点点地非常苦逼地“折腾试错”(Try-Error)出来的,而这里的“折腾试错”其实就是感知机的学习过程!


下面,我们就聊聊最简单的神经网络——感知机它是如何学习的?


5.3 感知机是如何学习的?


中国有句古话:“知错能改,善莫大焉。”说得就是“犯了错误而能改正,没有比这更好的事了”。


放到机器学习领域,这句话显然属于“监督学习”的范畴。因为“知错”,就表明它事先已有了事物的评判标准,如果你的行为不符合(或说偏离)这些标准,那么就要根据“偏离的程度”,来“改善”自己的行为。


下面,我们就根据这个思想,来制定感知机的学习规则。从前面讨论中我们已经知道,感知机学习属于“有监督学习”(即分类算法)。感知机是有明确的目的导向的,这有点类似于“不管白猫黑猫,抓住老鼠就是好猫”,不管是什么样的学习规则,能达到良好的分类目的,就是好学习规则。


我们知道,对象本身的特征值,一旦确定下来就不会变化。因此,所谓神经网络的学习规则,就是调整权值和阈值的规则(这个结论对于深度学习而言,依然是适用的)。


假设我们的规则是这样的:



其中ep = y- y’,y为期望输出,y’是实际输出,所以,具体说来,ep是二者的差值。在后面,读者朋友可以看到,这个“落差”就是整个网络中权值和阈值的调整动力。因为,很显然,如果ep为0,那么新、旧权值和阈值都是一样的,网络就稳定可用了!


下面,我们就用上面的学习规则来模拟感知机的学习过程。假设w1和w2初始值分别为1和-1(注意:已经不再是1和1了!),阈值θ依然为0(事实上为其它初值,也是可行的),那么我们遵循如下步骤,即可完成判定西瓜的学习:

(1)计算判定西瓜的输出值f:

将这个输出值带入如图5-2-b所示的阶跃函数中,可得y=0。


(2)显然,针对西瓜,我们期望输出的正确判定是:y=1,而现在实际输出的值y’=0,也就是说,实际输出有误。这个时候,就需要纠偏。而纠偏,就需要利用公式(5.1)所示的学习规则。于是,我们需要计算出来误差ep来。


(3)计算误差ep:



现在,我们把ep的值带入公式(5.1)所示的规则中,更新网络的权值和阈值,即:



(3)那么,在新一轮的网络参数(即权值、阈值)重新学习获得后,我们再次输入西瓜的属性值,来测试一下,看看它能否正确判定:



再经过激活函数(阶跃函数)处理后,输出结果y=1,很高兴,判定正确!


(4)我们知道,一个对象的类别判定正确,不算好,“大家好,才算真的好!”于是,在判定西瓜正确后,我们还要尝试在这样的网络参数下,看看香蕉的判定是否也是正确的:



类似地,经过激活函数(阶跃函数)处理后,输出结果y=0,判定也正确的!BINGO!误差ep为0,打完收工,学习结束!


在这个案例里,仅仅经过一轮的“试错法(trial-by-error)”,我们就搞定了参数的训练,但你可别高兴太早,谁叫这是一个“Hello World”版本的神经网络呢!事实上,在有监督的学习规则中,我们需要根据输出与期望值的“落差”,经过多轮重试,反复调整神经网络的权值,直至这个“落差”收敛到能够忍受的范围之内,训练才告结束。


在上面,我们仅仅给出了感知机学习的一个感性例子,下面我们要给出感知机学习的形式化的描述。


5.4 感知机的训练法则


通过前面的分析,我们可以看到,感知机是很容易实现逻辑上的“与(AND)”、“或(OR)”、“非(NOT)”等原子布尔函数(Primitive Boolean function),如图5-3所示(睿智如你,你肯定发现了,这里的确没有“异或”,这个坑回头我们在后面再填上)[2]。


图5-3 感知机实现逻辑运算


下面举例说明。首先,我们注意到,假设f是如图5-3所示的阶跃函数,通过合适的权值和阈值,即可完成常见的逻辑运算(既然是逻辑运算,x1和x2都只能取值为0或1),例如:


(1)“与(x1∧x2)”:当权值w1=w2=1,阈值θ=2时,有:



此时,仅当x1=x2=1时,y=1,而在其它情况下(如x1和x2无论哪一个取0),y=0。这样,我们在感知机中,就完成了逻辑“与”的运算。


(2)类似地,“或(x1∨x2)”:当w1=w2=1,阈值θ=0.5时,有:



此时,当x1或x2中有一个为“1”时,那么y=1,而在其它情况下(即x1和x2均都取“0”),y=0。这样,我们就完成了逻辑“或”的运算。


(3)在类似地,“非(┐x1)”:当w1=0.6,w2=,0,阈值θ=0.5时,有:



此时,当x1为“1”时,y=0,当x1为“0”时,y=1。这样,就完成了逻辑“非”的运算(当然,如果以x2做“非”运算,也是类似操作,这里不再赘述)。


更一般地,当我们给定训练数据,神经网络中的参数(权值wi和阈值θ)都可以通过不断地“纠偏”学习得到。为了方便起见,我们把阈值θ视为w0,而其权值设为固定值“-1”,那么阈值θ就可视为一个“哑节点(dummy node)”。这样一来,权重和阈值的学习可以“一统天下”称为“权重”的学习。


如此一来,感知机的学习规则就可以更加简单明了,对于训练样例(x,y)(需要注意的是,这里粗体字x表示训练集合),若当前感知机的实际输出y’,假设它不符合预期,存在“落差”,那么感知机的权值依据如公式(5.2)规则调整:


 

其中,η∈(0,1)称为学习率(learning rate),公式(5.2)其实是公式(5.1)的一般化描述。由公式(5.2)可知,如果(x,y)预测正确,那么可知y=y’,感知机的权值就不会发生任何变化,否则就会根据“落差”的程度做对应调整。


这里需要注意的是,学习率η的作用是“缓和”每一步权值调整强度的。它本身的大小,也是比较难以确定的。如果η太小,网络调参的次数就太多,从而收敛很慢。如果η太大,“步子大了,容易扯着蛋”,从而错过了网络的参数的最优解。因此,合适的η大小,在某种程度上,还依赖于人工经验(如图5-4所示)。


图5-4  学习率:“步子大了,容易扯着蛋”


5.5 感知机的表征能力


如果识别对象x有n个特征,那么感知机可以看做,在n维实例空间(即点空间)中的超平面决策面,以向量的模式写出来就是如图5-5所示。

图5-5 感知机的超平面


这样一来的话,对于超平面一侧的实例,感知机输出为1(或称判定为某一类),而对于超平面的另外一侧实例,感知机输出为0(判定为另外一类)。


由于感知机只有输出层神经元可以进行激活函数的处理,也就是说它只拥有单层的功能元神经元(functional neuron),因此它的学习能力是相对有限的。比如说在5.4小节中,原子布尔函数中的“与、或、非”等问题都是线性可分的(linearly separable)的问题。


前面的章节中,我们提到的那位人工智能泰斗明斯基(Minsky)已经证明,若两类模式是线性可分的,那么一定存在一个线性超平面可以将它们区分开来,如图5-6(a)-(c)所示。也就是说,这样的感知机,其学习过程一定会稳定(即收敛)下来,神经网络的权值可以学习得到。


但是对于线性不可分原子布尔函数(如“异或”操作),就不存在简单地线性超平面将其区分开来(如图5-6-(d))。在这种情况下,感知机的学习过程就会发生“震荡(fluctuation)”,权值向量就难以求得合适解。这里稍微为非专业读者解释一下什么异或?所谓异或(XOR),就是当且仅当输入值x1和x2不相等,则输出为1。反之,输出为0。你可以监督粗暴地把“异或”理解为:男欢女爱输出为1,搞基都是没有结果的(输出为0)!


图5-6 线性可分的“与、或、非”和线性不可分的“异或”


一个寄以厚望的感知机,居然连简单的“异或”功能都实现不了,这点让明斯基颇为失望。于是,在1969年,他和同事Papert合作写下《感知机》一书[3],直接把“感知机”判了个n年有期徒刑(n在当时为不可知变量)。


这么一说,好像明斯基是一位法官一样。但其实呢,他更像《白雪公主》里的那位继母王后。这是因为就是他,给那个叫“人工智能”的“白雪公主”喂了一颗“毒苹果”(《感知机》一书),让这位“白雪公主”一睡就是20年(n=20)。


我们知道,绝大多数童话都有个“happy ending(完美结局)”,《白雪公主》也不例外。现在我们好奇的是,在人工智能领域,谁又是那位“吻醒”白雪公主的“王子”呢?


欲知后事如何,且听我们下回分解。


5.6小结


在本小节,我们首先用西瓜和香蕉的判定案例,感性地谈了谈感知机的工作流程。然后,我们又给出了感知机的形式化学习规则以及感知机的表征能力。容易发现,感知机连常见的逻辑操作“异或”都难以实现,这一功能缺陷,直接让人工智能领域大神明斯基抓住了“小辫子”,然后就把“人工智能”送进了长达二十年的“冬天”。


但英国浪漫主义诗人雪莱说了:“冬天来了,春天还会远吗?”


5.7 请你思考


学习完本小节,请你思考如下问题:


(1)你能参照感知机判定“西瓜”和“香蕉”的案例,训练感知机完整布尔函数“与、或、非”等权值的学习吗?请用编程语言实现。(提示:它山之石,可以攻玉。可以借助开源的神经网络框架实现,如由Java语言编写的Neuroph,下载链接:http://neuroph.sourceforge.net/)


(2)你知道最终感知机是如何解决“异或”问题的吗?(提前剧透:增加神经网络的层数,提升网络数据特征的表达能力,网络层次多了,这就是深度神经网络啊!)


【参考文献】

[1] 吴岸城. 神经网络与深度学习.电子工业出版社.2016.6

[2] 周志华.机器学习.清华大学出版社.2016.2

[3] Minsky M, Papert S. Perceptrons[J]. 1969.


(六)损失函数减肥用,神经网络调权重


在上一讲中,我们提到,由于感知机不能解决“异或”问题,明斯基并无恶意却把“人工智能”打入“冷宫”二十载。而解决“异或”问题的关键在于,是否能解决非线性可分问题。那么,如何来解决这个问题呢?简单来说,就是使用更加复杂的网络,也就说利用多层前馈网络。在本讲,我们将详细讨论这个问题。


6.1 多层网络搞定“异或”问题


现在我们都知道,深度学习是一个包括很多隐含层的复杂网络结构。感知机之所以当年搞不定“非线性可分”问题,也是因为相比于深度学习这个“老江湖”,是因为它“too young,too simple(太年轻,太简单)”。当时,“感知机”刚刚诞生不久,如初生之婴儿,你也很难期望这么一个襁褓之娃复杂起来。


如前文所述,想解决“异或”问题,就需要让网络复杂起来。这是因为,复杂的网络,表征能力就比较强[1]。按照这个思路,我们在输入层和输出层之间,添加一层神经元,将其称之为隐含层(hidden layer,亦有简称为“隐层”)。这样一来,隐含层和输出层中的神经元都拥有激活函数。假设各个神经元的阈值均为0.5,权值如图6-1所示,就实现了“异或”功能。


图6-1 可解决“异或”问题的两层感知机


下面我们来详述这个实现流程。假设在如图6-1-a所示的神经元(即实心圆)的激活函数,依然是阶跃函数(即sgn函数),那么它的输出规则很非常简单:当x>0时,f(x)输出为1,否则输出0。


那么,对于x1和x2相同(即均为1)时,对于在隐含层的神经元1有:



类似地,对于在隐含层的神经元2有:



然后,对于输出层的输出神经元3而言,这时f1和f2是它的输入,于是有:



也就是说,x1和x2同为1时,输出为0。


那么对于x1和x2不相同(比如说,x1为1时, x2为0)时,对于在隐含层的神经元1有:



类似地,对于在隐含层的神经元2有:



然后,对于输出层的神经元3而言,f1和f2是它的输入,于是有:



不失一般性,由于x1和x2的地位是可以互换的,因此从上面分析可知,如图6-1所示的两层感知机,就可以实现“异或”功能。在这里,网络中的权值和阈值是我们事先给定的,而实际上,它们是需要神经网络自己通过反复地“试错”学习而来。


让我们再简单回顾一下神经网络的发展历史。1958年,弗兰克·罗森布拉特(Frank Rosenblatt)提出“感知机”(Perceptron)的概念。


1965年,A. G.伊瓦赫年科(Alexey Grigorevich Ivakhnenko)就提出了多层人工神经网络的设想。而这种基于多层神经网络的机器学习模型,后来被人们称为“深度学习”。


简单来说,所谓深度学习,就是包括很多隐含层的神经网络学习。这里的“深”即意味着“层深”(’Deep’ means many hidden layers),“网络深深深几许”呢?至少要大于3吧,多则不限,可以成百甚至上千。


所以,你看到了吧,如果追根溯源的话,伊瓦赫年科才是“深度学习”之父[2],而不是现在的“深度学习”大牛杰弗里•辛顿(Geoffrey Hinton),但鉴于辛顿的杰出贡献——是他让“深度学习”重见天日、大放异彩。因此,称呼辛顿为深度学习教父(Godfather of deep learning),似乎也更为合适[3]。


更需要我们玩味的是,在多层神经网络概念提出4年之后的1969年,明斯基才写出来他的那本“毒苹果”之作《感知机》。也就是说,多层神经网络在提出之后,并没有受到应有的重视。


直到1975年(此时,距离伊瓦赫年科提出多层神经网络概念已达10年之久了),感知机的“异或难题”才被理论界彻底解决。由此,见微知著可以看到,科学技术的发展,从而都不是线性地一蹴而就,而是呈现螺旋上升的!


我们现在学习这个“异或”解决方案,可能仅需要数分钟,但也是“书上一分钟,书后十年功”啊!


6.2多层前馈神经网络


更一般地,常见的多层神经网络如图6-2所示。在这种结构中,每一层神经元仅仅与下一层的神经元全连接。而在同一层,神经元彼此不连接,而且跨层的神经元,彼此间也不相连。这种被简化的神经网络结构,被称之为“多层前馈神经网络(multi-layer feedforward neural networks)”。



图6-2 多层前馈神经网络结构示意图


在多层前馈神经网络中,输入层神经元主要用于接收外加的输入信息,在隐含层和输出层中,都有内置的激活函数,可对输入信号进行加工处理,最终的结果,由输出层“呈现”出来。


这里需要说明的是,神经元中的激活函数,并不限于我们前面提到的阶跃函数、Sigmod函数,还可以是现在深度学习常用的ReLU(Rectified Linear Unit)和sofmax等。


简单来说,神经网络的学习过程,就是通过根据训练数据,来调整神经元之间的连接权值(connection weight)以及每个功能神经元的输出阈值。换言之,神经网络需要学习的东西,就蕴含在连接权值和阈值之中。


拟人化来说,对于识别某个对象来说,神经网络中的连接权值和阈值,就是它关于这个对象的“记忆(memory)”啊!


我们知道,大脑对于事物和概念的记忆,不是存储在某个单一的地点,而是像分布式地存在于一个巨大的神经元网络之中。


硅谷投资人王川先生认为,分布式表征(Distributed Representation),是人工神经网络研究的一个核心思想。那什么是分布式表征呢?简单来说,就是当我们表达一个概念时,神经元和概念之间不是一对一对应映射(map)存储的,它们之间的关系是多对多。具体而言,就是一个概念可以用多个神经元共同定义表达,同时一个神经元也可以参与多个不同概念的表达,只不过所占的权重不同罢了。


举例来说,对于“小红汽车”这个概念,如果用分布式特征地表达,那么就可能是一个神经元代表大小(形状:小),一个神经元代表颜色(颜色:红),还有一个神经元代表车的类别(类别:汽车)。只有当这三个神经元同时被激活时,就可以比较准确地描述我们要表达的物体。


分布式表征表示有很多优点。其中最重要的一点,莫过于当部分神经元发生故障时,信息的表达不会出现覆灭性的破坏。比如,我们常在影视作品中看到这样的场景,仇人相见分外眼红,一人(A)发狠地说,“你化成灰,我都认识你(B)!”这里并不是说B真的“化成灰”了,而是说,虽然时过境迁,物是人非,当事人B外表也变了很多(对于识别人A来说,B在其大脑中的信息存储是残缺的),但没有关系,只要B的部分核心特征还在,那A还是能够把B认得清清楚楚、真真切切!人类的大脑还是真的厉害啊!(现在这句话,也被好端端地被玩坏了,见图6-3)


图6-3  核心特征不丢失:化成灰我都认识你


前文提到,对于相对复杂的前馈神经网络,其各个神经元之间的链接权值和其内部的阈值,是整个神经网络的灵魂所在,它需要通过反复训练,方可得到合适的值。而训练的抓手,就是实际输出值和预期输出值之间存在着“落差”(你可以称之为“误差”)。


下面我们就先用一个小故事,来说明如何利用“落差”来反向调节网络参数的。


6.3现实很丰满,理想很骨感


说到理想和现实的“落差”时,人们常用这么一句话来表达:“理想很丰满,现实很骨感。”


事实上,有时候,这句话反着说,也是成立的:“现实很丰满,理想很骨感”。你可能猜到了,我说的是“减肥”这件事。


有人开玩笑说,男人有两大烦恼:一是把别人的肚子搞大了,二是把自己的肚子搞大了。还记得六七年前我在美国读书时,由于美帝的物质条件太好,肉食非常便宜,所以一不小心,糟了!我把自己的肚子搞大了。


等到临近回国的前三个月,一次无意站在体重秤上,我“惊喜”地发现,我有了——体重居然飙到可怕的200磅!


这次真的把自己都吓到了,这该如何是好?有个古诗改编的段子,很能体现我当时的“窘境”:


瘦小离家老胖回,乡音无改肥肉堆。

儿童相见不相识,笑问胖纸你是谁?


痛定思痛,我决定减肥(说好听点,是健身!)。


那该如何减(健)呢?其实就一个六字秘诀:“迈开腿,管住嘴!”


从那天起,我每天从住处到巴哈伊教神庙 (Baha'i House of Worship)两个来回,大概10公里的有氧长跑,几乎雷打不动。你看那,蓝蓝的天空,青青的草坪,幽静的小路上,总会有个胖纸正在挥汗如雨,汗流浃背,用不停止的脚步,来为过去的贪吃“赎罪”。


图 6-4 损失函数?减重功能!


现在回想起来,我挺佩服自己那会的毅力。三个月下来,我减下来近50磅!


在踏上返回北京航班的前一个小时,我静静地坐在租住屋里,模仿那首《再别康桥》,在自己的博客上,用两句话总结了我的美国之旅:


“轻轻的我走了,

正如我轻轻的来;

我挥一挥手,

不带走一两肥肉。”


或许你会疑惑,咦,我们正在学习神经网络咧,你吹这段过往的牛逼,是准备改行给我们推销减肥药吗?


哈哈,当然不是!


因为这段往事,让我想起了今天的主题“误差逆传播算法”!


这又哪跟哪啊?


别急,且听我慢慢道来。


我们知道,在机器学习中的“有监督学习”算法里,在假设空间中,构造一个决策函数f,对于给定的输入X,由f(X)给出相应的输出Y,这个实际输出值Y和原先预期值Y’可能不一致。于是,我们需要定义一个损失函数(loss function),也有人称之为代价函数(cost function)来度量这二者之间的“落差”程度。这个损失函数通常记作L(Y,Y)= L(Y, f(X)),为了方便起见,这个函数的值为非负数。


常见的损失函数有如下3类:


(1)0-1损失函数(0-1 loss function):



(2)绝对损失函数(absolute loss function)



(3)平方损失函数(quadratic loss function)



损失函数值越小,说明实际输出和预期输出的差值就越小,也就说明我们构建的模型越好。


对于第一类损失函数,用我自身减肥的例子很容易解释。就是减肥目标达到没?达到了,输出为0(没有落差嘛),没有达到输出1(减肥尚未成功,胖纸还需努力!)


对于第二类损失函数就更具体了。当前体重秤上读数和减肥目标的差值,这个差值有可能为正,但还有可能为负值,比如说,减肥目标为150磅,但一不小心减肥过猛,减到140磅,这是值就是“-10”磅,为了避免这样的正负值干扰,干脆就取一个绝对值好了。


对于第三类损失函数,类似于第二类。同样达到了避免正负值干扰,但是为了计算方便(主要是为了求导),通常还会在前面加一个“1/2”,这样一求导,指数上的“2”和“1/2”就可以相乘为“1”了:



当然,为了计算方面,还可以用对数损失函数(logarithmic loss function)。这样做的目的,主要是便于使用最大似然估计的方法来求极值。一句话,咋样方便咋样来!


或许你会问,有了这些损失函数?有啥子用呢?当然有用了!因为可以用它反向配置网络中的权值(weight),让损失(loss)最小啊。


我们都知道,神经网络学习的本质,其实就是利用“损失函数(loss function)”,来调节网络中的权重(weight)。而“减肥”的英文是“weight loss”,所以你看,我用自身减肥的案例来讲这个“损失函数”,是不是很应景啊?


或许你又会说,就算应景,那神经网络的权值,到底该咋个调法咧?


总体来讲,有两大类方法比较好使。第一种方法就是“误差反向传播(Error Back propagation,简称BP)”。简单说来,就是首先随机设定初值,然后计算当前网络的输出,然后根据网络输出与预期输出之间的差值,采用迭代的算法,反方向地去改变前面各层的参数,直至网络收敛稳定。


这个例子说起来很抽象,我们还是用减肥的例子感性认识一下。比如说,影响减肥的两个主要因素是“运动”和“饮食”,但它们在减肥历程中的权值,并不了然。然后,如果我减肥目标是150磅,而体重秤上给出实际值是180磅,这个30磅的落差,反过来调整我“运动”和“饮食”在减肥过程中的权值(是多运动呢,还是多吃点低卡食物呢?)。


这个BP算法,的确大名鼎鼎。它最早是由Geoffrey Hinton 和 David Rumelhart等人1986年在《Nature》(自然)杂志上发表的论文:“Learning Representations by Back-propagating errors”中提出来的。该论文首次系统而简洁地阐述了反向传播算法在神经网络模型上的应用。


BP反向传播算法非常好使,它直接把纠错的运算量,降低到只和神经元数目本身成正比的程度。现在,我们可以回答上一讲中提出的问答了,是哪位“王子”把人工智能这位“白雪公主”吻醒的了。是的,没错,就是当前的这位“深度学习”教父杰弗里•辛顿(Geoffrey Hinton)!


图 6-5 “人工智能”白马王子:杰弗里•辛顿


BP算法非常经典,在很多领域都有着经典的应用,当时它的火爆程度在绝不输给现在的“深度学习”。但后来大家发现,实际用起来它还是有些问题。比如说,在一个层数较多网络中,当它的残差反向传播到最前面的层(即输入层),其影响已经变得非常之小,甚至出现梯度扩散(gradient-diffusion),严重影响训练精度。


其实,这也是容易理解的。因为在“信息论”中有个信息逐层缺失的说法,就是说信息在逐层处理时,信息量是不断减少的。例如,处理A信息而得到B,那么B所带的信息量一定是小于A的。这个说法,再往深层次的探寻,那就是信息熵的概念了。推荐读者阅读一部影响我世界观的著作《熵:一种新的世界观》[5]。


根据热力学第二定律我们知道,能量虽然可以转化,但是无法100%利用。在转化过程中,必然会有一部分能量会被浪费掉。这部分无效的能量,就是“熵”。把“熵”的概念,迁移到信息理论,它就表示“无序的程度”。


按照阮一峰先生的解读,当一种形式的"有序化(即信息)",转化为另一种形式的"有序化",必然伴随产生某种程度上的"无序化(即熵)"[6]。依据这个理论,当神经网络层数较多时(比如说大于7层),BP反向传播算法中“误差信息”,就会慢慢“消磨殆尽”,渐渐全部变成无序的“熵”,因此就无法指导神经网络的参数调整了。


再后来,第二类改进方法就孕育而生了。它就是当前主流的方法,也就是“深度学习”常用的“逐层初始化”(layer-wise pre-training)训练机制[7],不同于BP的“从后至前”的训练参数方法,“深度学习”采取的是一种从“从前至后”的逐层训练方法。这是后话,我们回头再表。


6.4 小结


下面我们小结一下本章的主要知识点。首先,我们讲解了如何利用多层神经网络搞定“异或”问题的方法,然后我们用“减肥”的案例,讲解了多层前馈神经网络和损失函数的概念。


经典是永恒的,永远值得品味。在下一讲中,我们将用图文并茂的方式,详细讲解BP算法和梯度递减的概念,特别是这个“梯度递减”概念,它还会深深影响“深度学习”算法。请你关注。


6.5 请你思考


通过本讲的学习,请你思考如下问题:


(1)著名科技哲学家詹姆斯·卡斯在其著作《有限与无限的游戏》[8]中指出,世界上有两种类型的“游戏”:“有限的游戏”和“无限的游戏”。有限游戏的目的在于,赢得胜利;而无限的游戏,却旨在让游戏永远进行下去。从神经网络发展的起起落落中,你觉得“人工智能”的发展,是有限的游戏呢?还是无限的?为啥?


(2)杰弗里•辛顿先后提出的BP算法和深度学习算法,它们之间除了训练参数的方法有不同之外,还有什么本质上的不同呢?


 【参考文献】

[1] 周志华.机器学习.清华大学出版社.2016.2

[2] 李开复;王咏刚. 人工智能. 文化发展出版社. 2017.1

[3] Anna Tremonti. CBC. Deep Learning Godfather says machines learn like toddlers.2015.5

[4] Williams D, Hinton G. Learning representations by back-propagating errors[J]. Nature, 1986, 323(6088): 533-538.

[5]  [美] 杰里米·里夫金, 特德·霍华德. 熵:一种新的世界观. 上海译文出版社. 1987.2

[6] 阮一峰. 熵的社会学意义. 2013.4

[7] Hinton G E, Osindero S, Teh Y W. A fast learning algorithm for deep belief nets[J]. Neural computation, 2006, 18(7): 1527-1554.

[8] 詹姆斯·卡斯. 有限与无限的游戏.电子工业出版社. 2013.10


本来来源于阿里云云栖社区知乎机构号

https://www.zhihu.com/org/a-li-yun-yun-qi-she-qu-48/columns

文章作者:张玉宏博士,著有《品味大数据》一书。

审校:我是主题曲哥哥、阿福。


相关阅读

白话深度学习系列(一):一入侯门“深”似海,深度学习深几许

白话深度学习系列(二):人工“碳”索意犹尽,智能“硅”来未可知

白话深度学习系列(三):神经网络不胜语,M-P模型似可寻

白话深度学习系列(四):“机器学习”三重门,“中庸之道”趋若人





开课啦开课啦:


AI100学院特请在机器学习领域深耕10余年的中科院副教授冒老师带来干货课程——《XGBoost从基础到实战》,从XGBoost的原理讲解到代码实战,一步步带领大家从XGBoost的安装到一行行Python代码实现各类算法任务,不需要有很强的数学基础,直接从实战入手。通过4节XGBoost的专题课程,大家可以零基础理解XGBoost原理,掌握XGBoost调参,并能融会贯通地学习其他机器学习算法,学习如何用机器学习算法解决实际问题。如果你足够优秀,还能进击Kaggle竞赛哦。




   点击下方“阅读原文”查看更多内容。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存