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+ew⃗ c⃗  P ( D = 1 / w , c ) = σ ( w → ⋅ c → ) = 1 1 + e − w → ⋅ c →

而基于负采样的模型对于单个的 (w,c) ( w , c ) 的目标函数是:
logσ(w⃗ c⃗ )+kEcNPD[logσ(w⃗ c⃗ )] l o g σ ( w → ⋅ c → ) + k ⋅ E c N ∼ P D [ l o g σ ( − w → ⋅ c → ) ]

其中, k k 是负采样数目,cN是sample context,而 PD(c) P D ( c ) c c 出现的概率,可以根据已有数据计算PD(c)=#(c)D。总的目标函数为:
=wVWcVC#(w,c)(logσ(w⃗ c⃗ )+kEcNPD[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其实是一种隐式的矩阵分解

公式推导

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

=wVWcVC#(w,c)logσ(w⃗ c⃗ )+wVW#(w)(kEcNPD[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 ) 给简化了。再简化:
EcNPD[logσ(w⃗ c⃗ )]=cNVCPD(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 带入化简为:
EcNPD[logσ(w⃗ c⃗ )]=#(c)|D|logσ(w⃗ c⃗ )+cNVCc#(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=WiCj=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(wc)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=WC M S P P M I k = W ⋅ C

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

其形式为 Md=UdΣdVTd 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算法,兼具两者优点。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值