一、基于统计的词向量
基于统计的词向量目的是,希望通过低维稠密向量来表示词的含义,例如:
在上面三个句子中,比如对于like这个词,在三个句子中,其左右共出现2次I,1次deep 和1次NLP,所以like对应的词向量中,I、deep和NLP维的值分别为2,1,1。
但这些预训练模型也存在不足:
词梳理很多时,矩阵很大,维度很高,需要的存储空间也很大
当词的数目是在不断增长,则词向量的维度也在不断增长
矩阵很稀疏,即词向量很稀疏,会遇到稀疏计算的问题
二、GloVe
- GloVe目标是综合基于统计和基于预测的两种方法的优点。
- 模型目标:词进行向量化表示,使得向量之间尽可能多地蕴含语义和语法的信息
- 流程:输入语料库--> 统计共现矩阵--> 训练词向量-->输出词向量
构建统计共现矩阵
表示上下文单词
代表单词
表示在特定大小的上下文窗口(context window)内共同出现的次数。这个次数的最小单位是1,但是 GloVe不这么认为: 它根据两个单词在上下文窗口的距离dd.提出了一个衰减函数(decreasing weighting): 用于计算权重,也就是说距离越远的两个单词所占总 计数(total count)的权重越小。
构建词向量和共现矩阵之间的关系
其中,
是我们最终要求解的词向量;
分别是两个 词向量的bias term
那它到底是怎么来的,为什么要使用这个公式?为什么要构造两个词向量
?
有了上述公式之后,我们可以构建Loss function:
loss function的基本形式就是最简单的mean square loss,只不过在此基础上加了一个权重函数,那么这个函数起了什么作用,为什么要添加这个函数呢?我们知道在一个语料库 中,肯定存在很多单词他们在一起出现的次数是很多的(frequent co-occurrences),那么我们希 望:
- 这些单词的权重要大于那些很少在一起出现的单词,因此这个函数要是非递减函数(non- decreasing);
- 但这个权重也不能过大,当到达一定程度之后当不再增加;
- 如果两个单词没有在一起出现,也就是
,那么他们应该不参与到loss function的计算当中 去,也就是f(x)要满足f(x)=0
为此,作者提出了以下权重函数:
实验中作者设定,并且发现
时效果比较好。
三、word2vec 和 glove 的区别
GloVe 与word2vec,两个模型都可以根据词汇的 "共现 co-occurrence" 信息,将词汇编码成一个向量。
两者最直观的区别在于,word2vec是 "predictive" 的模型,而GloVe是 "count-based" 的模型。
- Predictive的模型,如Word2vec,根据context预测中间的词汇,要么根据中间的词汇预测context,分别对应了word2vec的两种训练方式cbow和skip-gram。
- Count-based模型,如GloVe,本质上是对共现矩阵进行降维。首先,构建一个词汇的共现矩阵,每一行是一个word,每一列是context。由于context是多种词汇的组合,其维度非常大,我们希望像network embedding一样,在context的维度上降维,学习word的低维表示。这一过程可以视为共现矩阵的重构问题,即reconstruction loss。
Glove 和 word2vec 从算法实现的角度来说,它们区别在于loss的计算是不同的:
- 对于原生的word2vec,其loss是交叉熵损失;
- 对于Glove来说,其需要先构建一个共现矩阵X,其中的
表示
和
共同出现的次数,其loss为如下的公式:
f(x) 是一个权重函数,当 Xij 等于0的时候,f(x) = 0,并且当 Xij 过大的时候,f(x) = 1。
两个模型在并行化上有一些不同,即GloVe更容易并行化,所以对于较大的训练数据,GloVe更快。