头条说的是Keras,我还想多说几句。
先说说框架。很多公号都热衷于对比深度学习的框架,但是我始终认为框架本身没有好坏,只有工作需要和使用习惯的不同。无论是TF还是Pytorch,都是很优秀的深度学习框架,而且二者还有一个特点:大体上一致,细节处略有不同。
很多初学者都会为入门框架的选择而烦恼。其实我倒觉得,最重要的不是选择,而是赶紧学起来。TF也好,Pytorch也好,包括没啥存在感的一堆“其它深度学习框架”,很多地方其实是相通的,有时候是功能相同,有时候干脆连名字都叫一样。
这个现象很正常,也很好解释。深度学习框架都是基于同一套深度学习理论,知识背景是完全一致的,深度学习的一些基本操作,譬如说卷积,又譬如说损失函数,无论是哪套框架都需要有对应的功能实现,在功能上趋同是必然的事。
简单来说,学会了一套框架,迁移到另一套框架上的成本,比学习两门都面向对象的编程语言还要低一点。
不过,深度学习框架要解决的不仅仅是学术问题,还有工程问题。因此,在细节上会有一些区别,还有一些特色的功能。业界有个笼统的说法,说学术界偏好Pytorch,而工业界喜欢Tensorflow,我是赞同这个说法的。
那么,究竟该怎么选择呢?俗话说得好,成年人是全都要,小孩子才做选择。既然不同的框架总体功能趋同,不妨都加以了解,再根据具体的任务需要,决定本次究竟选择哪款。
对于Keras,我还想多说两句。
就我个人来说,平时用Pytorch会多一些。原因也简单,深度学习框架都要依赖计算图,而早期的TF为了追求性能,支持的是静态计算图,在用户体验上做了很大牺牲,用人话来说就是用的我都快吐了。后来Pytorch出来,一用,那种爽快感感像极了被C艹虐了千百遍以后第一次接触到了Python,就一直用到了现在。
Keras呢其实用得很早,那时候连TF都还没出正式版,后端用的还是Theano。但是那时候的人也和今天一样,也非常纠结,说Keras确实封装得很好,用户体验大大提升,学习门槛也大大降低,但是毕竟是高层抽象,免不了要牺牲性能。今天在Tensorflow身上也能找到一模一样的话,历史果然就是在不断重复自身。
关键是那时候Theano已经是肉眼可见的明日黄花,大家都在转投学习曲线极其陡峭的TF,后来Keras好歹也支持TF了,可是我早被TF的陡峭曲线弄出了PTSD,早早地就转向了Pytorch。对于Keras TF的组合只是作为了解性质地简单玩了一下,没有深入体验。
以前我还常抱怨一件事。
机器学习圈子有几本经典必读书,首推《机器学习实战:基于Scikit-learn与Tensorflow》。这是本入门书,看名字也知道,介绍了两套Python的机器学习库,分别是面向机器学习算法的Scikit-learn,和面向深度学习算法的Tensorflow。
《机器学习实战》封面印了个黑黄相间的爬行动物,所以官方叫蜥蜴书,我不喜欢蜥蜴,我喜欢壁虎,所以我管它叫壁虎书。壁虎书最大的特点是写得细,很多基本的概念和基础的操作,都不厌其烦地展开介绍,特别适合入门,所以业界口碑很好。
但是,以前我觉得有点遗憾。壁虎书选择Scikit-learn就不必说了,做机器学习都绕不开这个库,属于必选动作。但深度学习这块选择的是Tensorflow而不是Pytorch,对于一名TF的重度不爱好者,实在可以说是这本书的一点瑕疵。
不过,决定写Keras这篇文章以后,我决定做一件事:用Keras写一个GAN。做资料收集很容易,有现成的文档和材料,但是,要把微妙的“感受”说清楚就太难了,以己之长攻彼之短,只会带来无穷无尽的争执。
就我的经验来说,必须得真的做完一个项目,才能说清楚一门技术究竟有哪些优点和槽点。至于为什么要写GAN呢,也好说,GAN又有生成器又有判别器,机器学习的两大方向都包了,能够全面考察Keras的能力。
当然,最重要的一点是,壁虎书就有如何实现GAN的章节,而且新版的壁虎书在深度学习部分首选就是Keras,而不是原生的TF,实在写不出来还可以“致敬”一下。
感想我都已经写在了头条的文章里,这里我想补充一条。用过Scikit-learn的同学应该都知道,Scikit-learn的一大特点就是高度封装,把算法的数学细节都统统屏蔽,使用者只需要知道这套算法有哪些参数,然后依葫芦画瓢把参数弄过来传进去就好。
我之前就常说,机器学习是依据数学建立起来的,但学习机器学习是不是都需要把所有公式都手推一遍才能掌握,那就见仁见智。如果只是想要使用机器学习算法的能力,我认为更重要的是知道算法的原理,知道用到哪些参数,这些参数又会对最终效果发挥怎样的作用。
这些知识来源于对算法的理解和实践,恐怕手推公式也无法替代对这部分内容的学习,如果目的是使用机器学习,特别是通过Scikit-learn使用机器学习,可能反而更看重这部分内容。我专门写了一本书,叫《机器学习算法的数学原理和Python实现》来介绍。
Keras给了我同样的感觉。
Keras屏蔽了大量细节,连神经网络最具特色的BP机制都屏蔽了,你只需要把模型搭起来,模型就能自动进行BP跑训练。但是和Scikit-learn一样,该有的参数你得有,譬如说激活函数、损失函数和优化器,这些标准配置都得用户选好了传进去。
很多人诟病Keras,也是因为它过于“高级”,把细节都做了屏蔽处理。譬如说处理时序数据,只要把LSTM层添加进去,哪怕你还没搞清LSTM里面究竟有几个门,同样可以为所欲为。
在设计理念这一层,Keras实在像极了Scikit-learn,如果让Scikit-learn团队开发深度学习框架,很可能就是今天Keras这个样子。相比之下,Pytorch明显要更底层一点,很多具体的细节、机制,都必需要手工处理。
其实用Pytorch和Keras作比较是不合适的,Keras是前端高级库,Pytorch这边对标的,应该是FastAI才对。
现在我倒觉得,新版的《机器学习实战》分别用Scikit-learn和Keras来分别介绍机器学习和深度学习,实在是在合理不过的事。如果要我选择一款框架介绍深度学习,同时又要和Scikit-learn保持一致的风格,我也会选择Keras。