深度自学

这两年常有朋友问我该怎么学习deep learning,要我推荐资料。为了省事,全都总结在这里吧。

首先推荐Ian Goodfellow Yoshua Bengio等人合作的新书。两位都是大神,Bengio是我最喜欢的学者,他的研究领域涵盖了DL所有的方向,而且在每个方向都做得非常顶尖;Goodfellow因为提出了这两年大热的GAN也一战封神。这本书涵盖了所有最fundamental的东西,强烈推荐。

但是仅仅看书还远远不够。

 

DL是个很新的学科,理论和实践一直在迅猛的迭代和更新。很多事情(例如, ICML2017最佳paper引发的关于深度学习网络泛化理论的争论)最好的学者也不能达成共识;曾经惊艳的RBM auto encoder decoder, 在算法大跨步进步的今天已经显得过时;更有甚者,最近Google Mind的一篇Attention is All YouNeed,隐隐然是要用inter/intra attention+position革现如今大红大紫的RNN的命。基于此,如果只是满足于读书,不知不觉你会跟最新的DL脱节。

所以我推荐读paper和读各种自媒体(博客,微信公众号,知乎都包括在内)

第一推荐看paper,我认为没有比看paper更好的快速提高自己的自学途径。

我在2012DL刚开始火起来的时候开始学习DL,那时候很希望有一本专门的教材。苦于没有书,所以才被迫一篇篇的看论文,不知不觉发现获益匪浅。如果像今天一样很容易就能看到大神写的书,恐怕没有动力去一篇篇啃paper,更没法把所有的知识融会贯通,获得比较深刻的理解。

举个例子,很多初学者搞不清Word2Vec为什么能产生有意义的embedding,不理解为什么可以用周围的词预测中间的词(cbow),或者用中间的词"预测"周围的词(skip-gram),为什么可以通过反向传播,得到有语义学意义的词向量表示。

答案全都在论文中。Mikolov的原论文的第一篇引文就是Yoshua Bengio的《A Neural ProbabilisticLanguage Model》。这篇论文才是真正的里程碑式的工作,它最早利用language model的反向传播产生了embeddings,而这些embedding可以认为是在预测下一个词语时的副产品。从这个角度上看,它和Word2Vec相比只是被预测的词语位置不同而已。如果可以接受利用预测下一个词,顺便产生其他词的表征,那么利用预测中间词,顺便产生其他词的表征这个做法就不会显得特别突兀了。

