Word2Vec原理详解

1. 词嵌入(word2vec)

自然语言是一套用来表达含义的复杂系统。在这套系统中,词是表义的基本单元。顾名思义,词向量是用来表示词的向量,也可被认为是词的特征向量或表征。把词映射为实数域向量的技术也叫词嵌入(word embedding)。近年来,词嵌入已逐渐成为自然语言处理的基础知识。

2. 为何不采用one-hot向量

  • 如何使用one-hot
    • 假设词典中不同词的数量(词典大小)为N,每个词可以和从0N−1的连续整数值索引一一对应。假设一个字符的索引是整数i,为了得到该词的one-hot向量表示,我们创建一个全0的长为N的向量,并将其第i位设成1。这样一来,每个词就表示成了一个长度为N的向量,可以直接被神经网络使用。
  • 存在的问题
    • 由于任何两个不同词的one-hot向量的余弦相似度都为0,故其无法准确表达不同词之间的相似度
  • 解决策略
    • 词嵌入:将每个词表示成一个定长的向量,并使得这些向量能较好地表达不同词之间的相似和类比关系。
      • 跳字模型(skip-gram):通过中心词来推断上下文一定窗口内的单词
      • 连续词袋模型(continuous bag of words, CBOW):通过上下文来推断中心词

3. 跳字模型 skip-gram

跳字模型假设基于某个词来生成它在文本序列周围的词。举个例子,假设文本序列是“the” “man” “loves” “his” “son”。以“loves”作为中心词,设背景窗口大小为2。如图1所示,跳字模型所关心的是,给定中心词“loves”,生成与它距离不超过2个词的背景词“the” “man” “his” “son”的条件概率,即
P(“the”, “man”, “his”, “son”|“loves”)
假设给定中心词的情况下,背景词的生成是相互独立的,那么上式可以改写成
P(“the”|“loves”)\cdot P(“man”|“loves”) \cdot P(“his”|“loves”) \cdot P(“son”|“loves”)

图1:跳字模型关心给定中心词生成背景词的条件概率

3.1 模型输入 one-hot

虽然开篇说了one-hot不行,但是我们不要忽略一个事实,计算机没办法识别“字符”,所有的数据必须转化成二进制的编码形式。

3.2 数学原理


大家已经注意到,我们已经到了Hidden Layer到Output Layer这一层了,简单来看就是隐藏层和输出层进行全连接,然后是一个softmax,输出概率。过程比较简单,一个Forward Propagation,一个Backward Propagation。

在跳字模型中,每个词被表示成两个d维向量,用来计算条件概率。假设这个词在词典中索引为i,当它为中心词时向量表示为\boldsymbol v_i \in \mathbb{R}^d,而为背景词时向量表示为\boldsymbol u_i \in \mathbb{R}^d。设中心词w_c在词典中索引为c,背景词w_o,在词典中索引为o,给定中心词生成背景词的条件概率可以通过对向量内积做softmax运算而得到:

P(w_o|w_c)=\frac{{\rm exp}(\boldsymbol u_o^{\top} \boldsymbol v_c)}{\sum_{i \in \mathcal{V}} {\rm exp}(\boldsymbol u_i^{\top} \boldsymbol v_c)}

其中词典索引集\mathcal{V}=\{0, 1, \ldots, |\mathcal{V}|-1\}。假设给定一个长度为T的文本序列,设时间步t的词为w^{(t)}。假设给定中心词的情况下背景词的生成相互独立,当背景窗口大小为m时,跳字模型的似然函数即给定任一中心词生成所有背景词的概率
\prod_{t=1}^{T} \prod_{-m \le j \le m, \, j \ne 0} P(w^{(t+j)}|w^{(t)})

这里小于1和大于T的时间步可以忽略。
这样就可以计算出每个中心词推断背景词的概率,而我们在输入的时候给出了背景词的向量,此时只需要最大化背景词的输出概率即可。 基于这样的想法,我们会想到极大化似然估计的方式。但是一个函数的最大值往往不容易计算,因此,我们可以通过对函数进行变换,从而改变函数的增减性,以便优化。这等价于最小化以下损失函数:
- \sum_{t=1}^{T} \sum_{-m \le j \le m, \, j \ne 0} {\rm log} P(w^{(t+j)}|w^{(t)})

