Word2Vec、GloVe、FastText 词嵌入概述、算法原理、数据准备、训练过程、训练结果

795 阅读8分钟

Word2Vec

1、Word2Vec词嵌入概述

Word2Vec 是 google 在2013年提出 NLP 模型,它的特点是将所有的词表示成低维稠密向量,从而可以在词向量空间上定性衡量词与词之间的相似性。

2、算法原理

2. 1 Continuous Bag-of-Words (CBOW)

image.png

CBOW 给定目标单词的上下文(前c个词以及后c个词)预测该目标单词是什么,用条件概率来建模,模型是求:

image.png

对于给定的一句话w1,w2,w3...wT,该模型的目标函数就是最大化上式的对数似然函数:

image.png

· T: 句子长度

· wt: 要预测的目标单词

· c: 上下文大小

条件概率由 softmax 给出:

image.png

2.2 Skip-gram

image.png

skip-gram 模型与 CBOW 恰好反过来,它是在给定一个单词的条件下,预测其上下文单词最有可能是哪些。

给定一句话w1,w2...wT该模型的目标函数:

image.png

3、数据准备

100W+中文电影评论数据集

4、训练过程:

第一步是分词。用jieba对数据集进行分词

第二步是训练。将分好词的文本生成一个词汇表,每个词统计词频,按照词频从高到低排序,取最频繁的V个词,构成一个词汇表。将输入文本的每个词都生成一个one-hot向量,此处注意保留每个词的原始位置,因为是上下文相关的,确定词向量的维数N

CBOW的处理步骤:

  1. 确定窗口大小window,对每个词生成2*window个训练样本,(i-window, i),(i-window+1, i),...,(i+window-1, i),(i+window, i)

  2. 确定batch_size,注意batch_size的大小必须是2*window的整数倍,这确保每个batch包含了一个词汇对应的所有样本

  3. 训练算法有两种:层次 Softmax 和 Negative Sampling

Skip-gram处理步骤:

  1. 确定窗口大小window,对每个词生成2*window个训练样本,(i, i-window),(i, i-window+1),...,(i, i+window-1),(i, i+window)

  2. 确定batch_size,注意batch_size的大小必须是2*window的整数倍,这确保每个batch包含了一个词汇对应的所有样本

  3. 训练算法有两种:层次 Softmax 和 Negative Sampling

5、训练结果

神经网络迭代训练一定次数,得到输入层到隐藏层的参数矩阵,矩阵中每一行的转置即是对应词的词向量

GloVe

1、GloVe词嵌入概述

Glove模型是一种基于全局词频统计的词表征工具,通过对词的上下文关系建模来解释词的语义信息,其核心思想是意思相近的词通常出现在相似的语境中。

2. 算法原理

首先基于语料库构建词的共现矩阵,然后基于共现矩阵和GloVe模型学习词向量。

2.1、统计共现矩阵

设共现矩阵为X,其元素为Xi,j

Xi,j的意义为:在整个语料库中,词i和词j共同出现在一个窗口中的次数。

举个例子,设有语料库:我要去北京天安门

这个小的语料库只有1个句子,分词后变成5个词:我、要、去、北京、天安门

假设采用一个窗口宽度为3(左右长度都为1)的统计窗口,那么就有以下窗口内容:

窗口标号中心词窗口内容
0我、要
1我、要、去
2要、去、北京
3北京去、北京、天安门
4天安门北京、天安门

窗口0长度小于3是因为中心词左侧内容少于1个,同理窗口4长度也小于3

以窗口2说明如何构造共现矩阵:

中心词为去,语境词为 要、北京;则执行:

X去、要 += 1

X去、北京 += 1

先使用窗口将整个语料库遍历一遍,即可得到共现矩阵X。

2.2、使用GloVe模型训练词向量

模型代价函数:

image.png

ui、vj是词i和词j的词向量,W是词汇表的大小,条件概率Pij表示单词j出现在单词i语境中的概率;Pi,j=Xi,j/Xi , f是权重函数

