自然语言处理的第一步就是获取词向量,获取词向量的方法总体可以分为两种两种,一个是基于统计方法的,一种是基于语言模型的
Glove是一个典型的基于统计的获取词向量的方法,基本思想是:用一个词语周边其他词语出现的次数(或者说两个词共同出现的次数)来表示每一个词语,此时每个词向量的维度等于词库容量,每一维存储着词库对应序号的词语出现在当前词语周围的次数,所有这些词向量组成的矩阵就是共现矩阵
我们也可以换一个角度来理解共现矩阵,共现矩阵就是两个词同时出现的次数,共现矩阵的i行j列的数值表示词库中第i个词和第j个词同时出现的次数,同时共现矩阵是对角线为零的斜对称矩阵
大家可以通过下边这个例子来更直观的理解共生矩阵
统计所有语料当中任意两个单词出现在同一个窗口中的频率,结果表现为共现矩阵 X
直接统计得到的共现矩阵 X,大小为 |V| x |V|(V=词库容量)
实践当中通常对原始统计矩阵施加 SVD(Singular Value Decomposition)来降低矩阵维度,同时降低矩阵的稀疏性
按照语言模型的演进历史,大体可分为三类:文法型语言模型、统计语言模型、神经概率语言模型;文法型语言模型是人工撰写的语言规则,这里不做赘述
基于 n-gram 的语言模型是基于统计的语言模型,在NLP任务中,我们往往要计算一个句子出现的概率,通常的做法是:
但是上述方法有两个缺陷:
4. 参数空间过大,概率 p(wt|wt-1…w1) 的参数有 O(n)O(n)O(n) 个。
5. 数据稀疏严重,有些词同时出现的情况可能没有,组合阶数高时尤其明显。
为了解决上述问题,n-gram 模型使用n阶马尔可夫假设对上述p(S)公式进行了简化处理,即用前n-1个词代替当前词前边的所有词计算当前词出现的条件概率,简化后的p(S)公式如下:
p ( w t ∣ w t − 1 , w t − 2 , . . . , w 1 ) ≈ p ( w t ∣ w t − 1 , w t − 2 , . . . , w t − n + 1 ) p(w_t|w_{t-1}, w_{t-2}, ..., w_1) \approx p(w_t|w_{t-1}, w_{t-2}, ..., w_{t-n+1}) p(wt∣wt−1,wt−2,...,w1)≈p(wt∣wt−1,wt−2,...,wt−n+1)
简单解释一下n阶马尔可夫假设:
- 简单来说,n阶马尔可夫假设的意思就是:符合马尔科夫过程的随机变量,当前状态只和前n-1个状态有关,即N阶马尔可夫假设认为,当前词出现的概率只依赖于前 n-1 个词
- 1阶马尔科夫假设当前状态只和当前状态有关,1阶马尔科夫假设不会考虑上下和当前次的关系,因此n一般大于1
这里插一嘴,笔者认为 虽然 n-gram 只用到了前 n-1 个数据,但是这前 n-1 个数据也是由前边数据得出的,因此 n-gram 也间接用到了前边的数据
基于神经网络的语言模型根据学习方法不同大体可以分为两大类,分别是Feature-based和Fine-tune,其中Feature-based学习方法就是通过神经网络获取词向量 ,ELMo、fastText、word2vec、NNLM就是Feature-based典型的例子
详细了解Feature-based 和 Fine-tune 的区别请参考->#深入理解# NLP 中的 Feature-based 和 Fine-tune 两种学习方法
虽然 ELMo、FastText、Word2vec等都是获取词向量的模型,但是fastText、word2vec (其实NNLM也能得到词向量)得到的是静态词向量,得到的词向量不考虑上下文(对于不同语境下的同一单词给出的词向量是相同的),因此不能够解决一次多义的问题。
而 ELMo 等语言模型会根据词语的上下文的不同对同一词语给出不同的词向量,从而解决的一词多义的问题。
word2vec 思想是训练一个神经网络,然后提取神经网络中的参数作为词语的词向量;训练网络的方式有两种,一种是cbow 一种是 skip-gram,前者是通过上下文词语预测中间词,后者是通过中间词预测周围词;哪种训练方法并不重要,我们也不会真正用这个模型去做预测,我们的目的是提取最终网络中的参数作为词语的词向量
fastText 设计之初是为了解决文本分类问题的,只不过在解决分类问题的同时 fastText 也能产生词向量,因此后来也被用来生成词向量
fastText 和 word2vec 类似,也是通过训练一个神经网络,然后提取神经网络中的参数作为词语的词向量,只不过 fastText 训练网络的方法是对文本进行分类;此外 word2vec 的输入是多个词语的 noe-hot 编码,fastText的输入是多个单词及其n-gram特征;同时fastText为了解决类别过多导致的softmax函数计算量过大的问题,使用了层次softmax代替标准的softmax
fastText 和 word2vec 最主要的区别如下:
ELMo 模型是一个双向的动态语言模型,在给出词语的词向量时会考虑词语的上文和下文,从而解决word2vec所遇到的一词多义问题;
上图展示的就是ELMo的网络结构,ELMo由两层网络组成,每层网络用于提取不同层级的特征;其中每层由两个方向相反的RNN网络构成(双向LSTM BiLSTM),分别记录上文信息和下文信息
同时,为了保证网络的稳定,ELMo从最底层词嵌入层到第一层biLSTM输出层之间还有一个残差链接。
对于输入的第 i 个静态词向量(因为静态词向量通过 CNN-BIG-LSTM 得到,因此维度为512),ELMo最终会出输出1个静态词向量和两个动态词向量,分别是:
ELMo中不同层的词向量往往的侧重点往往是不同的,输入层采用的 CNN-BIG-LSTM 词向量可以比较好编码词性信息,第 1 层 LSTM 可以比较好编码句法信息,第 2 层 LSTM 可以比较好编码单词语义信息。
ELMo 的作者提出了两种使用词向量的方法:
参考文章:
8. 吾爱NLP(5)—词向量技术-从word2vec到ELMo
9. 一文总结词向量的计算、评估与优化
10. #深入理解# NLP 中的 Feature-based 和 Fine-tune 两种学习方法
11. 动态词向量算法—ELMo