人工智能会在未来消灭很多工作,同时也会创造很多工作。它同机械、同计算机一样,是对人类能力的一次扩展,任何人都应该可以像应用机械一样应用人工智能,绝不应该是大公司的专利。
而深度学习可以说是目前各项人工智能技术的核心。因担心工作会被人工智能取代,越来越多的人想要入门深度学习。
然而如Ian Goodfellow所说,市面上很多教程都是大量的算法罗列,并不专注于如何利用这些算法来解决眼前的问题。这些教程很容易让人们误认为成为机器学习的专家就是知道所有算法。
事实上深度学习仍在迅速发展,今天的技术在明天就有可能被淘汰。并且每天都有大量新网络结构被提出,无法学完所有技术的我们需要找出各类网络结构的共性,尝试归类的理解其背后的设计理念。
本期雷锋网(公众号:雷锋网)硬创公开课邀请到《超智能体》一书作者于建国,分享的内容就是理解为何“深层”比“浅层”网络要好,深度学习适用于什么任务,并尝试找出前馈神经网络、循环神经网络、卷及神经网络、残差网络、预训练、多任务学习、端到端学习、自动编码器、迁移学习、distillation、dropout、regularization、batch-normalization等技术背后的共享,让大家感受该如何设计符合自己任务的深层神经网络。以一种不一样的思路切入深度学习。
内容介绍
本期公开课包含但不限于以下内容:
-
理解什么是学习
-
深度学习为何高效
-
神经网络的设计理念
-
入门所需材料
嘉宾介绍
于建国,会津大学Human Interface实验室博士在读,硕士做的是利用深度学习将口型数据融于语音识别模型的训练中,而识别时无需口型数据,从而提高识别率的研究。也因为喜欢上了研究而继续了博士课程。希望将自己这几年的思考和自学经验分享给大家。可在知乎上搜索YJango找到分享的内容,或者在gitbook上查看其终身连载的关于如何机器学习,如何人脑学习的《超智能体》一书。
(本期公开课完整视频,共82分钟)
以下为雷锋网对嘉宾分享内容实录精编。关注雷锋网旗下微信公众号,回复「PPT」可获取嘉宾完整PPT。
大家好,我是于建国,日本会津大学博士一年生,硕士的研究是基于深度学习结合口型的语音识别。很高兴能和大家在这里分享。其他的不多说,让我们直接步入正题。
由于人工智能的火热,越来越多的人担心自己的工作会被所取代,因而想要入门深度学习,却发现它很“黑箱”,这次就是分享一些我个人心得,关于深层神经网络的设计理念。
智能:何谓学习
智能能够做到的事情太多太多,实在是难以用一句话给出一个让人信服的定义。
所以让我们从另一个角度来切入:为什么生命需要智能,智能的作用是什么?
而这个答案却是唯一的,那就是为了生存下去。
生存游戏
所以现在假设宇宙还没有产生生命,我们来想象一个生存游戏。
这个生存游戏和右上角的小游戏差不多,也就是躲避危险从而生存下来。需要注意的是,你要清空你大脑当中的所有先验知识。你并不知道这个游戏怎么玩,所有的规则都是随机的,并不是说碰到绿柱子就会死。稍微抽象一下就可以得到左边的这个模型。ABCD表示不同的环境,个体在接收到环境的刺激后会产生靠近或远离的行为,结果就是死亡或者存活。这时,环境就是输入x,个体是关联f(可以叫它function,mapping,我在随后都把它叫做关联),行为是输出y。
游戏规则是:
-
1. 假设环境B和C都是危险的,靠近就会死亡。也可能是A和D是危险的,这是随机的。
-
2. 同时个体的关联f都是大自然随机生成的。
如果你是大自然的造物主,你要怎么在上述条件下,设计出可以一直自我延续下去的生命?
直接暴力的方式就是:不断的随机生成,总有一个个体会满足条件。比如说这个映射就可以,用01表示B,10表示C,1代表远离,0代表靠近,当出现B和C时,我们希望个体f会产生1这个数值。
但这时我们追加另一个规则,环境会变。就像这个小游戏,如果规则变成没碰到柱子就会死呢?
应该有人玩过“猫里奥”,你会用你以前玩马里奥的方式去玩,就是各种死。所以当环境变成A和D是危险的时候,这个个体就会死亡。
所以,即便个体非常幸运的产生了能够满足生存的关联f,也会在下一次环境改变之际化为无机物。如果还用随机生成的方式,生命永远只能在最初始的阶段停留片刻,无法进入下一个阶段。
因此生命想要延续,就需要一种能力,可以适应变化的能力。这也是霍金对于智能的描述:Intelligence is the ability to adapt to change.
于是,大自然利用大量的个体不断繁殖,并且该繁殖过程并非完美复制,而是会产生变异,变异的个体就有机会适应变化后的环境而存活下来,无法适应环境的个体会被筛选掉。筛选下来的个体继续大量繁殖,产生差异性,迎接下一次环境的筛选。筛选后的结果便是进化。进化出适合当前环境的关联。用这种繁殖、变异、筛选的动态循环,就可以形成能相对稳定存在的生命。
游戏的关键在于,关联的更新速度>环境的变化速度。
所以自然界的很多生物大量繁殖这一行为并不浪费,它增大可供筛选的样本数量,防止环境变化后,个体全部被筛选掉。
生命起源
这个是关于RNA是生命起源的视频讲解,我不做描述。感兴趣的朋友可以下载我的ppt来自己观看。
生存核心
这张图粗略展示了几个概念之间的关系,大量的智能关联是依靠DNA来存储的,而DNA的复制会产生变异,形成差异性,差异性又反映于个体,变异的个体会被环境筛选,对种群进行改造,进而对智能关联进行筛选。
对以上的内容进行梳理,就会得到下面的几个总结。
1. 进化的对象不是个体,也不是基因,而是智能关联。个体的生死对种群只是起到了一次更新作用。而基因相当于硬盘,存储在上面的智能关联才是核心。进化的过程就是关联被不断筛选的过程。筛选出符合当前环境的关联。
2. 寻找关联f的过程也就是学习。自然选择的动态过程就是一种以种群为单位的学习方式。
3. 智能是适应变化的能力,智能的核心部分有:
-
学习,关联的寻找,在低等生命中,对应的是自然选择。
-
延续,关联的存储,将学习到的关联延续下去。别的星球可能产生过生命,但是却没有既能在该星球稳定存在又可以延续和自我复制的媒介。所以影片《普罗米修斯》中将DNA称为外星人留在地球上的火种。
-
最后是决策,关联的应用,应用所学到的关联产生不同的行为来躲避危险。
DNA上存储的关联就好比是工具的蓝图,而各式各样的蛋白质就是根据蓝图造出的工具。蓝图是由自然选择来绘制的。
你会发现这和你所认识的智能不一样,似乎过于简单。因为刚才的描述仅停留在蛋白质层面上的低等智能的阶段。靠这种方式存活的生命是病毒,仅有保护性蛋白质外壳和DNA或者RNA,可以进行自我复制。但是单个蛋白质能够完成的任务很有限。为了增强适应变化的能力,大量蛋白质组合在一起,并行的工作,就到达了细胞层面的智能,同理大量细胞会形成组织,再到器官,系统,个体,团体,国家,越往上其能够完成的任务就越复杂。
我想用下面这段视频让大家感受,近几年所推崇的互联网思维其实始终都存在于你我的体内。只是科技让你我的连接速度提升后才得以凸显。我们自身就好比一个工厂,内部有大量的蛋白质在并行的完成各项生理功能。而处在互联网时代的我们,和在体内的蛋白质本质上没有什么区别。你并不是单个生命。
自然界无法瞬间产生特别复杂的功能,高等智能都是由低等智能迭代生成的。虽然大量的生物,用低等智能就可以很好的生存,但是我们依然想要弄清高级智能的原理将其服务于我们自身,因为我们的环境更为复杂。
高等智能最具代表性的就是可以思考。但是思考的原理实在难以解读。
还是用老方法,转而问为什么会进化出意识允许我们思考,它能够解决什么问题?
移动问题
因为环境的变化是随机的,所以进化并没有方向,但是却有增加差异性的趋势。还记得生存游戏的关键吗?就是关联的更新速度要尽可能大于环境的变化速度。而增加差异性就是增加了更新的幅度。
通过自我复制的方式,能够产生的差异性还是较弱。所以自然界慢慢的开始形成了有性繁殖,两个不同的个体进行交配,增加子代的差异性。
但是有性繁殖带来了一个问题,如果生命不可以移动,那么个体只能与周围的其他个体进行繁殖,这一区域就始终都是那几种智能关联,有性繁殖的差异性能力被限制。
所以为了洗牌,大范围移动成为了必然需求。即便是植物这样不可移动的生物,也会利用果实让动物帮助他们传播种子。
可大范围移动也带来了另一个问题,环境会随着移动而变化,个体在上一环境中通过自然学习所学习到的关联,在下一个环境并不适用。比如你将热带植物放在沙漠中,环境的不同会杀死它。
预测模型
这时需要新的学习方式,如果还用自然选择的方式显然不可行。
因为增加了移动,感官等能力,个体的生长周期变长。设想一下,花了好几个月生下来的小动物,错走一步掉坑里摔死了。那么几个回合,这个物种就灭绝了。他们承担不起自然选择这种试错学习方式所带来的代价。
于是对于大范围可移动生物而言,他们需要原有智能的基础上增加了另一项能力:预测。
关联f不再是简单的应激反应,不再是从环境到行为的关联。而是从过去事件到未来事件的关联。生物会利用意识在大脑中模拟自己与环境的关系,通过预测下一步,甚至下几步会发生什么,从而进行决策。这就和下棋一样。
神经元
神经元细胞内部大量的蛋白质可以控制电离子的进出,进而有了控制电的能力。它们用不同的频率来表示不同的状态,大脑中的神经网络就有了模拟环境的状态与变化的能力。
可以允许生命以个体为单位学习任意两个空间的关联。不再是自然选择这种以种群为单位的学习方式。
视觉感知
而决策需要依据,就需要生命有感知能力,感知周围的信息。我们以深度学习擅长的画面识别为例,我们来看看它到底在做什么,同时也来进一步理解“建立两个空间的关联”这一概念。
这里列出来了四个生物的视觉和人类的视觉的差异。而这就引出了一点知识,人眼看到的并非世界的原貌,而是适合自己生存的一种感知方式。
因为蛇的猎物一般是夜间行动,所以它就进化出了一种可以在夜间也能很好观察的感知系统。感热。
任何视觉系统都是将反光与“脑中”所看到的概念进行关联。相同的反光,经过不同的视觉系统会得到不同的感知。
所以画面识别实际上并不是识别这个东西本身是什么,而是学找人类的视觉关联方式,并再次应用。如果我们不是人类,而是蛇类,那么画面识别所寻找的f就和现在的不一样。
当x代表的是画面,而y代表的是画面在大脑中的概念时,神经网络所完成的就是画面识别。当x代表说过的话,而y代表将要说的话,那么神经网络所完成的就是语言模型,当x代表英语,而y代表中文,神经网络所完成的就是机器翻译。
神经网络的就是从很多输入到输出的例子中,寻找解释这两个空间的关联。就像y=ax+b这个线性方程,给你两个例子,让你确定a和b一样。确定后就可以在以后的活动中利用所建立的关联,通过输入特定的x得到我们想要的y。但自然界的关联可不像线性方程那么简单。
意识的作用
而代表着高等智能的意识允许我们在脑中预先模拟接下来会发生什么?从而决定下一步的行动。
一个人的一生就是在不断建立自己所处环境中各式各样的预测模型,形成一个世界模型。你可以叫它世界观。
茶杯坠落会发生什么,如果有枪声会怎样。人站在高处,会预测自己坠落的后果,所以害怕。
随着环境的变化,所建立的预测模型需要跟着更新。比如我们现在生存的环境就和古人不同,有投资项目,未来几个月的股票、房价、汇率的变化等。
所以你就可以看见,我们作为一个生命体,始终都在适应着这个时刻变化的世界。
智能的内容是关联,核心在于学习。但却不仅限于此,它还有围绕关联和学习的其他能力。
智能除了建立关联外还有何时搜集数据,因为我们是从历史经验中学习。
还有何时更新已建立的模型,何时使用哪个模型。这些都属于智能。
比如说,人脑的预测实际上是双向的,会时时刻刻预测即将发生的事情,并将实际发生的事情与自己的预测进行比较。通常这一过程不会得到你的意识的注意。只有那些与自己预测不符合的事件才会得到注意。例如你不会注意你每天都走的楼梯,但是当某个阶梯突然高出3厘米时,你却很容易察觉。这种与自己所建立的模型冲突的事件会更容易被记住并且作为训练数据搜集起来,用于以后的学习,为了让你更好的预测,更好的生存。所以思考的目的就是在于预测。
而人的一生始终都需要学习,因为世界不断变化。并不存在小孩子比成人学习能力强这么一说。之所以造成这种现象的原因是人们依赖自己的世界模型。孩子并没有构造出完整世界模型,所以DNA中进化出的本性让我们小时候充满好奇心,会什么都好奇,什么都学习。而成人已经建立的较为完善的世界模型,需要有一种保护机制,防止被人忽悠。如果你还是像小孩子一样,什么都学习,什么都更新,那么你就很容易被洗脑。
但成人也会更新已建立的模型。比如说服一个成人,较好的做法是描述一个事件,这时他会不由自主的预测结果。但当你告诉他,他的预测是错误的时候,他就得到了“原来自己已有的模型并不可靠的信号”,关闭抵制学习的保护机制来更新已有模型。
智能始终都是并行执行的,唯独意识不可以同一时间出现在两个地方,原因之一在于意识必须要在某个时刻决定应用哪个关联。我们的四肢有各种各样的关联,有骑车的,有跑步的,意识会起到调控作用。
我们现在的人工智能还没有达到意识的层面,仅仅是建立两个空间的关联,所以画面识别,语音识别都可以完成的很好。但我们会在这个基础上逐步的迈向意识。
预备知识
人工智能
智能的三个核心部分,学习,存储,应用,在自然界中有自然界的实现方式。
而人工智能就是想要将这种能力在机器上实现。比如我们不靠蛋白质,而靠机器来应用关联;不靠DNA,而靠电脑来存储已经学到的关联;不靠自然选择,而靠机器学习算法来建立关联。大家的目的都是为了做出决策,更好的生存。
那么实现这一目标需要哪些知识?
世界是不断变化的,会从一个状态变化到另一种状态。这里牵扯到两个概念:状态与变化。
那么如何准确的描述状态和变化?
进化出能感知三维空间的我们习惯在三维空间下描述物体。然而除了长宽高,世界上还有很多决定事物状态的因素。如决定股票价钱的因素,决定天气的因素就不只是三个。
甚至我们生存的世界可能并非三维,仅仅是因为三维的空间感知已经足够让我们可以很好的生存。我们并没有进化出更高维度的感知能力。
但这些高维度的状态与变化又该如何合理的描述?
线性代数就是用来描述任意维度空间下状态和变化的学科,而线性代数中的矩阵是存储状态和变化信息的媒介。
通过线性代数,我们知道了该如何描述事物的状态及其变化。可遗憾的是,对一个微小的生物而言,很多时候信息是缺失的,我们没有办法百分之百确定事物在变化后会到达哪种状态。甚至世界的底层都是建立在纯随机下的。因此我们需要概率来在该种情况下帮助我们,预测未来状态从而做出合理的决策。
同时既然我们想要在计算机上实现智能,就需要懂得如何将自己的想法在计算机上实现。但你不需要什么都懂,你特别需要明白的是如何在计算机上控制存储着状态与变化的矩阵。
深层:为何高效
学习的难点
知道了什么是学习后,我们再来看看学习到底难在哪里。
这一部分的理解决定了你对神经网络的设计理念。学习是需要从历史经验中训练出一个关联f,希望可以用这个关联f解决新的问题。就拿高考来说,我们通过做历年的真题来训练自己的解题方法f。训练的方式是不断的做题,并且对照正确答案。等到高考,当看到新题目x时,希望可以利用自己所训练的关联f,来得到正确答案y。我们真正关心的并不是已经做过的历年真题,而是高考。
学习的难点在于:需要在未见过的任务上表现良好。
极端情况
我们考虑一个极端的情况。假如说,高考只有4道判断题,那么只需要记住4道题的对错,高考就可以拿满分了。可是实际的情况是,高考所能出的题是无限的。而我们可以训练的历年真题却是有限的。又比如要识别猫的图片,猫会有各种各样的形态、表情、颜色、大小,各式各样的变体。而我们无法穷举所有的猫,该如何从有限的图片样本中训练出能较好判断一张图片是否是猫的关联f。
学习就是需要从有限的例子中找到合理的关联f。一个方向也就是训练更多的数据,看到更多的情况。比如有的同学就用题海战术。这就是这些年大数据对人工智能所起到的作用。
然而单靠大数据是不足够的。另一个方向的例子就是那些只做一两道题就可以抓住问题核心的学霸们,而这个实际上才是深度学习在自然界的任务中超越其他机器学习算法的关键。也就是加入先验知识,调整假设孔空间。
当然学习是数据越多越好,但为了了解为什么光靠大数据不够,我们需要明白三个问题。
第一:维度诅咒。
上面提到学习的第一个方向就是见到更多的例子。可是当维度越高,其情况就越多,就越无法见到所有的情况。
只考虑离散的简单任务,1维的时候有10种情况,2维的时候100种,3维的时候有1000种。维度越高,我们越无法见到所有的情况。现在一个普通的任务就有上百维度,并且是连续的数据。
那么那些没见过的数据该如何预测?传统的方式依赖于一个假设,那就是数据是平滑的,一个数值和它左右的数值差不太多。所以当遇到没见过的数据时,就取左右两个遇见过的数据的平均值,但是在高维情况下,这种做法非常不可靠,因为它不符合这个假设,数据并不平滑,而是有激烈的凹凸。
那么想要预测的可靠就需要更多的数据,并且是不一样的样本数据,这在现实中即便是大数据也难以实现。玩过炉石传说的朋友可以想想如果纯粹靠买卡牌包,想要将所有卡片都搜集齐全需要投入多少资金?
第二:关联f的寻找。
我们是靠历史数据来训练关联f,但是能够解释历史数据的关联f并非唯一。比如我想要两个数字相加等于1,我可以让其中一个数字为1,另一个数字为0;也可以让其中一个数字为-299,另一个数字为300。都能完成任务。这就会造成,我们寻找的关联f或许可以完美的解释训练数据。但是却无法保证在新的预测中依然完美预测。
比如这两张图,左边学习到的关联f可以完美的预测训练集。但是实际应用在测试集上,红色的部分却预测错了。我们实际是想要一个非常规整的螺旋形状。
又比如高考,能够解题的方法有很多种。有的非常巧妙,但是这些巧妙的解题方式可能只适用于个别题目。其他题目就不再适用。学生可能找到了一个可以解除所有他做过的题的解题方式,但却无法保证该解题方式在高考时同样有效。
第三:无免费午餐。
这同时引出了无免费午餐定理。既然关联f是无限的,那么寻找关联f好比是大海捞针。不同的机器学习算法只是更擅长在某个海域打捞而已。如果重点打捞某个区域,那么其他的区域就会被忽略。
所以如果想要打捞的关联f可以存在于大海的任何地方,那么深度学习并不会比其他的机器学习算法更优秀。这种情况下,任何两个机器学习算法都是等价的。
这是不是意味着深度学习并不优秀呢?并非如此。因为自然界中的很多任务,其关联f并非像我之前可以出现在大海当中的任何位置,而是会集中在特定海域,那些符合自然物理现象的特定海域。而深度学习就是擅长打捞该海域的机器学习算法。
深度学习就是我先前所说的学习的第二个方向,加入先验知识,调整假设空间。
那如何理解加入先验知识?比如说你让你的朋友猜你脑中所想的一个事物,这个难度是相当大的。因为你可以想任何事物。而你的朋友通常会要求你,给他一个范围。比如食物,也可以进一步把范围缩小到水果。那么他就不需要在所有的事物当中乱猜,会更容易猜中。
在二战时德军的Enigma(依尼格玛)密码机,可以生成成千上万密码,来传输作战信息。英军雇用包括人工智能之父图灵在内的数学家来直接破译它的加密原理。并不是假设这些数据是平滑的。机器学习也应该使用相同的思路,直接去思考数据是如何生成的。而我们所面临的很多任务,是由自然界的密码生成器所生成的。当时图灵等人是靠任何原文和密文之间不会相同字母这一特点来破解密码。
那么自然界的数据又有什么特点呢?
分布式表达
这就引入了第一个自然界的先验知识:并行组合。也就是深度学习中分布式表达distributed representation的思想。假设我们有8个不同的苹果,用一般的学习方式,我们需要看到8种不同情况才可以完美的学习。但是如果告诉你这些不同的苹果是由颜色、大小、形状,这三个因素组合形成呢。假如每个因素有两种情况,那么我们只需要学习好这六种情况即可。不需要见到8种变体。你会发现,加入了变体是由不同的因素组合形成的这一个先验知识后,我们降低了学习所需要的数据量。而椭圆其实也有变体,什么样的形状是椭圆?我们可以依照同样的思路继续分解下去,进一步降低训练所需要的数据量。
神经网络
拿人脸识别为例,各种各样的人脸是由五官组合而成的,而各种各样的五官,又是由不同的形状组合而成,各种各样的形状又是由像素点所组合而成。我们可以这样拆分下去来降低训练数据所需要的样本数量。
但是这样的拆分方式是有前提的。我们知道这个世界的事物是通过组合形成的,一个碳原子+两个氧原子形成二氧化碳,三个氧原子形成臭氧。同时又不是线性组合,所以我们来看神经网络最基本的变化公式,每一层都是将x内部的因素进行组合,再加入非线性变换得出一个y,仿照着自然界数据的生成规律。而训练神经网络就是给大量的x与对应的y,学习其中的W和b。就像线性方程y=ax+b,给你两个例子,让你求解a和b一样。在第一部分中我们也提到了人体也是由这种组合方式形成的,所以神经网络非常适合去做画面识别,语音识别。
如果在一个完全不同的物理规律的世界中,事物和我们的人体可能就不是以这种组合的方式形成,那么以这种拆分方式所学习到的关联f就无法很好的完成生成数据的工作。所得到的预测也不会可靠。
但是到目前为止,所讲的仅仅还是浅层神经网络为什么优秀的原因。具有一个隐藏层的神经网络只要有足够的隐藏节点,就可以拟合任意的训练数据。
但是,为什么深层学习比浅层学习要优秀。这其实在椭圆的位置就已经可以感受到了,就是将拆分后的因素再次拆分,可以进一步降低训练所需要的数据量。
然而,这里实际上已经增加了第二条先验知识:那就是迭代变换。
我们知道原子会形成分子,而事物是在原子所形成的分子的基础上,进一步迭代形成的,并非再从原子开始重新生成。飞机是由原子到分子再到各式各样的零件组合形成的。坦克同样也利用到了相同的分子层。虽然作为图片,坦克和飞机是不同的样本,但是他们都共享着相同的分子层。这意味着当你用深层神经网络时,训练飞机样本会间接的对坦克进行了训练,降低了训练所需要的数据量。
以右边的两个图为例,每个图的左边是神经网络连接图,而右边是不同变体之间的关系图。链接在一起的圆圈表示一个节点可以取的不同数值,分开的圆圈就是不同的节点。
如果像上半部分那样用一个隐藏层的神经网络来学习,那么每个变体只被拆成了服务于它自己的独立因素,并不会对其他的样本起到作用。
但如果用深层网络,像下边这个图,就容易在a b c这三个因素的部分形成共享。那么在训练(3,0)这个样本的时候,就会对所有共享a b c的其他样本起到了间接的训练作用。
再拿编程做比较,我们不会去直接一步到位的编程,而是会分成很多个小模块。这些小模块可以在不同的需求下都适用,也就是共享。这样,就不需要每遇到一个细微变化就重新编写一次。
目前描述的网络叫做深层前馈神经网络,feedforward neural network。变换只会一层接着一层进行,不同层之间不会有跳跃,并且组合也是在同一层内的因素间进行的。
想象如果一个网络中的某个节点可以和其他的任何节点连接,那么这样的网络就没有任何的侧重。好比在你找人时被告知,他无处不在和他在哪都不在。这就相当于没有加入先验知识,没有缩小寻找关联f的海域。
所以前馈神经网络的这种连接方式,很好的缩小了训练所用的数据量。因为这种组合方式比较符合自然界的物理形成规律。
所以深层学习并不会在所有任务当中都强大,但是在很多自然形成的数据当中超越其他机器学习算法。
深层神经网络
这时再回过头来思考生命与环境的关系,环境会变得越来越复杂,但是复杂是在原有因素的基础上增加依照物理规律形成的各种变体。比如原本只有n个因素,但是每个因素可以有两种不同的状态,那么可以形成的变体就会有2的n次方。
而生物学习就是将这些变体再次拆分成因素,并且从中学到一个关联方式,而这个关联方式就是知识。
我们目前所讲到的深层前馈神经网络引入了自然界中两个固有的先验知识:
-
并行:新状态是由若干旧状态并行组合形成。
-
迭代:新状态可由已形成的状态再次迭代形成。
前馈神经网络可以适用于几乎所有的任务,但它非常一般性,所提供的先验知识的针对性很低。
先验知识不够针对,那么训练所需要的数据量就会变大,并且过深之后会将那些噪音的形成规则也学习到模型当中,而这些规律并不是我们想要的。
而神经网络的其他变体,比如循环神经网络,卷积神经网络就提供了更多十分具有针对性的先验知识,可以缩小搜索的海域面积,排除掉那些噪音规律所带来的额外干扰。
不同的神经网络变体,就在于你向其中加入了不同的先验知识。
那我希望用这个影片来让大家感受,自然界中,并行组合和迭代变换这两个先验知识的。
应用:设计理念
铺垫了这么多,终于到了核心的部分。知道了深度学习为什么高效后,对于如何设计网络也有了相应的指导。
基本理念
首先要明确两点:
-
深度学习并非万能,使用深度学习的前提是你的数据可以使用这样的先验知识。不然就像是用解英语题的巧妙方式去解数学题。
-
其次,深度学习没有固定形式,不要认为循环神经网络就是循环神经网络,卷积神经网络就是卷积神经网络。如果你以这样的方式去学习神经网络,你这辈子都学习不完。因为网络的链接方式是无限的。你需要抓住至少两个核心。拆分因素和因素共享。
每层内的节点表示的是因素,这些因素共同描述事物的一种状态。这些状态可以逐层发展,发展后的状态又可以进行拆分和合并,来进行下一个状态的转变。
你可以把一个方框视为神经网络,并且神经网络可以继续与其他神经网络形成更深的神经网络。比如卷积层处理完的输出可以接着再进行循环层的处理。
如右图,第二个阶段的因素就是由三个神经网络提供的,不同神经网络的因素之间可以进行相加,也可以合并成更高维度的状态。
设计神经网络更像是玩乐高积木,但是玩的规则在于如何拆分因素,如何使不同的样本之间形成因素共享。所以在看到很多新的网络结构时,请务必考虑,他们的结构是如何考虑因素拆分和因素共享的。
虽然大家习惯叫做循环神经网络,卷积神经网络,但请以“层”去理解它们。层是指从一个状态到另一个状态的变化。那个变化才是层。
神经网络变体
下面就看看循环层和卷积层是如何利用因素共享这个先验知识来降低训练所需数据量和排除噪音规律的干扰的。
另外记住,卷积层并不是只针对画面识别,循环层也不是只针对时序信号。关键在于时间共享和空间共享。
如果用前馈层处理时序信号,需要将前后所发生事物状态并成一个更大的向量。这样每一个维度的权重都需要学习,即使很多维度都是无关紧要的。并且这样的方式只能处理固定长度的时序信号,长度不足时需要补零。
但如果告诉你,不同的时刻的状态都是由相同的规则进行处理的,那么一个时序序列中,每个时刻的状态都可以为权重的学习提供帮助。比如在前馈层中,三个时刻只能对Wxh进行一次学习;但是在循环层中,三个时刻能对Wxh和Whh进行三次学习。
不同时刻的状态都是由相同规则进行处理的,就是循环层加入的一条可以降低训练数据量同时排除噪音规律干扰的先验知识。应用这种处理方式的原因是因为世界上很多的数据都符合时间共享的规律。比如你在演奏音乐,每个乐器的物理特性在时间维度上是不变的,并不会这个时刻是笛子的物理特性,而下一时刻变成了二胡的物理特性。
同时需要注意的是,循环层中有两个因素流,一个是从输入流得到的。另一个信息流是从上一个时刻的状态得到的,都是时间共享。所以你可以看到循环层有两个权重Whh和Wxh。
用前馈层做时序预测,相当于徒手捏陶瓷,耗时耗力不说,又无法保证各个角度都相同。而用循环层做时序预测,相当于使用转盘,摆出一个手型后,每个角度都是以这种手型去捏制的。
人们常说循环神经网络,比前馈神经网络要好的原因在于可以考虑更长的历史信息。但我曾经做过实验,使用相同长度的历史信息,将二者进行比较后。循环神经网络依然比前馈网络效果要好。一定程度上验证了共享的作用。
另外双向循环神经网络是两个循环层的堆叠,而堆叠后有两种合并方法,一种是相加,一种是合成并更长的向量。我做过的所有实验中,相加的效果都比合并要好。可能也是因为第二个方向起到了限制作用。只有那些既可以在正向产生此种规律,又可以在反向产生另一种规律的关联f才会被我们采用。
上述提到的是时间共享,还有空间共享的卷积层。前馈层同样可以进行画面识别,但如果用前馈层,那么在这个例子中,就需要学习81个权重,而如果知道这些权重在空间下是共享的,那么可能只需要学习9个权重。
我们眼睛在观察时并非将整个图片全部收入眼帘。而是一个区域,一个区域扫描。每个区域扫描的规则是共享的,你的眼球不会在扫描这个区域时是人眼,而在扫描下个区域时却成了猫的眼睛。
调整假设空间
设计神经网络实质上就是在对假设空间进行调整。也就是选择在哪些片海域寻找你的关联f。
这里我总结了四条设计原则。
-
增加共享,降低确定关联f所需要的数据量。如果你知道它大致在大海的哪个范围后,就可以使用更少的渔网,更快的打捞上来。
-
增加惩罚,我们可能会事先知道关联f不满足哪些特点。那么一旦这种特点的关联f在训练中被找到时,我们就对结果进行惩罚,起到筛选作用。用打鱼做比喻的话,那些不符合条件的小鱼会被大孔渔网筛选掉。
-
优化起点,我们优先从哪片海域先开始寻找,找不到再找其它的海域。
-
降低变体数,变体数量越多,我们就需要见到越多的数据。所以我们可以预处理数据,将变体数量在学习之前就降低下去。比如将数据减去平均值,除以均差。
设计自己的神经网络
神经网络其实并不黑箱,黑箱的是你要学习的任务。就像高考的难点在于你不知道等待你的是什么题目。
神经网络也像是料理,并不是一种方式适用于所有的食材,你要根据你的食材特点选择合理的烹饪方式。
接下来我们再来看看应用这些设计原则的各项技术。
迁移学习
迁移学习是利用知识共享这一特点,将一个任务中已经学到的关联应用到其他任务当中去。比如在画面识别中,我们用大量的反光x到概念y来学习我们的视觉系统。
画面识别的前几层其实就可以想象成是人类的眼球是如何将反光关联到视网膜上的,而后几层可以想象成视网膜上的成像又是如何逐层变成抽象的图形概念的。
那么将已经训练好的,用于识别动物的神经网络的前几层这个f1拿出来,在识别植物的神经网络中,额外加两层再做轻微训练,同样适用,毕竟大家都是人眼,这部分的f1很大程度上是共享的。
多任务学习
多任务学习其实和迁移学习使用的是相同的先验知识。只是利用方式有些许不同。迁移学习是将已学到的知识用在另一个共享着相同知识的其他任务上。
而多任务学习,是在训练的时候用共享着相同底层知识的其他任务的数据来帮助一起训练。可以起到扩充训练数据量的作用。
同时寻找到的关联f更加优秀。因为三个不同的任务对底层的知识同时进行了约束。只有同时满足三个不同任务的关联f才会被采用,这就排除掉那些只符合单个任务的关联f。
跨层组合
这是另一条先验知识,我们知道前馈神经网络是不允许跨层组合的。
但现实中是否有跨层组合的现象? 比如说我们在判断一个人的时候,很多时候我们并不是观察它的全部,或者给你的图片本身就是残缺的。这时我们会靠单个五官,外加这个人的着装,再加他的身形来综合判断这个人。这样,即便图片本身是残缺的也可以很好的判断它是什么。这和前馈神经网络的先验知识不同,它允许不同层级之间的因素进行组合。
残差网络就是拥有这种特点的神经网络。大家喜欢用机器学习的方式去解释为什么残差网络更优秀。
这里我只是提供了一个以先验知识的角度去理解的方式。
需要注意的是每一层并不会像我这里所展示的那样,会形成明确的五官层,只是有这样的组合趋势,实际无法保证神经网络到底学到了什么内容。
蒸馏模型
其本质仍然属于迁移学习,但是将知识以不同的方式迁移。一般的迁移学习是将学到的权重直接用在新的模型当中,迁移的是权重。而蒸馏模型所迁移的是标签。
比如这张图中,有两个模型,完成的任务是相同的,但是叫做老师的这个模型拥有更好的特征(输入),而叫做学生的这个模型由于实际应用的约束,无法使用这样的特征。
蒸馏模型的做法是先训练老师模型,用老师模型的预测值作为一种额外的标签,在训练学生模型的时候和学生模型自己的标签一同使用,帮助学生模型寻找到更好的关联f。而这种帮助过程只发生在训练阶段,实际的使用中,只用学生模型。这就好比一个学生在做题的时候,他既有参考答案,又有一个家教的指导。虽然家教无法代替学生去考试。因为有家教的辅导,这个学生会比没有家教辅导的学生更容易学习。虽然作为叛逆学生的我不喜欢承认这一点。
因为不需要使用老师模型,这种技术也用于压缩深层神经网络的大小。同时也应用于那些只有训练时才可以获得,而实际应用时无法获得的额外信息。
我的硕士研究,结合口型的语音识别就是这种特点的任务。我不能在识别的时候在人的嘴里加一个用于测量口型移动的机器。口型数据只可以在训练的时候作为额外信息帮助我训练出更好的模型。
自动编码器
自动编码器是利用并行与迭代的这两个先验知识,来操控变体的一种技术。
当它用作生成模型时,它就可以仿造自然界的变体生成方式来生成出各种不同的变体。比如我输入7这个数字,他就可以利用自然界的变体生成方式来生成各种7的变体。
当它用作特征工程时,实际上就是disentangle the factors of variation不断的拆分变体的因素,达到减少变体数量的作用,所以会逐层减少节点,再以对称的方式将其变换到原来的输入,最后取变体数量最少的中间层作为特征表达。降低变体数量后,就可以降低学习所需要的数据量。
Batch normalization
一般我们会在输入和输出进行预处理,减去均值和标准差,降低变体数量。这个思路一样可以在隐藏层实施。因为输入和输出是事物的状态,有变体,隐藏层同样是发展的中间状态,也有变体。
端到端
这张图描述了机器学习历史。我们逐渐的减少人类知识在学习中的作用,而是让机器自己去学习知识。
假设我们的输入x是细胞层面,而输出的器官层面。如果使用传统的机器学习方式,我们会尽可能的,人工的去学习如何将细胞层面的输入x转换到一个线性可分的空间下去,然后再让机器来学习知识。但这需要一个专家用一生去学习细胞层是如何到达组织层的,并且还难以照顾到潜在细节。
而端到端的思想就是直接消除人工预处理和后续处理,尽可能让模型利用自然界的先验知识从输入自己形成到达输出的规则,增加模型的整体契合度。
抑制过拟合
过拟合是指你在学习时,过分拟合训练集的数据了。
拿右图举例,中间的是拟合的刚刚好。而左边的情况是欠拟合,而右边的情况是过分拟合训练数据了。
神经网络抑制过拟合有以下常用的几点,而这几点在人们日常学习中同样适用。拿历年真题为训练集,高考为测试集来说。
dropout(遗忘),训练神经网络是若干个样本,逐步送到神经网络中训练。这些样本当中不可能只包含一种规律,那些小细节也能形成规律。如果连续送入网络的几个样本都具有相同的细节规律,那么就会影响我们真正想要学习的规律。而使用dropout后,每次学习都会遗忘一些规律。这样,即使有几个拥有相同细节规律的样本很偶然的被连续的送入网络中训练,也会被忘掉。只有所有样本中都有的大规律才会被记住。
shuffle(乱序),训练的样本不要有固定顺序,而要随机打乱。和dropout的原因是一样的,防止拥有相同细节规律的样本连续被送入网络。比如我们不要一直从abandon,放弃,遗弃开始背英语单词一样。
L2 regularization(保持最简化),解决的方案不要过于复杂。不然只能顾及特例而失去普遍性。 就是老师提倡你在高考使用最普遍的解题方式一样。
mini-batch(多题一起做),相互比较后得出结论。比如同时看两本描述不同的书可以得到更好地理解。
noisy layer(加噪音),题目加入一些干扰项、改变考前环境、教室、平时状态等,增加鲁棒性。噪音会对我们的结果造成影响,改变数据的分布。而神经网络是干脆直接将噪音也一起建模在网络当中,将正常因素和噪音因素形成的组合作为最后的结果。
人工智能对我们的影响
机器,计算机,人工智能,这些都是人类自身能力的延伸,这些技术可以应用在任何行业之中。
曾经我们是靠锄头耕地,现在靠机器;曾经我们靠算盘算账,现在靠计算机。但是机械也好,计算机也好,所更换的仅仅是工具,不是工作内容。我们始终需要耕地,需要算账。
同样的人工智能仅仅帮助我们建立关联。有了合理的关联f,我们就可以根据特定情况产生相应的行为。 人工智能和机械以及计算机一样,都是工具,并不会改变我们想要完成的任务。而未来的所有任务都可以依靠这一项新工具来实现。
最后,所有的这些内容你在其他的材料基本不会看到。
因为很少有像我这么不务正业的学生,这也好奇,那也好奇,这抠一点,那抠一点。
这些内容都是我个人的思考,相当非主流。但是我将他们写在了我终身连载的《超智能体》当中。一个关于如何用人脑学习,如何机器学习的书。我希望这些内容可以给人们理解生命,理解智能的另一个视角。
同时我也以我自己所理解的方式写了一些深度学习的教程。这些教程的侧重点不一样,我希望读者可以理解其背后的道理,而不是单纯的搭建一个神经网络,完成某个特定的任务,在想要使用新任务时却无从下手。
最后呢,虽然我叫于建国,但是我不是国庆节出生的,我是非常倔强的白羊座。
。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/84615.html