论文|Sentence2Vec & GloVe 算法原理、推导与实​现

万物皆可Embedding系列会结合论文和实践经验进行介绍,前期主要集中在论文中,后期会加入实践经验和案例,目前已更新:

后续会持续更新Embedding相关的文章,欢迎持续关注「搜索与推荐Wiki」


Sentence2vec

Sentence2vec 是2017年发表于ICLR(国际学习展示回忆)的一篇论文,其全称为:A Simple but tough-to-beat baseline for sentence embeddings

下面来看一下论文所介绍的内容(论文的内容比较晦涩难懂,小编水平也不高,如果不当之处,评论区留言,感谢!)。

1、概述

论文主要提出了一种无监督的,基于单词词向量计算句子embedding的方法,称之为Smooth Inverse Frequecy(SIF),使用加权平均的方法从word embedding到sentence embedding,然后再基于句子的embedding进行相似度计算,下面使用Sentence2vec来代替模型的思想。

论文中提出的计算方法比直接平均求句子embedding的方法效果要好一些,在一些任务中甚至比RNN、LSTM模型表现还要好一些。

与该论文中思路比较相近的做法有:

  • 直接使用词语的平均embedding来表示句子,即不带权平均
  • 使用TF-IDF值作为权重,进行带权计算(前提是句子中没有大量重复的词语,且使用tfidf值作为权重没有理论依据)

通过引入SIF,结合词语embedding加权计算句子embedding,不仅表现较好,而且有较好的鲁棒性,论文中提到了三点:

  • 使用不同领域的语料训练得到的不同词语embedding,均取得了不错的效果,说明算法对各种语料都比较友好
  • 使用不同语料计算得到的词频,作为词语的权重,对最终的结果影响很小
  • 对于方法中的超参数, 在很大范围内, 获得的结果都是区域一致的, 即超参数的选择没有太大的影响

2、理论

a)潜在变量生成模型

在介绍Sentence2vec之前,先看一下潜在变量生成模型(latent variable generative model),其将语料的生成过程看作是一个动态的过程,第 t t t个单词是在第 t t t步生成的,每个单词 w w w 对应一个实值向量 R d R^d Rd。这个动态过程是通过 discourse vector c t ∈ R d c_t \in R^d ctRd 随机游走驱动的。discourse vector表达的是 what is being talked about。

discourse vector c t c_t ct 和 单词的向量 v w v_w vw 的内积表达的是 discourse和word之间的相关性,并且假设 t t t时间观测到的 w w w 的概率为这个内积的对数线性关系(log linear),表达式为:
P r [ w   e m i t t e d a t t i m e t ∣ c t ] ∝ e x p ( < c t , v w > ) Pr[w \, emitted at time t | c_t] \propto exp(<c_t, v_w>) Pr[wemittedattimetct]exp(<ct,vw>)

由于 c t c_t ct 是较小幅度的随机游走生成的, c t c_t ct c t + 1 c_{t+1} ct+1 之间只是相差一个很小的随机差向量,因此相邻的单词由相似的discourses vector 生成,另外计算表明这种模型的随机游走允许偶尔 c t c_t ct 有较大的 jump,通过这种方法生成的词向量,与word2vec(CBOW)和Glove是相似的。

b)Sentence2vec 在随机游走上的改进

在给定句子 s s s的情况下,对控制该句子的向量 discourse vector 进行最大似然估计, 我们观察到在句子生成单词的时候,discourse vector c t c_t ct 变化特别小,为了简单起见,认为其是固定不变的,为 c s c_s cs,可以证明 对 c s c_s cs 的最大似然估计就是该句中所有单词向量的平均。

Sentence2vec对模型的改进为增加了两项平滑(smoothing term),原因是:有些单词在上下文之外出现,可能会对discourse vector产生影响;有些常见的停用词和discourse vector几乎没有关系。

