DEEP LEARNING
深度学习
赵申剑 黎彧君 符天凡 李凯 译 张志华等 审校
人民邮电出版社
北京
图书在版编目(CIP)数据
深度学习/(美)伊恩·古德费洛(Ian Goodfellow),(加)约书亚·本吉奥(Yoshua Bengio),(加)亚伦·库维尔(Aaron Courville)著;赵申剑等译.--北京:人民邮电出版社,2017.8
ISBN 978-7-115-46147-6
Ⅰ.①深… Ⅱ.①伊…②约…③亚…④赵… Ⅲ.①机器学习 Ⅳ.①TP181
中国版本图书馆CIP数据核字(2017)第153811号
版权声明
Deep Learning by Ian Goodfellow,Yoshua Bengio,Aaron Courville
© 2016 Massachusetts Institute of Technology
Simplified Chinese translation copyright © 2017 by Posts & Telecom Press.
This edition published by arrangement with MIT Press through Bardon-Chinese Media Agency.All rights reserved.
本书简体中文翻译版由Bardon-Chinese Media Agency代理MIT Press授权人民邮电出版社独家出版发行。未经出版者书面许可,不得以任何方式复制或节录本书中的任何内容。
版权所有,侵权必究。
◆著 [美]Ian Goodfellow [加]Yoshua Bengio
[加] Aaron Courville
译 赵申剑 黎彧君 符天凡 李凯
审校 张志华 等
责任编辑 王峰松
责任印制 焦志炜
◆人民邮电出版社出版发行 北京市丰台区成寿寺路11号
邮编 100164 电子邮件 315@ptpress.com.cn
网址 http://www.ptpress.com.cn
北京画中画印刷有限公司印刷
◆开本:787×1092 1/16
印张:33
字数:805千字 2017年8月第1版
印数:1-4000册 2017年8月北京第1次印刷
著作权合同登记号 图字:01-2016-1194号
定价:168.00元
读者服务热线:(010)81055410 印装质量热线:(010)81055316
反盗版热线:(010)81055315
广告经营许可证:京东工商广登字20170147号
读者服务:
微信扫码关注【异步社区】微信公众号,回复“e46147”获取本书配套资源以及异步社区15天VIP会员卡,近千本电子书免费畅读。
《深度学习》由全球知名的三位专家Ian Goodfellow、Yoshua Bengio和Aaron Courville撰写,是深度学习领域奠基性的经典教材。全书的内容包括3个部分:第1部分介绍基本的数学工具和机器学习的概念,它们是深度学习的预备知识;第2部分系统深入地讲解现今已成熟的深度学习方法和技术;第3部分讨论某些具有前瞻性的方向和想法,它们被公认为是深度学习未来的研究重点。
《深度学习》适合各类读者阅读,包括相关专业的大学生或研究生,以及不具有机器学习或统计背景、但是想要快速补充深度学习知识,以便在实际产品或平台中应用的软件工程师。
Ian Goodfellow,谷歌公司(Google)的研究科学家,2014年蒙特利尔大学机器学习博士。他的研究兴趣涵盖大多数深度学习主题,特别是生成模型以及机器学习的安全和隐私。Ian Goodfellow在研究对抗样本方面是一位有影响力的早期研究者,他发明了生成式对抗网络,在深度学习领域贡献卓越。
Yoshua Bengio,蒙特利尔大学计算机科学与运筹学系(DIRO)的教授,蒙特利尔学习算法研究所(MILA)的负责人,CIFAR项目的共同负责人,加拿大统计学习算法研究主席。Yoshua Bengio的主要研究目标是了解产生智力的学习原则。他还教授“机器学习”研究生课程(IFT6266),并培养了一大批研究生和博士后。
Aaron Courville,蒙特利尔大学计算机科学与运筹学系的助理教授,也是LISA实验室的成员。目前他的研究兴趣集中在发展深度学习模型和方法,特别是开发概率模型和新颖的推断方法。Aaron Courville主要专注于计算机视觉应用,在其他领域,如自然语言处理、音频信号处理、语音理解和其他AI相关任务方面也有所研究。
中文版审校者简介
张志华,北京大学数学科学学院统计学教授,北京大学大数据研究中心和北京大数据研究院数据科学教授,主要从事机器学习和应用统计学的教学与研究工作。
译者简介
赵申剑,上海交通大学计算机系硕士研究生,研究方向为数值优化和自然语言处理。
黎彧君,上海交通大学计算机系博士研究生,研究方向为数值优化和强化学习。
符天凡,上海交通大学计算机系硕士研究生,研究方向为贝叶斯推断。
李凯,上海交通大学计算机系博士研究生,研究方向为博弈论和强化学习。
《深度学习》的中文译本忠实客观地表述了英文原稿的内容。本书的三位共同作者是一个老中青三代结合的整体,既有深度学习领域的奠基人,也有处于研究生涯中期的领域中坚,更有领域里近年涌现的新星。所以,本书的结构行文很好地考虑到了处于研究生涯各个不同阶段的学生和研究人员的需求,是一本非常好的关于深度学习的教科书。
深度学习近年来在学术界和产业界都取得了极大的成功,但诚如本书作者所说,深度学习是创建人工智能系统的一个重要的方法,但不是全部的方法。期望在人工智能领域有所作为的研究人员,可以通过本书充分思考深度学习和传统机器学习、人工智能算法的联系和区别,共同推进本领域的发展。
——微软研究院首席研究员华刚博士
这是一本还在写作阶段就被开发、研究和工程人员极大关注的深度学习教科书。它的出版表明我们进入了一个系统化理解和组织深度学习框架的新时代。这本书从浅入深介绍了基础数学、机器学习经验,以及现阶段深度学习的理论和发展。它能帮助AI技术爱好者和从业人员在三位专家学者的思维带领下全方位了解深度学习。
——腾讯优图杰出科学家、香港中文大学教授贾佳亚
深度学习代表了我们这个时代的人工智能技术。这部由该领域最权威的几位学者Good-fellow、Bengio、Courville撰写的题为《深度学习》的著作,涵盖了深度学习的基础与应用、理论与实践等各个方面的主要技术,观点鲜明,论述深刻,讲解详尽,内容充实。相信这是每一位关注深度学习人士的必读书目和必备宝典。感谢张志华教授等的辛勤审校,使这部大作能够这么快与中文读者见面。
——华为诺亚方舟实验室主任,北京大学、南京大学客座教授,IEEE Fellow李航
从基础前馈神经网络到深度生成模型,从数学模型到最佳实践,这本书覆盖了深度学习的各个方面。《深度学习》是当下最适合的入门书籍,强烈推荐给此领域的研究者和从业人员。
——亚马逊主任科学家、Apache MXNet发起人之一李沐
出自三位深度学习最前沿权威学者的教科书一定要在案前放一本。本书的第二部分是精华,对深度学习的基本技术进行了深入浅出的精彩阐述。
——ResNet作者之一、Face++首席科学家孙剑
过去十年里,深度学习的广泛应用开创了人工智能的新时代。这本教材是深度学习领域有重要影响的几位学者共同撰写。它涵盖了深度学习的主要方向,为想进入该领域的研究人员、工程师以及初学者提供了一个很好的系统性教材。
——香港中文大学信息工程系主任汤晓鸥教授
这是一本教科书,又不只是一本教科书。任何对深度学习感兴趣的读者,本书在很长一段时间里,都将是你能获得的最全面系统的资料,以及思考并真正推进深度学习产业应用、构建智能化社会框架的绝佳理论起点。
——新智元创始人兼CEO杨静
青山遮不住,毕竟东流去
深度学习这个术语自2006年被正式提出后,在最近10年得到了巨大发展。它使人工智能(AI)产生了革命性的突破,让我们切实地领略到人工智能给人类生活带来改变的潜力。2016年12月,MIT出版社出版了Ian Goodfellow、Yoshua Bengio和Aaron Courville三位学者撰写的《Deep Learning》一书。三位作者一直耕耘于机器学习领域的前沿,引领了深度学习的发展潮流,是深度学习众多方法的主要贡献者。该书正应其时,一经出版就风靡全球。
该书包括3个部分,第1部分介绍基本的数学工具和机器学习的概念,它们是深度学习的预备知识。第2部分系统深入地讲解现今已成熟的深度学习方法和技术。第3部分讨论某些具有前瞻性的方向和想法,它们被公认为是深度学习未来的研究重点。因此,该书适用于不同层次的读者。我本人在阅读该书时受到启发良多,大有裨益,并采用该书作为教材在北京大学讲授深度学习课程。
这是一本涵盖深度学习技术细节的教科书,它告诉我们深度学习集技术、科学与艺术于一体,牵涉统计、优化、矩阵、算法、编程、分布式计算等多个领域。书中同时也蕴含了作者对深度学习的理解和思考,处处闪烁着深刻的思想,耐人回味。第1章关于深度学习的思想、历史发展等论述尤为透彻而精辟。
作者在书中写到:“人工智能的真正挑战在于解决那些对人来说很容易执行、但很难形式化描述的任务,比如识别人们所说的话或图像中的脸。对于这些问题,我们人类往往可以凭直觉轻易地解决”。为了应对这些挑战,他们提出让计算机从经验中学习,并根据层次化的概念体系来理解世界,而每个概念通过与某些相对简单的概念之间的关系来定义。由此,作者给出了深度学习的定义:“层次化的概念让计算机构建较简单的概念来学习复杂概念。如果绘制出表示这些概念如何建立在彼此之上的一幅图,我们将得到一张‘深’(层次很多)的图。由此,我们称这种方法为AI深度学习(deep learning)”。
作者指出:“一般认为,到目前为止深度学习已经经历了三次发展浪潮:20世纪40年代到60年代深度学习的雏形出现在控制论(cybernetics)中,20世纪80年代到90年代深度学习以联结主义(connectionism)为代表,而从2006年开始,以深度学习之名复兴”。
谈到深度学习与脑科学或者神经科学的关系,作者强调:“如今神经科学在深度学习研究中的作用被削弱,主要原因是我们根本没有足够的关于大脑的信息作为指导去使用它。要获得对被大脑实际使用算法的深刻理解,我们需要有能力同时监测(至少是)数千相连神经元的活动。我们不能够做到这一点,所以我们甚至连大脑最简单、最深入研究的部分都还远远没有理解”。值得注意的是,我国有些专家热衷倡导人工智能与脑科学或认知学科的交叉研究,推动国家在所谓的“类脑智能”等领域投入大量资源。且不论我国是否真有同时精通人工智能和脑科学或认知心理学的学者,至少对交叉领域,我们都应该怀着务实、理性的求是态度。唯有如此,我们才有可能在这一波人工智能发展浪潮中有所作为,而不是又成为一群观潮人。
作者进一步指出:“媒体报道经常强调深度学习与大脑的相似性。的确,深度学习研究者比其他机器学习领域(如核方法或贝叶斯统计)的研究者更可能地引用大脑作为参考,但大家不应该认为深度学习在尝试模拟大脑。现代深度学习从许多领域获取灵感,特别是应用数学的基本内容如线性代数、概率论、信息论和数值优化。尽管一些深度学习的研究人员引用神经科学作为重要的灵感来源,然而其他学者完全不关心神经科学”。的确,对于广大青年学者和一线的工程师来说,我们是可以完全不用因为不懂神经(或脑)科学而对深度学习、人工智能踯躅不前。数学模型、计算方法和应用驱动才是我们研究人工智能的可行之道。深度学习和人工智能不是飘悬在我们头顶的框架,而是立足于我们脚下的技术。我们诚然可以从哲学层面或角度来欣赏科学与技术,但过度地从哲学层面来研究科学问题只会导致一些空洞的名词。
关于人工神经网络在20世纪90年代中期的衰落,作者分析到:“基于神经网络和其他AI技术的创业公司开始寻求投资,其做法野心勃勃但不切实际。当AI研究不能实现这些不合理的期望时,投资者感到失望。同时,机器学习的其他领域取得了进步。比如,核方法和图模型都在很多重要任务上实现了很好的效果。这两个因素导致了神经网络热潮的第二次衰退,并一直持续到2007年”。“其兴也悖焉,其亡也忽焉”。这个教训也同样值得当今基于深度学习的创业界、工业界和学术界等警醒。
我非常荣幸获得人民邮电出版社王峰松先生的邀请来负责该书的中文翻译。我是2016年7月收到王先生的邀请,但那时我正忙于找工作,无暇顾及。然而,当我和我的学生讨论翻译事宜时,他们一致认为这是一件非常有意义的事情,表达愿意来承担。译稿是由我的四位学生赵申剑、黎彧君、符天凡和李凯独立完成的。申剑和天凡是二年级的硕士生,而李凯和彧君则分别是二年级和三年级的直博生。虽然他们在机器学习领域都还是新人,其知识结构还不全面,但是他们热情高涨、勤于学习、工作专注、执行力极强。他们通过重现书中的算法代码和阅读相关文献来加强理解,在不到三个月的时间就拿出了译著的初稿,之后又经过自校对、交叉校对等环节力图使译著保持正确性和一致性。他们自我协调、主动揽责、相互谦让,他们的责任心和独立工作能力让我倍感欣慰,因而得以从容。
由于我们无论是中文还是英文能力都深感有限,译文恐怕还是有些生硬,我们特别担心未能完整地传达出原作者的真实思想和观点。因此,我们强烈地建议有条件的读者去阅读英文原著,也非常期待大家继续指正译著,以便今后进一步修订完善。我恳请大家多给予4位译者以鼓励。请把你们对译著的批评留给我,这是我作为他们的导师必须要承担的,也是我对王峰松先生的信任做出的承诺。
当初译稿基本完成时,我们决定把它公开在GitHub上,希望通过广大读者的参与来完善译稿。令人惊喜的是,有上百位热心读者给予了大量富有建设性的修改意见,其中有20多位热心读者直接帮助润色校对(详见中文版致谢名单)。可以说,这本译著是大家共同努力的结晶。这些读者来自一线的工程师和在校的学生,从中我领略到了他们对深度学习和机器学习领域的挚爱。更重要的是,我感受到了他们开放、合作和奉献的精神,而这也是推动人工智能发展不可或缺的。因此,我更加坚定地认为中国人工智能发展的希望在于年青学者,唯有他们才能让我国人工智能学科在世界有竞争力和影响力。
江山代有人才出,各领风骚数十年!
张志华代笔
2017年5月12日于北大静园六院
首先,我们要感谢原书作者在本书翻译时给予我们的大力帮助。特别是,原书作者和我们分享了书中的原图和参考文献库,这极大节省了我们的时间和精力。
本书涉及的内容博大且思想深刻,如果没有众多同学和网友的帮助,我们不可能顺利完成翻译。
我们才疏学浅而受此重任,深知自身水平难以将本书翻译得很准确。因此我们完成初稿后,将书稿公开于Git Hub,及早接受网友的批评和建议。以下网友为本书的翻译初稿提供了很多及时的反馈和宝贵的修改意见:@tttwwy、@tankeco、@fairmiracle、@Gage Gao、@huangpingchun、@Ma Hong P、@acgtyrant、@yanhuibin315、@Buttonwood、@titicacafz、@weijy026a、@Rui Zhang1993、@zymiboxpay、@xingkongliang、@oisc、@tielei、@yuduowu、@Qingmu、@HC-2016、@xiaomingabc、@bengordai、@Bojian、@Joy FYan、@minoriwww、@khty2000、@gump88、@zdx3578、@Pass Story、@imwebson、@wlbksy、@roachsinai、@Elvinczp、@endymecy、@9578577、@linzhp、@cnscottzheng、@germany-zhu、@zhangyafeikimi、@showgood163、@kangqf、@Neutron T、@badpoem、@kkpoker、@Seaball、@wheaio、@angrymidiao、@Zhiwei Yang、@corenel、@zhaoyu611、@Sirius XDJ、@dfcv24、@Emis XXY、@Flying Fire、@vsooda、@friskit-china、@poerin、@ninesunqian、@Jiaqi Yao、@Sofring、@wenlei、@wizyoung、@imageslr、@indam、@Xu LYC、@zhouqingping、@freedom Ren、@run Penguin和@piantou。
在此期间,我们4位译者再次进行了校对并且相互之间也校对了一遍。然而仅仅通过我们的校对,实在难以发现翻译中存在的所有问题。因此,我们邀请一些同学和网友帮助我们校对。经过他们的校对,本书的翻译质量得到了极大的提升。在此我们一一列出,以表示我们由衷的感谢!
·第1章(引言):刘畅、许丁杰、潘雨粟和Neutron T阅读了本章,并对很多语句提出了不少修改建议。林中鹏进行了校对,他提出了很多独到的修改建议。
·第2章(线性代数):许丁杰和骆徐圣阅读了本章,并修改语句。李若愚进行了校对,提出了很多细心的建议。蒋武轩阅读并润色了部分内容,提升了译文准确性和可读性。
·第3章(概率与信息论):许丁杰阅读了本章,并修改语句。李培炎和何翊卓进行了校对,并修改了很多中文用词,使翻译更加准确。
·第4章(数值计算):张亚霏阅读了本章,并对其他章节也提出了一些修改建议。张源源进行了校对,并指出了原文可能存在的问题,非常仔细。
·第5章(机器学习基础):郭浩和黄平春阅读了本章,并修改语句。李东和林中鹏进行了校对。本章篇幅较长,能够有现在的翻译质量离不开这4位的贡献。
·第6章(深度前馈网络):周卫林、林中鹏和张远航阅读了本章,并提出修改意见。
·第7章(深度学习中的正则化):周柏村进行了非常细心的校对,指出了大量问题,令翻译更加准确。
·第8章(深度模型中的优化):房晓宇和吴翔阅读了本章。黄平春进行了校对,他提出的很多建议让行文更加流畅易懂。
·第9章(卷积网络):赵雨和潘雨粟阅读了本章,并润色语句。丁志铭进行了非常仔细的校对,并指出很多翻译问题。
·第10章(序列建模:循环和递归网络):刘畅阅读了本章。赵雨提供了详细的校对建议,尹瑞清根据他的翻译版本,给我们的版本提出了很多建议。虽然仍存在一些分歧,但我们两个版本的整合,让翻译质量提升很多。
·第12章(应用):潘雨粟进行了校对。在他的校对之前,本章阅读起来比较困难。他提供的修改建议,不仅提高了行文流畅度,还提升了译文的准确度。
·第13章(线性因子模型):贺天行阅读了本章,修改语句。杨志伟校对了本章,润色大量语句。
·第14章(自编码器):李雨慧和黄平春进行了校对。李雨慧提升了语言的流畅度,黄平春纠正了不少错误,提高了准确性。
·第15章(表示学习):cnscottzheng阅读了本章,并修改语句。
·第17章(蒙特卡罗方法):张远航提供了非常细致的校对,后续又校对了一遍,使译文质量大大提升。
·第18章(直面配分函数):吴家楠进行了校对,提升了译文准确性和可读性。
·第19章(近似推断):黄浩军、张远航和张源源进行了校对。本章虽然篇幅不大,但内容有深度,译文在3位的帮助下提高了准确度。
所有校对的修改建议都保存在GitHub上,再次感谢以上同学和网友的付出。经过这5个多月的修改,初稿慢慢变成了最终提交给出版社的稿件。尽管还有很多问题,但大部分内容是可读的,并且是准确的。当然目前的译文仍存在一些没有及时发现的问题,因此修订工作也将持续更新,不断修改。我们非常希望读者能到GitHub提建议,并且非常欢迎,无论多么小的修改建议,都是非常宝贵的。
此外,我们还要感谢魏太云学长,他帮助我们与出版社沟通交流,并给予了我们很多排版上的指导。
最后,感谢我们的导师张志华教授,没有老师的支持,我们难以完成翻译。
如果没有他人的贡献,这本书将不可能完成。我们感谢为本书提出建议和帮助组织内容结构的人:Guillaume Alain、Kyunghyun Cho、、David Krueger、Hugo Larochelle、Razvan Pascanu和Thomas Rohée。
我们感谢为本书内容提供反馈的人。其中一些人对许多章都给出了建议:Martín Abadi、Guillaume Alain、Ion Androutsopoulos、Fred Bertsch、Olexa Bilaniuk、Ufuk Can Bi¸cici、Matko Bǒsnjak、John Boersma、Greg Brockman、Alexandre de Brébisson、Pierre Luc Carrier、Sarath Chandar、Pawel Chilinski、Mark Daoust、Oleg Dashevskii、Laurent Dinh、Stephan Dreseitl、Jim Fan、Miao Fan、Meire Fortunato、Frédéric Francis、Nando de Freitas、、Jurgen Van Gael、Javier Alonso García、Jonathan Hunt、Gopi Jeyaram、Chingiz Kabytayev、Lukasz Kaiser、Varun Kanade、Asifullah Khan、Akiel Khan、John King、Diederik P.Kingma、Yann Le-Cun、Rudolf Mathey、Matías Mattamala、Abhinav Maurya、Kevin Murphy、Oleg Mürk、Roman Novak、Augustus Q.Odena、Simon Pavlik、Karl Pichotta、Eddie Pierce、Kari Pulli、Roussel Rahman、Tapani Raiko、Anurag Ranjan、Johannes Roith、Mihaela Rosca、Halis Sak、César Salgado、Grigory Sapunov、Yoshinori Sasaki、Mike Schuster、Julian Serban、Nir Shabat、Ken Shirriff、Andre Simpelo、Scott Stanley、David Sussillo、Ilya Sutskever、Carles Gelada Sáez、Graham Taylor、Valentin Tolmer、Massimiliano Tomassoli、An Tran、Shubhendu Trivedi、Alexey Umnov、Vincent Vanhoucke、Marco Visentini-Scarzanella、Martin Vita、David Warde-Farley、Dustin Webb、Kelvin Xu、Wei Xue、Ke Yang、Li Yao、Zygmunt 和Ozan 。
我们也要感谢对单个章节提供有效反馈的人。
·数学符号:Zhang Yuanhang。
·第1章(引言):Yusuf Akgul、Sebastien Bratieres、Samira Ebrahimi、Charlie Gorichanaz、Brendan Loudermilk、Eric Morris、Cosmin Parvulescu和Alfredo Solano。
·第2章(线性代数):Amjad Almahairi、Nikola Bani、Kevin Bennett、Philippe Cas-tonguay、Oscar Chang、Eric Fosler-Lussier、Andrey Khalyavin、Sergey Oreshkov、István Petrás、Dennis Prangle、Thomas Rohée、Gitanjali Gulve Sehgal、Colby Toland、Alessan-dro Vitale和Bob Welland。
·第3章(概率与信息论):John Philip Anderson、Kai Arulkumaran、Vincent Dumoulin、Rui Fa、Stephan Gouws、Artem Oboturov、Antti Rasmus、Alexey Surkov和Volker Tresp。
·第4章(数值计算):Tran Lam An Ian Fischer和Hu Yuhuang。
·第5章(机器学习基础):Dzmitry Bahdanau、Justin Domingue、Nikhil Garg、Makoto Otsuka、Bob Pepin、Philip Popien、Emmanuel Rayner、Peter Shepard、Kee-Bong Song、Zheng Sun和Andy Wu。
·第6章(深度前馈网络):Uriel Berdugo、Fabrizio Bottarel、Elizabeth Burl、Ishan Du-rugkar、Jeff Hlywa、Jong Wook Kim、David Krueger和Aditya Kumar Praharaj。
·第7章(深度学习中的正则化):Morten Kolbæk、Kshitij Lauria、Inkyu Lee、Sunil Mohan、Hai Phong Phan和Joshua Salisbury。
·第8章(深度模型中的优化):Marcel Ackermann、Peter Armitage、Rowel Atienza、Andrew Brock、Tegan Maharaj、James Martens、Kashif Rasul、Klaus Strobl和Nicholas Turner。
·第9章(卷积网络):Martín Arjovsky、Eugene Brevdo、Konstantin Divilov、Eric Jensen、Mehdi Mirza、Alex Paino、Marjorie Sayer、Ryan Stout和Wentao Wu。
·第10章(序列建模:循环和递归网络):Gökçen Eraslan、Steven Hickson、Razvan Pas-canu、Lorenzovon Ritter、Rui Rodrigues、Dmitriy Serdyuk、Dongyu Shi和Kaiyu Yang。
·第11章(实践方法论):Daniel Beckstein。
·第12章(应用):George Dahl、Vladimir Nekrasov和Ribana Roscher。
·第13章(线性因子模型):Jayanth Koushik。
·第15章(表示学习):Kunal Ghosh。
·第16章(深度学习中的结构化概率模型):Minh Lê和Anton Varfolom。
·第18章(直面配分函数):Sam Bowman。
·第19章(近似推断):Yujia Bao。
·第20章(深度生成模型):Nicolas Chapados、Daniel Galvez、Wenming Ma、Fady Med-hat、Shakir Mohamed和Grégoire Montavon。
·参考文献:Lukas Michelbacher和Leslie N.Smith。
我们还要感谢那些允许我们引用他们的出版物中的图片、数据的人。我们在图片标题的文字中注明了他们的贡献。
我们还要感谢Lu Wang为我们写了pdf2html EX,我们用它来制作这本书的网页版本,Lu Wang还帮助我们改进了生成的HTML的质量。
我们还要感谢Ian的妻子Daniela Flori Goodfellow在Ian的写作过程中的耐心支持和检查。
我们还要感谢Google Brain团队提供了学术环境,从而使得Ian能够花费大量时间写作本书并接受同行的反馈和指导。我们特别感谢Ian的前任经理Greg Corrado和他的现任经理Samy Bengio对这项工作的支持。最后我们还要感谢Geoffrey Hinton在写作困难时的鼓励。
下面简要介绍本书所使用的数学符号。我们在第2~4章中描述大多数数学概念,如果你不熟悉任何相应的数学概念,可以参考对应的章节。
数和数组
a 标量(整数或实数)
a 向量
A 矩阵
A 张量
In n行n列的单位矩阵
I 维度蕴含于上下文的单位矩阵
e(i) 标准基向量[0,…,0,1,0,…,0],其中索引i处值为1
diag(a) 对角方阵,其中对角元素由a 给定
a 标量随机变量
a 向量随机变量
A 矩阵随机变量
集合和图
A 集合
R 实数集
{0,1} 包含0和1的集合
{0,1,…,n} 包含0和n之间所有整数的集合
[a,b] 包含a和b的实数区间
(a,b] 不包含a但包含b的实数区间
\ 差集,即其元素包含于 但不包含于
图
图 中xi的父节点
索引
ai 向量a 的第i个元素,其中索引从1开始
a−i 除了第i个元素,a 的所有元素
Ai,j 矩阵A的i,j 元素
Ai,: 矩阵A的第i行
A:,i 矩阵A的第i列
Ai,j,k 3维张量A的(i,j,k)元素
A:,:,i 3维张量的2维切片
ai 随机向量a的第i个元素
线性代数中的操作
矩阵A的转置
A的Moore-Penrose伪逆
A⊙B A和B 的逐元素乘积(Hadamard乘积)
det(A) A的行列式
微积分
y关于x的导数
y关于x的偏导
∇xy y 关于x 的梯度
∇Xy y 关于X 的矩阵导数
∇Xy y 关于X求导后的张量
f :n→m的Jacobian矩阵J ∈m×n
or H(f)(x) f 在点x 处的Hessian矩阵
x 整个域上的定积分
集合S上关于x 的定积分
概率和信息论
a⊥b a和b相互独立的随机变量
a⊥b|c 给定c后条件独立
P(a) 离散变量上的概率分布
p(a) 连续变量(或变量类型未指定时)上的概率分布
a~P 具有分布P 的随机变量a
Ex~P[f(x)]or Ef(x) f(x)关于P(x)的期望
Var(f(x)) f(x)在分布P(x)下的方差
Cov(f(x),g(x)) f(x)和g(x)在分布P(x)下的协方差
H(x) 随机变量x的香农熵
DKL(P||Q) P 和Q的KL散度
N(x;μ,Σ) 均值为μ,协方差为Σ,x 上的高斯分布
函数
f :→ 定义域为值域为的函数f
f g f 和 g 的组合
f(x;θ) 由θ 参数化,关于x 的函数(有时为简化表示,我们忽略θ 而记为f(x))
logx x的自然对数
σ(x) Logistic sigmoid,
ζ(x) Softplus,log(1+exp(x))
||x||p x 的Lp范数
||x|| x 的 L2范数
x+ x的正数部分,即max(0,x)
1condition 如果条件为真则为1,否则为0
有时候我们使用函数f,它的参数是一个标量,但应用到一个向量、矩阵或张量:f(x)、f(X)或f(X)。这表示逐元素地将f应用于数组。例如,C=σ(X),则对于所有合法的i、j和k,Ci,j,k=σ(Xi,j,k)。
数据集和分布
pdata 数据生成分布
由训练集定义的经验分布
X 训练样本的集合
x(i) 数据集的第i个样本(输入)
y(i)或 y(i) 监督学习中与 x(i)关联的目标
X m×n的矩阵,其中行Xi,:为输入样本x(i)
远在古希腊时期,发明家就梦想着创造能自主思考的机器。神话人物皮格马利翁(Pygmalion)、代达罗斯(Daedalus)和赫淮斯托斯(Hephaestus)可以被看作传说中的发明家,而加拉蒂亚(Galatea)、塔洛斯(Talos)和潘多拉(Pandora)则可以被视为人造生命(Ovid and Martin,2004;Sparkes,1996;Tandy,1997)。
当人类第一次构思可编程计算机时,就已经在思考计算机能否变得智能(尽管这距造出第一台计算机还有一百多年)(Lovelace,1842)。如今,人工智能(artificial intelligence,AI)已经成为一个具有众多实际应用和活跃研究课题的领域,并且正在蓬勃发展。我们期望通过智能软件自动地处理常规劳动、理解语音或图像、帮助医学诊断和支持基础科学研究。
在人工智能的早期,那些对人类智力来说非常困难、但对计算机来说相对简单的问题得到迅速解决,比如,那些可以通过一系列形式化的数学规则来描述的问题。人工智能的真正挑战在于解决那些对人来说很容易执行、但很难形式化描述的任务,如识别人们所说的话或图像中的脸。对于这些问题,我们人类往往可以凭借直觉轻易地解决。
针对这些比较直观的问题,本书讨论一种解决方案。该方案可以让计算机从经验中学习,并根据层次化的概念体系来理解世界,而每个概念则通过与某些相对简单的概念之间的关系来定义。让计算机从经验获取知识,可以避免由人类来给计算机形式化地指定它需要的所有知识。层次化的概念让计算机构建较简单的概念来学习复杂概念。如果绘制出表示这些概念如何建立在彼此之上的图,我们将得到一张“深”(层次很多)的图。基于这个原因,我们称这种方法为AI深度学习(deep learning)。
AI许多早期的成功发生在相对朴素且形式化的环境中,而且不要求计算机具备很多关于世界的知识。例如,IBM的深蓝(Deep Blue)国际象棋系统在1997年击败了世界冠军Garry Kasparov(Hsu,2002)。显然国际象棋是一个非常简单的领域,因为它仅含有64个位置并只能以严格限制的方式移动32个棋子。设计一种成功的国际象棋策略是巨大的成就,但向计算机描述棋子及其允许的走法并不是这一挑战的困难所在。国际象棋完全可以由一个非常简短的、完全形式化的规则列表来描述,并可以容易地由程序员事先准备好。
具有讽刺意义的是,抽象和形式化的任务对人类而言是最困难的脑力任务之一,但对计算机而言却属于最容易的。计算机早就能够打败人类最好的国际象棋选手,但直到最近计算机才在识别对象或语音任务中达到人类平均水平。一个人的日常生活需要关于世界的巨量知识。很多这方面的知识是主观的、直观的,因此很难通过形式化的方式表达清楚。计算机需要获取同样的知识才能表现出智能。人工智能的一个关键挑战就是如何将这些非形式化的知识传达给计算机。
一些人工智能项目力求将关于世界的知识用形式化的语言进行硬编码(hard-code)。计算机可以使用逻辑推理规则来自动地理解这些形式化语言中的声明。这就是众所周知的人工智能的知识库(knowledge base)方法。然而,这些项目最终都没有取得重大的成功。其中最著名的项目是Cyc(Lenat and Guha,1989)。Cyc包括一个推断引擎和一个使用CycL语言描述的声明数据库。这些声明是由人类监督者输入的。这是一个笨拙的过程。人们设法设计出足够复杂的形式化规则来精确地描述世界。例如,Cyc不能理解一个关于名为Fred的人在早上剃须的故事(Linde,1992)。它的推理引擎检测到故事中的不一致性:它知道人体的构成不包含电气零件,但由于Fred正拿着一个电动剃须刀,它认为实体——“正在剃须的Fred”(“Fred While Shaving”)含有电气部件。因此,它产生了这样的疑问——Fred在刮胡子的时候是否仍然是一个人。
依靠硬编码的知识体系面临的困难表明,AI 系统需要具备自己获取知识的能力,即从原始数据中提取模式的能力。这种能力称为机器学习(machine learning)。引入机器学习使计算机能够解决涉及现实世界知识的问题,并能做出看似主观的决策。比如,一个称为逻辑回归(logistic regression)的简单机器学习算法可以决定是否建议剖腹产(Mor-Yosef et al.,1990)。而同样是简单机器学习算法的朴素贝叶斯(naive Bayes)则可以区分垃圾电子邮件和合法电子邮件。
这些简单的机器学习算法的性能在很大程度上依赖于给定数据的表示(representation)。例如,当逻辑回归用于判断产妇是否适合剖腹产时,AI系统不会直接检查患者。相反,医生需要告诉系统几条相关的信息,诸如是否存在子宫疤痕。表示患者的每条信息称为一个特征。逻辑回归学习病人的这些特征如何与各种结果相关联。然而,它丝毫不能影响该特征定义的方式。如果将病人的MRI(核磁共振)扫描而不是医生正式的报告作为逻辑回归的输入,它将无法做出有用的预测。MRI扫描的单一像素与分娩过程中并发症之间的相关性微乎其微。
在整个计算机科学乃至日常生活中,对表示的依赖都是一个普遍现象。在计算机科学中,如果数据集合被精巧地结构化并被智能地索引,那么诸如搜索之类的操作的处理速度就可以成指数级地加快。人们可以很容易地在阿拉伯数字的表示下进行算术运算,但在罗马数字的表示下,运算会比较耗时。因此,毫不奇怪,表示的选择会对机器学习算法的性能产生巨大的影响。图1.1展示了一个简单的可视化例子。
许多人工智能任务都可以通过以下方式解决:先提取一个合适的特征集,然后将这些特征提供给简单的机器学习算法。例如,对于通过声音鉴别说话者的任务来说,一个有用的特征是对其声道大小的估计。这个特征为判断说话者是男性、女性还是儿童提供了有力线索。
然而,对于许多任务来说,我们很难知道应该提取哪些特征。例如,假设我们想编写一个程序来检测照片中的车。我们知道,汽车有轮子,所以我们可能会想用车轮的存在与否作为特征。遗憾的是,我们难以准确地根据像素值来描述车轮看上去像什么。虽然车轮具有简单的几何形状,但它的图像可能会因场景而异,如落在车轮上的阴影、太阳照亮的车轮的金属零件、汽车的挡泥板或者遮挡的车轮一部分的前景物体等。
解决这个问题的途径之一是使用机器学习来发掘表示本身,而不仅仅把表示映射到输出。这种方法我们称之为表示学习(representation learning)。学习到的表示往往比手动设计的表示表现得更好。并且它们只需最少的人工干预,就能让AI系统迅速适应新的任务。表示学习算法只需几分钟就可以为简单的任务发现一个很好的特征集,对于复杂任务则需要几小时到几个月。手动为一个复杂的任务设计特征需要耗费大量的人工、时间和精力,甚至需要花费整个社群研究人员几十年的时间。
表示学习算法的典型例子是自编码器(autoencoder)。自编码器由一个编码器(encoder)函数和一个解码器(decoder)函数组合而成。编码器函数将输入数据转换为一种不同的表示,而解码器函数则将这个新的表示转换回原来的形式。我们期望当输入数据经过编码器和解码器之后尽可能多地保留信息,同时希望新的表示有各种好的特性,这也是自编码器的训练目标。为了实现不同的特性,我们可以设计不同形式的自编码器。
当设计特征或设计用于学习特征的算法时,我们的目标通常是分离出能解释观察数据的变差因素(factors of variation)。在此背景下,“因素”这个词仅指代影响的不同来源;因素通常不是乘性组合。这些因素通常是不能被直接观察到的量。相反,它们可能是现实世界中观察不到的物体或者不可观测的力,但会影响可观测的量。为了对观察到的数据提供有用的简化解释或推断其原因,它们还可能以概念的形式存在于人类的思维中。它们可以被看作数据的概念或者抽象,帮助我们了解这些数据的丰富多样性。当分析语音记录时,变差因素包括说话者的年龄、性别、他们的口音和他们正在说的词语。当分析汽车的图像时,变差因素包括汽车的位置、它的颜色、太阳的角度和亮度。
在许多现实的人工智能应用中,困难主要源于多个变差因素同时影响着我们能够观察到的每一个数据。比如,在一张包含红色汽车的图片中,其单个像素在夜间可能会非常接近黑色。汽车轮廓的形状取决于视角。大多数应用需要我们理清变差因素并忽略我们不关心的因素。
显然,从原始数据中提取如此高层次、抽象的特征是非常困难的。许多诸如说话口音这样的变差因素,只能通过对数据进行复杂的、接近人类水平的理解来辨识。这几乎与获得原问题的表示一样困难,因此,乍一看,表示学习似乎并不能帮助我们。
深度学习(deep learning)通过其他较简单的表示来表达复杂表示,解决了表示学习中的核心问题。
深度学习让计算机通过较简单的概念构建复杂的概念。图1.2展示了深度学习系统如何通过组合较简单的概念(例如角和轮廓,它们反过来由边线定义)来表示图像中人的概念。深度学习模型的典型例子是前馈深度网络或多层感知机(multilayer perceptron,MLP)。多层感知机仅仅是一个将一组输入值映射到输出值的数学函数。该函数由许多较简单的函数复合而成。我们可以认为不同数学函数的每一次应用都为输入提供了新的表示。
学习数据的正确表示的想法是解释深度学习的一个视角。另一个视角是深度促使计算机学习一个多步骤的计算机程序。每一层表示都可以被认为是并行执行另一组指令之后计算机的存储器状态。更深的网络可以按顺序执行更多的指令。顺序指令提供了极大的能力,因为后面的指令可以参考早期指令的结果。从这个角度上看,在某层激活函数里,并非所有信息都蕴涵着解释输入的变差因素。表示还存储着状态信息,用于帮助程序理解输入。这里的状态信息类似于传统计算机程序中的计数器或指针。它与具体的输入内容无关,但有助于模型组织其处理过程。
目前主要有两种度量模型深度的方式。一种方式是基于评估架构所需执行的顺序指令的数目。假设我们将模型表示为给定输入后,计算对应输出的流程图,则可以将这张流程图中的最长路径视为模型的深度。正如两个使用不同语言编写的等价程序将具有不同的长度,相同的函数可以被绘制为具有不同深度的流程图,其深度取决于我们可以用来作为一个步骤的函数。图1.3说明了语言的选择如何给相同的架构两个不同的衡量。
另一种是在深度概率模型中使用的方法,它不是将计算图的深度视为模型深度,而是将描述概念彼此如何关联的图的深度视为模型深度。在这种情况下,计算每个概念表示的计算流程图的深度可能比概念本身的图更深。这是因为系统对较简单概念的理解在给出更复杂概念的信息后可以进一步精细化。例如,一个AI系统观察其中一只眼睛在阴影中的脸部图像时,它最初可能只看到一只眼睛。但当检测到脸部的存在后,系统可以推断第二只眼睛也可能是存在的。在这种情况下,概念的图仅包括两层(关于眼睛的层和关于脸的层),但如果我们细化每个概念的估计将需要额外的n次计算,那么计算的图将包含2n层。
由于并不总是清楚计算图的深度和概率模型图的深度哪一个是最有意义的,并且由于不同的人选择不同的最小元素集来构建相应的图,所以就像计算机程序的长度不存在单一的正确值一样,架构的深度也不存在单一的正确值。另外,也不存在模型多么深才能被修饰为“深”的共识。但相比传统机器学习,深度学习研究的模型涉及更多学到功能或学到概念的组合,这点毋庸置疑。
总之,这本书的主题——深度学习是通向人工智能的途径之一。具体来说,它是机器学习的一种,一种能够使计算机系统从经验和数据中得到提高的技术。我们坚信机器学习可以构建出在复杂实际环境下运行的AI系统,并且是唯一切实可行的方法。深度学习是一种特定类型的机器学习,具有强大的能力和灵活性,它将大千世界表示为嵌套的层次概念体系(由较简单概念间的联系定义复杂概念、从一般抽象概括到高级抽象表示)。图1.4说明了这些不同的AI学科之间的关系。图1.5展示了每个学科如何工作的高层次原理。
本书对各类读者都有一定的用处,但主要是为两类受众而写的。其中,一类受众是学习机器学习的大学生(本科或研究生),包括那些已经开始职业生涯的深度学习和人工智能研究者。另一类受众是没有机器学习或统计背景,但希望能快速地掌握这方面知识,并在他们的产品或平台中使用深度学习的软件工程师。现已证明,深度学习在许多软件领域都是有用的,包括计算机视觉、语音和音频处理、自然语言处理、机器人技术、生物信息学和化学、电子游戏、搜索引擎、网络广告和金融。
为了更好地服务各类读者,我们将本书组织为3个部分。第1部分介绍基本的数学工具和机器学习的概念。第2部分介绍最成熟的深度学习算法,这些技术基本上已经得到解决。第3部分讨论某些具有展望性的想法,它们被广泛地认为是深度学习未来的研究重点。
读者可以随意跳过不感兴趣或与自己背景不相关的部分。熟悉线性代数、概率和基本机器学习概念的读者可以跳过第1部分。若读者只是想实现一个能工作的系统,则不需要阅读超出第2部分的内容。为了帮助读者选择章节,图1.6给出了本书高层组织结构的流程图。
我们假设所有读者都具备计算机科学背景。也假设读者熟悉编程,并且对计算的性能问题、复杂性理论、入门级微积分和一些图论术语有基本的了解。
《深度学习》英文版配套网站是www.deeplearningbook.org。网站上提供了各种补充材料,包括练习、讲义幻灯片、错误更正以及其他应该对读者和讲师有用的资源。
《深度学习》中文版的读者,可访问人民邮电出版社异步社区网站www.epubit.com.cn,获取更多图书信息。
通过历史背景了解深度学习是最简单的方式。这里我们仅指出深度学习的几个关键趋势,而不是提供其详细的历史:
·深度学习有着悠久而丰富的历史,但随着许多不同哲学观点的渐渐消逝,与之对应的名称也渐渐尘封。
·随着可用的训练数据量不断增加,深度学习变得更加有用。
·随着时间的推移,针对深度学习的计算机软硬件基础设施都有所改善,深度学习模型的规模也随之增长。
·随着时间的推移,深度学习已经解决日益复杂的应用,并且精度不断提高。
我们期待这本书的许多读者都听说过深度学习这一激动人心的新技术,并对一本书提及一个新兴领域的“历史”而感到惊讶。事实上,深度学习的历史可以追溯到20世纪40年代。深度学习看似是一个全新的领域,只不过因为在目前流行的前几年它还是相对冷门的,同时也因为它被赋予了许多不同的名称(其中大部分已经不再使用),最近才成为众所周知的“深度学习”。这个领域已经更换了很多名称,它反映了不同的研究人员和不同观点的影响。
全面地讲述深度学习的历史超出了本书的范围。然而,一些基本的背景对理解深度学习是有用的。一般认为,迄今为止深度学习已经经历了3次发展浪潮:20世纪40年代到60年代,深度学习的雏形出现在控制论(cybernetics)中;20世纪 80年代到 90年代,深度学习表现为联结主义(connectionism);直到 2006 年,才真正以深度学习之名复兴。图1.7 给出了定量的展示。
我们今天知道的一些最早的学习算法,旨在模拟生物学习的计算模型,即大脑怎样学习或为什么能学习的模型。其结果是深度学习以人工神经网络(artificial neural network,ANN)之名而淡去。彼时,深度学习模型被认为是受生物大脑(无论人类大脑或其他动物的大脑)所启发而设计出来的系统。尽管有些机器学习的神经网络有时被用来理解大脑功能(Hinton and Shallice,1991),但它们一般都没有设计成生物功能的真实模型。深度学习的神经观点受两个主要思想启发:一个想法是,大脑作为例子证明智能行为是可能的,因此,概念上,建立智能的直接途径是逆向大脑背后的计算原理,并复制其功能;另一种看法是,理解大脑和人类智能背后的原理也非常有趣,因此机器学习模型除了解决工程应用的能力,如果能让人类对这些基本的科学问题有进一步的认识,也将会很有用。
现代术语“深度学习”超越了目前机器学习模型的神经科学观点。它诉诸于学习多层次组合这一更普遍的原理,这一原理也可以应用于那些并非受神经科学启发的机器学习框架。
现代深度学习最早的前身是从神经科学的角度出发的简单线性模型。这些模型设计为使用一组n个输入x1,…,xn,并将它们与一个输出y相关联。这些模型希望学习一组权重w1,…,wn,并计算它们的输出f(x,w)=x1w1+…+xnwn。如图1.7所示,第一次神经网络研究浪潮称为控制论。
McCulloch-Pitts 神经元(McCulloch and Pitts,1943)是脑功能的早期模型。该线性模型通过检验函数 f(x,w)的正负来识别两种不同类别的输入。显然,模型的权重需要正确设置后才能使模型的输出对应于期望的类别。这些权重可以由操作人员设定。20 世纪 50 年代,感知机(Rosenblatt,1956,1958)成为第一个能根据每个类别的输入样本来学习权重的模型。大约在同一时期,自适应线性单元(adaptive linear element,ADALINE)简单地返回函数f(x)本身的值来预测一个实数(Widrow and Hoff,1960),并且它还可以学习从数据预测这些数。
这些简单的学习算法大大影响了机器学习的现代景象。用于调节ADALINE权重的训练算法是被称为随机梯度下降(stochastic gradient descent)的一种特例。稍加改进后的随机梯度下降算法仍然是当今深度学习的主要训练算法。
基于感知机和 ADALINE中使用的函数 f(x,w)的模型称为线性模型(linear model)。尽管在许多情况下,这些模型以不同于原始模型的方式进行训练,但仍是目前最广泛使用的机器学习模型。
线性模型有很多局限性。最著名的是,它们无法学习异或(XOR)函数,即f([0,1],w)=1和f([1,0],w)=1,但f([1,1],w)=0和f([0,0],w)=0。观察到线性模型这个缺陷的批评者对受生物学启发的学习普遍地产生了抵触(Minsky and Papert,1969)。这导致了神经网络热潮的第一次大衰退。
现在,神经科学被视为深度学习研究的一个重要灵感来源,但它已不再是该领域的主要指导。
如今神经科学在深度学习研究中的作用被削弱,主要原因是我们根本没有足够的关于大脑的信息来作为指导去使用它。要获得对被大脑实际使用算法的深刻理解,我们需要有能力同时监测(至少是)数千相连神经元的活动。我们不能够做到这一点,所以我们甚至连大脑最简单、最深入研究的部分都还远远没有理解(Olshausen and Field,2005)。
神经科学已经给了我们依靠单一深度学习算法解决许多不同任务的理由。神经学家们发现,如果将雪貂的大脑重新连接,使视觉信号传送到听觉区域,它们可以学会用大脑的听觉处理区域去“看”(Von Melchner et al.,2000)。这暗示着大多数哺乳动物的大脑使用单一的算法就可以解决其大脑可以解决的大部分不同任务。在这个假设之前,机器学习研究是比较分散的,研究人员在不同的社群研究自然语言处理、计算机视觉、运动规划和语音识别。如今,这些应用社群仍然是独立的,但是对于深度学习研究团体来说,同时研究许多甚至所有这些应用领域是很常见的。
我们能够从神经科学得到一些粗略的指南。仅通过计算单元之间的相互作用而变得智能的基本思想是受大脑启发的。新认知机(Fukushima,1980)受哺乳动物视觉系统的结构启发,引入了一个处理图片的强大模型架构,它后来成为了现代卷积网络的基础(LeCun et al.,1998c)(参见第 9.10 节)。目前大多数神经网络是基于一个称为整流线性单元(rectified linear unit)的神经单元模型。原始认知机(Fukushima,1975)受我们关于大脑功能知识的启发,引入了一个更复杂的版本。简化的现代版通过吸收来自不同观点的思想而形成,Nair and Hinton(2010b)和 Glorot et al.(2011a)援引神经科学作为影响,Jarrett et al.(2009a)援引更多面向工程的影响。虽然神经科学是灵感的重要来源,但它不需要被视为刚性指导。我们知道,真实的神经元计算着与现代整流线性单元非常不同的函数,但更接近真实神经网络的系统并没有导致机器学习性能的提升。此外,虽然神经科学已经成功地启发了一些神经网络架构,但我们对用于神经科学的生物学习还没有足够多的了解,因此也就不能为训练这些架构用的学习算法提供太多的借鉴。
媒体报道经常强调深度学习与大脑的相似性。的确,深度学习研究者比其他机器学习领域(如核方法或贝叶斯统计)的研究者更可能地引用大脑作为影响,但是大家不应该认为深度学习在尝试模拟大脑。现代深度学习从许多领域获取灵感,特别是应用数学的基本内容,如线性代数、概率论、信息论和数值优化。尽管一些深度学习的研究人员引用神经科学作为灵感的重要来源,然而其他学者完全不关心神经科学。
值得注意的是,了解大脑是如何在算法层面上工作的尝试确实存在且发展良好。这项尝试主要被称为“计算神经科学”,并且是独立于深度学习的领域。研究人员在两个领域之间来回研究是很常见的。深度学习领域主要关注如何构建计算机系统,从而成功解决需要智能才能解决的任务,而计算神经科学领域主要关注构建大脑如何真实工作的、比较精确的模型。
20 世纪 80 年代,神经网络研究的第二次浪潮在很大程度上是伴随一个被称为联结主义(connectionism)或并行分布处理(parallel distributed processing)潮流而出现的(Rumelhart et al.,1986d;McClelland et al.,1995)。联结主义是在认知科学的背景下出现的。认知科学是理解思维的跨学科途径,即它融合多个不同的分析层次。20世纪80年代初期,大多数认知科学家研究符号推理模型。尽管这很流行,但符号模型很难解释大脑如何真正使用神经元实现推理功能。联结主义者开始研究真正基于神经系统实现的认知模型(Touretzky and Minton,1985),其中很多复苏的想法可以追溯到心理学家Donald Hebb在20世纪40年代的工作(Hebb,1949)。
联结主义的中心思想是,当网络将大量简单的计算单元连接在一起时可以实现智能行为。这种见解同样适用于生物神经系统中的神经元,因为它和计算模型中隐藏单元起着类似的作用。
在20世纪80年代的联结主义期间形成的几个关键概念在今天的深度学习中仍然是非常重要的。
其中一个概念是分布式表示(distributed representation)(Hinton et al.,1986)。其思想是:系统的每一个输入都应该由多个特征表示,并且每一个特征都应该参与到多个可能输入的表示。例如,假设我们有一个能够识别红色、绿色或蓝色的汽车、卡车和鸟类的视觉系统,表示这些输入的其中一个方法是将 9个可能的组合:红卡车、红汽车、红鸟、绿卡车等使用单独的神经元或隐藏单元激活。这需要9个不同的神经元,并且每个神经必须独立地学习颜色和对象身份的概念。改善这种情况的方法之一是使用分布式表示,即用3个神经元描述颜色,3个神经元描述对象身份。这仅仅需要6个神经元而不是9个,并且描述红色的神经元能够从汽车、卡车和鸟类的图像中学习红色,而不仅仅是从一个特定类别的图像中学习。分布式表示的概念是本书的核心,我们将在第15章中更加详细地描述。
联结主义潮流的另一个重要成就是反向传播在训练具有内部表示的深度神经网络中的成功使用以及反向传播算法的普及(Rumelhart et al.,1986c;Le Cun,1987)。这个算法虽然曾黯然失色且不再流行,但截至写书之时,它仍是训练深度模型的主导方法。
20 世纪 90 年代,研究人员在使用神经网络进行序列建模的方面取得了重要进展。Hochreiter(1991b)和 Bengio et al.(1994b)指出了对长序列进行建模的一些根本性数学难题,这将在第 10.7 节中描述。Hochreiter 和 Schmidhuber(1997)引入长短期记忆(long shortterm memory,LSTM)网络来解决这些难题。如今,LSTM在许多序列建模任务中广泛应用,包括Google的许多自然语言处理任务。
神经网络研究的第二次浪潮一直持续到20世纪90年代中期。基于神经网络和其他AI技术的创业公司开始寻求投资,其做法野心勃勃但不切实际。当AI研究不能实现这些不合理的期望时,投资者感到失望。同时,机器学习的其他领域取得了进步。比如,核方法(Boseret al.,1992;Cortes and Vapnik,1995;Schölkopf et al.,1999)和图模型(Jordan,1998)都在很多重要任务上实现了很好的效果。这两个因素导致了神经网络热潮的第二次衰退,并一直持续到2007年。
在此期间,神经网络继续在某些任务上获得令人印象深刻的表现(Le Cun et al.,1998c;Bengio et al.,2001a)。加拿大高级研究所(CIFAR)通过其神经计算和自适应感知(NCAP)研究计划帮助维持神经网络研究。该计划联合了分别由Geoffrey Hinton、Yoshua Bengio和Yann Le Cun领导的多伦多大学、蒙特利尔大学和纽约大学的机器学习研究小组。这个多学科的CIFARNCAP研究计划还包括了神经科学家、人类和计算机视觉专家。
在那个时候,人们普遍认为深度网络是难以训练的。现在我们知道,20世纪80年代就存在的算法能工作得非常好,但是直到2006年前后都没有体现出来。这可能仅仅由于其计算代价太高,而以当时可用的硬件难以进行足够的实验。
神经网络研究的第三次浪潮始于2006年的突破。Geoffrey Hinton表明名为“深度信念网络”的神经网络可以使用一种称为“贪婪逐层预训练”的策略来有效地训练(Hinton et al.,2006a),我们将在第15.1节中更详细地描述。其他CIFAR附属研究小组很快表明,同样的策略可以被用来训练许多其他类型的深度网络(Bengio and Le Cun,2007a;Ranzato et al.,2007b),并能系统地帮助提高在测试样例上的泛化能力。神经网络研究的这一次浪潮普及了“深度学习”这一术语,强调研究者现在有能力训练以前不可能训练的比较深的神经网络,并着力于深度的理论重要性上(Bengioand Le Cun,2007b;Delalleau and Bengio,2011;Pascanu et al.,2014a;Montufar et al.,2014)。此时,深度神经网络已经优于与之竞争的基于其他机器学习技术以及手工设计功能的AI系统。在写这本书的时候,神经网络的第三次发展浪潮仍在继续,尽管深度学习的研究重点在这一段时间内发生了巨大变化。第三次浪潮已开始着眼于新的无监督学习技术和深度模型在小数据集的泛化能力,但目前更多的兴趣点仍是比较传统的监督学习算法和深度模型充分利用大型标注数据集的能力。
人们可能想问,既然人工神经网络的第一个实验在20世纪50年代就完成了,但为什么深度学习直到最近才被认为是关键技术?自20世纪90年代以来,深度学习就已经成功用于商业应用,但通常被视为一种只有专家才可以使用的艺术而不是一种技术,这种观点一直持续到最近。确实,要从一个深度学习算法获得良好的性能需要一些技巧。幸运的是,随着训练数据的增加,所需的技巧正在减少。目前在复杂的任务中达到人类水平的学习算法,与20世纪80年代努力解决玩具问题(toy problem)的学习算法几乎是一样的,尽管我们使用这些算法训练的模型经历了变革,即简化了极深架构的训练。最重要的新进展是,现在我们有了这些算法得以成功训练所需的资源。图1.8展示了基准数据集的大小如何随着时间的推移而显著增加。这种趋势是由社会日益数字化驱动的。由于我们的活动越来越多地发生在计算机上,我们做什么也越来越多地被记录。由于计算机越来越多地联网在一起,这些记录变得更容易集中管理,并更容易将它们整理成适于机器学习应用的数据集。因为统计估计的主要负担(观察少量数据以在新数据上泛化)已经减轻,“大数据”时代使机器学习更加容易。截至2016年,一个粗略的经验法则是,监督深度学习算法在每类给定约5000个标注样本情况下一般将达到可以接受的性能,当至少有1000万个标注样本的数据集用于训练时,它将达到或超过人类表现。此外,在更小的数据集上获得成功是一个重要的研究领域,为此我们应特别侧重于如何通过无监督或半监督学习充分利用大量的未标注样本。
20世纪80年代,神经网络只能取得相对较小的成功,而现在神经网络非常成功的另一个重要原因是我们现在拥有的计算资源可以运行更大的模型。联结主义的主要见解之一是,当动物的许多神经元一起工作时会变得聪明。单独神经元或小集合的神经元不是特别有用。
生物神经元不是特别稠密地连接在一起。如图1.10所示,几十年来,我们的机器学习模型中每个神经元的连接数量已经与哺乳动物的大脑在同一数量级上。
1.自适应线性单元(Widrow and Hoff,1960);2.神经认知机(Fukushima,1980);3.GPU-加速卷积网络(Chellapilla et al.,2006);4.深度玻尔兹曼机(Salakhutdinov and Hinton,2009a);5.无监督卷积网络(Jarrett et al.,2009b);6.GPU- 加速多层感知机(Ciresan et al.,2010);7.分布式自编码器(Le et al.,2012);8.Multi-GPU 卷积网络(Krizhevsky et al.,2012a);9.COTSHPC无监督卷积网络(Coates et al.,2013);10.Goog Le Net(Szegedy et al.,2014a)
如图1.11所示,就神经元的总数目而言,直到最近神经网络都是惊人的小。自从隐藏单元引入以来,人工神经网络的规模大约每2.4年扩大一倍。这种增长是由更大内存、更快的计算机和更大的可用数据集驱动的。更大的网络能够在更复杂的任务中实现更高的精度。这种趋势看起来将持续数十年。除非有能力迅速扩展新技术,否则至少要到21世纪50年代,人工神经网络才能具备与人脑相同数量级的神经元。生物神经元表示的功能可能比目前的人工神经元所表示的更复杂,因此生物神经网络可能比图中描绘的甚至要更大。
1.感知机(Rosenblatt,1958,1962);2.自适应线性单元(Widrow and Hoff,1960);3.神经认知机(Fukushima,1980);4.早期后向传播网络(Rumelhart et al.,1986b);5.用于语音识别的循环神经网络(Robinson and Fallside,1991);6.用于语音识别的多层感知机(Bengio et al.,1991);7.均匀场sigmoid信念网络(Saul et al.,1996);8.Le Net-5(Le Cun et al.,1998c);9.回声状态网络(Jaeger and Haas,2004);10.深度信念网络(Hinton et al.,2006a);11.GPU-加速卷积网络(Chellapilla et al.,2006);12.深度玻尔兹曼机(Salakhutdinov and Hinton,2009a);13.GPU-加速深度信念网络(Raina et al.,2009a);14.无监督卷积网络(Jarrett et al.,2009b);15.GPU-加速多层感知机(Ciresan et al.,2010);16.OMP-1网络(Coates and Ng,2011);17.分布式自编码器(Le et al.,2012);18.Multi-GPU卷积网络(Krizhevsky et al.,2012a);19.COTSHPC无监督卷积网络(Coates et al.,2013);20.Goog Le Net(Szegedy et al.,2014a)
现在看来,神经元数量比一个水蛭还少的神经网络不能解决复杂的人工智能问题,这是不足为奇的。即使现在的网络,从计算系统角度来看它可能相当大,但实际上它比相对原始的脊椎动物(如青蛙)的神经系统还要小。
由于更快的CPU、通用GPU的出现(在第12.1.2节中讨论)、更快的网络连接和更好的分布式计算的软件基础设施,模型规模随着时间的推移不断增加是深度学习历史中最重要的趋势之一。人们普遍预计这种趋势将很好地持续到未来。
20世纪80年代以来,深度学习提供精确识别和预测的能力一直在提高。而且,深度学习持续成功地应用于越来越广泛的实际问题中。
最早的深度模型被用来识别裁剪紧凑且非常小的图像中的单个对象(Rumelhart et al.,1986d)。此后,神经网络可以处理的图像尺寸逐渐增加。现代对象识别网络能处理丰富的高分辨率照片,并且不需要在被识别的对象附近进行裁剪(Krizhevsky et al.,2012b)。类似地,最早的网络只能识别两种对象(或在某些情况下,单类对象的存在与否),而这些现代网络通常能够识别至少1000个不同类别的对象。对象识别中最大的比赛是每年举行的Image Net大型视觉识别挑战(ILSVRC)。深度学习迅速崛起的激动人心的一幕是卷积网络第一次大幅赢得这一挑战,它将最高水准的前5错误率从26.1%降到15.3%(Krizhevsky et al.,2012b),这意味着该卷积网络针对每个图像的可能类别生成一个顺序列表,除了15.3%的测试样本,其他测试样本的正确类标都出现在此列表中的前5项里。此后,深度卷积网络连续地赢得这些比赛,截至写作本书时,深度学习的最新结果将这个比赛中的前5错误率降到了3.6%,如图1.12所示。
深度学习也对语音识别产生了巨大影响。语音识别在20世纪90年代得到提高后,直到约2000年都停滞不前。深度学习的引入(Dahl et al.,2010;Deng et al.,2010b;Seide et al.,2011;Hinton et al.,2012a)使得语音识别错误率陡然下降,有些错误率甚至降低了一半。我们将在第12.3节更详细地探讨这个历史。
深度网络在行人检测和图像分割中也取得了引人注目的成功(Sermanet et al.,2013;Farabet et al.,2013;Couprie et al.,2013),并且在交通标志分类上取得了超越人类的表现(Ciresan et al.,2012)。
在深度网络的规模和精度有所提高的同时,它们可以解决的任务也日益复杂。Goodfellow et al.(2014d)表明,神经网络可以学习输出描述图像的整个字符序列,而不是仅仅识别单个对象。此前,人们普遍认为,这种学习需要对序列中的单个元素进行标注(Gulcehre and Bengio,2013)。循环神经网络,如之前提到的LSTM序列模型,现在用于对序列和其他序列之间的关系进行建模,而不是仅仅固定输入之间的关系。这种序列到序列的学习似乎引领着另一个应用的颠覆性发展,即机器翻译(Sutskever et al.,2014;Bahdanau et al.,2015)。
这种复杂性日益增加的趋势已将其推向逻辑结论,即神经图灵机(Graves et al.,2014)的引入,它能学习读取存储单元和向存储单元写入任意内容。这样的神经网络可以从期望行为的样本中学习简单的程序。例如,从杂乱和排好序的样本中学习对一系列数进行排序。这种自我编程技术正处于起步阶段,但原则上未来可以适用于几乎所有的任务。
深度学习的另一个最大的成就是其在强化学习(reinforcement learning)领域的扩展。在强化学习中,一个自主的智能体必须在没有人类操作者指导的情况下,通过试错来学习执行任务。DeepMind表明,基于深度学习的强化学习系统能够学会玩Atari视频游戏,并在多种任务中可与人类匹敌(Mnih et al.,2015)。深度学习也显著改善了机器人强化学习的性能(Finn et al.,2015)。
许多深度学习应用都是高利润的。现在深度学习被许多顶级的技术公司使用,包括Google、Microsoft、Facebook、IBM、Baidu、Apple、Adobe、Netflix、NVIDIA和NEC等。
深度学习的进步也严重依赖于软件基础架构的进展。软件库如Theano(Bergstra et al.,2010a;Bastien et al.,2012a)、PyLearn2(Goodfellow et al.,2013e)、Torch(Collobert et al.,2011b)、Dist Belief(Dean et al.,2012)、Caffe(Jia,2013)、MXNet(Chen et al.,2015)和Tensor-Flow(Abadi et al.,2015)都能支持重要的研究项目或商业产品。
深度学习也为其他科学做出了贡献。用于对象识别的现代卷积网络为神经科学家们提供了可以研究的视觉处理模型(DiCarlo,2013)。深度学习也为处理海量数据以及在科学领域做出有效的预测提供了非常有用的工具。它已成功地用于预测分子如何相互作用、从而帮助制药公司设计新的药物(Dahl et al.,2014),搜索亚原子粒子(Baldi et al.,2014),以及自动解析用于构建人脑三维图的显微镜图像(Knowles-Barley et al.,2014)等多个场合。我们期待深度学习未来能够出现在越来越多的科学领域中。
总之,深度学习是机器学习的一种方法。在过去几十年的发展中,它大量借鉴了我们关于人脑、统计学和应用数学的知识。近年来,得益于更强大的计算机、更大的数据集和能够训练更深网络的技术,深度学习的普及性和实用性都有了极大的发展。未来几年,深度学习更是充满了进一步提高并应用到新领域的挑战和机遇。
微信扫码关注【异步社区】微信公众号,回复“e46147”获取本书配套资源以及异步社区15天VIP会员卡,近千本电子书免费畅读。
本书这一部分将介绍理解深度学习所需的基本数学概念。我们从应用数学的一般概念开始,这能使我们定义拥有许多变量的函数,找到这些函数的最高点和最低点,并量化信念度。
接着,我们描述机器学习的基本目标,并描述如何实现这些目标。我们需要指定代表某些信念的模型、设计衡量这些信念与现实对应程度的代价函数以及使用训练算法最小化这个代价函数。
这个基本框架是广泛多样的机器学习算法的基础,其中也包括非深度的机器学习方法。在本书的后续章节,我们将在这个框架下开发深度学习算法。
线性代数作为数学的一个分支,广泛应用于科学和工程中。然而,因为线性代数主要是面向连续数学,而非离散数学,所以很多计算机科学家很少接触它。掌握好线性代数对于理解和从事机器学习算法相关工作是很有必要的,尤其对于深度学习算法而言。因此,在开始介绍深度学习之前,我们集中探讨一些必备的线性代数知识。
如果你已经很熟悉线性代数,那么可以轻松地跳过本章。如果你已经了解这些概念,但是需要一份索引表来回顾一些重要公式,那么我们推荐The Matrix Cookbook(Petersen and Pedersen,2006)。如果你没有接触过线性代数,那么本章将告诉你本书所需的线性代数知识,不过我们仍然强烈建议你参考其他专门讲解线性代数的文献,例如Shilov(1977)。最后,本章略去了很多重要但是对于理解深度学习非必需的线性代数知识。
学习线性代数,会涉及以下几个数学概念:
·标量(scalar):一个标量就是一个单独的数,它不同于线性代数中研究的其他大部分对象(通常是多个数的数组)。我们用斜体表示标量。标量通常被赋予小写的变量名称。在介绍标量时,我们会明确它们是哪种类型的数。比如,在定义实数标量时,我们可能会说“令s ∈表示一条线的斜率”;在定义自然数标量时,我们可能会说“令n ∈表示元素的数目”。
·向量(vector):一个向量是一列数。这些数是有序排列的。通过次序中的索引,我们可以确定每个单独的数。通常我们赋予向量粗体的小写变量名称,比如 x。向量中的元素可以通过带脚标的斜体表示。向量 x 的第一个元素是 x1,第二个元素是 x2,等等。我们也会注明存储在向量中的元素是什么类型的。如果每个元素都属于,并且该向量有 n个元素,那么该向量属于实数集 的 n 次笛卡儿乘积构成的集合,记为 n。当需要明确表示向量中的元素时,我们会将元素排列成一个方括号包围的纵列:
我们可以把向量看作空间中的点,每个元素是不同坐标轴上的坐标。
有时我们需要索引向量中的一些元素。在这种情况下,我们定义一个包含这些元素索引的集合,然后将该集合写在脚标处。比如,指定x1、x3和x6,我们定义集合S={1,3,6},然后写作x S。我们用符号-表示集合的补集中的索引。比如x−1表示x中除x1外的所有元素,x−S表示x中除x1、x3、x6外所有元素构成的向量。
·矩阵(matrix):矩阵是一个二维数组,其中的每一个元素由两个索引(而非一个)所确定。我们通常会赋予矩阵粗体的大写变量名称,比如A。如果一个实数矩阵高度为m,宽度为n,那么我们说A∈m×n。我们在表示矩阵中的元素时,通常以不加粗的斜体形式使用其名称,索引用逗号间隔。比如,A1,1表示A左上的元素,Am,n表示A右下的元素。我们通过用“:”表示水平坐标,以表示垂直坐标i 中的所有元素。比如,Ai,:表示 A 中垂直坐标 i 上的一横排元素。这也被称为 A 的第 i 行(row)。同样地,A:,i表示A的第i列(column)。当需要明确表示矩阵中的元素时,我们将它们写在用方括号括起来的数组中:
有时我们需要矩阵值表达式的索引,而不是单个元素。在这种情况下,我们在表达式后面接下标,但不必将矩阵的变量名称小写化。比如,f(A)i,j表示函数f作用在A上输出的矩阵的第i行第j列元素。
·张量(tensor):在某些情况下,我们会讨论坐标超过两维的数组。一般的,一个数组中的元素分布在若干维坐标的规则网格中,我们称之为张量。我们使用字体来表示张量“A”。张量中坐标为(i,j,k)的元素记作Ai,j,k。
转置(transpose)是矩阵的重要操作之一。矩阵的转置是以对角线为轴的镜像,这条从左上角到右下角的对角线被称为主对角线(main diagonal)。图2.1显示了这个操作。我们将矩阵A的转置表示为A丅,定义如下
向量可以看作只有一列的矩阵。对应地,向量的转置可以看作只有一行的矩阵。有时,我们通过将向量元素作为行矩阵写在文本行中,然后使用转置操作将其变为标准的列向量,来定义一个向量,比如x=[x1,x2,x3]丅。
标量可以看作只有一个元素的矩阵。因此,标量的转置等于它本身,a=a丅。
只要矩阵的形状一样,我们可以把两个矩阵相加。两个矩阵相加是指对应位置的元素相加,比如C=A+B,其中Ci,j=Ai,j+Bi,j。
标量和矩阵相乘,或是和矩阵相加时,我们只需将其与矩阵的每个元素相乘或相加,比如D=a·B+c,其中Di,j=a·Bi,j+c。
在深度学习中,我们也使用一些不那么常规的符号。我们允许矩阵和向量相加,产生另一个矩阵:C=A+b,其中Ci,j=Ai,j+bj。换言之,向量b 和矩阵A的每一行相加。这个简写方法使我们无须在加法操作前定义一个将向量b 复制到每一行而生成的矩阵。这种隐式地复制向量b 到很多位置的方式,称为广播(broadcasting)。
矩阵乘法是矩阵运算中最重要的操作之一。两个矩阵A和B的矩阵乘积(matrix product)是第三个矩阵C。为了使乘法可被定义,矩阵A的列数必须和矩阵B 的行数相等。如果矩阵A的形状是m ×n,矩阵B 的形状是n ×p,那么矩阵C 的形状是m ×p。我们可以通过将两个或多个矩阵并列放置以书写矩阵乘法,例如
具体地,该乘法操作定义为
需要注意的是,两个矩阵的标准乘积不是指两个矩阵中对应元素的乘积。不过,那样的矩阵操作确实是存在的,称为元素对应乘积(element-wise product)或者Hadamard 乘积(Hadamard product),记为A ⊙ B。
两个相同维数的向量 x 和 y 的点积(dot product)可看作矩阵乘积 x丅y。我们可以把矩阵乘积C=AB 中计算Ci,j的步骤看作A的第i 行和B 的第j 列之间的点积。
矩阵乘积运算有许多有用的性质,从而使矩阵的数学分析更加方便。比如,矩阵乘积服从分配律:
矩阵乘积也服从结合律:
不同于标量乘积,矩阵乘积并不满足交换律(AB=BA 的情况并非总是满足)。然而,两个向量的点积满足交换律:
矩阵乘积的转置有着简单的形式:
利用两个向量点积的结果是标量、标量转置是自身的事实,我们可以证明式(2.8):
由于本书的重点不是线性代数,我们并不想展示矩阵乘积的所有重要性质,但读者应该知道矩阵乘积还有很多有用的性质。
现在我们已经知道了足够多的线性代数符号,可以表达下列线性方程组:
其中 A∈m×n是一个已知矩阵,b ∈m是一个已知向量,x ∈n是一个我们要求解的未知向量。向量x 的每一个元素xi都是未知的。矩阵A的每一行和b 中对应的元素构成一个约束。我们可以把式(2.11)重写为
或者,更明确地,写作
矩阵向量乘积符号为这种形式的方程提供了更紧凑的表示。
线性代数提供了称为矩阵逆(matrix inversion)的强大工具。对于大多数矩阵 A,我们都能通过矩阵逆解析地求解式(2.11)。
为了描述矩阵逆,我们首先需要定义单位矩阵(identity matrix)的概念。任意向量和单位矩阵相乘,都不会改变。我们将保持n 维向量不变的单位矩阵记作I n。形式上,I n∈n×n,
单位矩阵的结构很简单:所有沿主对角线的元素都是1,而其他位置的所有元素都是0,如图2.2所示。
矩阵A的矩阵逆记作A−1,其定义的矩阵满足如下条件:
现在我们可以通过以下步骤求解式(2.11):
当然,这取决于我们能否找到一个逆矩阵A−1。在接下来的章节中,我们会讨论逆矩阵A−1存在的条件。
当逆矩阵A−1存在时,有几种不同的算法都能找到它的闭解形式。理论上,相同的逆矩阵可用于多次求解不同向量b的方程。然而,逆矩阵A−1主要是作为理论工具使用的,并不会在大多数软件应用程序中实际使用。这是因为逆矩阵A−1在数字计算机上只能表现出有限的精度,有效使用向量b的算法通常可以得到更精确的x。
如果逆矩阵A−1存在,那么式(2.11)肯定对于每一个向量b恰好存在一个解。但是,对于方程组而言,对于向量b的某些值,有可能不存在解,或者存在无限多个解。存在多于一个解但是少于无限多个解的情况是不可能发生的;因为如果x和y都是某方程组的解,则
(其中α取任意实数)也是该方程组的解。
为了分析方程有多少个解,我们可以将A的列向量看作从原点(origin)(元素都是零的向量)出发的不同方向,确定有多少种方法可以到达向量b。在这个观点下,向量x 中的每个元素表示我们应该沿着这些方向走多远,即xi表示我们需要沿着第i个向量的方向走多远:
一般而言,这种操作称为线性组合(linear combination)。形式上,一组向量的线性组合,是指每个向量乘以对应标量系数之后的和,即
一组向量的生成子空间(span)是原始向量线性组合后所能抵达的点的集合。
确定 Ax=b 是否有解,相当于确定向量 b 是否在 A 列向量的生成子空间中。这个特殊的生成子空间被称为A的列空间(column space)或者A的值域(range)。
为了使方程 Ax=b 对于任意向量 b ∈ m都存在解,我们要求 A 的列空间构成整个m。如果 m中的某个点不在 A的列空间中,那么该点对应的 b 会使得该方程没有解。矩阵A的列空间是整个m的要求,意味着A至少有m列,即n≥m。否则,A列空间的维数会小于m。例如,假设A是一个3×2的矩阵。目标b 是3维的,但是x 只有2维。所以无论如何修改x 的值,也只能描绘出3空间中的二维平面。当且仅当向量b 在该二维平面中时,该方程有解。
不等式n≥m仅是方程对每一点都有解的必要条件。这不是一个充分条件,因为有些列向量可能是冗余的。假设有一个2×2中的矩阵,它的两个列向量是相同的。那么它的列空间和它的一个列向量作为矩阵的列空间是一样的。换言之,虽然该矩阵有 2列,但是它的列空间仍然只是一条线,不能涵盖整个2空间。
正式地说,这种冗余称为线性相关(linear dependence)。如果一组向量中的任意一个向量都不能表示成其他向量的线性组合,那么这组向量称为线性无关(linearly independent)。如果某个向量是一组向量中某些向量的线性组合,那么我们将这个向量加入这组向量后不会增加这组向量的生成子空间。这意味着,如果一个矩阵的列空间涵盖整个m,那么该矩阵必须包含至少一组 m个线性无关的向量。这是式(2.11)对于每一个向量 b 的取值都有解的充分必要条件。值得注意的是,这个条件是说该向量集恰好有m个线性无关的列向量,而不是至少m个。不存在一个m维向量的集合具有多于m个彼此线性不相关的列向量,但是一个有多于m个列向量的矩阵有可能拥有不止一个大小为m的线性无关向量集。
要想使矩阵可逆,我们还需要保证式(2.11)对于每一个b值至多有一个解。为此,我们需要确保该矩阵至多有m个列向量。否则,该方程会有不止一个解。
综上所述,这意味着该矩阵必须是一个方阵(square),即m=n,并且所有列向量都是线性无关的。一个列向量线性相关的方阵被称为奇异的(singular)。
如果矩阵A不是一个方阵或者是一个奇异的方阵,该方程仍然可能有解。但是我们不能使用矩阵逆去求解。
目前为止,我们已经讨论了逆矩阵左乘。我们也可以定义逆矩阵右乘:
对于方阵而言,它的左逆和右逆是相等的。
有时我们需要衡量一个向量的大小。在机器学习中,我们经常使用称为范数(norm)的函数来衡量向量大小。形式上,Lp范数定义如下
其中p∈,p>1。
范数(包括Lp范数)是将向量映射到非负值的函数。直观上来说,向量x的范数衡量从原点到点x的距离。更严格地说,范数是满足下列性质的任意函数:
·f(x)=0⇒x=0;
·f(x+y)≤ f(x)+f(y)(三角不等式(triangle inequality));
·∀α∈,f(αx)=|α|f(x)。
当 p=2 时,L2范数称为欧几里得范数(Euclidean norm)。它表示从原点出发到向量 x确定的点的欧几里得距离。L2范数在机器学习中出现得十分频繁,经常简化表示为 kxk,略去了下标2。平方L2范数也经常用来衡量向量的大小,可以简单地通过点积x丅x 计算。
平方L2范数在数学和计算上都比L2范数本身更方便。例如,平方L2范数对x中每个元素的导数只取决于对应的元素,而L2范数对每个元素的导数和整个向量相关。但是在很多情况下,平方L2范数也可能不受欢迎,因为它在原点附近增长得十分缓慢。在某些机器学习应用中,区分恰好是零的元素和非零但值很小的元素是很重要的。在这些情况下,我们转而使用在各个位置斜率相同,同时保持简单的数学形式的函数:L1范数。L1范数可以简化如下当机器学习问题中零和非零元素之间的差异非常重要时,通常会使用 L1范数。每当 x 中某个元素从0增加,对应的L1范数也会增加。
有时候我们会统计向量中非零元素的个数来衡量向量的大小。有些作者将这种函数称为“L0范数”,但是这个术语在数学意义上是不对的。向量的非零元素的数目不是范数,因为对向量缩放α倍不会改变该向量非零元素的数目。因此,L1范数经常作为表示非零元素数目的替代函数。
另外一个经常在机器学习中出现的范数是L∞范数,也被称为最大范数(max norm)。这个范数表示向量中具有最大幅值的元素的绝对值:
有时候我们可能也希望衡量矩阵的大小。在深度学习中,最常见的做法是使用Frobenius范数(Frobenius norm),即
其类似于向量的L2范数。
两个向量的点积可以用范数来表示,具体如下
其中θ表示x和y之间的夹角。
有些特殊类型的矩阵和向量是特别有用的。
对角矩阵(diagonal matrix)只在主对角线上含有非零元素,其他位置都是零。形式上,矩阵 D 是对角矩阵,当且仅当对于所有的 i≠j,Di,j=0。我们已经看到过一个对角矩阵:单位矩阵,其对角元素全部是 1。我们用 diag(v)表示对角元素由向量 v 中元素给定的一个对角方阵。对角矩阵受到关注的部分原因是对角矩阵的乘法计算很高效。计算乘法 diag(v)x,我们只需要将 x 中的每个元素 xi放大 vi倍。换言之,diag(v)x=v ⊙ x。计算对角方阵的逆矩阵也很高效。对角方阵的逆矩阵存在,当且仅当对角元素都是非零值,在这种情况下,diag(v)−1=diag([1/v1,…,1/vn]丅)。在很多情况下,我们可以根据任意矩阵导出一些通用的机器学习算法,但通过将一些矩阵限制为对角矩阵,我们可以得到计算代价较低的(并且简明扼要的)算法。
并非所有的对角矩阵都是方阵。长方形的矩阵也有可能是对角矩阵。非方阵的对角矩阵没有逆矩阵,但我们仍然可以高效地计算它们的乘法。对于一个长方形对角矩阵D而言,乘法Dx会涉及x中每个元素的缩放,如果D是瘦长型矩阵,那么在缩放后的末尾添加一些零;如果D是胖宽型矩阵,那么在缩放后去掉最后一些元素。
对称(symmetric)矩阵是转置和自己相等的矩阵,即
当某些不依赖参数顺序的双参数函数生成元素时,对称矩阵经常会出现。例如,如果A是一个距离度量矩阵,Ai,j表示点i到点j的距离,那么Ai,j=Aj,i,因为距离函数是对称的。
单位向量(unit vector)是具有单位范数(unit norm)的向量,即
如果 x丅y=0,那么向量 x 和向量 y 互相正交(orthogonal)。如果两个向量都有非零范数,那么这两个向量之间的夹角是90◦。在n中,至多有n个范数非零向量互相正交。如果这些向量不但互相正交,而且范数都为1,那么我们称它们是标准正交(orthonormal)。
正交矩阵(orthogonal matrix)指行向量和列向量是分别标准正交的方阵,即
这意味着
正交矩阵受到关注是因为求逆计算代价小。我们需要注意正交矩阵的定义。违反直觉的是,正交矩阵的行向量不仅是正交的,还是标准正交的。对于行向量或列向量互相正交但不是标准正交的矩阵,没有对应的专有术语。
许多数学对象可以通过将它们分解成多个组成部分或者找到它们的一些属性来更好地理解。这些属性是通用的,而不是由我们选择表示它们的方式所产生的。
例如,整数可以分解为质因数。我们可以用十进制或二进制等不同方式表示整数12,但是12=2×2×3永远是对的。从这个表示中我们可以获得一些有用的信息,比如12不能被5整除,或者12的倍数可以被3整除。
正如我们可以通过分解质因数来发现整数的一些内在性质,我们也可以通过分解矩阵来发现矩阵表示成数组元素时不明显的函数性质。
特征分解(eigendecomposition)是使用最广的矩阵分解之一,即我们将矩阵分解成一组特征向量和特征值。
方阵 A 的特征向量(eigenvector)是指与 A 相乘后相当于对该向量进行缩放的非零向量v:
其中标量λ称为这个特征向量对应的特征值(eigenvalue)。(类似地,我们也可以定义左特征向量(left eigenvector),但是通常我们更关注右特征向量(right eigenvector))。
如果 v 是 A 的特征向量,那么任何缩放后的向量 sv(s∈,s≠0)也是 A 的特征向量。此外,sv 和v 有相同的特征值。基于这个原因,通常我们只考虑单位特征向量。
假设矩阵A有n个线性无关的特征向量{v(1),…,v(n)},对应着特征值{λ1,…,λn}。我们将特征向量连接成一个矩阵,使得每一列是一个特征向量:V=[v(1),…,v(n)]。类似地,我们也可以将特征值连接成一个向量λ=。因此A的特征分解(eigendecomposition)可以记作
我们已经看到了构建具有特定特征值和特征向量的矩阵,能够使我们在目标方向上延伸空间。然而,我们也常常希望将矩阵分解(decompose)成特征值和特征向量。这样可以帮助我们分析矩阵的特定性质,就像质因数分解有助于我们理解整数。
不是每一个矩阵都可以分解成特征值和特征向量。在某些情况下,特征分解存在,但是会涉及复数而非实数。幸运的是,在本书中,我们通常只需要分解一类有简单分解的矩阵。具体来讲,每个实对称矩阵都可以分解成实特征向量和实特征值:
其中Q是A的特征向量组成的正交矩阵,Λ是对角矩阵。特征值Λi,i对应的特征向量是矩阵Q的第i列,记作Q:,i。因为Q是正交矩阵,我们可以将A看作沿方向v(i)延展λi倍的空间,如图2.3所示。
虽然任意一个实对称矩阵A都有特征分解,但是特征分解可能并不唯一。如果两个或多个特征向量拥有相同的特征值,那么在由这些特征向量产生的生成子空间中,任意一组正交向量都是该特征值对应的特征向量。因此,我们可以等价地从这些特征向量中构成Q作为替代。按照惯例,我们通常按降序排列Λ的元素。在该约定下,特征分解唯一,当且仅当所有的特征值都是唯一的。
矩阵的特征分解给了我们很多关于矩阵的有用信息。矩阵是奇异的,当且仅当含有零特征值。实对称矩阵的特征分解也可以用于优化二次方程f(x)=x丅Ax,其中限制||x||2=1。当x等于A的某个特征向量时,f将返回对应的特征值。在限制条件下,函数f的最大值是最大特征值,最小值是最小特征值。
所有特征值都是正数的矩阵称为正定(positive definite);所有特征值都是非负数的矩阵称为半正定(positive semidefinite)。同样地,所有特征值都是负数的矩阵称为负定(negative definite);所有特征值都是非正数的矩阵称为半负定(negative semidefinite)。半正定矩阵受到关注是因为它们保证∀x,Ax >0。此外,正定矩阵还保证Ax=0⇒x=0。
在第2.7节,我们探讨了如何将矩阵分解成特征向量和特征值。还有另一种分解矩阵的方法,称为奇异值分解(singular value decomposition,SVD),是将矩阵分解为奇异向量(singular vector)和奇异值(singular value)。通过奇异值分解,我们会得到一些与特征分解相同类型的信息。然而,奇异值分解有更广泛的应用。每个实数矩阵都有一个奇异值分解,但不一定都有特征分解。例如,非方阵的矩阵没有特征分解,这时我们只能使用奇异值分解。
回想一下,我们使用特征分解去分析矩阵A时,得到特征向量构成的矩阵V 和特征值构成的向量λ,我们可以重新将A写作
奇异值分解是类似的,只不过这回我们将矩阵A分解成三个矩阵的乘积:
假设A是一个m×n的矩阵,那么U 是一个m×m的矩阵,D是一个m×n的矩阵,V是一个n×n矩阵。
这些矩阵中的每一个经定义后都拥有特殊的结构。矩阵U和V都定义为正交矩阵,而矩阵D定义为对角矩阵。注意,矩阵D不一定是方阵。
对角矩阵D 对角线上的元素称为矩阵A的奇异值(singular value)。矩阵U 的列向量称为左奇异向量(left singular vector),矩阵V 的列向量称右奇异向量(right singular vector)。
事实上,我们可以用与A相关的特征分解去解释A的奇异值分解。A的左奇异向量(left singular vector)是的特征向量。A的右奇异向量(right singular vector)是的特征向量。A的非零奇异值是特征值的平方根,同时也是 特征值的平方根。
SVD最有用的一个性质可能是拓展矩阵求逆到非方矩阵上。我们将在下一节中探讨。
对于非方矩阵而言,其逆矩阵没有定义。假设在下面的问题中,我们希望通过矩阵A的左逆B来求解线性方程:
等式两边左乘左逆B后,我们得到
取决于问题的形式,我们可能无法设计一个唯一的映射将A映射到B。
如果矩阵A的行数大于列数,那么上述方程可能没有解。如果矩阵A的行数小于列数,那么上述矩阵可能有多个解。
Moore-Penrose 伪逆(Moore-Penrose pseudoinverse)使我们在这类问题上取得了一定的进展。矩阵A的伪逆定义为
计算伪逆的实际算法没有基于这个定义,而是使用下面的公式
其中,矩阵U、D和V是矩阵A奇异值分解后得到的矩阵。对角矩阵D的伪逆D+是其非零元素取倒数之后再转置得到的。
当矩阵A的列数多于行数时,使用伪逆求解线性方程是众多可能解法中的一种。特别地,x=A+y是方程所有可行解中欧几里得范数||x||2最小的一个。
当矩阵A的行数多于列数时,可能没有解。在这种情况下,通过伪逆得到的x使得Ax和y的欧几里得距离||Ax−y||2最小。
迹运算返回的是矩阵对角元素的和:
迹运算因为很多原因而有用。若不使用求和符号,有些矩阵运算很难描述,而通过矩阵乘法和迹运算符号可以清楚地表示。例如,迹运算提供了另一种描述矩阵Frobenius范数的方式:
用迹运算表示表达式,我们可以使用很多有用的等式巧妙地处理表达式。例如,迹运算在转置运算下是不变的:
多个矩阵相乘得到的方阵的迹,和将这些矩阵中的最后一个挪到最前面之后相乘的迹是相同的。当然,我们需要考虑挪动之后矩阵乘积依然定义良好:
或者更一般地,
即使循环置换后矩阵乘积得到的矩阵形状变了,迹运算的结果依然不变。例如,假设矩阵A∈m×n,矩阵B ∈n×m,我们可以得到
尽管AB ∈m×m和BA∈n×n。
另一个有用的事实是标量在迹运算后仍然是它自己:a=Tr(a)。
行列式,记作det(A),是一个将方阵A映射到实数的函数。行列式等于矩阵特征值的乘积。行列式的绝对值可以用来衡量矩阵参与矩阵乘法后空间扩大或者缩小了多少。如果行列式是0,那么空间至少沿着某一维完全收缩了,使其失去了所有的体积;如果行列式是1,那么这个转换保持空间体积不变。
主成分分析(principal components analysis,PCA)是一个简单的机器学习算法,可以通过基础的线性代数知识推导。
假设在Rn空间中有m个点{x(1),…,x(m)},我们希望对这些点进行有损压缩。有损压缩表示我们使用更少的内存,但损失一些精度去存储这些点。我们希望损失的精度尽可能少。
编码这些点的一种方式是用低维表示。对于每个点x(i)∈n,会有一个对应的编码向量c(i)∈l。如果l比n小,那么我们便使用了更少的内存来存储原来的数据。我们希望找到一个编码函数,根据输入返回编码,f(x)=c;我们也希望找到一个解码函数,给定编码重构输入,x ≈g(f(x))。
PCA由我们选择的解码函数而定。具体来讲,为了简化解码器,我们使用矩阵乘法将编码映射回n,即g(c)=Dc,其中D ∈n×l是定义解码的矩阵。
到目前为止,所描述的问题可能会有多个解。因为如果我们按比例地缩小所有点对应的编码向量ci,那么只需按比例放大D:,i,即可保持结果不变。为了使问题有唯一解,我们限制D中所有列向量都有单位范数。
计算这个解码器的最优编码可能是一个困难的问题。为了使编码问题简单一些,PCA限制D的列向量彼此正交(注意,除非l=n,否则严格意义上D不是一个正交矩阵)。
为了将这个基本想法变为我们能够实现的算法,首先我们需要明确如何根据每一个输入x得到一个最优编码c*。一种方法是最小化原始输入向量x和重构向量g(c*)之间的距离。我们使用范数来衡量它们之间的距离。在PCA算法中,我们使用L2范数
我们可以用平方L2范数替代L2范数,因为两者在相同的值c上取得最小值。这是因为L2范数是非负的,并且平方运算在非负值上是单调递增的。
该最小化函数可以简化成
(式(2.30)中L2范数的定义)
(分配律)
(因为标量 的转置等于自己)。
因为第一项 不依赖于c,所以我们可以忽略它,得到如下的优化目标:
更进一步,代入g(c)的定义:
(矩阵D的正交性和单位范数约束)
我们可以通过向量微积分来求解这个最优化问题(如果你不清楚怎么做,请参考第4.3节)。
这使得算法很高效:最优编码x只需要一个矩阵-向量乘法操作。为了编码向量,我们使用编码函数
进一步使用矩阵乘法,我们也可以定义PCA重构操作:
接下来,我们需要挑选编码矩阵D。要做到这一点,先来回顾最小化输入和重构之间L2距离的这个想法。因为用相同的矩阵D对所有点进行解码,我们不能再孤立地看待每个点。反之,我们必须最小化所有维数和所有点上的误差矩阵的Frobenius范数:
为了推导用于寻求D*的算法,我们首先考虑l=1的情况。在这种情况下,D是一个单一向量d。将式(2.67)代入式(2.68),简化D为d,问题简化为
上述公式是直接代入得到的,但不是表述上最美观的方式。在上述公式中,我们将标量 放在向量d 的右边。将该标量放在左边的写法更为传统。于是我们通常写作
或者,考虑到标量的转置和自身相等,我们也可以写作
读者应该对这些重排写法慢慢熟悉起来。
此时,使用单一矩阵来重述问题,比将问题写成求和形式更有帮助。这有助于我们使用更紧凑的符号。将表示各点的向量堆叠成一个矩阵,记为X ∈m×n,其中。原问题可以重新表述为
暂时不考虑约束,我们可以将Frobenius范数简化成下面的形式:
(式(2.49))
(因为与d无关的项不影响argmin)
(因为循环改变迹运算中相乘矩阵的顺序不影响结果,如式(2.52)所示)
(再次使用上述性质)。
此时,我们再来考虑约束条件
(因为约束条件)
这个优化问题可以通过特征分解来求解。具体来讲,最优的d 是 最大特征值对应的特征向量。
以上推导特定于l=1的情况,仅得到了第一个主成分。更一般地,当我们希望得到主成分的基时,矩阵D由前l个最大的特征值对应的特征向量组成。这个结论可以通过归纳法证明,我们建议将此证明作为练习。
线性代数是理解深度学习所必须掌握的基础数学学科之一。另一门在机器学习中无处不在的重要数学学科是概率论,我们将在下一章探讨。
微信扫码关注【异步社区】微信公众号,回复“e46147”获取本书配套资源以及异步社区15天VIP会员卡,近千本电子书免费畅读。