学习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...)也剖析了一些学习上述材料时觉得不太容易的地方,欢迎交流。
如果你喜欢我的文章或分享,请长按下面的二维码关注我的公众号,谢谢!
学习Data Science/Deep Learning的一些材料的更多相关文章
- 贝叶斯深度学习(bayesian deep learning)
本文简单介绍什么是贝叶斯深度学习(bayesian deep learning),贝叶斯深度学习如何用来预测,贝叶斯深度学习和深度学习有什么区别.对于贝叶斯深度学习如何训练,本文只能大致给个介绍. ...
- Open Data for Deep Learning
Open Data for Deep Learning Here you’ll find an organized list of interesting, high-quality datasets ...
- 深度学习概述教程--Deep Learning Overview
引言 深度学习,即Deep Learning,是一种学习算法(Learning algorithm),亦是人工智能领域的一个重要分支.从快速发展到实际应用,短短几年时间里, ...
- 深度学习加速器堆栈Deep Learning Accelerator Stack
深度学习加速器堆栈Deep Learning Accelerator Stack 通用张量加速器(VTA)是一种开放的.通用的.可定制的深度学习加速器,具有完整的基于TVM的编译器堆栈.设计了VTA来 ...
- 深度学习阅读列表 Deep Learning Reading List
Reading List List of reading lists and survey papers: Books Deep Learning, Yoshua Bengio, Ian Goodfe ...
- 深度学习论文笔记-Deep Learning Face Representation from Predicting 10,000 Classes
来自:CVPR 2014 作者:Yi Sun ,Xiaogang Wang,Xiaoao Tang 题目:Deep Learning Face Representation from Predic ...
- 最实用的深度学习教程 Practical Deep Learning For Coders (Kaggle 冠军 Jeremy Howard 亲授)
Jeremy Howard 在业界可谓大名鼎鼎.他是大数据竞赛平台 Kaggle 的前主席和首席科学家.他本人还是 Kaggle 的冠军选手.他是美国奇点大学(Singularity Universi ...
- Anomaly Detection for Time Series Data with Deep Learning——本质分类正常和异常的行为,对于检测异常行为,采用预测正常行为方式来做
A sample network anomaly detection project Suppose we wanted to detect network anomalies with the un ...
- 深度学习框架Caffe —— Deep learning in Practice
因工作交接需要, 要将caffe使用方法及整体结构描述清楚. 鉴于也有同学问过我相关内容, 决定在本文中写个简单的tutorial, 方便大家参考. 本文简单的讲几个事情: Caffe能做什么? 为什 ...
随机推荐
- GERBER文件
GERBER文件 GERBER文件是一种国际标准的光绘格式文件,它包含RS-274-D和RS-274-X两种格式,其中RS-274-D称为基本GERBER格式,并 要同时附带D码文件才能完整描述一张图 ...
- SQL操作大全
下列语句部分是Mssql语句,不可以在access中使用. SQL分类: DDL-数据定义语言(CREATE,ALTER,DROP,DECLARE) DML-数据操纵语言(SELECT,DEL ...
- Freemarker 内置函数 数字、字符串、日期格式化用法介绍
在用FreeMarker过程中,感觉FreeMarker的字符串,日期,集合等处理能力还是很强大的,上网搜了一些资料,整理如下,以便能帮助大家更熟练的应用Freemarker完成项目开发. 一.Seq ...
- C# IGUID的生成
GUID(全局统一标识符)是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的.通常平台会提供生成GUID的API.生成算法很有意思,用到了以太网卡地址.纳秒级时间.芯片ID码和许多可 ...
- C2解题报告合集~
定时更新~ http://www.cnblogs.com/newbe/ http://www.cnblogs.com/newbe/p/4069834.html http://www.cnblogs.c ...
- WCF服务配置问题
上一篇中,我们主要是使用了代码来实现服务的自我寄宿.代码的实现稍微复杂些,不过还有些使用配置文件和配置工具的方法.下面来一一介绍下. 1.配置文件.首先在Host下添加个app.confi ...
- IO-02. 整数四则运算(10)
本题要求编写程序,计算2个正整数的和.差.积.商并输出.题目保证输入和输出全部在整型范围内. 输入格式: 输入在一行中给出2个正整数A和B. 输出格式: 在4行中按照格式“A 运算符 B = 结果”顺 ...
- poj 1806 分块模拟
Manhattan 2025 Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 1318 Accepted: 703 Des ...
- 使用curl 下载HTML
简单的一个curl小例子: #include <iostream> #include <string> #include <sstream> #include &l ...
- 我的ORM之十二 -- 支持的数据库及差别
我的ORM索引 支持最好的是SqlServer2005,Sqlserver2008,SqlServer2012 ,后续将支持:MySql,Sqlite,Oracle. 1.分页差别 MsSql 200 ...