两项平滑技术为:

  • 1、在对数线性模型中引入 了累加项 $ \alpha p(w) , , p(w)$ 表示的是单词 w w w在整个语料中出现的概率, α \alpha α 是一个超参数,这样即使和 c s c_s cs的向量内积很小,这个单词也有概率出现
  • 2、引入纠错项 c 0 ∈ R d c_0 \in R^d c0Rd (a common discourse vector),其意义是句子的最频繁的意义可以认为是句子的最重要组成部分。常常可以与语法联系起来. 文章中认为对于某个单词, 其沿着 c 0 c_0 c0方向的成分较大(即向量投影更长), 这个纠正项就会提升这个单词出现的概率.

纠正后的单词 w w w在句子 s s s中出现的概率为:
P r [ w   e m i t t e d i n s e n t e n c e s ∣ c s ] = α p ( w ) + ( 1 − α ) e x p ( < c s ~ , v w > ) Z c s ~ Pr[w \, emitted in sentence s | c_s] = \alpha p(w) + (1-\alpha) \frac{exp(<\tilde{c_s}, v_w>)}{Z_{\tilde{c_s}}} Pr[wemittedinsentencescs]=αp(w)+(1α)Zcs~exp(<cs~,vw>)
其中:

  • c s ~ = β c 0 + ( 1 − β ) c s , c 0 ⊥ c s \tilde{c_s} = \beta c_0 + (1- \beta) c_s, c_0 \perp c_s cs~=βc0+(1β)cs,c0cs
  • $ \alpha, \beta$为超参数
  • Z c s ~ = ∑ w ∈ V e x p ( < c s ~ , v w > ) Z_{\tilde{c_s}} = \sum_{w \in V} exp(<\tilde{c_s}, v_w>) Zcs~=wVexp(<cs~,vw>) 是归一化常数

从上面的公式中也可以看出,一个与 c s c_s cs 没有关系的词语 w w w 也可以在句子中出现,因为:

  • α p ( w ) \alpha p(w) αp(w) 常数项
  • 与 common discourse vector c 0 c_0 c0的相关性

c)计算句子相关性

句子的向量,即上文提到的 c s c_s cs 可以通过最大似然函数去生成,这里假设组成句子的词语 v w v_w vw是统一分散的,因此这里归一化 Z c Z_c Zc 对于不同句子的值都是大致相同的,即对于任意的 c s ~ \tilde{c_s} cs~ Z Z Z值都是相同的,,在这个前提下,得到的似然函数为:
p [ s ∣ c s ] = ∏ w ∈ s p ( w ∣ c s ) = ∏ w ∈ s [ α p ( w ) + ( 1 − α ) e x p ( < v w , c s ~ > ) Z ] p[s | c_s] = \prod_{w\in s} p(w|c_s)= \prod_{w \in s} [\alpha p(w) + (1-\alpha) \frac{ exp(<v_w, \tilde{c_s}>) }{Z}] p[scs]=wsp(wcs)=ws[αp(w)+(1α)Zexp(<vw,cs~>)]
取对数,可得:
f w ( c s ~ ) = l o g [ α p ( w ) + ( 1 − α ) e x p ( < v w , c s ~ > ) Z ] f_w(\tilde{c_s}) = log [\alpha p(w) + (1-\alpha) \frac{ exp(<v_w, \tilde{c_s}>) }{Z}] fw(cs~)=log[αp(w)+(1α)Zexp(<vw,cs~>)]
经过一系列推导,可得最终的目标函数为:
a r g m a x ∑ w ∈ s f w ( c s ~ ) arg max \sum_{w \in s} f_w(\tilde{c_s}) argmaxwsfw(cs~)

其正比于:
∑ w ∈ s α p ( w ) + α v w \sum_{w \in s} \frac {\alpha}{p(w) + \alpha} v_w wsp(w)+ααvw
其中 α = 1 − α α Z \alpha = \frac{1-\alpha} {\alpha Z} α=αZ1α