在语料库中,肯定存在很多单词他们在一起出现的次数是很多的,但当共现频率过高时(这里人为设定一个频率阈值Pmax),权重不应过分增大,因此,权重函数使用如下形式的分段函数:

image.png

优化代价函数,进而得到我们要的中心词词向量矩阵U和上下文词词向量矩阵V

3. 数据准备

100W+中文电影评论数据集

4. 训练过程

第一步是分词。用jieba对数据集进行分词

第二步是训练。将分好词的数据集作为输入,先使用窗口将整个语料库遍历一遍,即可得到共现矩阵X。

然后采用随机梯度下降(SGD),步骤如下。

(1) 随机初始化U和V两个矩阵(维度都为N×d,d为词向量维数,N为共现矩阵中的词数)的所有元素值。

(2)对共现矩阵X中非零元素进行随机抽样

(3)在一次抽样得到的词对(i,j),计算代价函数对于ui和vj的梯度(记为Δui和Δvj)

image.png

其中Pij是可以直接通过共现矩阵中计算出来的,因此由Pij可以计算出f(Pij)和log(Pij)。

(4)每一次抽样得到的词对(i,j),对U和V矩阵中的Ui列和Vj列进行更新(假定学习率为η)

image.png

(5)不断迭代随机抽样和U、V的更新,直至指定迭代次数收敛,得到最终的词向量矩阵U和 V

5、训练结果

将U和V对应位置元素相加(或求平均)得到最终的词向量矩阵。

从原理上讲U和V是对称的,他们唯一的区别是初始化的值不一样,而导致最终的值不一样。这两者其实是等价的,都可以当成最终的结果来使用。但是为了提高鲁棒性,最终选择两者之和U+V作为最终的词向量矩阵(两者的初始化不同相当于加了不同的随机噪声,所以能提高鲁棒性)。

FastText

1、FastText词嵌入概述

fastText是Facebook于2016年开源的一个词向量计算和文本分类工具,在学术上并没有太大创新。但是它的优点也非常明显,在文本分类任务中,fastText(浅层网络)往往能取得和深度网络相媲美的精度,却在训练时间上比深度网络快许多数量级。

2、算法原理

fastText 方法包含三部分:模型架构、层次 Softmax 和 N-gram 特征。

第一部分:模型架构

fastText的模型架构类似于CBOW,两种模型都是基于Hierarchical Softmax,都是三层架构:输入层、 隐藏层、输出层。

image.png

CBOW模型又基于N-gram模型和CBOW模型,此模型将W(t−N+1)……W(t−1)W(t−N+1)……W(t−1)作为输入,去预测W(t)
fastText的模型则是将整个文本作为特征去预测文本的类别。

第二部分:层次之间的映射 将输入层中的词和词组构成特征向量,再将特征向量通过线性变换映射到隐藏层,隐藏层通过求解最大似然函数,然后根据每个类别的权重和模型参数构建Huffman树,将Huffman树作为输出。

image.png

第三部分:fastText的N-gram特征

常用的特征是词袋模型。但词袋模型不能考虑词之间的顺序,因此 fastText 还加入了 N-gram 特征。比如“我 爱 她” 这句话中的词袋(bag of words)模型特征是 “我”,“爱”, “她”。这些特征和句子 “她 爱 我” 的特征是一样的。如果加入 2-Ngram,第一句话的特征还有 “我-爱” 和 “爱-她”,这两句话 “我爱她” 和 “她 爱 我” 就能区别开来了。当然,为了提高效率,我们需要过滤掉低频的 N-gram。

3、数据准备

使用100W+中文电影评论数据集

4、训练过程:

第一步是分词。用jieba对数据集进行分词

第二步是训练。将分好词的文本生成一个词汇表,将词汇表中的每个词都生成一个one-hot向量,fastText的输入是多个词及其n-gram特征,这些特征用来表示单个文档,隐含层都是对多个词向量的叠加平均,输出这个词序列属于不同类别的概率,fastText采用了分层Softmax,大大降低了模型训练时间。

5、训练结果

输出词向量(也就是Huffman树进行分类时的参数 )