CS224N学习笔记(三)—— 高级词向量表示

一、GloVe模型

基于统计的词向量模型以基于SVD分解技术的LSA模型为代表,通过构建一个共现矩阵得到隐层的语义向量,充分利用了全局的统计信息。然而这类模型得到的语义向量往往很难把握词与词之间的线性关系(例如著名的King、Queen、Man、Woman等式)。
基于预测的词向量模型则以基于神经网络的Skip-gram模型为代表,通过预测一个词出现在上下文里的概率得到embedding词向量。这类模型的缺陷在于其对统计信息的利用不充分,训练时间与语料大小息息相关。不过,其得到的词向量能够较好地把握词与词之间的线性关系,因此在很多任务上的表现都要略优于SVD模型。

既然两种模型各有优劣,那么能不能二者各取其长,构造一个更强大的词向量模型呢?

在GloVe的原始论文里,作者首先分析了Skip-gram模型能够挖掘出词与词之间线性关系的背后成因,然后通过在共现矩阵上构造相似的条件,得到一个基于全局信息的词向量模型——GloVe模型。

1.1 统计共现矩阵

共出矩阵其实很容易理解,假设现在有共现矩阵为 X,则 X_i,j 的意义就是在整个语料库中,单词 i 和单词 j 共同出现在一个窗口中的次数。

例如有语料库:i love you but you love him i am sad

这个小小的语料库只有1个句子,涉及到7个单词:i、love、you、but、him、am、sad。
如果我们采用一个窗口宽度为5(左右长度都为2)的统计窗口,那么就有以下窗口内容:

以窗口5为例说明如何构造共现矩阵:
中心词为love,语境词为but、you、him、i,则:

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

1.2 使用GloVe模型的原理

如果想利用全局的统计信息的话,那么必然需要将其纳入到词向量的训练过程中,最直接的方法当然是构建包含全局统计信息的损失函数。那么,该如何构建呢?

首先我们考虑共现矩阵的信息能不能用另外的方式来表示,使得我们可以通过网络学习。

如上面的共现矩阵表示形式,X_{i,k}表示了词 k 和 词 i 所在的上下文中出现的次数,X_i 表示以词i为中心的上下文的所有词,那么我们就可以得到:

单词k出现在单词i语境中的概率

使用同样的计算过程,我们可以得到单词 k 出现在单词 j语境中的概率。通过将两个概率相除,便可以得到如下结果:



通过研究最后一行的可以看出,这个比值很好地反应了词之间的关系:

也就是说,只要我们使用网络,让其学习这个概率,那么最后学习得到的词向量也就包含了共现矩阵的全局统计信息。

所以,现在的问题也就转化成了如何用网络或者说设计损失函数学习这一规律。

由这些信息直接构建损失函数有点困难,那么干脆我们由果索因,如果我们有这么一个网络可以做到我们所设想的事情,那么它比如可以写出如下的式子:

g函数就是我们的网络,也就是说,我们最后学到网络必然应该使得上式尽可能成立。那么,最自然的想法就是用差值来衡量两者的相近程度:

但这样的包含3个单词的损失函数是极难训练的,所以比如需要对g函数做一定的优化。

首先考虑的是 v_i, v_j 直接的关系,可以想象由于 v_iv_j 之间的差异才会使得上述规律存在,那么网络在学习用 v_iv_jv_k 作为输入得到 ratio_i,j,k 时,必然会学习 v_i, v_j之间的差异,那么我们直接先用式子表示出v_i,v_j之间的差异不就可以减少网络学习的难度了吗?

由于词向量具有线性关系,也就是说向量空间是内在的线性结构,所以表示 v_i, v_j 之间的差异最自然有效的方法就是做差。(PS:其实我觉得这边做差其实也就是为了简单,因为神经网络是一个很强的非线性模型,所以其完全可以在学习过程中修正只是做差所带来的差异。也就是说,我们这边做差只是帮网络简化了其学习过程,否则它可能还要试试更多的四则运算从而才能找到最后的结果。与其这样,不如我们直接就给出一个相对比较正确的差异表示方法,从而节省一些没必要的尝试过程)

又因为考虑到 ratio_{i,j,k} 是一个标量,而 v_iv_jv_k 都是向量,那么从向量到标量最直接的方法也就是点乘:

