Embedding算法之矩阵分解

编程入门 行业动态 更新时间:2024-10-28 13:15:44

Embedding算法之<a href=https://www.elefans.com/category/jswz/34/1769510.html style=矩阵分解"/>

Embedding算法之矩阵分解

说明

此文章翻译来自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+e−w⃗ ⋅c⃗  P ( D = 1 / w , c ) = σ ( w → ⋅ c → ) = 1 1 + e − w → ⋅ c →
而基于负采样的模型对于单个的 (w,c) ( w , c ) 的目标函数是:
logσ(w⃗ ⋅c⃗ )+k⋅EcN∼PD[logσ(−w⃗ ⋅c⃗ )] l o g σ ( w → ⋅ c → ) + k ⋅ E c N ∼ P D [ l o g σ ( − w → ⋅ c → ) ]
其中, k k 是负采样数目,cN" role="presentation" style="position: relative;">cN是sample context,而 PD(c) P D ( c ) 是 c c 出现的概率,可以根据已有数据计算PD(c)=&#x0023;(c)D" role="presentation" style="position: relative;">PD(c)=#(c)D。总的目标函数为:
ℓ=∑w∈VW∑c∈VC#(w,c)(logσ(w⃗ ⋅c⃗ )+k⋅EcN∼PD[logσ(−w⃗ ⋅c⃗ )]) ℓ = ∑ w ∈ V W ∑ c ∈ V C # ( w , c ) ( l o g σ ( w → ⋅ c → ) + k ⋅ E c N ∼ P D [ l o g σ ( − w → ⋅ c → ) ] )
文章没有看到为什么这里有一个 #(w,c) # ( w , c ) ,个人觉得应该是带权重的意思,出现频率越高,词对越重要的,如有理解错误,敬请指正。

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

公式推导

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