顺便说一句,Word2Vec这篇论文之所以大热,不仅仅是因为其原创性,(论在word embedding原创性,我认为时间上较早的Bengio和其后继其他几人更突出。印象中embedding这个词最早也是由Bengio他们提出),而是因为其非深度的架构带来的计算效率上的极大提升,从而在工业界得到了广泛应用。想再更进一步的看清Word2Vec的本质,推荐另一篇论文Yoav Goldberg“Neural Word Embedding asMatrix Factorization”。他通过一系列推导,得出的结论是:Word2Vec就是一个变种的(偏移的PMIMatrix Factorization --- MF,或者说SVDPCA对我们来说并不陌生。

第二推荐各种网络资源。paper的缺点是有时候学术性太强,对自学者不够友好。好在网上的很多资料(课件,博客等等)可以在很大程度上弥补这些缺陷。paper为了发表必然需要有足够的学术性,但是太学术了对时间有限的业余爱好者来说不一定是好事。转而依赖一些网上的资料可以避免耗费不必要的时间。举个例子,关于这两年火的一塌糊涂的GAN,前一段有篇论文《Wasserstein GAN》很好的分析了原论文计算方法的不足之处。我本来没有看到过这篇论文,偶然在微信上看到转自知乎的《令人拍案叫绝的Wasserstein GAN》(作者郑华滨),对这篇论文进行了很好的科普,看了以后我立即就拍案叫绝了。怀着极大的兴趣,我找来了原论文,发现学术性较强,定理证明了一大堆。还多亏有这篇科普文章,省去了大量的阅读时间。

基于以上两点,我下面针对最fundamentalDL的方面推荐材料,希望能帮助大家尽快入门。我一直以为自己是NLP工作者,自认为对这方面的论文了解较多,但是对Computer Vision(以下简称CV)不算熟悉,所以以下推荐偏NLP另外声明,网上的牛人非常非常多,有的人本来就是专业选手(比如李菲菲的高徒,写得一手好博客的Andrej Karpathy), 有的是天才横溢的业余选手(比如Kevin Frans),他们贡献了非常非常多的好的学习资料。我的推荐仅限于我非常有限的业余阅读,难免挂一漏万,不足之处请兜着。


1. General
DL理论上的概述

     a.
刚才提到的《Deep Learning作者:Ian Goodfellow, YoshuaBengio, Aaron Courville  

     b.我偶像Yoshua Bengio的综述文章:

    Learning DeepArchitectures for AI 2009

   Representation Learning:A review and new perspectives2012

    c. Deep Learning教父Geoffrey Hinton Coursera课程Neural Networks forMachine Learning
      
youtube上搜的到。他的课常常有对问题直觉的解释,很精彩。缺点是课程时间较早,内容稍嫌老旧,专业性略强。

     d. Richard SocherStanfordDL课程Intro to NLP with DeepLearning》。我今年才在youtube上发现这个内容相当丰富视频。Richard Socher是一流的NLP专家,也是一流的presenter。这里强烈推荐这套课程给热爱DL@NLP的有志青年。它的亮点是对word2vec的原理和代码的讲解,以及,对重要的用于NLP的各种DL网络/方法的介绍。(在最后几个lecture他着重讲了ReNN (recursive neuralnetwork)。这是他博士期间的工作,把语法分析植入到树形结构中,从而产生对句子的理解,这是语言学和统计学在深度学习很好的一次结合,在学术界很有名气。但是我不推荐花时间去掌握这些,因为它毕竟不是NLP的主流。可以先跳过。)


   
注意:以上推荐的资料可能会包含一些较为过时,或不够流行的内容。比如a, b, c中的RBM, auto encoderdecoder,  这几年一些计算方法发展起来以后,这些方法略显老旧;比如d中的ReNN,由于标注耗时且难度大,在工业界不够主流。从最有效的时间分配角度考虑,可以先跳过不学。如果真的有兴趣了解,我还是推荐先了解auto encoder decoder。有篇好的论文可以看看:《What RegularizedAuto-Encoders Learn from the Data Generating Distribution

2. Word Embedding
   
DL@NLP的话就一定得了解Word Embedding, 当然最有代表性的方法就是大名鼎鼎的Word2Vec
   
以上已经提过几篇论文,兹列如下:

    a. Mikolov
的原始论文

   DistributedRepresentations of Words and Phrases and their Compositionality

    Efficient Estimation ofWord Representations in Vector Space

    b.前面提过的《A Neural ProbabilisticLanguage Model by Yoshua Bengio et. al.
    
这个是DLlanguage model 中应用的祖先文章(2003年)
    
听说有公司开始拿Word2Vec当面试题了。如果遇到这种问题,淡淡的告诉他这个事儿咱得从2003年开始捋。:)

     c.Neural Word Embedding asMatrix Factorizationby Yoav Goldberg et. al.
     
如前所述,Word2Vec在文章中被解释为一变种PCA。这个重要的insight面试的时候也可以拿来用。

     d.
还有其他的一些技术也能同样以unsupervised的方式产生embedding,最著名的比如
      Stanford
Chris Manning Glove:《Global Vectors for WordRepresentation

     直觉上GloveMF联系更紧密些。在学术圈,GloveWord2Vec各自产生的embedding可以同时作为输入层给supervised neural network。仿照CV里的术语,它们被称为不同的channel


        word embedding
能够非常好的表征每个词语,但是难度在于如何表示一个句子或者段落。如果简单的求平均可能导致噪音太多,精确度下降。

 

        大致来说,有两大类方法可以很好的处理这个问题,一类属于unsupervised方法,直接产生整句或段落的表征。另外一类属于supervised方法,很多网络结构,比如LSTM CNN(+LSTM) ReNN等等都可以在产生句子的表征。笼统的说,第一类方法通用性强,可以放在各种不同任务中使用;第二类方法因为有针对性(有 label),效果更好。

以下34是对这两大类方法的推荐阅读:

 

3. unsupervised sentence/paragraph/docembedding

   

    a.DistributedRepresentations of Sentences and Documents by Quoc Le et. al.
   
这是篇早期的paragraph/doc embedding的文章,二作就是word2vec之父Mikolov本人。作为这方面的鼻祖文章,该paper一直被之后的同类文章各种引用。
   
