Warning
本章默认读者拥有最基本的计算机科学知识和微积分、线性代数和概率论知识,但不需要具有人工智能方面的专业知识。
了解深度学习(deep learning)并不需要很深的知识, 简单说深度学习就是:使用多层神经网络来进行机器学习。
为了在一节中将深度学习的基本面貌展现出来, 首先我们需要了解神经网络, 它是一个带参数的函数, 通过调整参数, 可以拟合不同的函数。 而机器学习就是一种让计算机自动调整函数参数以拟合想要的函数的过程。 以上即为“deep learning”的“learning”部分。
接着我们会介绍, 多个这种带参数的函数可以进行嵌套, 构成一个多层神经网络, 能更好地拟合某些实际问题中需要的函数。 但是可惜的是这个方法提出了几十年, 学者们却没有找到在这种情况下有效地自动调整函数参数的算法。 直到前些年逐层预训练的方法被提出, 才使得这一方法能够达到较好的效果。 以上即为“deep learning” 的“deep”部分。
我家最近买了一台面包机,我觉得这个小机器非常有意思。 在我看来,它类似于一个全自动洗衣机——只需要在开始的时候往一个缸体内加入原材料面粉、水(脏衣服)以及一些辅料如酵母、盐(洗衣液),然后选择模式如普通面包、法式面包等(快洗、大件衣服等),盖上盖子,按开始。 机器就开始按照编好的程序进行搅拌、加热等操作(洗衣机还会进水、放水)。最后在提示音之后打开盖子,就得到了我们想要的输出——面包(干净衣服)。当然,还可以根据需要只进行某部分操作,如只进行和面或发酵(只漂洗或甩干)。
而面包机有意思的特别之处是,它还可以用来做酸奶和醪糟(一种发酵的米酒), 这是因为加热发酵过程对于制作面包、酸奶和醪糟是类似的。也就是说,一个可控温度的容器是一个通用的工具,给它不同的运行参数(时间、温度),它就可以实现不同的功能。 在我读大学的时候,也听说生物系的同学用一种叫做“电热恒温培养箱”的实验仪器自制酸奶,这种机器做酸奶跟面包机相比就如同单反相机跟数码相机的区别吧。
通过以上的叙述,我想说的是一个工具或者机器的参数, 通常包含固定的和可调的两部分。 一个通用性强的机器, 调整其可调的参数, 就可以实现不同的功能。 这适用于面包机、洗衣机、电热恒温培养箱、照相机等等。而我们的计算机其实也是一样的,它也可以看作一种参数高度可调的工具, 所谓的参数,就是某个程序的代码, 运行不同的代码就可以实现不同的功能。
而本章将要介绍的深度学习所基于的人工神经网络(在之后若不加说明,神经网络均是指人工神经网络), 也是一种参数高度可调的通用工具。它的本质是一个由一系列向量、矩阵运算构成的函数, 函数的输入和输出就是这个工具的输入和输出,函数表达式中某些矩阵和向量的取值,就构成了这个工具可调的参数, 而函数表达式的形式本身,则是不可调的。
例如, 函数
就可以被看作一个人工神经网络。 其输入为
输出为
, 可调整的参数为
和
。 不同的参数, 可以构成不同的函数以实现不同的功能。
我们再接着讨论一下神经网络这种通用机器的特点。
神经网络的理念是, 给出一种通用的函数形式, 它的计算步骤、方式均是固定的, 其功能只由其中的参数取值决定。 也就是说, 其参数是一些实数向量和矩阵。 所有参数构成的参数空间是一个高维欧式空间。 空间中任意一个点就是一组具体的参数取值, 也就对应于一种实现具体功能的工具。
说的形而上一些, 这是一种叫做连接主义的理念。 可以与我们的人脑类比,连接主义认为人脑就是一种这样的通用机器,构成人脑的脑细胞所实现的功能很固定很简单, 人之所以拥有智能, 则是因为数量庞大的这样的简单单元以某种非常特殊的方式互相连接着。 在之后的小节中我们会看到, 人工神经网络可以看作是对人脑某种程度的模拟, 人工神经网络中的函数相当于定义了某种特殊的脑细胞的连接方式, 而函数中可调的参数则定义了在这种连接方式下这些连接的强度。
我们还能举出一些与连接主义不同的理念。
例如,我的中学化学老师一直挂在嘴边的一句话就是“结构决定功能”。化合物的功能,是由其结构决定的。 当我们写出
时, 它的化学性质已经确定了, 诸如氧原子和氢原子的连接强度这样的信息是次要的。 这与人工神经网络中连接权重决定功能是不一样的。
在人工智能领域, 与连接主义对立的有“符号主义”。 后者并不将人的智能解释为脑细胞的某种连接方式, 而是将其解释为人类与其它动物相比非常强的符号处理能力。 利于人类的语言, 就可以看作一个符号系统。 符号系统的特点是其对象是离散的, 例如每个人发“machine”的声音可能大相径庭,但只要与其它单词能够区别,我们就把它当作同一个符号,而这个符号又对应着某种意义, 比如“machine”的意义就是“能完成某种功能的工具或装置”。 更为复杂的, 对符号的处理还包括对符号串的处理以及对符号逻辑的处理。 在我们已知的生物中, 只有人类掌握了如此强的符号处理能力。
那么, 处理符号的函数与定义人工神经网络的函数的区别就很明显了。 用来处理符号的函数的输入应该是符号性的, 即离散的变量及其组合, 不同的符号和它们的组合都有其背后对应的意义, 而人工神经网络的输入通常是实数构成的向量或矩阵, 每个分量不需要有抽象的意义。 处理符号的函数会用到很多逻辑运算, 而人工神经网络一般使用代数运算。 处理符号的函数中可调整的参数会比较抽象, 参数空间由符号的组合来表示(类似与我们中学学的排列组合),而人工神经网络中可调的参数也是一些实数构成的向量和矩阵, 参数空间是欧式空间。
我们现在使用的所有计算机都等价于图灵机, 程序员设计出程序(机器的参数)并运行机器, 计算机就可以完成不同的任务。 而人工神经网络的野心并不是提出另一个计算框架, 让人手工地在这个框架下调整神经网络的参数, 然后构造不同功能的机器。 它是想给出一种通用的算法, 能够自动地找到一组参数的取值, 让神经网络能够很好的完成给定任务。
一言以蔽之, 人工神经网络的目标是用机器设计机器。
这可是个能够让人心跳加速的口号。 人类花了成百上千万年的进化, 学会了制造工具,进入了石器时代。 又花了几百万年的时间, 学会了用机器制造机器, 发生了工业革命。 下一个里程碑就应该是用机器设计机器, 注意这里不是指的用机器辅助人设计机器, 如现在已经有的计算机辅助设计 (CAD), 而是机器根据人的需求自己设计机器。
机器设计机器, 在人工神经网络中, 就是机器自动调整参数。更具体地, 就是在一个高维欧式参数空间中,找到一点, 对应于一种机器, 能够完成某种指定的任务。
在后面的章节中会介绍在人工神经网络中, 是通过怎样的方式以及算法使得一个神经网络可以根据不同的问题自动地调整参数。
到目前为止, 我们只介绍了一般的人工神经网络模型。 对于深度学习, 其使用的人工神经网络是一种多层前馈神经网络。 用数学的语言描述, 就是说神经网络所对应的函数是一个由多个函数嵌套而成的函数。 例如:
(1)
函数
由三个函数嵌套而成。 三个函数各有自己的参数。
不过, 以上所描述的仍旧是一个也许比大多数读者都要年长的模型。 为何在近年它才再次火起来呢, 因为虽然该模型被提出很久, 但是学者们一直无法找到很好的方法用以调整各个层次函数中的参数。 也就是说只是由于解决了一个纯技术性的问题, 使得这个老模型再次成为人们的焦点。
一个由嵌套函数构成的函数是非常复杂的, 参数空间非常大且复杂, 会很容易只能找到局部最优的解, 而这样的解往往并不太好, 从而使得这种模型的效果反而不如其它简单模型。 近年, 学者终于找到了第一种能够有效训练参数的方法, 即逐层预训练并最后进行微调。 所谓逐层预训练, 就是用一种方法逐个训练。 例如对于公式 (1) 代表的神经网络, 就是用不同的方法逐个地分别确定参数
、
、
的值。 最后再合在一起进行微调。 而如何逐个学习各层的参数, 其中的妙处我们在后面的章节进行介绍。
以上讨论了何为机器学习, 以及神经网络这种特殊的实现机器学习目标的框架, 而深度学习就是指的一类特殊的神经网络。
深度学习作为一种机器学习模型, 近年在很多应用场合都取得了很好的成绩。 以下按机器学习任务的应用类别来加以分别介绍:
分类 。 任务的输出为一个离散的量。 例如在垃圾邮件自动过滤中, 输入一封邮件, 输出是或不是垃圾邮件。 图像识别 是一种具体的分类任务, 其输入是一幅图片, 输出为图片中物体的名字(一般是在一个有限的集合中找出一个)。 Andrew Ng 教授是这方面的牛人。 他与Google建立的团队使用1000台机器,16000个cpu组成集群构成一个神经网络, 对20000种物体的图片进行识别。 相对于非深度学习的方法的准确率提高了70%。 最近, Ng 教授的团队继续用gpu取代cpu进行计算, 使得可以用少得多机器完成相同任务。
结构分类 。 结构分类是一类特殊的分类问题, 其输出不是一个简单的离散的量, 而是由多个离散的量构成的结构。 例如我们文字交流中使用的句子, 既是由离散的量(汉字或单词)线性连接构成的。 语音识别 就是一个非常有用的结构分类问题, 其输入是一段语言的录音, 输出是语音对应的句子。 供职于微软的邓力使用深度学习在语音识别方面取得了很大的进步。 在一个大会上, 微软演示了一个可以进行实时翻译的系统, 演讲者用英文演讲, 其语言被实时识别为英文文本, 再被翻译为汉语, 最后合成相应的汉语语音被播放出来, 技惊四座。
回归 。 回归是不同与分类的另一大类问题。 它的输出不是离散的量, 而是连续的实数。 语言模型 就是一个特殊的回归任务, 对于一个句子, 它给出这个句子产生的概率。 常用的句子的概率高于不常用的句子, 正确的句子的概率高于错误的(例如不合语法的)句子。 深度学习的鼻祖之一 Hinton 就曾用深度网络构造过高质量的语言模型。 语言模型在语音识别、 机器翻译、中文输入法中都起到很大的作用。