前言

缘起

2017年2月,TensorFlow的首届开发者峰会(2017 TensorFlow Dev Summit)在美国的加利福尼亚州举行。在会上,谷歌公司宣布正式发布TensorFlow 1.0版本。本书就是基于最新的1.1.0版本来介绍TensorFlow的技术解析和实战。

人工智能大潮来了。2016年,AlphaGo击败围棋大师李世石后,人工智能的应用仿佛一夜之间遍地开花。在科技潮流的大环境中,现在硅谷的用人单位越来越倾向于雇用既懂理论(思考者)又懂编程(执行者)的工程师。思考者的日常工作是阅读文献以求产生思路,而执行者则是编写代码来实现应用。但是要成为一名真正的工程师,学习机器学习是将思考者和执行者相结合的最快途径。

众所周知,人工智能是高级计算智能最宽泛的概念,机器学习是研究人工智能的一个工具,深度学习是机器学习的一个子集,是目前研究领域卓有成效的学习方法。深度学习的框架有很多,而TenforFlow将神经网络、算法这些平时停留在理论层面的知识,组织成一个平台框架,集合了神经网络的各个算法函数组成一个工具箱,让广大工程师可以专心建造自己的目标领域的“轮子”,而且TenforFlow是基于Python语言的,极易上手,这些优势迅速吸引了全世界的工程师。

我曾经也是一名前后端开发工程师,更专注于后端工程方向,而潜心研究深度学习和TensorFlow后,我被TensorFlow深深地迷住了。我发现它对各行各业将会有很深远的影响,并且会大大地解放劳动力。

与传统工程师的主要工作——实现产品需求或者设计高可用性架构不同,深度学习让人总结和抽象人类是怎样理解和看待问题的,并把这种方式教给机器。例如,在AlphaGo的研究中,人们需要先抽象出人类思考围棋的方式,然后将这种方式抽象成算法,并且配合人类大脑构造中神经网络的传输来实现这些算法。这时,工程师不会再写实现业务需求的逻辑代码,而是深度学习中将神经网络的“黑盒”和模型效果非常好却缺乏“可解释性”的特性相结合,在次次实验中尽量找出规律。记得美国前总统肯尼迪在宣布登月计划时曾说:“我们选择去月球,不是因为它简单,而是因为它困难。”今天,我相信,所有致力于人工智能方向的工程师之所以自豪地去研究,也不是因为它简单,而是因为它困难。我们研究它,是因为立足于现在这个点往前看,我们看不到已经建好的高楼大厦,看到的是一片等待我们去发掘的空旷的大地,而这个发掘过程需要的是十足的远见、决心、勇气和信心。

我在学习的过程中,由于深度学习的资料英文的居多,在理解上走了不少弯路。我把学到的知识和原理用心整理并用文字表述出来,写成这本书,希望能帮助没有接触过深度学习的广大程序员迅速上手,而不再被英文阅读理解挡在门外。说实话,TensorFlow的文档以及API接口是比较抽象的,再加上有一些从工程方向转入深度学习的人以前没有过深度学习的经验,所以如果带着工程类程序研发的思维去学习,甚至是实现业务逻辑需求的思维去学习,效果会很差。我希望这本书能为读者呈现一个通俗易懂、形象生动的TensorFlow,使读者迅速走入深度学习的世界。

在本书的写作过程中,为了能充分挤出时间,深夜当我困倦时,我常常让自己以最不舒服的方式入睡,希望能尽量少睡,以此增加仔细钻研的时间。有时我还会打开电视,将音量设置为静音,感受房间中电视背景光闪烁的动感,以此提醒自己时间的流动。刚开始我会坐在工作台前写作,累了又会抱着笔记本坐在床上继续写作,有时会写着写着不知不觉地睡着,凌晨三四点钟又醒来,感受黑夜里的那片安宁,心情顿时平静,再次投入到钻研中。每每有灵感,都非常激动;每每再次深入一个概念,增删易稿,把原理逼近真相地讲透,都让我非常有成就感。

面向的读者

我素来不爱探究数学公式的推导原理,对符号也很茫然,只是在必须要用时才对这些公式进行详细的推导,但是我却对这些原理在应用层面如何使用出奇地感兴趣。本书的目标就是带读者进入造“应用轮子”的大门。我会以最少的数学公式讲清楚如何用TensorFlow实现CNN、RNN,如何在实战中使用TensorFlow进行图片分类、人脸识别和自然语言处理等,以及如何将想训练的数据、想实现的应用亲手做出来。

同时,Python语言是一门相当高级的语言,有“可执行的伪代码”的美誉,可以用极少的代码行去完成一个复杂的功能,同时Python还有极为丰富的第三方库,让全世界很多工程师的开发工作变得异常简单。TensorFlow是用Python语言实现的框架,对很多学生来说非常容易上手,当然,如果是有开发经验的工程师,就更容易学会。如果说设计神经网络模型像是盖一栋大楼,那么TensorFlow强大的API用起来会让人感觉就像搭积木一样容易。因此,懂点儿Python,即便不怎么懂数学和算法原理也没关系,尽管跟着我一起学便是。

