本文是一门同名课程的学习笔记,按照教学计划,这门课一共四讲,因此该笔记系列也就相应地由四篇文章构成.课程主体上参考《深度学习入门:基于Python的理论与实现》(斋藤康毅)一书,因为这本书没有选用常见的pytorch和tensorflow等深度学习的框架,重视从最基础的部分开始讲起.
本系列笔记参考如下几本书:
《深度学习入门:基于Python的理论与实现》(斋藤康毅).也就是课程选用的教材.《深度学习》(IanGoodfellow,YoshuaBenjio,AaronCourville),也就是深度学习领域中大名鼎鼎的花书.《深度学习:基于MATLAB的设计实例》(PhilKim)《机器学习实战:基于Scikit-Learn和TensorFlow》(AurélienGéron)《机器学习》(周志华),也就是机器学习中著名的西瓜书.1深度学习机器学习
人工智能
人工智能是现在炒得非常火的概念,全国上下有好多大学都在自家计算机系或者其它院系开设了人工智能专业.从字面上来说,人工智能就是"人造"的"智能",这里的"智能"指的就是人类表现出来的头脑思维,而"人造"指的一般就是计算机.换言之,人工智能泛指通过计算机(或者其它机器)实现传统上人们认为只有人才能做的事.
实现人工智能有多种技术途径,机器学习就是目前最热门的一个.那什么是机器学习(machinelearning,ML)呢?机器学习泛指那些通过数据进行学习的算法.这里学习的意义直观上好理解,但是对其进行详细的定义并不容易.Mitchell在年给它给了一个目前人们普遍接受的定义:
对于某类任务
和性能度量
,一个计算机程序被认为可以从经验
中学习是指通过经验
改进后,它在任务
上由性能度量
衡量的性能有所提升.
在Mitchell的定义中,出现了若干个对象:任务
,性能度量
,经验
.它们也需要进一步说明.当我们写程序的时候总是为了实现一些目的,比如从大量的人像数据中找到特定的人,又比如让机器人行走,再比如翻译一篇外语文章等,这些目的就是程序需要完成的任务.为了评估任务完成的情况如何,我们就必须找到合理的评估指标,比如在工业生产中产品的产出量、产品的合格率等都是典型的评估指标.这些评估指标就是一种性能度量.那什么是经验呢?拿我们人类来说,我们提到的经验就是过去经历过的事实,当我们试图完成某项工作的时候,对它的任何一次尝试都可以算作是对这项工作的经验.类似地想法也存在于机器学习中,当确定好一个半成品模型后,模型的每一次输出以及对输出结果的评估都可以算作是经验.机器学习的目的就在于通过这些经验不断地优化模型.如果基于已有数据训练的模型在新的数据中表现情况不错,我们就说这个模型得到了泛化.
接下来对上述三个对象进行更为详细的解释.
任务任务就是我们希望机器学习完成的目标,然而这个说法并不利于计算机处理,毕竟计算机是用来处理数据的.摆在计算机面前的是大量的数据,通过适当的手段这些数据可以和数构成映射(这总是可以的,毕竟数据不外乎:图像、音频、文字、数值.图像可以转换为像素值,音频可以转换为频率,文字可以转换为文字编码,数值更不用说).显然,对于同一个对象,我们可以选择不同的侧面(属性)将其转换为数值,这个数值就是这个对象关于该属性的属性值,习惯上属性
和属性值
的有序对
被叫做特征(在之后的叙述中属性、属性值和特征这三个名词有时候会混用,这并不会带来太大的问题).对于某个对象寻求属性以及其属性值的过程叫做提取特征或特征提取.把一个对象的所有特征汇集起来就构成了对原本对象的一个刻画,一定程度上就可以替代原本的对象.假定我们对对象
找到了
个特征
,那么我们就找到了对象
和一个向量
的一个对应.实际的工作中需要处理的对象不是一个而是一群,它们都可以通过合适的特征集转换为向量,每个对象生成的向量就叫做这群对象的一个样本.机器学习的任务可以理解为将样本作为输入得到输出这个事件,换言之,学习任务就是一个映射
.根据输出类型(也就是映射
)的不同,我们就可以将学习任务划分为不同的类别.最常见,也是最重要的两类任务就是分类和回归.这两类任务也是深度学习通常要面对的问题类型,也是科学研究中最为常见的两类问题.
(a)分类任务.这里
是某个有限集,通常就是
,每个指标代表一个类别.比如我们用
来表示某个人的身体信息,比如
表示身高,
表示体重,然后计算BMI,将这个人划分为体重过轻,正常,超重和肥胖这四类,如果我们分别用
代表它们,则任务就是把每个人
归类到
中的一个.
(b)回归任务.这里
通常就是
的一个子集.比如说在刑事犯罪中如果在现场采集到了脚印,并且确定了脚印对应的鞋码、特定位置的深浅等信息,我们自然希望对脚印的主人的信息进行预测,比如他的身高、体重、性别等,前面两个就是一种回归任务,而后者就是一种分类任务.
性能度量假定我们通过机器学习训练得到了一个用于分类的模型,那么如何评价这个模型的好坏呢?显然,我们可以用它分类结果的正确率来对模型进行评估,这里的正确率就是分类任务中最为常见的性能度量,当然,它的反面,也就是错误率也是同样的:更高的正确率意味着更低的错误率.
通常我们会将样本的集合(称作数据集)分成两类:训练集和测试集,通过训练集来对模型进行训练,通常在训练集上模型会表现的相当出色,但是这个模型到底如何其实取决于它对于未知样本的表现情况,因此会用测试集来测试它的表现.
举个例子,身高体重性别之间存在比较明显的相关性,假定我们希望用身高和性别信息来预测体重(这是典型的回归任务),并且我们已经拥有一个地区内人群的上述信息.我们将这些人群的给出的数据集随机八二分,用八成的数据来训练模型,模型需要将身高
和性别
变成体重
,即
.训练集通过训练找到对它最合适的
,给定测试集中的数据
,模型给出一个预测
,那么预测的误差
就是一个不错的性能度量,更为常用的则是预测表现的标准差
测试集
测试集
其中
测试集
表示测试集中样本的数目.显然
越小我们的模型表现得就越好.
经验在某种意义上,经验和数据集没有什么明显的区分,它通常是数据集中的一部分数据点(也就是样本).但是数据也是有特点的,根据数据的特点可以对机器学习进行分类:
(1)监督式学习
这个过程和学生学习知识的过程很相似.我们如何检验自己掌握了某项知识?选择一道习题,根据自己的现有知识,完成该习题,然后将其与正确答案比对,如果答题错误,则说明对该知识点掌握情况不佳,于是需要订正错误,找到错误点,然后对自己的知识系统进行更新.将这个过程不断重复,也就是完成所有的练习题就实现了对对应知识点的一次完整的学习.可以看到,在这个过程中,正确答案保证了每次完成习题后都知道自己错在哪里了,于是学习就更有效率.如果将习题理解为输入,输出是习题的答案,那么这类数据集的特点就是对于每个输入,都有一个正确的输出,这个正确的输出叫做标签或者标记.模型的目的是找到一个最贴近正确输出的
.基于这类数据集的学习过程就叫做监督式学习,学习过程就是对于同样的输入,为减少正确输出与模型输出之间的差别的对模型进行优化的过程.最理想的情况自然是对于每个输入都给出正确输出.比如前文提到的对身高性别和体重之间关系的训练,由于对应于某一身高和性别的体重数据都是知道的,因此这是一个典型的监督式学习.分类和回归是监督式学习中最为典型的两种任务类型.
(2)无监督式学习
这个与监督式学习比较即可得知其特点:数据集只有输入,而没有正确的输出.它通常用于研究数据的特征以及对数据进行预处理.一个类似的例子就是学生根据自己已有的知识,将遇到的习题划分为某一类,但是他本身不会求解该习题,习题类别的划分也是主观的,没有客观标准.这类问题叫做聚类,聚类是一种典型的无监督学习,因为训练集中的数据不带有标签.
(3)半监督式学习
顾名思义,我们的数据集中有些数据带有标签,但是大量数据是不带有标签的.一个典型的例子就是机场等处的个人信息核查,我们将身份证信息作为输入,计算机可以将当时的身份信息和你的头像关联起来,而现在的任务就是识别正在等待核查的人是否是身份证对应的那个人.身份识别系统通常是将某些时候带有个人信息的图像数据和监控系统得到的大量不关联个人信息的图像数据作为输入来训练模型的,这就是典型的半监督学习.
(4)强化学习
如果数据集不固定,那么对于每次更新后的数据集都可以进行训练,学习系统(通常称作智能体)和环境会继续交互,它能观察环境,做出选择,执行操作并通过反馈来升级学习策略.一个典型的例子就是家长对孩子的规训:如果孩子做错事了,就给予其惩罚,这样孩子每当遇到类似的事的时候就会想起原本的惩罚从而知道如何处理对应问题.强化学习多用在机器人领域和游戏领域当中.
值得注意的是,上面的分类中其实最核心的就是监督学习和无监督学习,后面两个都是这两类方式的杂交产物.
机器学习有各种各样的实现方法,用于处理不同类别的问题.而深度学习就是机器学习的一种实现方法,它在图像识别、语音识别领域有着极佳的表现.深度学习和神经网络基本上就是同义词,因此接下来我们开始探讨神经网络的相关问题.
2人工神经网络的发展历史学习一门学科,学习它的发展历史还是有一定必要的.因为从历史中可以窥见发展的脉络,从历史中可以得知发展的方向,从历史中可以寻求前人的智慧乃至于找到一些掩埋在故纸堆中的珍宝.
正如世界上出现的绝大部分事物一样,神经网络的发展也是起起伏伏的.
起年,心理学家WarrenMcCulloch以及数学家WalterPitts描述了一种理想化的人工神经网络,该神经网络模型被称作MP模型,后面还要进一步对其进行解释.McCulloch和Pitts两人基于MP模型构建了一种基于简单逻辑运算(且、或、非)的计算机制.年Turing在理论上描述了一种图灵机,这种图灵机采用Hubb型学习[1]模式.年,McCulloch和Pitts的学生MarvinMinsky建造了第一台神经网络机,称作SNARC.在年,Rosenblatt最早提出可以用来模拟人类感知能力的神经网络模型,并将其命名为感知机(perceptron),还提出了一种接近于人类学习过程(迭代、试错)的学习算法.
在MP模型提出后的十几年内,神经网络吸引了一些学者对其进行研究,不过此时还没有掀起什么太大的波浪.而且这个波浪正要有点比较大的起伏的时候,MarvinMinsky,这位神经网络的正统继承者,给神经网络致命一击:
伏年,MarvinMinsky出版了《感知机》一书,书中用两个问题击垮了当时的神经网络的研究:
基本感知机无法处理异或回路;计算机没有足够的算力,导致处理大型神经网络需要花费很长的计算时间.这两个问题不说判处神经网络死刑,但是至少它让很多研究神经网络的学者感觉心灰意冷,转向研究其它算法.在这段时间内,如果有谁说自己在研究神经网络,会遭到共同体的无视.然而火种孕育在灰烬之中.年,Harvard的PaulWebos发明了反向传播算法(BP算法),尽管这个算法在当时没有受到应有的重视,但是BP算法实际上基本解决了Minsky问题中的第二个.年,KunihikoFukushima(福岛邦彦[2])提出了一种带卷积和子采样操作的多层神经网络新知机(Neocognitron),这也是现在大名鼎鼎的卷积神经网络的雏形.
再起年,Caltech的物理学家JohnHopfield对神经网络引入了能量函数的概念,并提出了用于联想记忆和优化计算的网络,后来被称作Hopfield网络.这种网络模型是基于物理学的要求搭建起来的,是对Ising模型的一个推广[3],是一种全连接网络.虽然全连接网络引入的参数太多不好训练,现在不再使用这种网络,但是Hopfield在当时普遍研究前馈神经网络的情况下率先引入反馈神经网络,并在理论上对反馈神经网络的稳定性进行了分析,最重要的是这个模型在旅行商问题[4]上取得了当时最好的结果,引起了轰动.使得陷入低谷的神经网络再次焕发起了活力,吸引力一批学者重新投身于神经网络的研究当中.比如年GeoffreyHinton就在Hopfield理论的启发下,提出一种随机化版本的Hopfield网络,现在被称作Boltzmann机,听这名字就知道物理气息浓厚了.紧接着,在年,DavidRumelhart和JamesMcClelland对连接主义[5](Connectionism)在计算机模拟神经活动中的应用提供了全面的论述,并且重新发明了BP算法,此时BP算法引起了人们的兴趣,事实上,BP算法也是机器学习中应用最广泛的算法之一.在年,另一项轰动性的成果被LeCun等人通过将BP算法引入卷积神经网络实现了,这个成果就是手写体数字的识别,这也是当前神经网络最经典的案例,之后很多例子也会以它为典例展开.
又伏在二十世纪九十年代中期,以统计学习理论(statisticallearning)和支持向量机(supportvectormachine,SVM)以及核方法(kernalmethods)为代表的机器学习模型开始兴起,其中统计学习理论和连接主义学习有着密切关系,而有效的SVM算法在九十年代初期被提出,在九十年代中期因为文本分类应用中的高效性得到广泛