ℓ=∑w∈VW∑c∈VC#(w,c)logσ(w⃗ ⋅c⃗ )+∑w∈VW#(w)(k⋅EcN∼PD[logσ(−w⃗ ⋅c⃗ )]) ℓ = ∑ w ∈ V W ∑ c ∈ V C # ( w , c ) l o g σ ( w → ⋅ c → ) + ∑ w ∈ V W # ( w ) ( k ⋅ E c N ∼ P D [ l o g σ ( − w → ⋅ c → ) ] )
注意这里有一个技巧,把 ∑#(w,c) ∑ # ( w , c ) 给简化了。再简化:
EcN∼PD[logσ(−w⃗ ⋅c⃗ )]=∑cN∈VCPD(cN)logσ(−w⃗ ⋅c⃗ ) E c N ∼ P D [ l o g σ ( − w → ⋅ c → ) ] = ∑ c N ∈ V C P D ( c N ) l o g σ ( − w → ⋅ c → )
这里是期望公式,把 PD(cN)=#c(N)/D P D ( c N ) = # c ( N ) / D 带入化简为:
EcN∼PD[logσ(−w⃗ ⋅c⃗ )]=#(c)|D|logσ(−w⃗ ⋅c⃗ )+∑cN∈VC∖c#(cN)|D|logσ(−w⃗ ⋅cN→) E c N ∼ P D [ l o g σ ( − w → ⋅ c → ) ] = # ( c ) | D | l o g σ ( − w → ⋅ c → ) + ∑ c N ∈ V C ∖ c # ( c N ) | D | l o g σ ( − w → ⋅ c N → )
对于一个特定的词对,后面一项便没有了,化简为:
ℓ=#(w,c)logσ(w⃗ ⋅c⃗ )+k⋅#(w)⋅#(c)|D|logσ(−w⃗ ⋅c⃗ ) ℓ = # ( w , c ) l o g σ ( w → ⋅ c → ) + k ⋅ # ( w ) ⋅ # ( c ) | D | l o g σ ( − w → ⋅ c → )
此时,我们把 w⃗ ⋅c⃗  w → ⋅ c → 作为一个整体求解,求导使得为0,化简后得到:
w⃗ ⋅c⃗ =log(#(w,c)⋅|D|#(w)⋅#(c))−logk w → ⋅ c → = l o g ( # ( w , c ) ⋅ | D | # ( w ) ⋅ # ( c ) ) − l o g k
等式右边是可以直接计算的,而k是负采样的个数,人为设定的。接下来就是优化等式求得 w⃗  w → 和 c⃗  c → 的问题了,word2vec中用的是梯度下降法,这篇文章里用的是svd,经过了处理的svd,后面将展开。这里还要说的是:
PMI(w,c)=log(#(w,c)⋅|D|#(w)⋅#(c)) P M I ( w , c ) = l o g ( # ( w , c ) ⋅ | D | # ( w ) ⋅ # ( c ) )
PMI是pointwise mutual information的简写,是NLP中用得很多的一信息度量指标,带入后化简可以得到:
MSGNSij=Wi⋅Cj=w⃗ ⋅c⃗ =PMI(wi,cj)−logk M i j S G N S = W i ⋅ C j = w → ⋅ c → = P M I ( w i , c j ) − l o g k
显然,当 k=1 k = 1 的时候,就只剩下了一项PMI,此时得到的embedding可以看作就是对PMI的分解,如果 k>1 k > 1 ,那就是对PMI平移之后的分解。而另外一种embedding方法:noise-contrasitive estimation(NCE),也可化简为类似的形式:
MNCEij=w⃗ ⋅c⃗ =log(#(w,c)#(c))−logk=logP(w∖c)−logk M i j N C E = w → ⋅ c → = l o g ( # ( w , c ) # ( c ) ) − l o g k = l o g P ( w ∖ c ) − l o g k

Pointwise Mutual Information

PMI定义为:

PMI(w,c)=log(#(w,c)⋅|D|#(w)⋅#(c)) P M I ( w , c ) = l o g ( # ( w , c ) ⋅ | D | # ( w ) ⋅ # ( c ) )
由每个词对组成的PMI矩阵,如果直接按照定义进行计算会出现问题,比如,当某一词对未出现过时, PMI(w,c)=log0=−∞ P M I ( w , c ) = l o g 0 = − ∞ .在NLP中常用的方法是将未知的PMI置零。另外还有一个问题就是,由PMI定义,如果分子特别大,分母很小,得到的PMI将为很大的负数,这也不合理,因此处理为:
PPMI(w,c)=max(PMI(w,c),0) P P M I ( w , c ) = m a x ( P M I ( w , c ) , 0 )
Positive PMI,它是稀疏的,而且这样处理以后会有一种效果,两个词对出现决定了它的值,忽略了未出现的词对效果。

如何解得embeddings

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

SPPMIk(w,c)=max(PMI(w,c)−logk,0) S P P M I k ( w , c ) = m a x ( P M I ( w , c ) − l o g k , 0 )
我们假定 MSPPMIk M S P P M I k 是由所有词对组成的矩阵,这个矩阵我们是可以直接求得的,由上面的推导我们有:
MSPPMIk=W⋅C M S P P M I k = W ⋅ C
等式左边是知道的,就是一个矩阵如何分解成两个矩阵,并且是两个维度更低的矩阵相乘。现今非常成熟的SVD即是一种矩阵分解方法,取特征值最大的特征向量组成矩阵后,使得其前后损失最小,即: MSPPMIk≈Md M S P P M I k ≈ M d ,使得:
Md=arg minRank(M′=d)∥∥M′−M∥∥2 M d = a r g m i n R a n k ( M ′ = d ) ‖ M ′ − M ‖ 2
其形式为 Md=Ud⋅Σd⋅VTd M d = U d ⋅ Σ d ⋅ V d T ,由此可以直接取得;
WSVDα=Ud⋅(Σd)α , CSVDα=Vd⋅(Σd)1−α W S V D α = U d ⋅ ( Σ d ) α , C S V D α = V d ⋅ ( Σ 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算法,兼具两者优点。

更多推荐

Embedding算法之矩阵分解

本文发布于:2024-02-12 06:16:47,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1686570.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:矩阵   分解   算法   Embedding

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!