最小化损失函数,我们最容易想到的就是梯度下降法。在使用梯度下降法之前,我们要把我们的损失函数定义出来,毕竟上面的式子是一个概率,下面把softmax的计算结果带入得到:
{\rm log} P(w_o|w_c)=\boldsymbol u_o^{\top} \boldsymbol v_c-{\rm log} \Big( \sum_{i \in \mathcal{V}} {\rm exp}(\boldsymbol u_i^{\top} \boldsymbol v_c) \Big)

损失函数已经得到了,我们的目标就是最小化它,优化它之前我们要搞清楚我们的参数是谁?每错,我们的参数是中心词和背景词,那对于这样的一个函数显然是非凸函数,因此,我们要做一个假设,假设在对中心词权重更新时,背景词的权重是固定的,然后在以同样的方式来更新背景词的权重。
\begin{align} \frac{\partial {\rm log} P(w_o|w_c)}{\partial \boldsymbol v_c} &= \boldsymbol u_o - \frac{\sum_{j \in \mathcal{V}} {\rm exp}(\boldsymbol u_j^{\top} \boldsymbol v_c) u_j}{\sum_{i \in \mathcal{V}} {\rm exp}(\boldsymbol u_i^{\top} \boldsymbol v_c)} \\ &= \boldsymbol u_o - \sum_{j \in \mathcal{V}} \Bigg( \frac{ {\rm exp}(\boldsymbol u_j^{\top} \boldsymbol v_c)}{\sum_{i \in \mathcal{V}} {\rm exp}(\boldsymbol u_i^{\top} \boldsymbol v_c)} \Bigg) \boldsymbol u_j \\ &= \boldsymbol u_o - \sum_{j \in \mathcal{V}} P(w_j|w_c) \boldsymbol u_j \end{align}
这里就计算出来了中心词的梯度,可以根据这个梯度进行迭代更新。对于背景词的更新是同样的方法,
\begin{align} \frac{\partial {\rm log} P(w_o|w_c)}{\partial \boldsymbol u_o} &= \boldsymbol v_c - \frac{{\rm exp}(\boldsymbol u_o^{\top} \boldsymbol v_c)}{\sum_{i \in \mathcal{V}} {\rm exp}(\boldsymbol u_i^{\top} \boldsymbol v_c)} \boldsymbol v_c \\ &= \boldsymbol v_c - P(w_o|w_c) \boldsymbol v_c \\ &=(1 - P(w_o|w_c)) \boldsymbol v_c \end{align}
P(w_o|w_c) \rightarrow 1时,即通过中心词w_c我们可以正确预测上下文词w_o时,不需要调整u_o,反之,则相应调整u_o
但是要注意背景词的个数不是唯一的,所以更新的时候要逐个更新,幅图辅助理解。


训练结束后,对于词典中的任一索引为iii的词,我们均得到该词作为中心词和背景词的两组词向量和。
这里存在几个问题:

  • 在词向量映射过程中需要计算大量的乘法运算,有没有什么方法减少运算量?
    • 可以通过查表(Lookup Table)方式,因为计算出来的这组向量,和单词在one-hot编码表的位置是有关系的!举个例子,如果单词出现的位置column=3,那么对应的就会选中权重矩阵的Index=3的列。
  • 一个是在词典中所有的词都有机会被当做是“中心词”和“背景词”,那么在更新的时候,都会被更新一遍,这种时候该怎么确定一个词的向量到底该怎么选择呢?
    • 在自然语言处理应用中,一般使用跳字模型的中心词向量作为词的表征向量。
  • 从刚刚最终的梯度公式中,存在着一个参数\mathcal{V},我们知道这个参数代表的含义是词典中单词的个数,通常这个个数会非常大,这时候我们在进行迭代的时候对系统消耗也是巨大的,因为每走一步就要对所有的单词进行一次矩阵运算。这种时候该如何进行优化呢?
    • 负采样 Negative Sampling
    • 层级softmax Hierarchical Softmax

4. 连续词袋模型 CBOW

连续词袋模型与跳字模型类似。与跳字模型最大的不同在于,连续词袋模型假设基于某中心词在文本序列前后的背景词来生成中心词。在同样的文本序列“the” “man” “loves” “his” “son”里,以“loves”作为中心词,且背景窗口大小为2时,连续词袋模型关心的是,给定背景词“the” “man” “his” “son”生成中心词“loves”的条件概率(如图2所示),也就是
P(“loves”|“the”, “man”, “his”, “son”)

