Deep Learning在NLP领域的发展
三个阶段:
-
Word Embedding
-
Word2Vec
-
GloVe
-
-
RNN改进和扩展
-
LSTM/GRU
-
Seq2Seq
-
Attention/Self-Attention
-
-
Contextual Word Embedding
-
ELMO
-
OpenAI GPT
-
BERT
-
第一个阶段主要是Word Embedding包括word2vec和glove,可以通过无监督的预料学习到一个比较好的词向量,可以把一个词向量用于下游的任务从而提高模型的泛化能力。
第二个阶段主要是RNN的改进和扩展,包括LSTM和GRU对原始答案的改进,包括两个RNN组成的Seq2Seq能解决nlp里面的大部分问题,比如机器翻译、问答、摘要。Attention/Self-Attention是对Seq2Seq的进一步改进。
第三个阶段是考虑上下文的word embedding。
语言模型(nlp基本任务)
语言建模是根据给定的前一个单词来预测文本中的下一个单词的任务,预测句子概率。
任务:给定一个句子w,其中包括k个词,w1到wk。需要计算这个句子的概率,此处使用条件概率把他分解成条件概率乘积的形式:比如说先计算w1 的概率,然后在给定w1的情况下计算w2的概率,然后给定w1和w2来计算w3的概率,以及给定w1到wk-1来计算wk 的概率。在深度学习之前主流的语言模型是n-gram模型。但是这种模型缺少泛化能力。
word embedding
它是把词映射到一个稠密的低纬的空间,这样的映射使得语义上比较相似的两个词在语义空间的距离比较近,语义差别大的距离比较远。
word2vec可以学到一些词语间的关系。
word2vec使用的假设是分布式假设,它的意思是说如果两个词的上下文是相似的,那么他们的语义也是相似的。
- word2vec有两个基本的模型:CBOW和Skip-Gram。CBOW是利用上下文来预测中心词,Skip-Gram是利用中心词来预测上下文
- 词袋(Bag of Words)模型,最常用的方法是one-hot编码和tf-IDF。
词袋将文本看作一个无序的词汇集合,忽略语法和单词顺序,对每一个单词进行统计,计算词频。 但是问题是BOW的最大缺点是严重缺乏相似词之间的表达。
对于nlp来说,我们输入的是一个一个离散的符号,比如说是一些是字符的序列,或者说是一些单词的序列。对于神经网络来说,他处理的都是向量或者矩阵。所以我们第一步就是需要把一个词编码成一个向量。最简单的编码方式就是One-Hot Encoding。但是这种编码产生的结果是高维的稀疏的,这是缺陷。
词袋模型和word2vec都是将文本向量化的常用方法。
在word embedding编码的时候,一个词经常会有多个语义,如果强行将用一个向量来编码它的语义的时候,我们只能把这几种语义都编码到向量里面,但实际上句子里面的词一般只有一种语义。
像上述的情况可以用RNN、LSTM、GRU来解决。
用两个RNN组成Seq2Seq的模型。
由于词向量是不考虑上下文的,比如在编码bank的时候,只能把“银行”“水边”两个意思编码进去。
RNN可以解决这个问题,因为RNN有记忆能力,比如上图中在计算t时刻的一个隐状态时,除了考虑Xt(输入),同时也会考虑t-1时刻的隐状态,会把这两个组合起来才可以求出St(t时刻的隐状态)。同时在计算t+1时刻时,除了考虑t+1时刻的输入Xt+1,还会考虑t时刻的隐状态。
St是记忆了从开始到t时刻的所有语义,加入最后一刻是Sn,则可以认为是编码了整个句子的语义。所以RNN是具有记忆能力,同时具有上下文表示的能力。
最原始的RNN,神经网络大部分梯度下降或者反向传播来训练参数。我们需要把loss或者error 向前传递。由于梯度消失的问题,普通的RNN很难学到长距离的依赖关系。此时LSTM可以来解决这个问题。
LSTM通过门的机制来避免了梯度消失的问题。