深度学习究竟怎么入门?两位Google大神掀起剑气之争
(本文经公众号“量子位”授权转载,转载请联系出处)
作为一名 华山派新弟子 深度学习新手,该先学会用框架快速搭出神经网络,用到实际问题中去,还是该先练习用Python基本徒手搭建模型,在小数据集上训练,了解它们的工作原理?
谷歌的两位研究员最近在Twitter上展开了一场旷日持久的争论,两派主要代表都是圈子里大名鼎鼎颇有建树的人物:
“气宗”代表 谷歌大脑的研究员David Ha(@hardmaru),SketchRNN的爸爸。
“剑宗”代表 谷歌研究员François Chollet(@fchollet),Keras的爸爸。
注: “气宗”“剑宗”无任何道德、派系等层面的影射,不要多心
剑气之争
这两位所争论的问题,正是 内力和剑法哪个更重要 深度学习新手的入门路径问题:了解模型的内部原理,和快速实现模型解决问题,哪个更重要呢?
量子位越洋围观了这场辩论,觉得他们的观点很值得搬回来让大家了解、思考一下。
在David Ha看来,想搞好深度学习,当然要先打基础,“练气”很重要。他在一个月前抛出了这样一个观点:
从零开始(用纯Python、numpy、甚至JS)实现全连接网络、卷积神经网络、RNN、反向传播、SGD,然后用小训练集来训练这些模型是一种学习神经网络如何工作的好方法。在跳到框架上之前,应该花时间从这里收获宝贵的直觉力。
新手入门,难道不该用最简单的高层框架吗?Keras作者Chollet就更支持初学者们先“练剑”。他对David的反驳是这样的:
实现神经网络能教你怎样实现神经网络,让你从算法上理解它们的工作原理。
但这不能教会你它们是做什么的,或者说能否实现哪些功能。要学习这些,你应该把它们应用到一系列真实问题上去(而不是XOR、MNIST)。
究竟谁更有道理?两位过招七八条Twitter,来详细论证自己的观点,看完再选适合你的方法也不迟。
以气驭剑
徒手搭模型,拿MNIST这样的小数据集、甚至XOR来琢磨其中奥妙,显然不是速成之法。那么,花这么多时间“打坐练气”的意义何在?
追求的,当然是一个以气驭剑。
David Ha说,深度学习框架都是些样板化的模型,入门就用框架,会限制眼界,让你泯然众人。
从零开始徒手搭模型就不一样了,对于那些跨行业入门深度学习的人来说,有机会从自己的独特视角,看到大多数人忽略的东西。
“气宗”不止David一人。李飞飞的得意门生、现任特斯拉AI总监的Andrej Karpathy也表达过类似观点。
他在斯坦福CS231n课上就要求学生将神经网络的向前和向后传递都用numpy实现一遍。学生当然有意见:拿个框架就能自动算的东西,我为什么要徒手来搭?
最重要的原因是,徒手将向前和向后传递都实现一遍才能真正理解其中的工作原理。如果单纯依赖框架的自动计算,在反向传播出现问题时就无法应对。
Karpathy为此专门写过博客一篇:
https://medium.com/@karpathy/yes-you-should-understand-backprop-e2f06eab496b
有些知行合一的实践者,说这样学习很有收获:
比如说Oculus VR的CTO John Carmack也在琢磨深度学习,前不久,不擅长休假的他花了一周时间专门休假闭关写代码(So…量子位休假应该闭关写稿😱)。
身为资深高阶码农,Carmack没装TensorFlow没用PyTorch,而是用C++从零开始写了一些神经网络实现,包括其中的反向传播,然后用MNIST做了一些实验。
他说经过这一番折腾,他对过度训练、泛化、正则化有了更好的深层理解。
BTW 插播一个推荐,Carmack作为一个不爱看视频课程的人,高度赞扬了斯坦福CS231n公开课。
还有更极致的。另一位资深码农Thomas Lahore说他当年入门机器学习时,故意先什么文献、课程都不看,自己思考了几个月,这段经历对他来说非常宝贵。
他们,都是David心目中基础扎实的好学生。David特别强调对背后原理的理解,他说这不仅有利于更快消灭bug,在现有范式之外进行延展解决新问题的时候也更有信心。
更重要的是,“(基本徒手搭个神经网络)真没那么难,又不是让你写个像Keras那样深思熟虑的框架出来。:)”
一招制敌
对于上面这种学习方法,Fast.ai创始人Jeremy Howard路过参与到话题中来,吐槽了“气宗”的最强大势力:高校里的计算机专业。
他说,计算机学位教育非要让人先从底层开始构建一堆东西,然后才能学习那些抽象的东西,结果他有很多朋友大一没读完就退学了。
枯燥,确实是徒手搭建神经网络的一大缺陷。
不过,Chollet对这种方法的反对是出于别的原因。这位大佬能造个Keras出来,当然不至于认为实现神经网络太难或者太枯燥,他觉得这种方法,实在不够学以致用。
招式内部原理分析得再清楚,不知道该用在哪儿,也是白搭。
Chollet举了很多例子来说明这一观点:
练习手写奇异值分解(SVD)有什么用?写完还是不知道SVD能干什么,把它用到各种数据集上看结果,才能获得直观的印象。
研究生们2000年就会用C语言写神经网络了,可是他们对神经网络的理解,可能还不如一名只会鼓捣框架的2018年高中生,毕竟现在有更多的应用环境。
现在很多人从没动手实现过,也对神经网络挺熟练的,知道这个东西如何工作。10年后,这样的人可能会占90%,就像现在的软件工程师了解操作系统,但基本都没开发过操作一样。
还来了一段现身说法:
“我2009年念书的时候,第一次用C语言写了神经网络,从中学到的C比神经网络多。后来又过了好几年我才开始理解神经网络能干什么,为什么有用。关键在于更好的工具+现实世界数据集上的应用。”
总之,时代在进步,下一代学的东西就是更抽象,不该拿老一套方法来要求学生们了。
他建议学生们去参加Kaggle竞赛,除了神经网络之外也用一用其他的机器学习模型,再通过可视化方法来探索其中的特征。
“剑招”已经打包好了。Chollet希望未来的学生们知道什么时候该出哪一招,对于内部的原理,其实不必深究。
要兼顾?
在Twitter上参与到这场争论中来的路人,支持哪一方的都有,当然,最多的观点是“都重要,要兼顾”。
不知道国内的小伙伴怎么看?
END
更多精彩:
全程中文!Google发布机器学习速成课,完全免费(附视听评测)
干货:教学论文福利哪里寻?精选40多张计算机教学模式图(快收藏)!
未来的所有新兴工作都需要软件工程师,《2017年美国新兴职业报告》这么分析!
计算机科学领域2017年度研究热点排行,最热的领域居然是这个!
喜讯:《计算机教育》跃居《中国学术期刊影响因子年报(人文社会科学)2017版》Q1区!