Embedding算法之矩阵分解

本文探讨了词嵌入技术中的Skip-gram模型与矩阵分解之间的内在联系,揭示了基于负采样的Skip-gram(SGNS)如何通过点互信息(PMI)转化为隐式的矩阵分解过程,并比较了SGNS与奇异值分解(SVD)两种方法的优缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

说明

此文章翻译来自2014年nips,Neural Word Embedding as Implicit Matrix Factorization,引用量632。主要贡献是把经典skip-gram算法通过PMI,和矩阵分解联系了起来,并深入探讨了Skip-gram算法的优劣势。作者Omer Levy及Yoav Goldberg,来自Bar-Ilan University。

基于负采样的Skip-gram模型(skip-gram with negative sampling)

把Skip-gram with negative sampling模型简写为SGNS,词对(w,c)(w,c)在data出现的概率为p(D=1/w,c)p(D=1/w,c),不出现的概率为p(D=0/w,c)p(D=0/w,c),有:

P(D=1/w,c)=σ(w⃗ c⃗ )=11+ew⃗ c⃗ P(D=1/w,c)=σ(w→⋅c→)=11+e−w→⋅c→

而基于负采样的模型对于单个的(w,c)(w,c)的目标函数是:
logσ(w⃗ c⃗ )+kEcNPD[logσ(w⃗ c⃗ )]logσ(w→⋅c→)+k⋅EcN∼PD[logσ(−w→⋅c→)]

其中,kk是负采样数目,cN是sample context,而PD(c)PD(c)cc出现的概率,可以根据已有数据计算PD(c)=#(c)D。总的目标函数为:
=wVWcVC#(w,c)(logσ(w⃗ c⃗ )+kEcNPD[logσ(w⃗ c⃗ )])ℓ=∑w∈VW∑c∈VC#(w,c)(logσ(w→⋅c→)+k⋅EcN∼PD[logσ(−w→⋅c→)])

文章没有看到为什么这里有一个#(w,c)#(w,c),个人觉得应该是带权重的意思,出现频率越高,词对越重要的,如有理解错误,敬请指正。

SGNS其实是一种隐式的矩阵分解

公式推导

把总体目标函数展开,得到:

=wVWcVC#(w,c)logσ(w⃗ c⃗ )+wVW#(w)(kEcNPD[logσ(w⃗ c⃗ )])ℓ=∑w∈VW∑c∈VC#(w,c)logσ(w→⋅c→)+∑w∈VW#(w)(k⋅EcN∼PD[logσ(−w→⋅c→)])

注意这里有一个技巧,把#(w,c)∑#(w,c)给简化了。再简化:
EcNPD[logσ(w⃗ c⃗ )]=cNVCPD(cN)logσ(w⃗ c⃗ )EcN∼PD[logσ(−w→⋅c→)]=∑cN∈VCPD(cN)logσ(−w→⋅c→)

这里是期望公式,把PD(cN)=#c(N)/DPD(cN)=#c(N)/D带入化简为:
EcNPD[logσ(w⃗ c⃗ )]=#(c)|D|logσ(w⃗ c⃗ )+cNVCc#(cN)|D|logσ(w⃗ cN)EcN∼PD[logσ(−w→⋅c→)]=#(c)|D|logσ(−w→⋅c→)+∑cN∈VC∖c#(cN)|D|logσ(−w→⋅cN→)

对于一个特定的词对,后面一项便没有了,化简为:
=#(w,c)logσ(w⃗ c⃗ )+k#(w)#(c)|D|logσ(w⃗ c⃗ )ℓ=#(w,c)logσ(w→⋅c→)+k⋅#(w)⋅#(c)|D|logσ(−w→⋅c→)