这样我们也就表示出来g函数,但是仔细一看,这个损失函数还是很难训练。那么接着考虑,我们可以看出 ratio_{i,j,k} 是一个除法结构,那么作为等式的另一边,必然也应该可以表示成这样的除法结构。于是考虑通过引入exp函数做到这样的操作:

然后就发现找到简化方法了:只需要让上式分子对应相等,分母对应相等。

通过观察可以发现,分子分母的形式是相似的,也就是说我们完全可以通过统一的形式来学习:

注意:这边下标表示替换了一下,与上面的表示方法并不相同,不要对号入座

通过对两边去对数,我们可以将损失函数简化成:

但仔细深究就会发现这个损失函数是有问题的,由上述推导可以得到:

对于这样的向量乘法来说,互换下标不会改变其最后的结果,但P互换则不相等。我们将P_{i,j}展开可以得到:

我们发现前一项刚好下标互换不会改变结果,那么我们可以学习这一项:

于是损失函数就变成了:

该损失函数的一个主要缺点为它认为所有的共现词权重相等,即使很少出现或没有出现的词,所以为了克服这一缺点,使用了加权最小二乘回归模型。也就是说基于出现频率越高的词对其权重应该越大的原则,在损失函数中添加权重项,于是代价函数进一步完善:

具体权重函数应该是怎么样的呢?
首先应该是非减的,其次当词频过高时,权重不应过分增大,作者通过实验确定权重函数为:


二、fastText 模型

写在前面的话:fastText的分类模型和词向量训练模型是不一样的,网上很多博客把分类模型作为词向量训练模型来讲(PS:本人就被误导得很惨,幸好及时发现)

2.1 基本原理

fastText的词向量训练模型并不复杂,就是在原来的word2vec上加入的子词信息,理解了子词,基本上fastText的词向量训练模型就掌握了。(子词其实在后面的词向量模型和NLP预训练模型中都有用到)

什么是子词呢?例如对于where这个词,如果我们对这一个词使用n-gram模型,那么若n为3时,我们可以得到<wh, whe, her, ere, re>(fasttext模型中会对一次词添加上<>符号,也就是说原来的where这个词在fastText的表示中会变成<where>的形式)。另外,其实还会再加上整个词<where>作为一个特殊的子词。也就是说,在训练词向量的时候,每一个词都会变成一个子词集合加入训练,而不是原来单词的一个词。最后在表示一个词的词向量时,通过将子词向量直接加和即可得到词向量。

其训练过程基本和之前的word2vec一致,虽然同样可以采用cbow和skip-gram两种方式,但官方提到在实践过程中skip-gram模型对于子词信息的处理比cbow更好:

在对fine进行词向量训练时

但是对每个词都加入其子词信息会导致所需资源过多,为了有效地减小子词规模,fastText使用hash映射的方法,这也是一种常用的trick,这里就不展开介绍了,有兴趣可以参考:Hash Trick

2.2 子词

fastText的词向量训练模型和传统word2vec模型最大的不同就是在子词的引入上,那么子词信息的引入可以带来什么优势呢?

首先,自然是对词的结构的学习。考虑到词根、词形等特殊结构,如果和传统的word2vec一样只将词作为一个整体来学习,那么就很容易丢失掉这些信息,这是相当可惜的。另外,由于是通过对一个词使用n-gram模型得到子词之后再得到的词向量,所以若在实际使用中出现一个从未出现过的词,便可通过这个新词的子词组合来获得词向量。


参考:

  1. CS224n笔记3 高级词向量表示
  2. http://www.ijiandao.com/2b/baijia/89997.html
  3. https://blog.csdn.net/sinat_26917383/article/details/54847240
  4. https://www.jianshu.com/p/2acc49549af6
  5. glove 学习笔记
  6. word2vec以及GloVe总结
  7. https://www.cnblogs.com/iloveai/p/cs224d-lecture3-note.html
  8. https://fasttext.cc/docs/en/unsupervised-tutorial.html
  9. 论文:Enriching Word Vectors with Subword Information
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,417评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,921评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,850评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,945评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,069评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,188评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,239评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,994评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,409评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,735评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,898评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,578评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,205评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,916评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,156评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,722评论 2 363
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,781评论 2 351

推荐阅读更多精彩内容