因此可以得到:

  • 最优解为句子中所有单词向量的加权平均
  • 对于词频更高的单词 w w w, 权值更小, 因此这种方法也等同于下采样频繁单词

最后, 为了得到最终的句子向量 c s c_s cs, 我们需要估计 c 0 c_0 c0.。通过计算向量 c s ~ \tilde{c_s} cs~的first principal component(PCA中的主成分), 将其作为 c 0 c_0 c0,最终的句子向量即为 c s ~ \tilde{c_s} cs~减去主成份向量 c 0 c_0 c0

d)整体算法流程

整体算法流程

3、实现

作者开源了其代码,地址为:https://github.com/PrincetonML/SIF

Glove

1、概述

论文中作者总结了目前生成embedding的两大类方法,但这两种方法都有其弊端存在

  • 基于矩阵分解,弊端为因为是基于全局进行矩阵的构建,对于一些高频词,在算法优化的过程中,占的权重比较大
  • 基于滑动窗口,不能直接对语料库的单词进行共现建模,使用的是滑动窗口,没有办法利用数据的共现信息

因此作者提出了一种基于语料库进行信息统计,继而生成embedding的算法-Glove。下面就来具体看下对应的算法原理。

2、算法推导过程

字符的定义:

  • X X X 表示单词的共现矩阵, X i j X_{ij} Xij 表示 单词 j j j在单词 i i i的上下文中出现的次数,即在指定的窗口内,单词 i , j i,j i,j的共现次数
  • X i X_i Xi 表示 任何一个单词 k k k 和单词 i i i的共现次数总和, ∑ k X i k \sum_{k} X_{ik} kXik
  • P i j = P ( j ∣ i ) = X i j / X i P_{ij}=P(j|i)=X_{ij} / X_i Pij=P(ji)=Xij/Xi,表示单词 i , j i,j i,j的共现次数在单词 i i i 出现次数总和的概率

论文中给出了一个简单的例子,来数目如何从共现矩阵中提取出有意义的信息,如下图所示:

共现矩阵提取信息说明

上图想要说明的信息是,如果单词 k k k 和单词 i i i的相关度比 k k k j j j的相关度大的话, P ( i k ) / P ( j k ) P(ik) / P(jk) P(ik)/P(jk)的值会很大,差距越大,比值越大;同理如果 k k k i i i的相关度比 k k k j j j的相关度小的话, P ( i k ) / P ( j k ) P(ik) / P(jk) P(ik)/P(jk)的值会很小,差距越大,比值越小;如果 k k k i , j i, j i,j都不想关的话, P ( i k ) / P ( j k ) P(ik) / P(jk) P(ik)/P(jk)的值会接近于1。

上述的讨论说明了词向量的学习应该是基于共现概率的比率而不是概率本身,因此假设可以通过函数 F F F来学习到词向量,函数 F F F可以抽象为:
F ( w i , w j , w ~ k ) = P i k P j k F(w_i, w_j, \tilde{w}_k) = \frac{P_{ik}} {P_{jk}} F(wi,wj,w~k)=PjkPik
其中 w w w表示的是词向量, P i k P j k \frac{P_{ik}} {P_{jk}} PjkPik 可以从语料中计算得到,函数 F F F依赖于一些尚未指定的参数,但因为一些必要的条件,函数 F F F可以进一步的被确定。

由于向量空间具有线性结构,因此可以对词向量进行差分,函数 F F F可以转化为:
F ( w i − w j , w ~ k ) = P i k P j k F(w_i - w_j, \tilde{w}_k) = \frac{P_{ik}}{P_{jk}} F(wiwj,w~k)=PjkPik
虽然函数F可能是一个比较复杂的结构,比如神经网络,但这样做,会使我们试图捕获的线性结构消失,因此为了避免这个问题,我们可以先对向量做个内积,可以转化为:
F ( ( w i − w j ) T w ~ k ) = P i k P j k F((w_i - w_j)^T \tilde{w}_k) = \frac{P_{ik}}{P_{jk}} F((wiwj)Tw~k)=PjkPik