此时,我们把w⃗ c⃗ w→⋅c→作为一个整体求解,求导使得为0,化简后得到:
w⃗ c⃗ =log(#(w,c)|D|#(w)#(c))logkw→⋅c→=log(#(w,c)⋅|D|#(w)⋅#(c))−logk

等式右边是可以直接计算的,而k是负采样的个数,人为设定的。接下来就是优化等式求得w⃗ w→c⃗ c→的问题了,word2vec中用的是梯度下降法,这篇文章里用的是svd,经过了处理的svd,后面将展开。这里还要说的是:
PMI(w,c)=log(#(w,c)|D|#(w)#(c))PMI(w,c)=log(#(w,c)⋅|D|#(w)⋅#(c))

PMI是pointwise mutual information的简写,是NLP中用得很多的一信息度量指标,带入后化简可以得到:
MSGNSij=WiCj=w⃗ c⃗ =PMI(wi,cj)logkMijSGNS=Wi⋅Cj=w→⋅c→=PMI(wi,cj)−logk

显然,当k=1k=1的时候,就只剩下了一项PMI,此时得到的embedding可以看作就是对PMI的分解,如果k>1k>1,那就是对PMI平移之后的分解。而另外一种embedding方法:noise-contrasitive estimation(NCE),也可化简为类似的形式:
MNCEij=w⃗ c⃗ =log(#(w,c)#(c))logk=logP(wc)logkMijNCE=w→⋅c→=log(#(w,c)#(c))−logk=logP(w∖c)−logk

Pointwise Mutual Information

PMI定义为:

PMI(w,c)=log(#(w,c)|D|#(w)#(c))PMI(w,c)=log(#(w,c)⋅|D|#(w)⋅#(c))

由每个词对组成的PMI矩阵,如果直接按照定义进行计算会出现问题,比如,当某一词对未出现过时,PMI(w,c)=log0=PMI(w,c)=log0=−∞.在NLP中常用的方法是将未知的PMI置零。另外还有一个问题就是,由PMI定义,如果分子特别大,分母很小,得到的PMI将为很大的负数,这也不合理,因此处理为:
PPMI(w,c)=max(PMI(w,c),0)PPMI(w,c)=max(PMI(w,c),0)

Positive PMI,它是稀疏的,而且这样处理以后会有一种效果,两个词对出现决定了它的值,忽略了未出现的词对效果。

如何解得embeddings

Shifted PPMI (SPPMI),由上一节得到:

SPPMIk(w,c)=max(PMI(w,c)logk,0)SPPMIk(w,c)=max(PMI(w,c)−logk,0)

我们假定MSPPMIkMSPPMIk是由所有词对组成的矩阵,这个矩阵我们是可以直接求得的,由上面的推导我们有:
MSPPMIk=WCMSPPMIk=W⋅C

等式左边是知道的,就是一个矩阵如何分解成两个矩阵,并且是两个维度更低的矩阵相乘。现今非常成熟的SVD即是一种矩阵分解方法,取特征值最大的特征向量组成矩阵后,使得其前后损失最小,即:MSPPMIkMdMSPPMIk≈Md,使得:
Md=arg minRank(M=d)MM2Md=arg minRank(M′=d)‖M′−M‖2

其形式为Md=UdΣdVTdMd=Ud⋅Σd⋅VdT,由此可以直接取得;
WSVDα=Ud(Σd)α , CSVDα=Vd(Σd)1αWSVDα=Ud⋅(Σd)α , CSVDα=Vd⋅(Σd)1−α

αα常常取0,1,1/2.

SVD对比SGNS优劣势分析

优势

1.SVD不需要调参,比如学习率
2.SVD在已知(w,c,#(w,c))(w,c,#(w,c))的情况下更易于训练,而SGNS需要单独知道每一对(w,c)(w,c)的观察值

劣势

1.SGNS对未观察到的数据分别处理,利用了未观察到的数据,而SVD都置零了
2.SGNS对每一对词对分别处理,频率较高的词对将得到更好的结果,而对未观察到的词对具有更好的容错性。
3.SGNS每次处理某一词对时并不需要让其他未观察到的词对值为0,不需要对词对矩阵作稀疏处理即可优化得到各自的embedding

stochastic matrix factorization

作者提到了SVD和SGNS的一种middle-groud算法,兼具两者优点。

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值