NLP学习(1)---Glove模型---词向量模型

一、简介:

1、概念:glove是一种无监督的Word representation方法。

Count-based模型,如GloVe,本质上是对共现矩阵进行降维。首先,构建一个词汇的共现矩阵,每一行是一个word,每一列是context。共现矩阵就是计算每个word在每个context出现的频率。由于context是多种词汇的组合,其维度非常大,我们希望像network embedding一样,在context的维度上降维,学习word的低维表示。这一过程可以视为共现矩阵的重构问题,即reconstruction loss。(这里再插一句,降维或者重构的本质是什么?我们选择留下某个维度和丢掉某个维度的标准是什么?Find the lower-dimensional representations which can explain most of the variance in the high-dimensional data,这其实也是PCA的原理)。

2、优点:充分有效的利用了语料库的统计信息,仅仅利用共现矩阵里面的非零元素进行训练,而skip-gram没有很有效的利用语料库中的一些统计信息。

3、发展过程:

词向量详细推导:https://blog.csdn.net/liuy9803/article/details/86592392

  (1)one-hot:

词向量的维数为整个词汇表的长度,对于每个词,将其对应词汇表中的位置置为1,其余维度都置为0。

缺点是:

  • 维度非常高,编码过于稀疏,易出现维数灾难问题;
  • 不能体现词与词之间的相似性,每个词都是孤立的,泛化能力差。

(2)向量空间模型VSM:

定义:在给定文档集合C和词典D的条件下,将某篇文档通过词袋模型表示成一个个的词,而后根据 TF-IDF 为每个词计算出一个实数值;

由于词典D的大小为M,因此将这篇文档转化成一个M维向量,如果词典中某个词未出现在文档中,则这个词的在向量中对应的元素为0,若某个词出现在文档中,则这个词在向量中对应的元素值为这个词的tf-idf值。这样,就把文档表示成向量了,而这就是 向量空间模型(vector space model)

而有了文档向量,也就可以用余弦公式计算文档之间的相似度了。

缺点:

  • 相对于onehot加入了tf-idf等信息,向量空间模型并没有catch住词(term)与词(term)之间的关系,它假设各个term之间是相互独立的。一些上下文信息丢失。
  • 在实际应用中,我们并不是直接使用 TF*IDF 这个理论模型,因为它计算出来的权重偏向于短文本因此需要某种平滑

举个例子来说,term1在docA中出现了3次,term2在docA中出现了9次,根据上面计算TF的方式,意味着:term2的tf权重(或者说重要性)比term1要大3倍,那真的是重要3倍么?因此,在Lucene的实际评分模型中,计算的是sqrt(tf),即通过 tf 开根号,起到一定的平滑作用。类似地,计算 idf 时,是取log对数,也是为了平滑。

词向量空间模型的主要思路是出现在类似的上下文环境中的单词在语义上很可能相似。例如,假如我们发现,“咖啡”和“喝”经常同时出现,另一方面,“茶”和“喝”也经常同时出现,那么我们可以推测“咖啡”和“茶”在语义上应该是相似的。则词向量维度为总上下文的词数量。【但如果词料数量很多,则会产生维度过高的问题】

(3)词嵌入:

神经网络将词汇表中的词作为输入,输出一个低维的向量表示,然后使用BP优化参数。

生成词向量的神经网络模型分为两种:

  • 一种的目的是训练可以表示语义关系的词向量,能被用于后续任务中,如word2vec;
  • 另一种是将词向量作为副产品产生,根据特定任务需要训练得到词向量,如fastText。

①学习的概率分布

Word2Vec:【其输出是单词同时出现的概率分布】

GLove:【相比单词同时出现的概率,单词同时出现的概率的比率能够更好地区分单词。】

比如,假设我们要表示“冰”和“蒸汽”这两个单词。对于和“冰”相关,和“蒸汽”无关的单词,比如“固体”,我们可以期望P冰-固体/P蒸汽-固体较大。类似地,对于和“冰”无关,和“蒸汽”相关的单词,比如“气体”,我们可以期望P冰-气体/P蒸汽-气体较小。相反,对于像“水”之类同时和“冰”、“蒸汽”相关的单词,以及“时尚”之类同时和“冰”、“蒸汽”无关的单词,我们可以期望P冰-水/P蒸汽-水、P冰-时尚/P蒸汽-时尚应当接近于1。

②目标函数:最小二乘

Word2Vec:【Word2Vec中隐藏层没有使用激活函数,这就意味着,隐藏层学习的其实是线性关系。】

GLove:【隐藏层使用比神经网络更简单的模型】
词向量是无监督学习少数几个成功的应用之一,优势在于不需要人工标注语料,直接使用未标注的文本训练集作为输入,输出的词向量可以用于下游业务的处理。

③优点:

    • 词向量是无监督学习少数几个成功的应用之一,优势在于不需要人工标注语料,直接使用未标注的文本训练集作为输入,输出的词向量可以用于下游业务的处理。
    • 词向量用于迁移学习:

(1)使用大的语料库训练词向量(或网上下载预训练好的词向量);

(2)将词向量模型迁移到只有少量标注的训练集任务中;

(3)用新的数据微调词向量(如果新的数据集不大,则这一步不是必须的)。

    • 词维度降低

虽然词向量是神经网络的输入,但并非第一层输入。第一层是词的one-hot编码,乘以一个权重矩阵后得到才是词向量化表示,而权重在模型训练阶段是可以更新的。

二、模型

推导过程:

 

三、Glove和skip-gram、CBOW模型对比

Cbow/Skip-Gram 是一个local context window的方法,比如使用NS来训练,缺乏了整体的词和词的关系,负样本采用sample的方式会缺失词的关系信息。
另外,直接训练Skip-Gram类型的算法,很容易使得高曝光词汇得到过多的权重

Global Vector融合了矩阵分解Latent Semantic Analysis (LSA)的全局统计信息和local context window优势。融入全局的先验统计信息,可以加快模型的训练速度,又可以控制词的相对权重。

我的理解是skip-gram、CBOW每次都是用一个窗口中的信息更新出词向量,但是Glove则是用了全局的信息(共线矩阵),也就是多个窗口进行更新

   https://blog.csdn.net/u012879957/article/details/82735057

  • 两者最直观的区别在于,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在这方面节省了很多资源

  • performance上差别不大。

    两个模型在并行化上有一些不同,即GloVe更容易并行化,所以对于较大的训练数据,GloVe更快。

 四、源码理解:

https://blog.csdn.net/weixin_36711901/article/details/78508798

https://github.com/stanfordnlp/GloVe/tree/master/src

https://zhuanlan.zhihu.com/p/28613493

  

 参考:https://blog.csdn.net/u014665013/article/details/79642083

http://zh.gluon.ai/chapter_natural-language-processing/glove.html

http://www.pengfoo.com/post/machine-learning/2017-04-11

https://www.jianshu.com/p/d0d5a828bcaa

原文地址:https://www.cnblogs.com/Lee-yl/p/11172255.html