NLP获取词向量的方法(Glove、n-gram、word2vec、fastText、ELMo 对比分析)
自然语言处理的第一步就是获取词向量,获取词向量的方法总体可以分为两种两种,一个是基于统计方法的,一种是基于语言模型的。
1 Glove - 基于统计方法
Glove是一个典型的基于统计的获取词向量的方法,基本思想是:用一个词语周边其他词语出现的次数(或者说两个词共同出现的次数)来表示每一个词语,此时每个词向量的维度等于词库容量,每一维存储着词库对应序号的词语出现在当前词语周围的次数,所有这些词向量组成的矩阵就是共现矩阵。
我们也可以换一个角度来理解共现矩阵,共现矩阵就是两个词同时出现的次数,共现矩阵的i行j列的数值表示词库中第i个词和第j个词同时出现的次数,同时共现矩阵是对角线为零的斜对称矩阵。
大家可以通过下边这个例子来更直观的理解共生矩阵:
1.1 实现步骤
- 统计所有语料当中任意两个单词出现在同一个窗口中的频率,结果表现为共现矩阵 X
- 直接统计得到的共现矩阵 X,大小为 |V| x |V|(V=词库容量)
- 实践当中通常对原始统计矩阵施加 SVD(Singular Value Decomposition)来降低矩阵维度,同时降低矩阵的稀疏性
1.2 优点
- 训练速度快
- 充分利用了全局的统计信息
1.3 存在的问题
- 对于单一词语,只有少部分词与其同时出现,导致矩阵极其稀疏,因此需要对词频做额外处理来达到好的矩阵分解效果
- 矩阵非常大,维度太高
- 需要手动去掉停用词(如although, a,...),不然这些频繁出现的词也会影响矩阵分解的效果
2 基于语言模型的方法
按照语言模型的演进历史,大体可分为三类:文法型语言模型、统计语言模型、神经概率语言模型;文法型语言模型是人工撰写的语言规则,这里不做赘述
2.1 基于 n-gram 的语言模型
基于 n-gram 的语言模型是基于统计的语言模型,在NLP任务中,我们往往要计算一个句子出现的概率,通常的做法是:
1. 对于句中的每个词,计算在给定前边所有词的条件下每个词出现的条件概率:
2. 将每个词出现的条件概率连乘,从而得到当前句子出现的概率(当前句子对应词语组合出现的概率)公式如下:
但是上述方法有两个缺陷:
- 参数空间过大,概率 的参数有 O(n)O(n)O(n) 个。
- 数据稀疏严重,有些词同时出现的情况可能没有,组合阶数高时尤其明显。
为了解决上述问题,n-gram 模型使用n阶马尔可夫假设对上述 $p(s)$公式进行了简化处理,即用前 n-1 个词代替当前词前边的所有词计算当前词出现的条件概率,简化后的 $p(s)$公式如下:
每个单词出现的条件概率如下:
简单解释一下n阶马尔可夫假设:
- 简单来说,n阶马尔可夫假设的意思就是:符合马尔科夫过程的随机变量,当前状态只和前n-1个状态有关,即N阶马尔可夫假设认为,当前词出现的概率只依赖于前 n-1 个词
- 1阶马尔科夫假设当前状态只和当前状态有关,1阶马尔科夫假设不会考虑上下和当前次的关系,因此 n 一般大于1
这里插一嘴,笔者认为 虽然 n-gram 只用到了前 n-1 个数据,但是这前 n-1 个数据也是由前边数据得出的,因此 n-gram 也间接用到了前边的数据
2.2 基于神经网络的语言模型
基于神经网络的语言模型根据学习方法不同大体可以分为两大类,分别是 Feature-based 和 Fine-tune,其中 Feature-based 学习方法就是通过神经网络获取词向量 ,ELMO、fastText、word2vec、NNLM都是 Feature-based 模型的例子
详细了解Feature-based 和 Fine-tune 的区别请参考如下文章:#深入理解# NLP 中的 Feature-based 和 Fine-tune 两种学习方法blog.csdn.net/lch551218/article/details/115318811?spm=1001.2014.3001.5501
虽然 ELMO、FastText、Word2vec等都是获取词向量的模型,但是fastText、word2vec、NNLM 得到的是静态词向量,静态词向量不考虑上下文(对于不同语境下的同一单词给出的词向量是相同的),因此不能够解决一次多义的问题。
而 ELMO 等语言模型会根据词语的上下文的不同对同一词语给出不同的词向量,从而解决的一词多义的问题。
2.2.1 word2vec
word2vec 思想是训练一个神经网络,然后提取神经网络中的参数作为词语的词向量;训练网络的方式有两种,一种是cbow 一种是 skip-gram,前者是通过上下文词语预测中间词,后者是通过中间词预测周围词;哪种训练方法并不重要,我们也不会用这个模型去做预测,训练的目的是提取最终网络中的参数作为词语的词向量
2.2.2 fastText
fastText 设计之初是为了解决文本分类问题的,只不过在解决分类问题的同时 fastText 也能产生词向量,因此后来也被用来生成词向量。
fastText 和 word2vec 类似,也是通过训练一个神经网络,然后提取神经网络中的参数作为词语的词向量,只不过 fastText 训练网络的方法是对文本进行分类;此外 word2vec 的输入是多个词语的 noe-hot 编码,fastText的输入是多个单词及其n-gram特征;同时fastText为了解决类别过多导致的softmax函数计算量过大的问题,使用了层次softmax代替标准的softmax。
fastText 和 word2vec 最主要的区别如下:
- 输入增加了n-gram特征
- 使用 层次softmax做多分类
- 通过文本分类的方式来训练模型
2.2.3 ELMO
ELMO 模型是一个双向的动态语言模型,在给出词语的词向量时会考虑词语的上文和下文,从而解决word2vec所遇到的一词多义问题;
1、 ELMO得到词向量的过程
- 用通用语言模型(如word2vec、fastText、glove等)去训练一个静态词向量,ELMO内部使用 CNN-BIG-LSTM 语言模型得到的词向量,得到词向量的维度为 512
- 使用得到的静态词向量去训练ELMO网络
- 下游任务中使用词向量时,加载预训练的ELMO网络参数,根据当前上下文去动态调整词向量,从而得到一个动态的词向量。
2、 ELMO网络结构
上图展示的就是ELMO的网络结构,ELMO由两层网络组成,每层网络用于提取不同层级的特征;其中每层由两个方向相反的RNN网络构成(双向LSTM,简称BiLSTM),分别记录上文信息和下文信息
同时,为了保证网络的稳定,ELMO从最底层词嵌入层到第一层biLSTM输出层之间还有一个残差链接。
3. 得到ELMO的词向量
对于输入的第 i 个静态词向量(因为静态词向量通过 CNN-BIG-LSTM 得到,因此维度为512),ELMO最终会出输出1个静态词向量和两个动态词向量,分别是:
- $h(i,0)$:将两个输入的静态词(复制一份)向量拼接在一起,维度是512+512=1024,拼接的目的是为了和后边两个词向量的维度统一。
- $h(i,1)$:将ELMO第1层两个反向LSTM的输出拼接,维度是512+512=1024。
- $h(i,2)$:将ELMO第2层两个反向LSTM的输出拼接,维度是512+512=1024。
ELMo 中不同层的词向量往往的侧重点往往是不同的,输入层采用的 CNN-BIG-LSTM 词向量可以比较好编码词性信息,第 1 层 LSTM 可以比较好编码句法信息,第 2 层 LSTM 可以比较好编码单词语义信息。
ELMO 的作者提出了两种使用词向量的方法:
- 是直接使用最后一层 biLSTM 的输出作为词向量,即 $h(i,2)$ 。
- 更加通用的做法,将 $h(i,0)$ 、$h(i,1)$ 、$h(i,2)$ 三个输出加权融合在一起,公式如下。其中γ 是一个与任务相关的系数,允许不同的 NLP 任务缩放 ELMO 的向量,可以增加模型的灵活性。 $s_{j}^{task}$是使用 softmax 归一化的权重系数;此方法得到的elmo词向量可以看成是各层向量与初始静态词向量的ensemble
通过下面这张图片能形象地理解使用第二种方法获取词向量的过程:
4. ELMO优点
- ELMO的各层参数实际上就是为各种有监督的下游任务准备的,因此ELMO可以被认为是一种迁移学习(transfer learning)。
- 通过这样的迁移策略,那些对词义消歧有需求的任务就更容易通过训练给第二隐层一个很大的权重,而对词性、句法有明显需求的任务则可能对第一隐层的参数学习到比较大的值(实验结论)。总之,这样便得到了一份”可以被下游任务定制“的特征更为丰富的词向量。
5. ELMO缺点
- lstm是串行机制,训练时间长,从这一点来看ELMO注定成为不了大哥,
- 相比于Transformer,lstm提取特征的能力还是不够的,我觉得未来lstm可能会被淘汰,毕竟屁股决定脑袋,时间为上!
- ELMO 的两个RNN网络是分别计算的,导致计算时上下文的信息不会相互通信,进而导致ELMO得到的词向量有一定的局限性
- 输出的结果只是讲两个RNN网络得到的结果拼接在一起,上下文信息并不会相互影响
转载于:https://blog.csdn.net/lch551218/article/details/114836207