一日用Keras,终生用Keras
本书自出版以来收到众多好评,因为是 Keras 作者写的书,所以全书基本围绕着 Keras 讲深度学习的各种实现,从 CNN,RNN到GAN等等,总体偏入门,但也承载着很多作者对深度学习整体性的思考。值得一提的是作者推荐用GPU 跑书中的例子,这不是开玩笑, 用CPU 跑你会感到很绝望的~
本书代码都放在作者的 [Github]上,基本与书中内容一致,当然很多内容的解释在书中会更详细一些。Keras 的文档很全,对新手也比较友好,所以很多人觉得看文档就行,没必要看书,其实书和文档各有优缺点。
书最大的优点是框架性,能提供一个“整体视角”,让读者在脑中建立一个完整的地图,知道哪些常用哪些不常用,再据此针对性地查漏补缺就比较方便了,而如果直接查文档面对海量的API往往会无所适从。然而书因为要照顾整体性,必然会抛弃一些与主旨无关的内容或细节,而这正是文档的优点,可以把所有内容都囊括进来,不需要太考虑整体可读性。而且查文档有种探宝的意味,时常不经意间发现了一个神奇的功能居然被实现了。
全书分为两大部分,第一部分是对于深度学习的全局介绍,包括其与人工智能、机器学习的关系,一些相关的基本概念如张量(tensor)、梯度下降、神经网络、反向传播算法等等。其中第三章举了三个简单的例子,分别对应的任务是二分类、多分类和回归,让读者快速了解 Keras 的基本使用方法,熟悉使用深度学习处理数据问题的典型流程。
这里插一句,对于入门这个领域一直存在着两种声音: 一种是top-down式,从实践入手,讲究先沉浸在实际的项目中,再回到理论;另一种是bottom-up式,典型的学习方式是先学习各类书和课程,从理论和数学入手,再到实践。本书作者 François Chollet 是坚定的 top-down 派,记得之前网上看过一篇文章就是讲作者和其他业界大佬撕逼哪种方式好。。。 作者在一个访谈中也提到:
对于那些在 MOOC(Udacity, Coursera, edx, MIT Opencourseware)或者书上自学机器学习/深度学习的人,你有什么建议?
François Chollet:我认为学习机器学习的最好方法是:
首先,清楚地理解关键算法是怎样起作用的,试着自己在 Numpy 中重新实现一个有趣的例子(Numpy 卷积网络、Numpy 多层感知器, Numpy LSTM)。
熟悉实际应用,看看 Keras repo 提供的 Keras 实例。尝试着修改它们,使得它们适应新的数据,并调整模型的结构直到你得到了在你的问题上所能得到的最好结果。
通过 Kaggle 竞赛获得一种做研究和在现实生活中应用数据科学的感觉。
最后,你可以开始阅读理论书籍(例如 Goodfellow, Bengio 和 Courville 的深度学习书籍)和论文来深化对于你正在进行的工作的更加抽象和数学的理解。
可见作者很推崇在 kaggle 中实际应用所学到的东西,书中写到:
The only real way to learn is through practice and actual coding—that’s the philosophy of this book, and Kaggle competitions are the natural continuation of this.
书的第二部分难度进一步增加,主要是关于深度学习在计算机视觉和自然语言处理中的实际应用,主角自然是经典的卷积神经网络和循环神经网络,另外第8章浮光掠影般讲了 VAE 和 GAN,但限于篇幅其实有种意犹未尽的感觉。
接下来说一下每章中的主要内容和一些比较有意思的点。
Chapter 1
第一章主要说的就是“什么是深度学习?”。 著名的三环图,人工智能、机器学习、深度学习三者的关系:
作者提到机器学习与统计学颇有渊源,但二者的不同之处在于机器学习往往需要处理海量高维数据,而很多传统的统计分析方法只适用于小数据。另外,机器学习尤其是深度学习,是工程导向的,具有”应用倒逼理论“的特点,其理论体系还没有完整建立起来,因而需要不断地动手实验来验证各种想法。这其实与现在很多观点认为深度学习像“炼丹术” 不谋而合,结合上文中作者的top-down派,这一点也不足为奇。
李航的《统计学习方法》中提到机器学习的三大要素:模型+策略+算法。第一章的这张图是对此理念的完美体现:
模型是事先定义好的神经网络架构,深度学习的模型中一般有着上百万个的权重(weights),这些权重决定了输入数据X后模型会输出什么样的预测结果Y‘,而所谓的“学习”就是寻找合适的权重使得预测结果和真实目标尽可能接近。而说道接近就涉及到了如何度量两个值的接近程度,这就是策略要做的事情,其实就是定义合适的目标函数(损失函数)。目标函数以真实目标Y和预测结果Y'作为输入,输出一个损失值(loss score)作为反馈信号来更新权重以减少这个损失值,而具体实现这一步骤的就是算法,即上图中的优化器(optimizer),优化器的典型例子就是梯度下降以及其各种变种。
所以这张图清晰地描绘了神经网络整个的训练过程,开始时权重被初始化为一些随机值,所以其预测结果和真实目标Y相差较大,进而损失值也会很大。随着优化器不断地更新权重,使得损失值也会越来越小,最后当损失值不再减少时我们就得到了一个训练好的神经网络。
Keras的设计基本上也是按照这个思路,先定义整个网络,具体表现为加各种各样的层(layer),再指定相应的损失函数和优化器,就可以开始训练了。在另外一页作者说可以把层(layers)想象成深度学习的乐高积木,那么是时候祭出这张图了:
Chapter 2
第二章讲了一些基本概念,Keras的基本用法,张量,矩阵运算,随机梯度下降等等,有意思的是作者说根据其多年经验,对于一些数学概念使用Numpy代码片段更易被擅长编程的人所接受,所以通篇都是像下图这么解释的(这里解释的是relu激活函数),然而我觉得这明显不如数学公式直观。
Chapter 3
第三章提供了三个简单的例子以让读者快速上手Keras,分别为IMDB电影数据集的情感分析、新闻主题分类和房价预测,这三个例子对应了二分类、多分类和回归这三个机器学习中最常遇到的问题。虽然都是比较简单的例子,但麻雀虽小却也五脏俱全,书中依然对各种可能碰到的问题做了比较详尽的阐述,比如如何将数据预处理成适合神经网络的输入,如何定义神经网络层,如何标准化数据,如何处理过拟合和欠拟合等等。而在这之前,作者简要介绍了Keras。
Keras是一个基于Python的深度学习框架,最大的特点是易用性,近年来增长势头迅猛,在Kaggle上也非常流行,我印象中几个比赛前几名的Solution如果是神经网络的话基本都用了Keras。
关于 Keras 在 Kaggle 上流行的原因,作者在一篇采访中说:
在机器学习竞赛中,这些获胜者很少是从一开始就想出了最好的想法,然后简单地部署它,提交结果,最后很快忘了这回事。开发一个好的模型需要对最初的想法进行多次迭代,直到时间到了;你总是能进一步改进你的模型。最终的模型与你最初尝试解决这个问题时所设想的方案几乎没有任何共同点,因为一个事先想好的方案基本上从来不会在现实试验中存活下来。所以赢不是说你最初的理论构想有多棒,而在于你的设想有多少能通过现实的考验。你不会输给比你更聪明的人,你会输给那些比你重复更多实验的人,他们一点点精化他们的模型。如果你把 Kaggle 上的团队按照实验的次数排名,我保证你会发现试验次数排名与最后的竞争排行榜有很强的关联。
Keras 被设计作为一种可快速构建许多不同模型的原型的方法,其关注的重点是尽可能减少从想法到实验结果验证之间所需的时间。Keras API 和工作流程基本上可以减少设置新实验的开销(overhead)(代码开销和认知开销)。所以使用 Keras 让你可以更快地迭代,尝试更多事物。最终,这能让你赢得比赛(或发表论文)。能够以最小的延迟将想法变成结果对实现好的研究来说是很关键的——这是 Keras 背后的核心信念之一。
Keras中包含了两种定义模型的方法:Sequential模型和Functional模型。Sequential模型是多个网络层的线性堆叠,而Functional模型则使得用户可以定义多输出模型、非循环有向模型或具有共享层的模型等复杂模型。Functional模型具有很高的灵活性,而Sequential模型可以看做其一个特例。本书前半部分都是用Sequential模型,后半部分高级内容会使用Functional模型。
Chapter 4
第四章比较理论化,介绍了机器学习的方方面面:监督学习、无监督学习、强化学习的概念,如何评估模型,特征工程,如何处理过拟合等等。这其中令我印象最深刻的点是讲到 dropout 是一种神经网络中常用的正则化方法,作者提到 Geoffrey Hinton 是受到了银行中欺诈预防的启发,大牛的脑洞就是不一样啊~ Hinton说:
我去银行的时候经常发现柜员一直在换,我询问了这么做的原因,但却没人知道。后来我想明白了,如果想要成功地进行银行欺诈往往需要内部员工的配合,这使我意识到如果对每个样本随机丢弃一部分不同的神经元,这样就能阻止“阴谋”的发生,进而减少过拟合。
这里的意思是dropout相当于对每一层的输出值添加了噪声,将一些不重要的偶然模式剔除,这等于减少了”阴谋“ 的发生。如果不剔除的话神经网络会开始记忆这些偶然模式,进而容易过拟合。
关于drouput为什么效果好,基本上没有数学上的证明,因而诞生了很多直觉上的解释(比如上文中Hinton的)。在《Hands On Machine Learning with Scikit Learn and TensorFlow》中,作者阐述了另一种有趣的解释:
如果一个公司的员工每天早上都是扔硬币决定今天去不去上班,那么这个公司会运作良好吗?这并非没有可能,这意味着任何重要的工作都会有替代者,不会只依赖于某一个人。同样员工也会学会和公司内各种不同的人合作,而不是每天面对固定的人,每个员工的能力也会得到提升。这个想法虽然不见得适用于企业管理,但却绝对适用于神经网络。在进行dropout后,一个神经元不得不与随机挑选出来的其他神经单元共同工作,而不是原先一些固定的周边神经元。这样经过几轮训练这些神经元的个体表现力大大增强,同时也减弱了神经元节点间的联合适应性,增强了泛化能力。
台大的李宏毅老师也贡献了一个直觉解释,见下图:
我们知道通常是在训练神经网络的时候使用 dropout,这样会降低神经网络的拟合能力,而在预测的时候则关闭 dropout。这就好像在练轻功的时候在脚上绑着很多重物,但是在真正和别人打的时候会把重物全拿走,这样就会一下子变得很强2333 。
Chapter 5 & 6
从第五章开始,本书进入第二部分,开始从宏观转向具体的问题。第五章和第六章谈了深度学习的两大主力:卷积神经网络和循环神经网络分别在图像和文本领域的应用。因为这里的重点是实战,所以里面谈到的原理大致有个直觉上的认识就行了(比如下面分别是是书中卷积和循环神经网络的图示),如果想要深入的话还是得找 《Deep Learning》。
Chapter 7
第七章讲了Keras的一些高级应用。其中的重点是Functional模型,其使得用户能像函数一样操作层(layer),并通过一个 tensor 来调用它。这增加了灵活性,从而一些比较复杂的网络也不再是问题。比如下图中的问答模型是一个典型的多输入模型:
或者像构建Inception这样的有向无环图:
本章最后作者提到了一个集成方法,用树模型和深度神经网络做Ensemble很多时候能取得不错的效果。他在2014年Kaggle上的Higgs Boson比赛中获得了第4名,使用的就是多种树模型和深度神经网络的融合。Ensemble的真谛在于模型多样性,几个准确率最高但多样性不足的模型做Ensemble可能还不如用几个多样性高但准确率低一点的模型。
于是,我顺便翻到了作者的 Kaggle账号。
Chapter 8
第8章无疑是书中最吸引人的一章,作者教你使用Keras实现一些比较神奇的功能,如文本生成,艺术风格转换等等。我按照这些内容做了两个例子,顺便吐槽下豆瓣为什么不能插代码。。
============================ 2019.5.4 Update ============================
Chapter 9
先上作者的一个演讲视频,讲的内容和本书第 9 章有很多类似的地方。https://www.bilibili.com/video/av30762338
最后一章作为完结篇,作者谈的东西都比较形而上,因而我写得也会比较形而上。。
深度学习直接带动了人工智能的第三次浪潮,但很多业内人士始终对此持谨慎态度,认为不该进行过度解读。因为深度学习的原理,说白了 (如书中所述),就是一堆向量从输入空间到目标空间的几何变换,仅此而已。下图来自于李宏毅老师的 PPT,机器学习大致就是寻找一个函数,输入一些数字 (如图片、声音、文字等都可以转换成一堆数字) 后,它能输出结果,而这个函数中就包含着众多几何变换。
既然基本原理如此简单,那为什么很多人对现在的人工智能发展感到恐慌?作者提到了比较关键的一点,那就是我们人类经常会不由自主地拟人化客体,比如在一块石头上画个笑脸,这块石头就变为了”乐观开朗“的石头; 气候问题严重,就认为地球需要被保护 (其实是人类自己需要保护自己,几亿年前地球的环境远比现在恶劣却依然延续了下来)。如果说函数是输入值到输出值的映射,那么这种拟人化也就是行为到心理的映射。当我们训练出一个可以正确识别猫的模型,我们倾向于认为这个模型”理解“了什么是猫。然而事实是深度学习模型根本不理解什么是猫什么是狗 (至少不是以人类可以理解的方式) ,近几年大火的 GAN 就显示出模型是多么地容易被愚弄,可见模型对于事物本身并没有本质上的认识。要想模型具有人类般的 extreme generalization (书中语) 能力,还有很长的路要走。
然而就我看来,人们感到恐慌的另一个原因,是在于不了解,因为恐惧的根源在于未知。《经济学人》这篇文章中提到,近年来业内业外对人工智能的态度两极分化。不搞人工智能的人通常对近年来的该领域的进展感到惊异,仿佛一夜之间就要全面取代人类了。而搞人工智能的人会觉得:“什么嘛,这不就是找一个损失函数,不断优化,找到最优参数得出结果么,这其中根本不存在思维、推理、认知,因而离真正的智能还差得远了”。 认为 AI 具有人的思维,能推理布局,能天神下凡,能拯救世界,本书作者直言这是 “pure fantasy” ,是对智能和技术的双重误读。
写到这里看来作者是代入了一些主观情绪在里面了,作为一名“严谨”的科研技术人员,看见外界各路传媒,畅销书整天天花乱坠般宣扬着 AI 会不断进化,统治全人类等等,难免会嗤之以鼻哈哈。不过人们的担忧其实也不无道理,比如像 AlphaGo 知道自己在下围棋吗? 我的看法是不知道,它不过是为了达到强化学习里设定的最大奖励罢了,这与人类认知里的围棋文化实在是大相径庭。而这才是最可怕的,我们人类所看重的东西: 善良、专一、共情、自由、平等、民主、金钱、身份、权力等等,AI 眼里都没有这些概念,因而它们所做的决策可能不会关注这些东西。纵使现在的人工智能没有作者所说的推理和抽象能力,其依然可能无意识下误伤友军。
最后吐槽一句,现在 tensorflow 2.0 版本出来后全面 keras 化,给人的感觉是不知道是在用 tf 还是 keras 了,不知这究竟是福还是祸。。。
/