学习Data Science/Deep Learning的一些材料
原文发布于我的微信公众号: GeekArtT.
从CFA到如今的Data Science/Deep Learning的学习已经有一年的时间了。期间经历了自我的兴趣、擅长事务的探索和试验,有放弃了的项目,有新开辟的路线,有有始无终的遗憾,也有还在继续的坚持。期间有数不清的弯路、失落,有无法一一道明的挫败和孤独,也有每日重复单调训练而积累起来的自信与欣喜。和朋友聊天让我意识到,将我目前所摸索到的一些材料和路径分享出来,使其他想要进入这个领域的人或者仅仅是兴趣爱好者能够少走一些弯路,大概是有些意义的。
因为Google Alpha Go的原因,Deep Learning成了一个火热的话题。然而,Deep Learning也仅仅是Machine Learning的一个细小分支;而Machine Learning中的很多发展、结论以及背后的本质思想,又是和statistics密不可分。过度关注Deep Learning而全然不顾Machine Learning的一些基本事实和其背后的一些statistics的动机,会让你仅仅是知其然,而无法达到知其所以然。更无法使你根据你所要解决的现实问题去调整、优化你的模型。仅仅是知道Deep Learning的过程,那是非常容易的,不过是在一堆线性的传播路径中加入一些非线性项,然后根据数据用gradient descent去更新参数罢了。然而,它们为什么可以起作用?哪些构架更有效?对于不同的问题,哪些非线性函数又更加有效?这就不是仅仅知道个过程就可以回答的了。你必须深入背后所隐藏的理论,通过不断地编写程序去实验、检验,才能够慢慢积累起一些直观,进而去探索、了解这些问题的答案。我不会允诺你任何的速成和捷径,因为那不符合人最基本的客观认识规律。但是,如果你真的很愿意进入这个领域,有着真正的热情,那么持续不断地每天至少3小时(考虑到8小时的工作时间无法撼动)的学习,3个月的时间应该能够让你建立起最起码的自信。
对于任何一个课题、一个领域、一个国家,想要真正了解它,你就必须了解它的运作方式和行事风格。而要了解这些看不见的运作方式和行事风格,你就必须了解它的文化。而要了解它的文化,你就必须了解它的历史。对于科学来说,其历史不仅仅是指一段历史的综述性介绍。更重要的是,你要亲自阅读那些重要历史节点的paper,去寻找最原始的idea是如何产生的。直接学习最前沿的材料,也许可以让你最快速地获取知识,让你能够立刻动手做事。因为这些材料已经经过了无数人的简化、优化和重组,让你可以用最快的速度进行吸收。然而,这些材料的一个缺陷在于,这些重组织会将最原始的想法抹去,只留下最后的完美建筑。所有的材料都是精巧的,然而你却找不到半点关于这个领域如何创建出来的线索(很多大师,诸如Gauss有着最强烈的这种癖好。更恶劣的代表是Laplace,不仅隐去行迹,还会加上一个注脚“容易得到”)。你完全不了解是什么启发了当初的创建者提出了这些思想,又是什么影响了期间的发展,使它变成现在这样。你又应该借鉴这背后的哪些想法和思想,去启发你对别的领域做出一些突破。所有这些线索都埋藏在历史的长河中。如果你无法耐住寂寞,脚踏实地去阅读历史节点的文献,去寻找背后的脉络,你对这个领域的认识和思考,就必然无法深入。这些基本的功夫,是之后一切发展的前提。
Deep Learning的发展史并不算太长,最早的关于backward propagation的文章First time back-propagation became popular发表在1986年。如果非要算上neural network的史前时期,第一篇关于感知机的文章Perceptron,也仅仅是在1957年,由Frank Rosenblatt发表。在这不长的历史中,这些历史节点的paper占据了最核心的地位。即便是今天的很多现代算法,比起它们“远古时期”的样子,也差不了多少。在这段30年左右的历史中,neural network却经历了几段波折和起伏。那些令人受挫的低潮期,就源自于人们对它以及它所代表的AI的过分期许。面对今天深度学习的又一次辉煌期,我们并不敢太确定,历史是否还会重演。而在这些冰河时期依旧坚持、并推动着neural network持续发展的人,就是今天供职于Google, Facebook以及Université de Montréal大学的Deep Learning的三巨头: Geoffrey E. Hinton, Yann LeCun, Yoshua Bengio。能够将一个领域从最低谷期救回来的人,必然无愧为巨头之称。因此,我以为,能够充分展现Deep Learning整体轮廓的paper必然是2015年由这三巨头发表在Nature杂志上的Review:Deep Learning。虽然Hinton声称,在这篇paper里你学不到什么实质性的东西。但是对于初学者来说,建立起对一个领域最初的正确观念至关重要。
Deep Learning能够再次复苏的关键性节点,是在2012年的ImageNet上取得显著性的胜利,Imagent classification with deep convolutional neural networks, Alex Krizhevsky, llya Sutskever, Geoffrey E Hinton, 2012。然而真正让人惊讶的是,这篇文章所论述的算法比起Yann LeCun在1998年发表的文章Gradient-Based Leanring Applied to Document Recognition只有些许的差别。如果你想了解Deep Learning背后的很多思想以及关键性决策的考虑,例如为何用精度更差的SGD而不是二阶、三阶的梯度更新算法。我强烈建议你去阅读这篇原始文献。我自己在阅读的过程中是受益良多的,甚至是那些附录也会带给你许多精细的洞见。
如今Deep Learning最擅长的三个领域分别是视觉分析,文本分析,语音分析。它们基本对应了Convolutional Neural Network(CNN), Long Short-Term Memory(LSTM)这些模型。从我个人的角度看,在你有了基本的Deep Learnig的基础后,进一步学习的复杂模型是CNN。因为你可以从中建立很多有用的直觉。例如,在Deep Learning中那些非常不自然或者说神奇的非线性项,在CNN中会有最直观的对应。甚至,它还可以提供给你生物上的解释,如何与大脑视觉皮质的结构相对应。(Visual Cortex Cell Recording, https://www.youtube.com/watch?v=Cw5PKV9Rj3o)
要学习CNN,除了之前Yann LeCun的历史性的paper之外,最好的材料当然是Stanford在2016年开设的cs231n。它是由Computer Vision领域的大师Fei-fei Li所带的博士Andrej Karpathy(目前在Elon Musk的OpenAI工作)和Justin Johnson共同开设。课程主页在http://cs231n.stanford.edu/。课程材料包括其在YouTube的视频以及在GitHub上的Assignments。作业设计非常用心,如果你能够认真阅读里面所有的源代码,你不仅仅会学会最基本的数据分析的技巧,还能够学会软件工程的思维方式,教你如何去重构你的代码,使他们更加清晰、更具备扩展性。另外,Andrej的blog(http://karpathy.github.io/)也非常优秀,对Deep Learning进行了各种深入浅出的论述。
学习LSTM,可以参考同样出自Stanford的cs224d,以及Colah的blog(http://colah.github.io/posts/2015-08-Understanding-LSTMs/)。
同是在2016年,由Andrew Ng主办,在湾区的Conference:Bay Area Deep Learning School 2016也是值得推荐的佳品。
在工业上,运用Deep Learning并不是直接从零开始去写代码,而是运用现成的,主要由Google、Facebook等公司维护的开源框架:Caffe, Torch, TensorFlow, Theano。这不仅是因为现成的框架更为成熟,更关键的是,这些成熟框架中会提供经过大量训练的良好参数。这些“训练”会运用到Google这样等级的大公司的海量高性能服务器。这些计算资源可不是普通人甚至是普通企业可以得到的。所以,如果能够直接使用由这些优质计算资源训练得到的模型参数,那是非常宝贵和重要的。
Caffe(caffe.berkeleyvision.org)由C++写成,创建者是现在任职于Google的Yangqing Jia。这是他在Berkeley读书时所写的项目。Caffe拥有出色的性能和模块化的代码,是非常值得运用和学习的框架。并且,很多最新的paper的实现都会发布在Caffe或者由Caffe的维护者重新实现,非常适合作为阅读paper的伴侣。
Torch由Lua写成,可以当做是C的脚本,其语言规范很像JavaScript。Facebook的很多最新研究都会发布在Torch之下(不知道是不是因为Yann LeCun的偏爱),并且Torch非常适合新手对Deep Learning的内部细节做调试。
TensorFlow已经是很出名了,由Google在2015年发布。短短一年时间已经成为了GitHub上最炙手可热的Deep Learning方面的项目。学习TensorFlow可以参看Google的Principal Scientist,Vincent Vanhoucke在Udacity上开设的课程Deep Learning。另外,我个人推荐学习keras,一个建立在TensorFlow和Theano之上的Python框架。keras具有更为直观的模块以及优秀的文档。对于初学者来说,直接深入专业级的TensorFlow是困难的,因为它可是经过了Google资深工程师的各种设计与优化,不太容易直接看出Deep Learning领域里的很多原始概念。所以,学习keras或许可以为你进一步学习TensorFlow提供一些帮助。
最后,再补充一些关于Machine Learning和statistics方面的材料。2016年由CMU开设的cmu 10-701是Machine Learning的phd课程,里面更加注重运用statistics的思维视角。其后续课程cmu 10-702则是更为高深的关于statistics的理论讲解,比较适合具备数学专业能力的人学习(因为里面涉及了泛函和测度的大量讨论,如果你觉得没什么的话,那就继续吧)。学习cmu 10-701并不是那么容易。里面的讨论几乎都基于statistic的角度,非常像Christopher Bishop的名著Pattern Recognition and Machine Learning(当然,这也是这门课所推荐的课程教材,并给予了“easy”的comment...好吧,至少我没有体会到其容易性)的风格。我个人会强烈建议,在学习这门课时要用CMU的老大Tom Mitchell在1997年所写的教材Machine Learning以及它的增补章节(http://www.cs.cmu.edu/~tom/mlbook.html)用作参考资料。我强烈怀疑,CMU如此坚实的统计风格,或许就是由Mitchell带出来的。另外,同样是CMU开设的另一门课Convex Optimization, 10-725也推荐一下。
如果你想学习一点分布式的Machine Learning,并且决定从Spark开始入手,那么Berkeley在edX上开设的Spark系列三部曲推荐给你:
-
BerkeleyX: CS105x Introduction to Apache Spark: https://courses.edx.org/courses/course-v1:BerkeleyX+CS105x+1T2016/info .
-
BerkeleyX: CS120x Distributed Machine Learning with Apache Spark: https://courses.edx.org/courses/course-v1:BerkeleyX+CS120x+2T2016/info .
-
BerkeleyX: CS110x Big Data Analysis with Apache Spark: https://courses.edx.org/courses/course-v1:BerkeleyX+CS110x+2T2016/courseware/d1f293d0cb53466dbb5c0cd81f55b45b/a8482182209e4148811ac58f68a6182f/ .
出色的课程,精炼的表达,以及值得深入学习的辅助源代码。
如果你还想多学一些关于parallel computation方面的课程,可以推荐Berkeley的课程cs267。这可是当年Caffe的作者Yangqing Jia所学,并且还启发了Caffe的设计想法的课程。
我自己技术方面的blog:kid551.github.io(VPN required...)也剖析了一些学习上述材料时觉得不太容易的地方,欢迎交流。
如果你喜欢我的文章或分享,请长按下面的二维码关注我的公众号,谢谢!