他们训练出来的paragraph vector可以作为输入用于多种tasks,效果也很不错。缺点是traininginference的时间比较长。

    b.Bags of Tricks for TextClassification (Mikolov去年的又一大作Fast Text)

   word2vec方法惊人的相似---word2vec中被预测的中间词替换成sentence/paragrah vector就可以了。而且一样利用了浅层网络,有力的体现了Mikolov大师的极简风格。文中指出尽管理论上深度网要远远强于浅网络,但在sentiment analysis这样的简单NLP问题上也许并不易体现二者的差别。

       

     c.  Skip-Thought Vectorsby Ryan Kiros et. al.
   
从网络结构上看,属于RNN encoder-decoder  问题的构造方法上又像 word2vec里的 skip-gram
   
这种创新方式在DL里很常见,不同方法或结构的杂交常常有好的收获。

4. RNN/LSTM/GRU

   RNN/LSTM/GRUNLP领域可以说是如日中天。刚才说了,word embedding能够非常好的表征每个词语,但是问题在于该如何利用它们表示一个句子或者段落。循环神经网络就是另一大类方法的代表。具体来讲,人们常常用word embedding来表征词语作为输入层,接下来利用RNN逐词压缩信息,最终整句的信息被压缩在最后一个RNN cell的输出里。可是在实际的模型训练中人们发现gradientvanish或者explode。为了解决它人们提出了各种技术,其中就包括LSTM和后来的GRU

    a.首先,如何理解RNN的缺点?强烈推荐下面这篇论文:

    On the difficulty oftraining recurrent neural networksby Razvan Pascanu et. al.
       LSTM
之父Jurgen Schmidhuber的原始论文因为理论性太强,我就在这里略过了。那篇文章好几十页的干货,我反正是看晕了。作为替代,在这里强烈推荐这篇文章。它的精妙之处在于一上来就对RNN的数学表达式进行了改造,之后的数学推导变得异常的顺利,简单漂亮的证明了exploading/vanishinggradients问题。

    
    b. colah's blog
LSTM结构的讲解。《Understanding LSTMNetworks
   
地址: http://colah.github.io/posts/2015-08-Understanding-LSTMs/

   论文往往学术性强而通俗性弱,网络资源例如个人的自媒体是有益的补充。这篇博客图文并茂,深入浅出。

    c. Andrej Karpathy的博客The UnreasonableEffectiveness of Recurrent Neural Networks

    Karpathy好像发了一篇同名的paper。他的这篇博文科普性挺强,主要研究了一下char-rnn。他把char-rnn用在了莎翁小说,维基,甚至Latex脚本上,作了很有意思的实验。

 

    d.Sequence to SequenceLearning with Neural Networksby Ilya Sutskever

  最早的把LSTM应用在machine translation文章,此后也是被其他文章各种引用。  

    e.LSTM的缺点也很明显,一是把所有的信息压缩于encoder最后一个cell难度太大,在处理一些复杂度高的问题时,常常力不从心,比如machine translation问题。二是作为sequence model不适合并行化,速度上存在瓶颈。后来的研究者创造了attention model去有效的对齐目的语言和源语言,再后来又有人利用attention+position vectors去取代整个LSTM结构,效果也很好。DL@NLP方面的发展进步很快,令人振奋,我希望将来有机会能介绍一下attention model。因为内容不属于fundamental,这里就不做推荐了。

5. Convolutional NeuralNetwork  
     CNN
是计算机视觉发展出来的网络结构和技术,属于我不熟悉的领域(说的好像我很熟悉NLP似的),我就少说几句不误人子弟了。
    
不过,我还是想推荐一些很好的网络资源:

    a. Stanfordcs231nConvolutional NeuralNetworks for Visual Recognition》课件。

       最早是Andrej KarpathyFeifei Li助教的时候写的。
       
它的好处是很详细的讲解了convolutional filter这些技术。比如用动图解释convolutional filter的作用机制,以及阐述清楚每个参数是如何计算出来。这就是网络资源的好处。很少有paper会给出这样仔细的解释。

 

    b.如何直觉上理解convolutional filter的作用?很多网上资源做出了详细的解释,这里随便抓两个:

   A Beginner's Guide toUnderstanding Convolutional Neural Networks地址:
     https://adeshpande3.github.io/adeshpande3.github.io/A-Beginner%27s-Guide-To-Understanding-Convolutional-Neural-Networks/
    
作者是Adit DeshPande
     WildML
上的一篇UnderstandingConvolutional Neural Networks for NLP地址:
     http://www.wildml.com/2015/11/understanding-convolutional-neural-networks-for-nlp/

    作者是Denny Britz

    c.应用:

     5b中的《UnderstandingConvolutional Neural Networks for NLP》后半段指出了好几篇利用CNNNLP问题的文章,都很有代表性,推荐。
    
