词向量技术

词向量基础
单词的表示 独热编码存在一下问题:

  • 无法以一个向量的方式表示一个单词的含义
  • 向量维度高,且非常稀疏
  • 没有衡量两个单词之间的语义相似度
由于独热编码的缺点,一种新的方式-词向量(也叫分布式表示)表示方式如下:
独热编码 词向量(分布式表示)
我们 [1,0,0,0,0] [0.1,0.2,0.4,0.2]
爬山 [0,1,0,0,0] [0.2,0.3,0.1,0.2]
当有了词向量的分布式的表示之后,两个单词之间的相似度是可以算出来的,当然,效果取决于词向量的质量。这个词向量的维数是由训练词向量的模型人工定义的,学习词向量的模型如Bert,Glove,SkipGram,ELMo
从上可以看到:
  • 分布式表示时向量是稠密的,很少有0
  • 分布式表示时维数远远小于独热编码
  • 词向量一定程度上可以表示这个单词的含义,则从一定程度上就可以表示两个单词之间的相似度
总结如下:
独热编码 分布式表示
无法表示单词额的含义 可以认为表示单词的含义
向量非常稀疏 向量稠密
向量长度等于词库的长度 向量长度是超参数
不需要训练 需要训练
SkipGram模型
词向量技术
文章图片

参考论文:
Efficient Estimation of Word Representations in Vector Space
SkipGram模型的核心是通过中心词来预测周围的单词。也就是说如果我们的词向量训练地比较准确,预测效果就比较强,实际上这就是我们的目标函数。
为了便于理解,为什么通过中心词可以预测出周围的单词?我们来了解它背后的逻辑:
这里有一个假设叫做分布式的假设,这个分布式的假设意味着如果两个单词挨在一起,那有可能两个单词的含义是比较类似的,所以我可能通过一个单词预测出它相似的单词。
下面记录Skipgram的推导:
假设我们存在这样的数据集{\(s_1,s_2,s_3,s_4,s_5\)},当然我们的数据不可能这么少,数据通常都是一篇一篇的文章或者直接复制网页上的一段话也是我们数据。
通过挨着的词语相类似的思维,用以上的样本想要训练出词向量,我们可以这样做:最大可能下面的条件概率乘积:
$$ p(s2|s1)·p(s1|s2)·p(s3|s2)·p(s2|s3)·p(s3|s4)·p(s5|s4)·p(s4|s5) $$
可以发现,我们对我们的P(相邻词|中心词)作了一个循环,由此可以推出更通用性的公式:
w-中心词,c-属于w上下文的词
$$ L(\theta) = MLE \prod_{w\in Text}\prod_{c\in Context}p(c|w; \theta)\tag{1} $$
$$ \theta = arg\,\max_{\theta} \sum_{w\in Text} \sum_{c\in Context}log p(c|w; \theta)\tag{2} $$
对于条件概率 \( p(c|w; \theta)\)我们希望能表示为\( \theta \)的形态,所以我们要知道它的属性以写出合适的形态,一般它具有以下属性:
  • 概率值在0~1之间
  • \( \sum_{i=1}^n p(c|w; \theta) = 1 \)
  • (w,c)相似的时候,我们希望它的值越大
  • (w,c)不相似的时候,我们希望它的值越小
所以我们可以采用softmax的形态:
$$ softmax = \frac {e^{z_i}}{\sum\limits_{c=1}^c e^c}\tag{3} $$
\( ( p(c|w; \theta) \)就可以写为下式(4):
c'表示w的全部相邻词,\( u_c \)表示c的embedding,\( v_w \)表示中心词w的embedding
当w和c相似的时候\( u_c v_w \)的内积也越大,反则相反。在这里,我们采用余弦相似度来衡量相似性,两向量愈相似,点积也愈大。
$$ ( p(c|w; \theta) = \frac {e^{u_c v_w}} {\sum\limits_{c'} e^{u_{c'} v_w}}\tag{4} $$
进一步:
$$ \begin{equation}\begin{split} \theta &= arg\,\max_{\theta} \sum_{w\in Text} \sum_{c\in Context}log \frac {e^{u_c v_w}} {\sum\limits_{c'} e^{u_{c'} v_w}}\\ &= arg\,\max_{\theta}\sum_{w\in Text} \sum_{c\in Context} e^{u_c v_w}-log\sum_{c'} e^{u_{c'} v_w}\tag{5} \end{split}\end{equation} $$
上式五可以看出这个目标函数存在的一些问题:在减去的后一项那我们作了一个内层循环,而这一项的时间复杂度时间上是O(|V|),V是我们词库的大小,所以在我们词库量很大的时候,代价会很大,精度也会损失,而且这个式子也不太容易优化,所以以下我们们考虑另一种思维方式,它也叫负采样,待会我解释为什么会叫负采样。
同样我们存在一堆数据集D{\(s_1,s_2,s_3,s_4...s_n\)}
我们假设它的可能性:
D=1表示相邻,否则相反
$$ p(D=1|w,c; \theta) $$
$$ p(D=0|w,c'; \theta)\tag{6} $$
则我们的目标函数可以MLE这个式子(7):
$$ L(\theta) = \prod p(D=1|w,c; \theta) p(D=0|w,c'; \theta)\tag{7} $$
$$ \begin{equation}\begin{split} \theta =& arg\,\max_{\theta}\prod p(D=1|w,c; \theta) p(D=0|w,c'; \theta)\\ =&arg\,\max_{\theta}\prod_{w,c\in D}p(D=1|w,c; \theta) \prod_{w,c' \in \overline D} p(D=0|w,c'; \theta)\tag{8} \end{split}\end{equation} $$
接下来我们又考虑这个条件概率p应该满足什么条件:
  • 概率值在0~1之间
  • (w,c)相似的时候,我们希望它的值越大
  • (w,c)不相似的时候,我们希望它的值越小
故而我们重新考虑Sigmoid函数,以下是我们写好后的目标函数:
$$ \ell(\theta) =arg\,\max_\theta \sum_{w,c\in D} log \sigma(u_cv_w)+\sum_{w,c'\in \overline D} log \sigma(-u_c'v_w)\tag{9} $$
在实际样本中,负样本比正样本多很多,所以上式(9)可以改造为式(10)
$$ \ell(\theta) =arg\,\max_\theta \sum_{w,c\in D} [log \sigma(u_cv_w)+\sum_{c'\in N(w)} log \sigma(-u_c'v_w)]\tag{10} $$
\( c'\in N(w)\)表示属于w的N个负样本,所以也叫负采样。
接下来使用梯度下降法求解\( \theta \):
$$ \frac{\partial \ell(\theta)} {\partial u_c} = \sum_{w,c\in D}[1-\sigma(u_cv_w)]v_w\tag{11} $$
$$ \frac{\partial \ell(\theta)} {\partial v_w} =\sum_{w,c\in D}\{ [1-\sigma(u_cv_w)]u_c+\sum_{c'\in N(w)}[\sigma(-u_cv_w)-1]u_{c'}\}\tag{12} $$
$$ \frac{\partial \ell(\theta)} {\partial u_{c}'} = \sum_{c'\in N(w)}[\sigma(-u_cv_w)-1]v_w\tag{13} $$
【词向量技术】未完待续...

    推荐阅读