在翻译学上有一个概念叫作“平行语料库”,这个概念来自制作于公元前196年的古埃及罗塞塔石碑,石碑上用希腊文字、古埃及文字和当时的通俗体文字刻了同样的内容。在本书进行某个概念的讲解时,虽然是用Python代码作示范,但TensorFlow前端开发同时也支持多种上层语言,本书讲解过程中也会兼顾到用C++、Java、Go语言做开发的读者。

我希望,本书成为不同领域的读者进入人工智能领域的“垫脚石”,也希望所有的读者在人生路上能利用TensorFlow这个工具大放异彩。

我有很重的强迫症,因此,在编写本书的过程中,阅读了国内外很多与TensorFlow相关的资料,对本书的目录结构和框架经过很多次反复琢磨和调整;在写完之后,我又从头到尾地读过好几遍,并且和了解TensorFlow不同方面的人反复交流,根据建议又反复修改。这一切就是希望它能通俗易懂,把读者快速领入深度学习的大门。

这扇门的背后是异彩纷呈的,身怀这门技艺的人是应该非常自豪的,但这扇门的背后也是非常辛苦的,有时数据需要自己去想办法解决,还需要每天看论文,知晓最新科研成果,给自己以启发,反复地做实验,研究算法和模型,寻求提升和解决方法,经常会遇到在很长一段时间没有思路的情况。但是,只要做的东西是开创的,令人称赞的,就会开心地享受这个过程。

我专为本书读者建立了一个QQ交流群(320420130),希望在群里与大家深入讨论和交流学习过程中遇到的问题,也希望与大家分享最新的研究成果。

致谢

非常感谢谷歌大脑的工程师Jeff Dean,在得知我目前正在写这本书的时候,他特地发了邮件鼓励我:“听说你写了一本关于TensorFlow的书,真是太好了。希望你很享受学习TensorFlow的这段经历,并享受运用TensorFlow完成各种任务的这种体验。我非常高兴你为中文社区写这本书。”Jeff Dean的邮件原文是:“It's great that you've written a book about TensorFlow. I hope you enjoyed the experience in learning about TensorFlow and how to accomplish various tasks. I'm glad that you're making your book available for the Chinese speaking community.”。这让我更坚定了传播TensorFlow深度学习的决心。

感谢百度硅谷AI实验室资深科学家王益老师关于AI on Kubernetes的建议。

感谢在百度工作时的同事陈后江,在写作过程中,我们有时在周末的深夜还进行讨论,印象最深的一次是在大冬天晚上,我们恰好都在外面,相互通了20多分钟电话,手冻得像冰棒似的。还要感谢童牧晨玄,他也是深度学习领域的爱好者,对关键的概念理解得非常透彻,能十分精准地讲出原理。

非常感谢《Redis实战》一书的译者黄健宏,他对技术写作有很丰富的经验。和他聊书总是能聊到凌晨以后,讨论到畅快处,甚至聊到天亮,他对问题的思考就像是“演杂技”一样,精准又恰到好处;同时,他又是一个非常让人感到温暖和踏实的朋友。

非常感谢iOS资深开发者唐巧,他在国内社区乐于分享的精神造福了很多的技术从业者,也正是他的推荐让我和本书的编辑杨海玲老师结下了这段美好的情谊。

非常感谢人民邮电出版社的杨海玲编辑,她最开始想到这个写作方向,我们一起一点一点地讨论书的内容,确认书的写作框架。在写作过程中,她的细致、专业、独到的见解也为本书增色不少。她对内容严谨和认真的态度令人动容。

非常感谢中科院计算所刘昕博士对本书第6章神经网络的发展提出的建议;感谢曾经的百度同事毕骁鹏对第8章、第9章、第13章、第14章、第20章、第21章提出的极为细致的建议,尤其是他擅长GPU和FPGA的部分,对本书的硬件加速提供了很多建议;感谢中科院智能信息处理重点实验室常务副主任山世光对第10章人脸识别部分提出的建议;感谢刘元震对本书第11章提出的建议;感谢我的好朋友容器专家苗立尧对第17章提出的建议;感谢百度地图导航专家梁腾腾对第19章移动端开发给予的极为细致的建议;感谢阿里巴巴数据科学与技术研究院高级专家孙亮博士对整本书的结构和知识点提出的建议。

感谢我的好朋友吴丽明,曾经那么帮助过我;感谢我的好朋友饶志臻先生,一直诱惑我买苹果设备,有个硬件发烧友真的很幸福;感谢我的闺蜜谢禹曦,好久没有和你聚餐了,甚是思念。

最后,还得感谢一位流行歌手——“火星弟弟”华晨宇,他在舞台上那一次次创意和感染力的演出深深地吸引了我,他在台下那认真刻苦作曲改歌的样子也激励着我,每次想到他的事迹,都给我极大的鼓励。

非常感谢本书的每一位读者,本书的完成过程非常辛苦但也充满甜蜜。我在“知乎”(ID:李嘉璇)和网站(tf.greatgeekgrace.com)上也会回答关于“人工智能”的各类问题,希望通过内容的更新与读者不断交流。另外,由于水平有限,在内容上表述上难免也有遗漏和疏忽,也恳请读者多多指正。

李嘉璇

2017年4月于北京石景山

个人博客:blog.greatgeekgrace.com

TensorFlow交流社区:tf.greatgeekgrace.com

电子邮箱:qiyueli_2013@163.com