如果觉得引用的论文太多了看不过来,推荐看这一篇时间较早的文章:《Convolutional Neural Networks for SentenceClassification by Yoon Kim

     

    d.补充一下,如果想深入了解DL@computer vision,顺着ILSVRC的历史读paper是个好办法。一部DL@computer vision的发展史,简直就是一部ILSVRC(俗称ImageNet)竞赛史(今年好像是最后一届了)。而且,很多影响很大的方法,最初都是在Computer Vision领域创造出来,进而应用到NLP领域。比如CNN,比如下文将要介绍的dropout, batchnormalization, resnet等等。这里有篇文章总结了历史上好的Computer Vision方面的paper,作者还是Adit DeshPande
地址: https://adeshpande3.github.io/adeshpande3.github.io/The-9-Deep-Learning-Papers-You-Need-To-Know-About.html

 

6.计算方法(drop out ,  batchnormalization,  ResNet)

    a. dropout

   Dropout - A Simple Way toPrevent Neural Networks from Overfitting by Nitish Srivastava et.al.

    抛开技术不谈,我很喜欢这种文章它从实验结果到理论的解释都很丰富。有些技术上的进步极大的推动了DL的发展,dropout就是这样,可以说自问世以来,渗透于DL的各个应用场景。

 

   b. batch normalization

 Batch Normalization Accelerating DeepNetwork Training by Reducing Internal Covariate Shiftby Sergey Ioffe et. al.

   dropout问世之后唯一敢号称可以取代dropout的方法(paper就这么明示的)如今batch normalization(时常配合以dropout)简直成了DL训练的标配。
   
这里有一篇科普文章介绍batch normalization,地址:https://gab41.lab41.org/batch-normalization-what-the-hey-d480039a9e3b 作者 Karl N.

   c. ResNet

   Deep Residual Learningfor Image Recognitionby Kaiming He
    
这篇文章是我这几年来读到的最好的一篇文章,没有之一。我到今天都能够体会到阅读它时内啡肽愉快的分泌。:)
    
文章问了一个很简单的问题:为啥在训练的时候不断增加网络深度会导致精度下降?这是个令人困惑的问题,因为在最保守的情况下,哪怕高层的网络一直都保持identity mapping都不至于导致表现更差。为了让网络学会这个构造解,作者干脆采取了一个很“Naive”的做法去处理,即直接让网络的每一层学习理想的高阶mapping和原输入之间的残差(语言上表述比较晦涩,还是建议看原论文)。这初看上去是换汤不换药,因为数学形式上完全是等价,网络本身也并没有因为这一简单的trick而变得更加强大。但是,神奇的是,残差竟然比原mapping更加好学习!这种简单的改进竟然得到了惊人的实验结果(该论文背后的工作赢得了2016年的ImageNet冠军)。
    
科研做到这个程度根本就是返璞归真。我们不是总能遇见这样的好文章的。

 

7.没有介绍的内容,和DL编程框架

    DL上达成共识,有标配的方面我就不赘述了。比如hidden的神经元我们常ReLu,比如优化方法我们默认用adam等等

   关于优化方法,我个人觉得懂不懂这些不是太影响应用,而真的要去学这些东西,可能要花费大量的时间。
   
顺带说一句DL的开发框架。
    Tensorflow
毫无疑问是最火的,功能开发的齐全社区也大。
   
不过我还是想向初学者推荐Keras,它可以提供深度网络的高级接口,使用非常方便,而且把业界最常用的标准做法全部作为自己的默认值(比如LSTM forget gate的默认值为1),能够最大程度上解放程序员。其作者Francios Chollet已被google招安,而且tf已经采用Keras作为自己的一个module,可见被认可程度。当有一天对DL了解比较多,有余力去关心细节时,再学习tf也不迟。

   
AI火热的今天,自学DL比在DL崭露头角的2012年要方便很多。今天我们有各种渠道方便的了解到DL最新的进展,而且网络上的资源也远比过去要丰富。即使不用arxiv,不去上NIPS, ICML, ICLR的官网,我们也能在微信公众号(机器之心,新智元)和头条上看到优秀论文的介绍。学习DL Paper+网络资源是最佳组合。希望这篇文章能帮助到你。

 

Enjoy Reading !

 


关注公众号《没啥深度》有关自然语言处理的深度学习应用,偶尔也有关计算机视觉


  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值