本文主要是介绍word2vec and glove优缺点,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
传统方法
-
假设我们有一个足够大的语料库(其中包含各种各样的句子,比如维基百科词库就是很好的语料来源)
-
那么最笨(但很管用)的办法莫过于将语料库里的所有句子扫描一遍,挨个数出每个单词周围出现其它单词的次数,做成下面这样的表格就可以了。
-
假设矩阵是5W*5W维,矩阵运算量巨大。假设矩阵的每个数字都用标准32位Int表示,需要10,000,000,000个byte,也就是10GB的内存(且随着词汇量增加程平方倍增长,汉语常用词汇大约有20万个)。
-
传统方法对于大规模语料,时空上的开销的难以接受。
-
可以通过SVD化简,SVD的几何意义实际上是通过线性变换来找到最能表达矩阵信息的一组正交基。
- 优点
- 训练速度很快
- 能够实现word embedding
- 缺点
- 因为仅关注cooccurence,word vector包含的词向量语义信息有限,仅仅能进行词语相似度计算等有限的任务。
- 优点
word2vec
-
所需要的基础知识
- Hierarchical Softmax是用输出值的霍夫曼编码代替原本的One-Hot向量,用霍夫曼树替代Softmax的计算过程。
- Negative Sampling(简称NEG)使用随机采用替代Softmax计算概率,它是另一种更严谨的抽样模型NCE的简化版本。
-
顾名思义,Word2Vec就是把单词转换成向量。它本质上是一种单词聚类的方法,是实现单词语义推测、句子情感分析等目的一种手段。
-
Word2Vec 的基本思想是把自然语言中的每一个词,表示成一个统一意义统一维度的短向量。
-
word2vec适合的情况就是对于一个序列的数据,在序列局部数据间存在着很强的关联。典型的就是文本的序列了,邻近的词之间关联很强,甚至可以通过一个词的上下文大概预测出中间那个词是什么。
-
选取训练后的单词向量的其中任意3个维度,放到坐标系中展示,会发现语义相似的词汇在空间坐标中的位置会十分接近,而语义无关的词之间则相距较远。这种性质可以用来对单词和句子进行更加泛化的分析。
-
一些研究还发现,计算有相似关系的单词之间的位移向量也会十分相似,例如从“Man”到“Wonman”的向量,与从“King”到“Queen”之间的向量几乎相同。
-
至于向量中的每个维度具体是什么意义,没人知道,也无需知道,也许对应于世界上的一些最基本的概念。
-
训练 Word2Vec 的思想,是利用一个词和它在文本中的上下文的词,这样就省去了人工去标注。
-
CBOW用环境词预测中心词,得到逻辑回归网络可以用来预测类似“一句话中缺少了一个单词,这个单词最可能是什么”这样的问题。
- 首先预处理数据,把所有需要进行训练的词汇编上序号,比如1-50000
- 随机初始化一个维度为50000x50的矩阵,作为待训练的嵌入矩阵
- 每次取出一个中心词和它的其中一个环境词(环境词市中心词前后的若干n个词,n越大效果越好,但速度越慢)
- 以环境词编号作行数,从词向量矩阵里取出这一行数据(50维向量)
- 将这个50维向量作为逻辑回归网络的输入,训练目标是中心词编号相应的One-Hot向量
在训练的反向传播时计算,不但更新逻辑回归网络的权重矩阵,还要往前多传递一级,把取出的50维向量的值也根据目标梯度进行更新 - 将更新过的50维向量重新更新到嵌入矩阵相应的行
- 重复以上过程,直到所有的中心词都已经被遍历一遍,此时嵌入矩阵值的计算就完成了
-
Skip-gram 训练方法,它的做法是,将一个词所在的上下文中的词作为输出,而那个词本身作为输入,也就是说,给出一个词,希望预测可能出现的上下文的词。
-
skip-gram 方法应用更广泛(训练数据较大时候效果比CBOW更好一点)
-
-
一个人读书时,如果遇到了生僻的词,一般能根据上下文大概猜出生僻词的意思,而 Word2Vec 正是很好的捕捉了这种人类的行为。
-
缺点:context 很小,没有使用全局的cooccur,所以实际上对cooccur的利用很少
GloVe
-
问题:词义相近的词对贡献次数多,词义差得比较远的词对共现次数比较少,但其实他们的区分度并不明显。能否用共现之间的比值来增大区分度?
-
Motivation:对word-pair cooccur进行建模,拟合不同word-pair的cooccur之间的差异。
区别
-
两者最直观的区别在于,word2vec是“predictive”的模型,而GloVe是“count-based”的模型。具体是什么意思呢?
-
不采用 negative sampling 的word2vec 速度非常快,但是准确率仅有57.4%。
- 只告诉模型什么是有关的,却不告诉它什么是无关的,模型很难对无关的词进行惩罚从而提高自己的准确率
- 在python的gensim这个包里,gensim.models.word2vec.Word2Vec默认是不开启negative sampling的,需要开启的话请设置negative参数,如何设置文档中有明确说明gensim: models.word2vec
- 当使用了negative sampling之后,为了将准确率提高到68.3%,word2vec就需要花较长的时间了(8h38m)
-
相比于word2vec,因为golve更容易并行化,所以速度更快,达到67.1%的准确率,只需要花4h12m。
-
由于GloVe算法本身使用了全局信息,自然内存费的也就多一些,相比之下,word2vec在这方面节省了很多资源
参考文献
白话Word2Vec——简书
CBOW训练过程例子
Word Embeddings
GloVe
这篇关于word2vec and glove优缺点的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!