图2:连续词袋模型关心给定背景词生成中心词的条件概率

因为连续词袋模型的背景词有多个,我们将这些背景词向量取平均,然后使用和跳字模型一样的方法来计算条件概率。设\boldsymbol{v}_i \in \mathbb{R}^d\boldsymbol{u}_i \in \mathbb{R}^d分别表示词典中索引为i的词作为背景词和中心词的向量(注意符号的含义与跳字模型中的相反,假设输入向量为\boldsymbol{v},输出向量为\boldsymbol{u})。设中心词w_c在词典中索引为c,背景词w_{o_1}, \ldots, w_{o_{2m}}在词典中索引为o_1, \ldots, o_{2m},那么给定背景词生成中心词的条件概率

P(w_c \mid w_{o_1}, \ldots, w_{o_{2m}}) = \frac{\text{exp}\left(\frac{1}{2m}\boldsymbol{u}_c^\top (\boldsymbol{v}_{o_1} + \ldots + \boldsymbol{v}_{o_{2m}}) \right)}{ \sum_{i \in \mathcal{V}} \text{exp}\left(\frac{1}{2m}\boldsymbol{u}_i^\top (\boldsymbol{v}_{o_1} + \ldots + \boldsymbol{v}_{o_{2m}}) \right)}

为了让符号更加简单,我们记\mathcal{W}_o= \{w_{o_1}, \ldots, w_{o_{2m}}\},且\bar{\boldsymbol{v}}_o = \left(\boldsymbol{v}_{o_1} + \ldots + \boldsymbol{v}_{o_{2m}} \right)/(2m),那么上式可以简写成
P(w_c \mid \mathcal{W}_o) = \frac{\exp\left(\boldsymbol{u}_c^\top \bar{\boldsymbol{v}}_o\right)}{\sum_{i \in \mathcal{V}} \exp\left(\boldsymbol{u}_i^\top \bar{\boldsymbol{v}}_o\right)}

给定一个长度为T的文本序列,设时间步t的词为w^{(t)},背景窗口大小为m。连续词袋模型的似然函数是由背景词生成任一中心词的概率
\prod_{t=1}^{T} P(w^{(t)} \mid w^{(t-m)}, \ldots, w^{(t-1)}, w^{(t+1)}, \ldots, w^{(t+m)})

训练连续词袋模型同训练跳字模型基本一致。连续词袋模型的最大似然估计等价于最小化损失函数
-\sum_{t=1}^T \text{log}\, P(w^{(t)} \mid w^{(t-m)}, \ldots, w^{(t-1)}, w^{(t+1)}, \ldots, w^{(t+m)})

注意到
\log\,P(w_c \mid \mathcal{W}_o) = \boldsymbol{u}_c^\top \bar{\boldsymbol{v}}_o - \log\,\left(\sum_{i \in \mathcal{V}} \exp\left(\boldsymbol{u}_i^\top \bar{\boldsymbol{v}}_o\right)\right)

通过微分,我们可以计算出上式中条件概率的对数有关任一背景词向量\boldsymbol{v}_{o_i}(i = 1, \ldots, 2m)的梯度
\begin{align} \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) \end{align}

中心词的梯度同理可得,
\begin{align} \frac{\partial \log\, P(w_c \mid \mathcal{W}_o)}{\partial \boldsymbol{u}_c} &=\bar{\boldsymbol{v}}_o - \frac{\exp (\boldsymbol{u}_c^\top \bar{\boldsymbol{v}}_o)}{\sum_{i \in \mathcal{V}} \exp \left( \boldsymbol{u}_i^\top \bar{\boldsymbol{v}}_o \right)} \bar{\boldsymbol{v}}_o \\ &= \bar{\boldsymbol{v}}_o - P(w_c \mid \mathcal{W}_o) \bar{\boldsymbol{v}}_o \\ &= \left( 1- P(w_c \mid \mathcal{W}_o) \right) \bar{\boldsymbol{v}}_o \end{align}

同跳字模型不一样的一点在于,我们一般使用连续词袋模型的背景词向量作为词的表征向量。

参考

  1. NLP之---word2vec算法skip-gram原理详解
  2. Word2Vec Tutorial - The Skip-Gram Model
  3. 动手学深度学习
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343