`
wx1568037608
  • 浏览: 33485 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

GloVe:另一种Word Embedding方法

 
阅读更多

若想深层地理解GloVe和本文,最好了解SVD, word2vec(skip-gram为主)的相关知识。
若仅寻求一种新的word embedding方法,可以不必了解以上前置知识。


一言以蔽之,GloVe的思想就是借鉴word2vec的pair-wise的方法以及其他一些trick来进行传统矩阵分解运算进而得到word vectors。

GloVe(Global Vectors for Word Representation)是斯坦福大学发表的一种word embedding 方法,GloVe: Global Vectors for Word Representation,它看起来很new,其实有着old school的内核。GloVe尝试借鉴NNLM和word2vec的优势来弥补旧方法的劣势,取得了不错的效果。该文发表于word2vec之后,其方法内核比较朴实和简单,实现也颇有粗暴之处。官方实验中,GloVe是略胜w2v一筹的,至于实际应用如何,还是建议再进行试验,或者作为一种算法补充。

个人实验中,GloVe是略逊于w2v的,不过一来是肉眼debug,二来场景并不是十分典型的NLP场景,故见仁见智,仍然建议再做实验再来定夺。

Word Representation 历史

自然语言处理(Natural Language Processing),曾经也叫做“Computational linguistics”。从名字就能看出,核心就在于让language变得computational,在可以计算的前提下,一切计算机/数学方法才得以使用。

这就是word representation的出发点,将language/paragraph/sentence/word/character 用数学形式来表示。目前通常采用的representation形式是向量形式。

简单梳理一下word representation的历史,了解各方法的背景和之间联系,有助于对word embedding有更好的理解,以及更好地理解GloVe。

Non-distributed Representation

One-hot Encoding

最简单的编码方式当然是one hot 形式,每个词独占一个维度,每个词向量 有一个维度是1,其他为0,词向量的维度是vocabulary的长度。
如句子'a dog is not a cat'中,按照one hot encoding,有:

vocab = ('a', 'dog', 'is', 'not', 'cat') 
a = [1, 0, 0, 0, 0]
dog = [0, 1, 0, 0, 0]
is = [0, 0, 1, 0, 0]
not = [0, 0, 0, 1, 0]
cat = [0, 0, 0, 0, 1]

One hot 编码的特点是假设所有的word互相独立,这是一个很强的假设,显然在有些任务中并不合适,如词语相似度方面,dogcat的相似度应当比dognot高,但是在one hot中,他们都是0。

One-hot的优缺点

One hot encoding的优点:

  • 至少让word 有了一个向量表示,让语言可以计算
  • one hot encoding 很稀疏,在一些对稀疏数据友好的问题(如部分分类问题)有比较不错的效果

One hot encoding的缺点:

  • 假设太强,许多NLP task不适用
  • 对大词库的language建模,向量维度太大,难以储存
  • 无法加入新词

在One hot encoding的缺点中,无法加入新词的原因是,一个维度只表达一个word的信息,一个word的信息也只由一个维度表达,满足这个映射特性的word representation叫做Non-distributed Representation, 也叫做Localist Representation。

Distributed Representation

与Non-distributed Representation相对地,有Distributed Representation的概念。Distributed Representation的意思是,描述language的向量是定长的(fix-length),在定长的向量中,一个语义信息可能由多个维度共同决定,一个维度也可能决定着多方面的语义信息。此时,word vector就比较稠密(dense),不再像one-hot encoding一样稀疏。

在这种表示方法下,word vector可以大大缩短向量长度,因此,通常得到Distributed Representation的word vectors的方法也叫做word embedding方法(直译即词嵌入,将word的语义信息嵌入fix-length的向量中)。

矩阵分解方法

以下内容需要线性代数和矩阵分解的相关知识
对推荐系统的矩阵分解算法有了解会更有利于理解这部分内容

Word都出现在document中,应用bag-of-words[5]或者sliding window,可以得到cooccurence matrix,如:
对于如下的三句话的语料:

  1. I enjoy flying.
  2. I like NLP.
  3. I like deep learning.

有 共现矩阵:

对该共现矩阵进行SVD分解[6][7][8]来降维。
SVD是一个常见的矩阵分解算法,其基本原理如下:

Datamn=UmmSmnRnnDatam∗n=Um∗m∗Sm∗n∗Rn∗n


奇异值类似主成分,在实际应用中,往往取top k个奇异值就能够表示绝大部分信息量,因此SVD经常拿来做损失较小的有损压缩:

Datamn=UmkSkkRknDatam∗n=Um∗k∗Sk∗k∗Rk∗n


SVD的几何意义实际上是通过线性变换来找到最能表达矩阵信息的一组正交基,原1*n维词向量在取得top k 奇异值后,可以用1*k维向量来表示该word,进而实现word embedding的效果。

 

如果想更深入理解SVD,推荐[6][7][8]三篇文章

用代码来实际跑一下:

import numpy as np  
import matplotlib.pyplot as plt  
la = np.linalg  
words = ["I","like","enjoy","deep","learning","NLP","flying","."]    
X=np.array([[0,2,1,0,0,0,0,0],
            [2,0,0,1,0,1,0,0],
            [1,0,0,0,0,0,1,0],
            [0,1,0,0,1,0,0,0],
            [0,0,0,1,0,0,0,1],
            [0,1,0,0,0,0,0,1],
            [0,0,1,0,0,0,0,1],
            [0,0,0,0,1,1,1,0]])    
U,s,Vh=la.svd(X,full_matrices=False)    
plt.axis([-0.8,0.2,-0.8,0.8])    
for i in xrange(len(words)):  
    plt.text(U[i,0],U[i,1],words[i])  
plt.show()  

结果如图下,可以看到,对三个句子的语料,已经有一点点语义距离的关系在里面了,比如enjoy和like在方向上是一致的,两个动词距离比较接近等等。

矩阵分解的优缺点

矩阵分解方法的优点是:

  • 训练速度很快
  • 能够实现word embedding

其缺点也很明显:

  • 因为仅关注cooccurence,word vector包含的词向量语义信息有限,仅仅能进行词语相似度计算等有限的任务。

NNLM 以及 word2vec

于是发展到了用language model来搞事情的时代。
word vectors是LM的副产品,本来LM是用来做language modeling的。
这个方法出奇的好,因为lm相当于做了sentence粒度的modeling,对词语在语义空间上的建模更充分。
更多的话题不详细展开了,也不是本文重点,注意nnlm和word2vec的几个关键:

  • 求解max log likelihood作为object func
  • pair-wise应用SGD的求解过程

他们的好处是:

  • 有了更多语言学层面的支撑,在更多NLP task上表现更好
  • pair-wise的求解对计算资源很友好

但是,也有一些缺点:

  • context 很小,没有使用全局的cooccur,所以实际上对cooccur的利用很少

GloVe

GloVe发明的初衷,就是想结合两者的长处,搞出一个充分利用统计量的更好train的适用程度更广的word embedding方法。

动机

我们注意到,在篇章中,语义距离相近的词,共现次数多,语义距离远的词贡献次数少。见图下:

然而可以看到的是,区分度不算高。于是想到,能否用共现之间的比值来增大区分度?
对于wordi,wordj,wordkwordi,wordj,wordk,应当有:

  • 如果ij很相关,ik不相关,那么P(j|i)/P(k|i)P(j|i)/P(k|i)应当很大
  • 如果ij很相关,ik也不相关,那么P(j|i)/P(k|i)P(j|i)/P(k|i)应当趋近于1

对应图上的数据,可以看到区分度已经好很多。

这就是GloVe的动机,对word-pair cooccur进行建模,拟合不同word-pair的cooccur之间的差异。

模型推导

根据GloVe的思想,我们关注:

F(wi,wj,w~k)=PijPjkF(wi,wj,w~k)=PijPjk

 

其中,取wordiwordi的出现次数为XiXi, 定义Pij=P(j|i)=Xij/XiPij=P(j|i)=Xij/Xi表示在XiXi的context下wordjwordj的出现几率, F则是某一种能够实现我们需求的变换。
wi,wjwi,wj是实数空间下的wordi,wordjwordi,wordj的word vector,wk˜wk~也是实数空间下的wordkwordk的context word vector,其作用类似word2vec中的context vector。

在word2vec中,context vector最终被舍弃,但是由于GloVe的context只有一个word,所以这个context word vector也是一个word vector的,更加有趣的是,后面可以看到,在GloVe中,公式是完全对称的,所以两个word vector理论上拥有同样的表示能力,是同一个语义空间下的word representation。

因为一个好的word vector应当是线性可加减的,因此对于word之间的差异,可以用减法来进行衡量,可以拍脑门一个公式,将FF对向量的约束缩小为FF对向量差的约束,这样易于计算,也比较解释得通:

F(wiwj,w~k)=PijPjkF(wi−wj,w~k)=PijPjk


现在,参数变少了。又,我们目前关注的是很单纯很美的线性关系,而word vector通常都很多维度,每个维度照理来讲,是有其语义含义的,像NN那样上百维的向量进行非线性变换,让维度和维度之间进行运算,会丢掉这种单纯的关系在模型中的作用,因此GloVe 拍脑门一个公式,不妨让两个向量点乘一下,在公式中就约束住维度的“纯正血统”,避免维度之间不必要的计算:

F((wiwj)Tw~k)=PijPjkF((wi−wj)Tw~k)=PijPjk


这样就避免了长向量的复杂运算丢掉模型初心的问题。

 

回到问题本身,我们是基于cooccur进行计算,实际上在一次共现中wordi,wordjwordi,wordj是同等地位的,那么对于一个合适的FF,更换word pair单词的顺序理应不影响输出结果,换言之,FF应当是对称的,一个合适的FF应当满足 F(wi,wj)==F(wj,wi)F(wi,wj)==F(wj,wi),当然现在的公式还不满足这一点,GloVe想了办法让公式变得符合预期。

首先,想要公式能够对称,先让其拥有结构不变性,可以给未知的FF一个新的约束,使FF是一个同态变换:

F((wiwj)Tw~k)=F(wTiw~k)F(wTjw~k)F((wi−wj)Tw~k)=F(wiTw~k)F(wjTw~k)

 

选择除法有几个原因,一个是这样的同态变换好找(exp就是这样一个变换),二是和(5)式在形式和参数上都能完美符合.

(5)式和(6)式相对应的,有:

F(wTiw~k)=Pik=XikXiF(wiTw~k)=Pik=XikXi


对于(6)式,我们很容易想到exp就是这样一个符合要求的变换:

F=expwTiw~k=log(Pik)=log(Xik)log(Xi)F=expwiTw~k=log(Pik)=log(Xik)−log(Xi)


我们将log(Xi)log(Xi)移到等式左边,它是wordiwordi的出现次数,是一个常量,和wordkwordk无关,因此可以归入wiwi的biasbibi中,为了保持公式的对称性,再加入wkwk的biasbkbk,公式变成:

wTiw~k+bi+b~k=log(Xik)wiTw~k+bi+b~k=log(Xik)


这个公式呢,就是我们从(3)式的初心出发,推导出的一个具有比较漂亮的对称形式的公式,式左是我们对word vector的运算,式右是一个共现常量。看起来非常棒,其形式跟LSE也有相似之处,不过不展开了。

 

很容易得到Object function,一个典型的square loss:

J=i,j=1V(wTiw~j+bi+b~jlog(Xij))2J=∑i,j=1V(wiTw~j+bi+b~j−log(Xij))2

 

当然此时还有问题,共现矩阵是很稀疏的,大部分共现都是0,需要合理的loss加权,对共现多的词给予更高关注,GloVe给了一个weighted square loss:

J=i,j=1Vf(Xij)(wTiw~j+bi+b~jlog(Xij))2J=∑i,j=1Vf(Xij)(wiTw~j+bi+b~j−log(Xij))2


加权函数 ff为:

f(x)={(x/xmax)αifx<xmax,1otherwisef(x)={(x/xmax)αifx<xmax,1otherwise


其图像如图:

 

意思是,在共现超过阈值后,其loss的权重维持在1.0的不变水平。当然,这也横生了两个超参:xmaxxmax 和 αα GloVe给的参考值分别为xmax=100,α=0.75xmax=100,α=0.75。

至此,GloVe推导完毕。过程到处充满了蛮横无理,最终形式倒出奇的还蛮好看。

两个词向量

上面说到,GloVe每个词涉及到两个词向量,一个词语本身的向量wiwi,一个词的context向量w~iw~i。最初这样设计,将word和context的向量分开,不用一套,是为了在更新参数的时候能够简单地套用SGD。
但是呢,我们可以看到,公式本身是对称的,context和word其实并没有什么区别。
那么两个向量应该是一样语义空间中的差不多的词向量,context word vector这个副产品自然不能落下,GloVe经过一番试验,最终发现,两个向量加起来最后起到的效果最好。

“这样损失了一些模型的可解释性,但是模型表现更好了”,助教在该校CS224N 2017 winter课程中如是说。

十分暴力,但无法反驳。

GloVe 和 其他模型的关系

当看到GloVe拍脑门找到loglog函数的时候,就觉得和word2vec中应用language model有几分类似。
其实确有千丝万缕的联系的,推一推,会发现两者的相似性,不过我写到这里懒得写了,更多的细节有兴趣可以自己琢磨下。

GloVe 使用

GloVe已经在github开源,源码以及binary可以在GloVe Github找到。
GloVe的代码写的比较糙,每一步是独立的程序,因此要按照以下步骤进行:

  1. 运行./vocab_count 进行词频统计
  2. 运行./cooccur 进行共现统计
  3. 运行./shuffle 进行打散
  4. 运行./glove 进行训练词向量

具体参数和word2vec比较类似,具体用法可以见
https://github.com/stanfordnlp/GloVe/blob/master/demo.sh

Reference

[1] (Paper) GloVe: Global Vectors for Word Representation
[2] CS224N Lecture 3 | GloVe: Global Vectors for Word Representation
[3] GloVe Github
[4] word co-occurrence and theory of meaning
[5] Bag-of-words_model
[6] 奇异值分解(SVD)原理详解及推导
[7] 强大的矩阵奇异值分解(SVD)及其应用
[8] We Recommend a Singular Value Decomposition

费尽心思写了一个自己不那么喜欢的模型感觉有些奇怪,不过这是一篇很励志的paper和算法,它告诉我两个道理:
1. 发吊文章不一定需要特别吊的算法,也可以在老算法上改进一下,没准就很厉害
2. 斯坦福的厉害人物偶尔也会划划水
当然GloVe本身很厉害,只是写完了文章,调侃一下。

分享到:
评论

相关推荐

    WordEmbedding源文件,写的清晰明了,供参考

    WordEmbedding是自然语言处理(NLP)领域中一种重要的技术,它将词语表示为向量,使得计算机能够理解和处理自然语言。这个压缩包包含了一个名为"TopicModel_Word2Vec.ipynb"的文件,这很可能是一个Jupyter Notebook...

    自然语言处理之动手学词向量(word embedding) 动手学词向量知识讲解 共101页.pdf

    - Glove (Global Vectors for Word Representation) 是另一种流行的词向量表示方法。 - Glove旨在解决Word2vec的一些局限性,如不能很好地处理词频率问题。 - **特点**: - Glove使用全局统计信息(如共现矩阵)来...

    word2vec的源码

    - **GloVe**(Global Vectors for Word Representation)是另一种词嵌入方法,结合了Count-based方法和分布假设,优化了Word2Vec的一些不足。 - **FastText** 是Facebook Research提出的模型,不仅考虑词序,还考虑...

    【ch11-循环神经网络】 时间序列表示.pdf

    另一种方法是使用预训练的词向量如Word2Vec或GloVe来初始化Embedding Layer,这可以加速模型训练过程,并且通常能提升最终的模型表现。 以上就是根据文件标题、描述以及部分内容生成的知识点总结。循环神经网络作为...

    从深度学习回顾自然语言处理词嵌入方法.pdf

    另一项重要进展是GloVe(Global Vectors for Word Representation),它结合了计数方法和预测方法的优点,通过最小化全局词共现矩阵的对数似然损失函数来学习词向量,旨在保留局部和全局统计信息。 近年来,随着...

    文本相似度的判定器。

    3. **编辑距离(Levenshtein Distance)**:这是一种衡量两个字符串差异的度量,通过计算将一个字符串转换成另一个字符串所需的最少单字符编辑(插入、删除或替换)数量。 4. **TF-IDF**: Term Frequency-Inverse ...

    文本相似度

    7. **词嵌入(Word Embedding)**,如Word2Vec或GloVe:这些方法将词汇转化为连续的向量表示,使得语义相近的词在向量空间中靠近。通过比较这些词向量的相似性,可以计算文本的相似度。 8. **段落向量(Paragraph ...

    深度学习视域下的文本表示方法研究.pdf

    向量空间模型(VSM)是另一种常见的文本表示方法,通过计算文本间的相似度来体现语义关系。尽管VSM在信息检索中广泛应用,但它仍然依赖于词频统计,对词汇的上下文关系处理不够精细。为了克服这一问题,主题模型如...

    词向量词向量词向量.doc

    SVD 是一种统计学方法,它通过对协方差矩阵进行分解来找到词语之间的内在联系。此外,还有基于迭代算法的方法,如Word2vec 和 GloVe。这些算法通过大规模语料库的学习,自动提取词语之间的语义关系,从而生成高质量...

    文本分类程序

    5. **文本聚类**:在文件名`textcluster`中,可能包含对文本进行无监督聚类的代码,这是另一种处理文本的方法,它不依赖于预定义的类别,而是根据相似性自动分组文本。 这个程序可能包含了以上所有步骤,用于从输入...

    SentenceDistance-master_聚类_

    常见的方法包括词袋模型(Bag-of-Words)、TF-IDF(Term Frequency-Inverse Document Frequency)和词向量(Word Embedding,如Word2Vec或GloVe)。 2. **杰斯卡距离(Jaccard Distance)**:这是一种衡量两个集合...

    基于seq2seq的聊天机器人,添加了人脸识别登录功能、聊天功能、AI写诗功能等.zip

    7. **词嵌入(Word Embedding)**: 如Word2Vec、GloVe等,将词语映射为连续向量,使得词汇之间的语义和语法关系在向量空间中得以体现。 8. **文本生成**: 包括诗歌生成、故事生成等,利用RNN、Transformer或VAE等...

    数据挖掘reuters21578

    近年来,随着深度学习的发展,如词嵌入(Word Embedding)如Word2Vec和GloVe,以及预训练模型如BERT和XLNet,reuters21578数据集也被用来训练和微调这些模型,以提升文本理解能力。 7. **挑战与扩展**: 尽管...

    NLP自然语言处理原理与实践

    机器翻译是将一种语言的文本自动转换为另一种语言;问答系统能回答用户提出的问题;而语音识别则涉及将口语转换为文本。 在NLP实践中,常见的方法和技术有基于规则的方法、统计方法和深度学习方法。基于规则的方法...

    NLP技术相关经典面试题

    - **机器翻译**:自动将一种语言翻译成另一种语言。 - **文本分类**:根据内容将文本归类到不同的类别中,如情感分析中的正面评价和负面评价。 - **命名实体识别(NER)**:从文本中识别出具有特定意义的命名实体,...

    基于深度学习的古诗生成(deep learning based Chinese poem generation.zip

    6. **门控循环单元(GRU)**:GRU是另一种解决RNN问题的模型,结构比LSTM简单,但在某些任务上表现相当。 7. **序列到序列模型(Sequence-to-Sequence, Seq2Seq)**:Seq2Seq模型常用于机器翻译,也可用于文本生成,由...

    自然语言处理及应用基础知识

    - **词嵌入(Word Embedding)**:这是一种更先进的词表示方法,通过将词映射到低维的连续向量空间中来表示词的意义。词嵌入不仅能够降低维度,还能有效地捕捉词与词之间的语义关系,从而提高诸如情感分析、机器翻译...

    training-tricks.zip

    5. 权重衰减(Weight Decay)与正则化:通过L1或L2正则化防止过拟合,权重衰减是L2正则化的另一种说法,能约束权重的大小,保持模型的简洁性。 6. Dropout:随机丢弃一部分神经元以降低模型依赖,防止过拟合。在...

    文本编码,简化机器学习训练前的文本编码转化工作.zip

    2. **词嵌入(Word Embedding)**:如Word2Vec和GloVe,它们通过预训练模型将每个词映射到一个低维连续向量空间,这种向量能捕获词汇之间的语义关系。 3. **字符级编码**:不以词为单位,而是将每个字符单独编码,...

    兜哥带你NLP入门(自然语言处理入门).pdf

    主题建模是NLP中的另一个重要主题,latent Dirichlet allocation(LDA)是一种常用方法,通过概率模型发现文本中的隐藏主题。在中文处理中,Jieba分词库可以帮助进行词性标注,它是中文文本处理的基础工具。 关键词...

Global site tag (gtag.js) - Google Analytics