美文网首页深度学习
2020自然语言处理—skip-gram 实现

2020自然语言处理—skip-gram 实现

作者: zidea | 来源:发表于2020-06-25 20:17 被阅读0次
nlp_cover.jpg

word2vec 不是模型而是工具,包含两个模型一个跳字模型(skip-gram)和连续词袋模型(CBow),word2vec 词向量可以比较好表达不同词之间的相似度和类比关系。

在开始介绍模型前我们先了解一些概念

  • 中心词
  • 背景词
  • 窗口

\prod_{t=1}^T \prod_{-m \le j \le m, j\neq 0} P(w^{(t+j)}|w^{(t)})

  • m 表示窗口的大小
  • T 表示文本中词的数量
  • t 表示第几个词

我们这里用了一个朴素假设,就是这里用中心词生成背景词概率是相互独立,所以这里用了连乘。那么上面公式就是表示文本中每一个词作为中心词生成背景词的联合概率。我们目标就是最大化这个联合概率,最大化这个联合概率就等于最小化这个联合函数

-\frac{1}{T} \sum_{t=1}^T \sum_{-m \le j \le m, j\neq 0} \log P(w^{(t+j)}|w^{(t)})
前面加了负号就表示最大化上面公式就等于最小化这个公式。下面问题是如何最小化这个损失函数。希望通过找到中心词和背景词的向量表达来最小化这个损失函数。

P(w_o|w_c) = \frac{\exp(u_o^Tv_c)}{\sum_{i \in v} \exp(u_i^T,v_c)}

我们如何设计向量表达式来表示在给定中心词出现背景词的概率呢。假设我们有个词典 V ,在词典中每一个词都有对应的索引。

  • u_o 表示背景词的向量
  • v_c 表示中心词的向量
  • 我们通过计算他们点积u_i^T,v_c取 softmax 来表示P(w_o|w_c)概率
  • 在模型中每一个词都有两个向量分别表示作为背景词和中心词的向量c:\vec{v_c},\vec{u_c},根据在模型中其作用不同使用他的不同向量

随机梯度下降,计算模型参数梯度
\frac{\partial P(w_o|w_c)}{\partial v_c} = u_o - \sum_{j \in v} \frac{\exp (u_j^T v_c)}{\sum_{i \in v} \exp(u_i^T v_c)}

\frac{\partial P(w_o|w_c)}{\partial v_c} = u_o - \sum_{j\in v} P(w_j|w_c)u_j
我们可以通过计算梯度下降,不断迭代来的得到v_o,同理可以计算出u_o最终对于索引为 i 的词,我们可以得到这个词作为背景词和中心词向量u_iv_i

计算开销O|V|

模型参数

v_c = v_c - \frac{\partial L}{\partial v_c}

在连续词袋模型中我们是用背景词来生成中心词,而在跳字模型中我们使用中心词生成背景词。

\prod_{t=1}^T P(w^{(t)}|w^{(t-m)},\dots,w^{(t-1)},w^{(t+1)},\dots,w^{(t+m)})

损失函数
-\sum_{t=1}^T \log P(w^{(t)}|w^{(t-m)},\dots,w^{(t-1)},w^{(t+1)},\dots,w^{(t+m)})

P(w_c|w_{o_{1}},\dots,w_{o_{2m}}) = \frac{\exp [u_c^T(v_{o_{1}} + \dots + v_{o_{2m}} )/(2m)]}{ \sum_{i \in v} \exp [u_i^T(v_{o_{1}} + \dots + v_{o_{2m}})/(2m)] }

\frac{\partial \log\, P(w_c \mid \mathcal{W}_o)}{\partial \boldsymbol{v}_{o_i}} = \frac{1}{2m} \left(\boldsymbol{u}_c - \sum_{j \in \mathcal{V}} \frac{\exp(\boldsymbol{u}_j^\top \bar{\boldsymbol{v}}_o)\boldsymbol{u}_j}{ \sum_{i \in \mathcal{V}} \text{exp}(\boldsymbol{u}_i^\top \bar{\boldsymbol{v}}_o)} \right) = \frac{1}{2m}\left(\boldsymbol{u}_c - \sum_{j \in \mathcal{V}} P(w_j \mid \mathcal{W}_o) \boldsymbol{u}_j \right).

我们用背景词向量求一个平均,

无论是连续词袋模型还是跳字模型他们算法还是比较直观,但是都是因为使用到了 softmax 所以计算量开销都比较大。

在是在词向量中使用到了两个算法来解决问题,一个是负采样和一个是层次 softmax 法。近似训练法。怎么通过近似训练解决问题,softmax 问题,在分母引入了字典中所有的词。softmax 考虑我们背景词可能是词典中任意一个词,这样才能得到合理概率,也就是归一化的作用,这是就是上面带来大量运算开销的根源。

我们看w_o

相关文章

网友评论

    本文标题:2020自然语言处理—skip-gram 实现

    本文链接:https://www.haomeiwen.com/subject/nbmbxhtx.html