MLP咱们就不说了,显然这个是要垫底的,在此不做讨论。MLP可以被视作一个分类器,单纯用它的话当然不如采用CNN/LSTM做特征提取/句子表示的方法来的好。
我们可以先来看几种典型的架构。
首先是最经典的Richard Socher和Andrew Ng的这篇Recursive Deep Models for Semantic Compositionality Over a Sentiment Treebank : https://nlp.stanford.edu/~socherr/EMNLP2013_RNTN.pdf
这是一个RNN的结构,当时出来的时候刷新了Sentiment Analysis的STOA成绩好几个点,引起了轰动(到现在Stanford CS224d/n DL4NLP的课,标题上的图还是用的这一篇,可见其经典地位)
其次是CNN+Dynamic Pooling。最近有一篇极好的review paper: Deep Learning applied to NLP: https://arxiv.org/pdf/1703.03091.pdf
再其次是CNN+LSTM。比如这一篇C-LSTM:A C-LSTM Neural Network for Text Classification : https://arxiv.org/pdf/1511.08630.pdf
大致思路是先使用CNN网络做局部特征提取/denoising,再用LSTM提取contextual dependencies。在这里,不采用Maxpooling:LSTM会以更优化的方式将句子不同部位的特征做一个非线性的组合。
最后一种,是将CNN当成RNN来用(有点像wavenet):Language Modeling with Gated Convolutional Networks: http://david.grangier.info/papers/2016/dauphin-lm-2016.pdf
值得一提的是,现在有趋势(这个主要是针对英文)直接使用char-cnn来做word embedding,比如MIT media lab的这一篇Tweet2Vec: Learning Tweet Embeddings Using Character-level CNN-LSTM Encoder-Decoder: http://soroush.mit.edu/publications/tweet2vec_vvr.pdf
另外,我们做这么多的工作其实就是为了从词的语义表示做到句子的语义表示。从这个角度来说,也有大量的非监督的方法来做sentence embedding,最后将这个embedding放进一个分类器即可。其中最有代表性的就是这两篇:skip-thought vector: https://arxiv.org/pdf/1506.06726.pdf
以及A Simple but Tough-to-Beat Baseline for Sentence Embeddings (ICLR’17): https://openreview.net/pdf?id=SyK00v5xx
OpenAI在前一段时间也发了一篇通过非监督的学习句子embedding发现”sentiment neuron”的文章,也挺有意思的:Unsupervised Sentiment Neuron: https://blog.openai.com/unsupervised-sentiment-neuron/; Learning to Generate Reviews and Discovering Sentiment :https://arxiv.org/abs/1704.01444
具体到任务来说:
情感分析的话,虽然最初是用RNN取得的突破,但目前CNN的效果就很好,LSTM做的话也是可以做到接近的程度但是会比CNN慢不少。直觉上,CNN主要是做了局部特征的提取,类似n-gram。一般而言在情感分析的任务中,带有显著情感极性的词组会对结果有比较关键的影响,所以CNN网络可以很好地工作。(具体文章上面已经有贴)
关系抽取的话,一般还是RNN工作地比较好,因为涉及到高阶的依赖关系,比如:End-to-End Relation Extraction using LSTMs on Sequences and Tree Structures: https://arxiv.org/pdf/1601.00770.pdf
当然,CNN依然是很有力的:Relation Extraction: Perspective from Convolutional Neural Networks :http://www.cs.nyu.edu/~thien/pubs/vector15.pdf
实体识别:这是一个典型的序列标注问题,用LSTM (Bidirectional LSTM for Named Entity Recognition in Twitter Messages: https://noisy-text.github.io/2016/pdf/WNUT20.pdf) /LSTM+CRF (End-to-end Sequence Labeling via Bi-directional LSTM-CNNs-CRF: https://arxiv.org/pdf/1603.01354.pdf) 是非常符合直觉的方法,当然也不乏有混用LSTM和CNN的(Named Entity Recognition with Bidirectional LSTM-CNNs: https://arxiv.org/pdf/1511.08308.pdf)
我们最后提一下多任务框架,这是一个很有力地解决NLP的多重任务之间互相依赖的方法。A Joint Many-Task Model: Growing a Neural Network for Multiple NLP Tasks: https://arxiv.org/pdf/1611.01587.pdf
一个model搞定大多数的NLP任务,再也不用东拼西凑一堆模型啦!神清气爽,有一种强迫症被治愈的感觉。
归根结底,现在深度学习应用到NLP上有非常多的手段,不过如您所知,all models are wrong, some are useful — 根据语言、数据集和任务的特点灵活运用才是关键,有时候调参一些小细节反而是比大的结构框架选择还重要的。在此祝您炼丹愉快!
本回答来自Emotibot机器学习科学家马永宁。