神经网络和深度学习的学习路线

从去年暑假开始接触神经网络,自己研究的方向是基于深度学习的自然语言处理,在这个过程中,接触了许多教程、论文、编程框架,断断续续,今天把前段时间学习过的内容、学习路线稍微总结一下,也为刚刚接触神经网络的朋友提供一些可借鉴的参考。

入门级教程

Neural Network and Deep Learning

说到神经网络入门的教程,首推哈工大SCIR的微信公众号的一个教程,这是他们团队从国外翻译过来的:【《神经网络与深度学习》连载】,已经连载更新完毕。如果你英文程度不错,也可以直接阅读英文原版【Neural Network and Deep Learning

这个教程的好处在于,它有实打实的源码例子供我们运行:https://github.com/mnielsen/neural-networks-and-deep-learning

它的例子是针对手写字体识别的,数据集是经典的MNIST数据。

UFLDL教程

UFLDL,全称为Unsupervised Feature Learning and Deep Learning,即无监督的特征学习和深度学习。这个教程是斯坦福大学出品,吴恩达主持出品,良心保证,有中英文。

英文教程地址:http://ufldl.stanford.edu/wiki/index.php/UFLDL_Tutorial

中文教程地址:http://ufldl.stanford.edu/wiki/index.php/UFLDL教程

内容比较多、比较杂,我个人是重点看了【神经网络】、【反向传导算法】、【softmax回归】以及【处理大型图像】的内容,【处理大型图像】主要讲的是卷积神经网络CNN,而CNN也能应用于自然语言处理。

总之,哈工大和斯坦福的这两个教程我是结合着一起看的,入门也花了点时间,结合代码看可能会理解更透彻。

自然语言处理教程

用深度学习来弄自然语言处理,首先要向量化文本,这里比较出名的是google出品的word2vec。它可以根据你给的大量语料,训练出一种词语表达方式,用一个几百维的向量来表示一个词语,这样,就方便了词语的数学化表征。

52NLP给出了用word2vec训练中英文维基百科的详细步骤:http://www.52nlp.cn/中英文维基百科语料上的Word2Vec实验

这个博客挺好的,有很多自然语言处理相关的文章。

深度学习教程

有了神经网络的基础,就可以继续看深度学习的模型了。基于自然语言处理,我看了cnn和rnn、lstm和gru这些模型。

CNN模型

我看了这篇论文:《Convolutional Neural Networks for Sentence Classification》,里面有实验,代码在这里:https://github.com/yoonkim/CNN_sentence,跑的是关于影评句子情感分类的例子。需要用到训练好的word2vec数据,https://code.google.com/archive/p/word2vec/ 有的下载,即页面上【Pre-trained word and phrase vectors】,是300维的、谷歌用100万亿左右单词的新闻预料训练好的词向量。

网上很多中文教程基本上都是翻译这篇论文的,可以结合着一起看。

RNN模型

rnn模型是公认的比较适合自然语言处理的模型。

首推【The Unreasonable Effectiveness of Recurrent Neural Networks】这篇博文,一个简单的rnn就能生成效果良好的语言模型,即,通过你给出的语料,训练出和你语料风格类似的句子、语言。作者用他的模型,训练了莎士比亚的作品、linux源码等等,都有令人惊讶的效果。

对应的源码在这里:https://github.com/karpathy/char-rnn  是用lua实现的,如果你对python比较熟悉,可以看:https://gist.github.com/karpathy/d4dee566867f8291f086 (貌似要翻墙)。由于是这个模型是char by char的,直接处理中文可能有问题,我作了一些更改,可以跑中文,训练了一下唐诗,挺好玩的,下次贴上来。

其次可以看RNN的系列教程:【RECURRENT NEURAL NETWORKS TUTORIAL】,有RNN,LSTM和GRU,也有对应的代码实现:https://github.com/dennybritz/rnn-tutorial-rnnlm ,是基于python的,有theano的实现过程。

另外,关于LSTM,【Understanding LSTM Networks】 这篇博文讲的很棒。

深度学习框架

我平时用python比较多,所以接触的框架基本上是python的。

theano

官方文档:http://deeplearning.net/software/theano/

配置是个麻烦事,多搜索,多尝试,总能配成功。

我对这个框架还不是很熟悉,它的编程模式和一般的不太一样,不过熟悉了这种框架之后,能很方便的对你的模型进行修改。

TensorFlow

官方文档:https://www.tensorflow.org/

中文文档:http://www.tensorfly.cn/

谷歌出品,没用过,暂不评价。不过强大。

keras

theano和tensorflow的高级封装,用python实现,适合快速实现模型。

官方文档:https://keras.io/

中文文档:http://keras-cn.readthedocs.io/en/latest/

 

还有很多别的框架,就不一一介绍了。

10-fold CV是什么意思

今天在看《Convolutional Neural Networks for Sentence Classification》这篇论文的时候,在实验部分看到了这样的一个表格(摘取两行数据):

Data c l N |V| |Vpre| Test
MR 2 20 10662 18765 16448 CV
SST-1 5 18 11855 17836 16262 2210

关于表头,论文给出了注释:

c: Number of target classes. l: Average sentence length.
N: Dataset size.
|V|: Vocabulary size.
|Vpre|: Number ofwords present in the set of pre-trained word vectors.
Test:Test set size (CV means there was no standard train/test splitand thus 10-fold CV was used).

关于最后的一个Test,即测试数据集,说是由于没有标准的测试集,所以用一个10-fold CV来代替。

那这个10-fold CV到底是什么来的。

查了下资料,10-fold CV也就是10-fold cross-validation,是一种交叉验证的方法,最简单的解释就是,将数据集分成10份,轮流将其中9份用于训练,1份用于测试,循环10次,求最终准确度的平均值。

依此类推,k-fold CV亦是如此。

所以我下载的http://www.cs.cornell.edu/people/pabo/movie-review-data/rt-polaritydata.tar.gz 这个数据集,由于没有验证测试集,所以就用10-fold CV 这种方法来做了。