深度学习NLP笔记(三):GloVe模型

GolVe模型使用了词与词的共现信息。定义X为共现矩阵,则xij为词j出现在词i环境中的次数。令 x i = ∑ k x i k x_{i}=\sum_{k}x_{ik} xi=kxik为任意词出现在词i环境中的次数,则:
P ( i j ) = P ( j ∣ i ) = x i j x i P(ij)=P(j|i)=\frac{x_{ij}}{x_{i}} P(ij)=P(ji)=xixij
  P(ij)为词j出现在词i环境中的概率,也成为词i和词j的共现概率。
  例如,对于语料:

  • I like deep learning.
  • I like NLP.
  • I enjoy flying.
    可以得到共现矩阵:
    深度学习NLP笔记(三):GloVe模型_第1张图片
    可以得到 P ( ′ I ′ , ′ l i k e ′ ) = 2 3 P('I','like')=\frac{2}{3} P(I,like)=32
    那么共现概率到底有什么用呢?举一个例子。
wk “solid” “gas” “water”
p 1 = P ( w k ∣ " i c e " ) p_{1}=P(w_{k} \mid "ice") p1=P(wk"ice") 0.00019 0.000066 0.003
p 2 = P ( w k ∣ " s t e a m " ) p_{2}=P(w_{k} \mid "steam") p2=P(wk"steam") 0.000022 0.00078 0.0022
p 1 / p 2 p_{1}/p_{2} p1/p2 8.9 0.085 1.36

从直观上我们知道,“solid”和"ice"很接近,但是和"steam"相差很远,因此 P ( “ s o l i d ” ∣ " i c e " ) P(“solid” \mid "ice") P(solid"ice")应该较大,而 P ( “ s o l i d ” ∣ " s t e a m " ) P(“solid” \mid "steam") P(solid"steam")应该较小,进而 P ( “ s o l i d ” ∣ " i c e " ) / P ( “ s o l i d ” ∣ " s t e a m " ) P(“solid” \mid "ice")/P(“solid” \mid "steam") P(solid"ice")/P(solid"steam")也就应该较大;“gas”和“ice”相差较远,而与“steam”比较接近,所以 P ( “ g a s ” ∣ " i c e " ) / P ( “ g a s ” ∣ " s t e a m " ) P(“gas” \mid "ice")/P(“gas” \mid "steam") P(gas"ice")/P(gas"steam")应该较小;“water”和“ice”、“steam”都比较接近,则 P ( “ w a t e r ” ∣ " i c e " ) / P ( “ w a t e r ” ∣ " s t e a m " ) P(“water” \mid "ice")/P(“water” \mid "steam") P(water"ice")/P(water"steam")应该接近1。
  我们希望找到一个函数可以很好地表示以wi为中心词,三个词之间的关系,也就是: f ( u j , u k , v i ) ≈ p i j p i k f(u_{j},u_{k},v_{i}) \approx \frac{p_{ij}}{p_{ik}} f(uj,uk,vi)pikpij
  概率之间的比值是一个标量,所以我们可以将 f f f限制为一个标量函数: f ( u j , u k , v i ) = f ( ( u j − u k ) T v i ) f(u_{j},u_{k},v_{i})=f((u_{j}-u_{k})^{T}v_{i}) f(uj,uk,vi)=f((ujuk)Tvi)。交换索引函数 f f f应该满足 f ( x ) f ( − x ) = 1 f(x)f(-x)=1 f(x)f(x)=1,所以一个可能是 f ( x ) = e x p ( x ) f(x)=exp(x) f(x)=exp(x)。于是, f ( u j , u k , v i ) = e x p ( u j T v i ) e x p ( u k T v i ) ≈ p i j p i k f(u_{j},u_{k},v_{i})=\frac{exp(u_{j}^{T}v_{i})}{exp(u_{k}^{T}v_{i})} \approx \frac{p_{ij}}{p_{ik}} f(uj,uk,vi)=exp(ukTvi)exp(ujTvi)pikpij
  也就是说,我们想要得到 e x p ( u k T v i ) = p i k = x i k x i exp(u_{k}^{T}v_{i})=p_{ik}=\frac{x_{ik}}{x_{i}} exp(ukTvi)=pik=xixik
  对于这个式子,两边取对数,可以得到 u k T v i = l o g ( x i k ) − l o g ( x i ) u_{k}^{T}v_{i}=log(x_{ik})-log(x_{i}) ukTvi=log(xik)log(xi)
  这里有一个问题,按照我们的理解 p i k p_{ik} pik应该和 p k i p_{ki} pki相等,但是 u i T v k = l o g ( x i k ) − l o g ( x k ) u_{i}^{T}v_{k}=log(x_{ik})-log(x_{k}) uiTvk=log(xik)log(xk)
  由于后面的一项,两者并不相等,所以需要对后面的项进行处理。我们用一个偏移向量 ( b i + b k ) (b_{i}+b_{k}) (bi+bk)替代后面的项,得到 u k T v i = l o g ( x i k ) − ( b i + b k ) u_{k}^{T}v_{i}=log(x_{ik})-(b_{i}+b_{k}) ukTvi=log(xik)(bi+bk)
  将偏移向量移到左边,得到
   u k T v i + ( b i + b k ) = l o g ( x i k ) u_{k}^{T}v_{i}+(b_{i}+b_{k})=log(x_{ik}) ukTvi+(bi+bk)=log(xik)
  我们发现,最终我们得到的是用词向量表达了共现词频。我们希望左边和右边越接近越好,那么我们就可以根据这个式子来定义我们的损失函数: ∑ i , j = 1 V h ( x i j ) ( u k T v i + ( b i + b k ) − l o g ( x i k ) ) 2 \sum_{i,j=1}^{V}h(x_{ij})(u_{k}^{T}v_{i}+(b_{i}+b_{k})-log(x_{ik}))^{2} i,j=1Vh(xij)(ukTvi+(bi+bk)log(xik))2
   h ( x i j ) h(x_{ij}) h(xij)是权重函数,它与共现词频有关。

你可能感兴趣的:(深度学习NLP)