上述公式中左侧是减法,右侧是除法,这很容易让人联想到指数运算,因此限定函数 F F F为指数函数,此时有:
e x p ( w i T w k − w j T w k ) = e x p ( w i T w k ) e x p ( w j T w k ) = P i k P j k exp(w_i^Tw_k - w_j^Tw_k) = \frac{exp(w_i^Tw_k)}{exp(w_j^Tw_k)} = \frac{P_{ik}}{P_{jk}} exp(wiTwkwjTwk)=exp(wjTwk)exp(wiTwk)=PjkPik
此时,只需要确保等式两边分子和分母相等即可,即:
e x p ( w i T w k ) = P i k , e x p ( w j T w k ) = P j k exp(w_i^T w_k) = P_{ik}, exp(w_j^Tw_k) = P_{jk} exp(wiTwk)=Pik,exp(wjTwk)=Pjk

进一步,可以转化为语料中的所有词汇,考察 e x p ( w i T w k ) = P i k = X i k X i exp(w_i^T w_k) = P_{ik} = \frac{X_{ik}}{X_i} exp(wiTwk)=Pik=XiXik,即:
w i T w k = l o g ( X i k X i ) = l o g X i k − l o g X i w_i^T w_k = log (\frac{X_{ik}}{X_i}) = log X_{ik} - logX_i wiTwk=log(XiXik)=logXiklogXi
由于上式左侧 w i T w k w_i^T w_k wiTwk 中,调换 i i i k k k 的值不会改变其结果,即具有对称性,因此,为了确保等式右侧也具备对称性,引入了两个偏置项,即:
w i T w k = l o g X i k − b i − b k w_i^T w_k = log X_{ik} - b_i - b_k wiTwk=logXikbibk

此时, l o g X i log X_i logXi 已经包含在 b i b_i bi中,因此,此时模型的目标就转化为通过学习词向量的表示,使得上式两边尽量接近,因此,可以通过计算两者之间的平方差来作为目标函数,即:
J = ∑ i , k = 1 V ( w i T w ~ k + b i + b k − l o g X i k ) 2 J = \sum_{i,k=1}^{V} (w_i^T \tilde{w}_k + b_i + b_k - log X_{ik})^2 J=i,k=1V(wiTw~k+bi+bklogXik)2
但是这样的目标函数有一个缺点,就是对所有的共现词汇又是采用相同的权重,因此,作者对目标函数进行了进一步的修正,通过语料中的词汇共现统计信息来改变他们在目标函数中的权重,具体如下:
J = ∑ i , k = 1 V f ( X i k ) ( w i T w ~ k + b i + b k − l o g X i k ) 2 J = \sum_{i,k=1}^{V}f(X_{ik}) (w_i^T \tilde{w}_k + b_i + b_k - log X_{ik})^2 J=i,k=1Vf(Xik)(wiTw~k+bi+bklogXik)2
这里 V V V 表示词汇的数量,并且权重函数 f f f 必须具备一下的特性:

  • f ( 0 ) = 0 f(0)=0 f(0)=0,当词汇共现的次数为0时,此时对应的权重应该为0
  • f ( x ) f(x) f(x) 必须时一个非减函数,这样才能保证当词汇共现的次数越大时,其权重不会出现下降的情况
  • 对于那些太频繁的词, f ( x ) f(x) f(x) 应该能给予他们一个相对小的数值,这样才不会出现过渡加权

