远在古希腊时期,发明家就梦想着创造能自主思考的机器。
自人类最初设想可编程计算机的那一刻起,他们便开始探索计算机智能化的可能性,尽管这一设想比第一台实际计算机的诞生要早上百年(Lovelace, 1842)。目前,人工智能(AI)已经演变成一个繁荣的领域,不仅广泛应用于各个行业,还是许多研究者的热门课题。人工智能的愿景是让智能软件能够自动完成日常工作、解析语音和图像、辅助医疗诊断,并支撑基础科研活动。
在人工智能的发展初期,那些对人脑来说挑战重重、但对计算机相对容易的问题很快就被解决了。这些问题通常能够用一套严密的数学规则来表达。然而,真正的挑战在于那些人类能够轻松应对、但难以用传统方法精确描述的任务,比如理解口语或识别图像中的人脸。我们往往依靠直觉就能轻松解决这些问题。
我们可以对这类直观问题提出一种解决策略,使计算机能够通过经验学习,并依据一个分层的概念结构来理解世界,其中每一个概念都是通过与其他一些较为基础的概念之间的关联而定义的。这种方法允许计算机通过经验而非人工明确规定的知识来获得认知,而且通过分层概念的构建,计算机能够从简单概念出发逐步学习复杂概念。如果将这些相互构建的概念绘制成图表,就会呈现出一张层次丰富的“深度”图谱。正是基于这种原理,我们将此方法称为AI深度学习。
具有讽刺意味的是,那些抽象且需形式化的任务,通常是人脑面临的最大挑战之一,对计算机来说却是较为简单的任务。例如,计算机已经能够在象棋比赛中战胜世界顶级棋手,然而在物体识别或语音识别方面,它们直到最近才达到与人类相当的水平。人们的日常生活依赖于对周围世界的深刻理解,很多这类知识都是基于主观直觉的,难以通过形式化的语言准确表达。要使计算机展现出类似人类的智能,就必须使它们掌握这种类型的知识。将这种难以形式化的知识有效地传递给计算机是人工智能领域面临的一个核心挑战。
尝试将世界知识以形式化语言直接编码进计算机的人工智能项目,并未取得突破性进展。这些尝试通常采用所谓的知识库方法,其中计算机利用逻辑规则自动理解硬编码的声明。其中最知名的尝试之一是Cyc项目,该项目建立了一个庞大的使用CycL语言编写的声明数据库,由人工输入。这种方法十分繁琐且难以捕捉世界的复杂性。例如,Cyc无法理解一个简单故事,如一个名叫Fred的人早上刮胡子,因为它的逻辑推理发现故事中的不一致——它无法将持有电动剃须刀的Fred与没有电气部件的人类概念相协调。
这种依赖于硬编码知识的方法所遇到的问题表明,AI系统需要能够自我获取知识,即从原始数据中学习和提取模式的能力,这就是机器学习的领域。通过引入机器学习,计算机能够处理涉及现实世界知识的问题并做出主观判断,如使用逻辑回归决定是否建议进行剖腹产,或使用朴素贝叶斯算法区分垃圾邮件和非垃圾邮件。
这些机器学习算法的效果在很大程度上依赖于数据的表示方式。例如,在使用逻辑回归判断是否适合剖腹产时,系统不会直接检查患者,而是依赖医生提供的相关信息,如子宫是否有疤痕等。这些信息点称为特征,它们是算法学习和做出预测的基础。然而,这些算法不能自行定义特征,如果直接以MRI扫描图像为输入,而不是结构化的医疗报告,算法可能无法做出有意义的预测,因为MRI图像上的单个像素与分娩并发症之间的关联极其微弱。
让我们看这样一份数据(简化部分):
Class | x | y |
Class 1 | 2.882026173 | 2.941575349 |
Class 1 | 2.200078604 | 1.326120469 |
Class 1 | 2.489368992 | 1.364757501 |
Class 1 | 3.1204466 | 2.484698354 |
Class 1 | 2.933778995 | 1.413438297 |
Class 1 | 1.51136106 | 2.971810593 |
Class 1 | 2.475044209 | 1.79319051 |
Class 2 | 3.766790452 | 3.634661124 |
Class 2 | 3.527776872 | 3.807560095 |
Class 2 | 3.794975153 | 4.047175795 |
Class 2 | 3.991489793 | 3.978914274 |
Class 2 | 4.189575868 | 3.856556404 |
Class 2 | 5.129654475 | 3.969186799 |
Class 2 | 3.978871424 | 3.946347362 |
Class 2 | 3.5220275 | 3.640197806 |
Class 2 | 3.827009112 | 3.593503506 |
Class 2 | 3.768202013 | 4.137258179 |
Class 2 | 4.240740737 | 3.554542459 |
Class 2 | 3.229601493 | 3.42132237 |
Class 2 | 4.031630997 | 3.843853874 |
Class 2 | 4.078253269 | 3.921166492 |
Class 2 | 4.116090518 | 5.128361749 |
Class 2 | 3.701341966 | 3.647649862 |
Class 2 | 3.881039135 | 4.471630362 |
Class 2 | 3.287969546 | 4.373594167 |
Class 2 | 3.753340058 | 3.405527522 |
Class 2 | 3.728569262 | 4.386626489 |
Class 2 | 4.208025023 | 3.40805968 |
Class 2 | 3.421908784 | 2.670413881 |
Class 2 | 4.390599051 | 4.303159762 |
Class 2 | 4.747242272 | 3.122054708 |
Class 2 | 2.965007487 | 4.225467231 |
Class 2 | 4.213129365 | 3.657994551 |
Class 2 | 4.338454018 | 4.829775398 |
Class 2 | 3.681281487 | 4.5342547 |
Class 2 | 3.801364093 | 3.773307098 |
Class 2 | 3.933559711 | 3.656081194 |
Class 2 | 3.85110456 | 3.392961298 |
Class 2 | 3.845493515 | 3.779538684 |
Class 2 | 3.161998097 | 3.859822252 |
Class 2 | 4.576165782 | 3.817653228 |
能看出来什么?恐怕没有人能看出来,那我们将他可视化:
很好,我们似乎发现了规律,但是,怎么形容?比如,我们可以用一条直线将两个不同类区分出来吗。似乎不行。。。。那换一个坐标系呢:
似乎可以了。
就像刚才的例子。对于许多人工智能任务而言,解决问题的一种常见方法是首先识别出一组适当的特征,然后利用这些特征来训练简单的机器学习算法。以声音识别说话者的任务为例,声道的大小估计就是一个重要特征,因为它能够为区分说话者的性别和年龄(如成人男性、女性或儿童)提供重要线索。
然而,对于很多任务来说,确定哪些特征最为关键却是一个颇具挑战的问题。以检测照片中汽车为例,我们可能会本能地认为轮子的存在是一个关键特征,因为大多数汽车都配有轮子。但是,准确地根据像素值定义一个轮子的外观却是非常困难的。尽管轮子的基本几何形状相对简单,但在不同的环境和条件下,轮子的图像可能会有很大差异。例如,轮子上的阴影、由太阳照射而产生的高光、汽车挡泥板的遮挡,以及可能遮挡轮子一部分的前景物体等因素都会影响轮子的视觉表现,使得基于像素的轮廓识别变得复杂。
解决如何从原始数据中提取有用特征的问题的一种方法是采用表示学习(representation learning),它不仅仅关注于将数据映射到输出,而是专注于发现数据的有效表示。表示学习的优势在于学习到的表示往往比人工设计的表示更为有效,并且它们可以在最少的人工干预下迅速适应新任务。表示学习算法能够在几分钟内为简单任务发现有效的特征集,而对于更为复杂的任务,这个过程可能需要几小时到几个月。相比之下,手动设计复杂任务的特征集不仅耗时耗力,甚至可能需要整个研究社区数十年的努力。
现实世界的人工智能应用面临的挑战在于,观测到的每一项数据都可能同时受到多个变化因素的影响。例如,在一张展示红色汽车的照片中,夜间的光照条件下,汽车的某些像素可能接近黑色;汽车轮廓的识别则依赖于观察角度。成功的应用需要能够识别并区分这些变化因素,同时忽略不重要的因素。
从原始数据中提取高层次、抽象的特征非常困难,尤其是当涉及到复杂和微妙的变化因素,如说话者的口音时。这些因素的识别几乎需要接近人类水平的理解,这使得任务变得与获得原始问题的表示一样复杂。深度学习(deep learning)通过使用简单的表示来构建更复杂的表示,为表示学习中的核心难题提供了解决方案。
计算机处理原始感观输入数据,如将图像转化为像素值集合,面临着理解这些数据背后含义的巨大挑战。简单地将一组像素映射到特定的对象标识上,这样的函数非常复杂,若不采用间接方法,直接学习或评估这种映射似乎几乎不可行。深度学习通过将这一复杂的映射任务分解为一系列更简单、层次化的映射来解决这个问题,每个简单映射由模型中的不同层来实现。