综合以上三点特性,作者提出了下面的权重函数:
f ( x ) = { ( x / x m a x ) a i f   x < x m a x 1 o t h e r w i s e f(x) = \left\{\begin{matrix} (x / x_{max})^a & if \,x < x_{max}\\ 1 & otherwise \end{matrix}\right. f(x)={(x/xmax)a1ifx<xmaxotherwise

作者在实验中设定 x m a x = 100 x_{max} = 100 xmax=100,并且发现 α = 3 / 4 \alpha = 3/4 α=3/4时效果比较好,函数的图像如下图所示:

a值设定效果

3、总结

以上就是有关 G l o V e GloVe GloVe原理的介绍,作者其实也是基于最开始的猜想一步一步简化模型的计算目标,最后看GloVe的目标函数时发现其实不难计算,但是要从最开始就想到这样一个目标函数其实还是很难的。最后做一下总结:

  • G l o v e Glove Glove综合了全局词汇共现的统计信息和局部窗口上下文方法的优点,可以说是两个主流方法的一种综合,但是相比于全局矩阵分解方法,由于 G l o V e GloVe GloVe不需要计算那些共现次数为0的词汇,因此,可以极大的减少计算量和数据的存储空间
  • 但是 G l o V e GloVe GloVe把语料中的词频共现次数作为词向量学习逼近的目标,当语料比较少时,有些词汇共现的次数可能比较少,笔者觉得可能会出现一种误导词向量训练方向的现象

【技术服务】,详情点击查看: https://mp.weixin.qq.com/s/PtX9ukKRBmazAWARprGIAg

扫一扫 关注微信公众号!号主 专注于搜索和推荐系统,尝试使用算法去更好的服务于用户,包括但不局限于机器学习,深度学习,强化学习,自然语言理解,知识图谱,还不定时分享技术,资料,思考等文章!

Thinkgamer_ CSDN认证博客专家 图书作者 推荐系统研究者
Thinkgamer,著有《推荐系统开发实战》,「搜索与推荐Wiki」公众号独立作者,愿景是持续输出精品系列内容,让知识能够平等的到达每一个人。从事推荐系统相关工作多年!
已标记关键词 清除标记
相关推荐
课程简介: 历经半个多月的时间,Debug亲自撸的 &ldquo;企业员工角色权限管理平台&rdquo; 终于完成了。正如字面意思,本课程讲解的是一个真正意义上的、企业级的项目战,主要介绍了企业级应用系统中后端应用权限的管理,其中主要涵盖了六大核心业务模块、十几张数据库表。 其中的核心业务模块主要包括用户模块、部门模块、岗位模块、角色模块、菜单模块和系统日志模块;与此同时,Debug还亲自撸了额外的附属模块,包括字典管理模块、商品分类模块以及考勤管理模块等等,主要是为了更好地巩固相应的技术栈以及企业应用系统业务模块的开发流程! 核心技术栈列表: 值得介绍的是,本课程在技术栈层面涵盖了前端和后端的大部分常用技术,包括Spring Boot、Spring MVC、Mybatis、Mybatis-Plus、Shiro(身份认证与资源授权跟会话等等)、Spring AOP、防止XSS攻击、防止SQL注入攻击、过滤器Filter、验证码Kaptcha、热部署插件Devtools、POI、Vue、LayUI、ElementUI、JQuery、HTML、Bootstrap、Freemarker、一键打包部署运行工具Wagon等等,如下图所示: 课程内容与收益: 总的来说,本课程是一门具有很强践性质的&ldquo;项目&rdquo;课程,即&ldquo;企业应用员工角色权限管理平台&rdquo;,主要介绍了当前企业级应用系统中员工、部门、岗位、角色、权限、菜单以及其他体模块的管理;其中,还重点讲解了如何基于Shiro的资源授权员工-角色-操作权限、员工-角色-数据权限的管理;在课程的最后,还介绍了如何一键打包上传部署运行项目等等。如下图所示为本权限管理平台的数据库设计图: 以下为项目整体的运行效果截图: 值得一提的是,在本课程中,Debug也向各位小伙伴介绍了如何在企业级应用系统业务模块的开发中,前端到后端再到数据库,最后再到服务器的上线部署运行等流程,如下图所示:
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页