词嵌入 word2vec:Skip-Gram 与 CBOW 经典解读

词嵌入(word2vec)

原文:Dive into Deep Learning classic 0.17.6, Word Embedding (word2vec)

作者:Aston Zhang、Zachary C. Lipton、Mu Li、Alexander J. Smola

原页面版本信息:D2L classic 0.17.6;页面 HTTP Last-Modified 为 2022-11-13

授权说明:D2L 英文开源书正文采用 Creative Commons Attribution-ShareAlike 4.0 International License(CC BY-SA 4.0)。本文为中文翻译,保留原文结构、公式、图注与引用关系,并按同一许可分享。

自然语言是一个用来表达意义的复杂系统。在这个系统中,词是意义的基本单位。顾名思义,词向量 就是用来表示词的向量,也可以看作词的特征向量或表示。把词映射为实数向量的技术称为词嵌入。近年来,词嵌入已经逐渐成为自然语言处理的基础知识。

One-Hot 向量不是一个好选择

在循环神经网络的相关章节中,我们曾使用 one-hot 向量来表示词(字符也被当作词处理)。假设词典中不同词的数量(即词典大小)为 N N N,每个词分别对应从 0 0 0 到 N − 1 N-1 N−1 的一个不同整数(索引)。若要得到索引为 i i i 的任意一个词的 one-hot 向量表示,我们可以创建一个长度为 N N N、所有元素均为 0 的向量,并把位置 i i i 上的元素设为 1。这样,每个词都被表示为一个长度为 N N N 的向量,并且可以直接被神经网络使用。

尽管 one-hot 词向量很容易构造,但它通常并不是一个好的选择。主要原因之一是,one-hot 词向量无法准确表达不同词之间的相似性,例如我们常用的余弦相似度 。对于向量 x , y ∈ R d \mathbf{x}, \mathbf{y} \in \mathbb{R}^d x,y∈Rd,它们的余弦相似度就是两者夹角的余弦值:

x ⊤ y ∥ x ∥ ∥ y ∥ ∈ − 1 , 1 . \frac{\mathbf{x}^\top \mathbf{y}}{\|\mathbf{x}\| \|\mathbf{y}\|} \in -1, 1. ∥x∥∥y∥x⊤y∈−1,1.

由于任意两个不同词的 one-hot 向量之间的余弦相似度都为 0,因此 one-hot 向量无法编码词与词之间的相似性。

自监督的 word2vec

word2vec 工具正是为了解决上述问题而提出的。它把每个词映射为一个定长向量,而这些向量能够更好地表达不同词之间的相似性与类比关系。word2vec 工具包含两个模型,即 skip-gram (Mikolov、Sutskever、Chen 等,2013)和连续词袋模型(continuous bag of words,CBOW;Mikolov、Chen、Corrado 等,2013)。为了得到具有语义意义的表示,这两个模型的训练都依赖于条件概率;这些条件概率可以理解为:在语料中,用某些词周围的一部分词去预测另一些词。由于监督信号来自不带人工标签的数据本身,skip-gram 和连续词袋模型都是自监督模型。

下面,我们将介绍这两个模型及其训练方法。

Skip-Gram 模型

skip-gram 模型假设,一个词可以用来生成文本序列中它周围的词。以文本序列 "the""man""loves""his""son" 为例。我们选择 "loves" 作为中心词 ,并把上下文窗口大小设为 2。如图 14.1.1 所示,给定中心词 "loves",skip-gram 模型考虑生成上下文词 "the""man""his""son" 的条件概率;这些上下文词与中心词之间的距离都不超过 2 个词:

P ( "the" , "man" , "his" , "son" ∣ "loves" ) . P(\textrm{"the"},\textrm{"man"},\textrm{"his"},\textrm{"son"}\mid\textrm{"loves"}). P("the","man","his","son"∣"loves").

假设在给定中心词的情况下,上下文词是相互独立生成的(即条件独立)。此时,上面的条件概率可以改写为:

P ( "the" ∣ "loves" ) ⋅ P ( "man" ∣ "loves" ) ⋅ P ( "his" ∣ "loves" ) ⋅ P ( "son" ∣ "loves" ) . P(\textrm{"the"}\mid\textrm{"loves"})\cdot P(\textrm{"man"}\mid\textrm{"loves"})\cdot P(\textrm{"his"}\mid\textrm{"loves"})\cdot P(\textrm{"son"}\mid\textrm{"loves"}). P("the"∣"loves")⋅P("man"∣"loves")⋅P("his"∣"loves")⋅P("son"∣"loves").

图 14.1.1:Skip-Gram 模型在给定中心词的条件下,考虑生成周围上下文词的条件概率。

在 skip-gram 模型中,为了计算条件概率,每个词都有两个 d d d 维向量表示。更具体地说,对于词典中索引为 i i i 的任意词,分别用 v i ∈ R d \mathbf{v}_i\in\mathbb{R}^d vi∈Rd 和 u i ∈ R d \mathbf{u}_i\in\mathbb{R}^d ui∈Rd 表示它作为中心词上下文词 时的两个向量。给定中心词 w c w_c wc(其在词典中的索引为 c c c)后,生成任意上下文词 w o w_o wo(其在词典中的索引为 o o o)的条件概率,可以通过对向量点积做 softmax 运算来建模:

P ( w o ∣ w c ) = exp ⁡ ( u o ⊤ v c ) ∑ i ∈ V exp ⁡ ( u i ⊤ v c ) , P(w_o \mid w_c) = \frac{\exp(\mathbf{u}_o^\top \mathbf{v}c)}{ \sum{i \in \mathcal{V}} \exp(\mathbf{u}_i^\top \mathbf{v}_c)}, P(wo∣wc)=∑i∈Vexp(ui⊤vc)exp(uo⊤vc),

其中词表索引集合为 V = { 0 , 1 , ... , ∣ V ∣ − 1 } \mathcal{V} = \{0, 1, \ldots, |\mathcal{V}|-1\} V={0,1,...,∣V∣−1}。给定一个长度为 T T T 的文本序列,其中时间步 t t t 上的词记为 w ( t ) w^{(t)} w(t)。假设给定任意中心词后,上下文词都是相互独立生成的。对于上下文窗口大小 m m m,skip-gram 模型的似然函数就是:给定任意中心词后,生成所有上下文词的概率:

∏ t = 1 T ∏ − m ≤ j ≤ m , j ≠ 0 P ( w ( t + j ) ∣ w ( t ) ) , \prod_{t=1}^{T} \prod_{-m \leq j \leq m,\ j \neq 0} P(w^{(t+j)} \mid w^{(t)}), t=1∏T−m≤j≤m, j=0∏P(w(t+j)∣w(t)),

其中小于 1 1 1 或大于 T T T 的任意时间步都可以省略。

训练

skip-gram 模型的参数,是词表中每个词的中心词向量和上下文词向量。在训练时,我们通过最大化似然函数(即最大似然估计)来学习模型参数。这等价于最小化下面的损失函数:

− ∑ t = 1 T ∑ − m ≤ j ≤ m , j ≠ 0 log   P ( w ( t + j ) ∣ w ( t ) ) . - \sum_{t=1}^{T} \sum_{-m \leq j \leq m,\ j \neq 0} \textrm{log}\, P(w^{(t+j)} \mid w^{(t)}). −t=1∑T−m≤j≤m, j=0∑logP(w(t+j)∣w(t)).

使用随机梯度下降来最小化损失时,在每次迭代中,我们可以随机采样一段较短的子序列,并计算这段子序列上的(随机)梯度,从而更新模型参数。为了计算这个(随机)梯度,我们需要得到对数条件概率分别关于中心词向量和上下文词向量的梯度。一般而言,根据上面的 softmax 条件概率,涉及任意一对中心词 w c w_c wc 与上下文词 w o w_o wo 的对数条件概率为:

log ⁡ P ( w o ∣ w c ) = u o ⊤ v c − log ⁡ ( ∑ i ∈ V exp ⁡ ( u i ⊤ v c ) ) . \log P(w_o \mid w_c) =\mathbf{u}_o^\top \mathbf{v}c - \log\left(\sum{i \in \mathcal{V}} \exp(\mathbf{u}_i^\top \mathbf{v}_c)\right). logP(wo∣wc)=uo⊤vc−log(i∈V∑exp(ui⊤vc)).

通过求导,可以得到它关于中心词向量 v c \mathbf{v}_c vc 的梯度:

∂ log   P ( w o ∣ w c ) ∂ v c = u o − ∑ j ∈ V exp ⁡ ( u j ⊤ v c ) u j ∑ i ∈ V exp ⁡ ( u i ⊤ v c ) = u o − ∑ j ∈ V ( exp ⁡ ( u j ⊤ v c ) ∑ i ∈ V exp ⁡ ( u i ⊤ v c ) ) u j = u o − ∑ j ∈ V P ( w j ∣ w c ) u j . \begin{aligned}\frac{\partial \textrm{log}\, P(w_o \mid w_c)}{\partial \mathbf{v}_c}&= \mathbf{u}o - \frac{\sum{j \in \mathcal{V}} \exp(\mathbf{u}_j^\top \mathbf{v}_c)\mathbf{u}j}{\sum{i \in \mathcal{V}} \exp(\mathbf{u}_i^\top \mathbf{v}_c)}\\&= \mathbf{u}o - \sum{j \in \mathcal{V}} \left(\frac{\exp(\mathbf{u}_j^\top \mathbf{v}c)}{ \sum{i \in \mathcal{V}} \exp(\mathbf{u}_i^\top \mathbf{v}_c)}\right) \mathbf{u}_j\\&= \mathbf{u}o - \sum{j \in \mathcal{V}} P(w_j \mid w_c) \mathbf{u}_j.\end{aligned} ∂vc∂logP(wo∣wc)=uo−∑i∈Vexp(ui⊤vc)∑j∈Vexp(uj⊤vc)uj=uo−j∈V∑(∑i∈Vexp(ui⊤vc)exp(uj⊤vc))uj=uo−j∈V∑P(wj∣wc)uj.

注意,上式中的计算需要得到以 w c w_c wc 为中心词时,词典中所有词的条件概率。其他词向量的梯度也可以用同样的方法得到。

训练完成后,对于词典中索引为 i i i 的任意词,我们会同时得到两个词向量: v i \mathbf{v}_i vi(作为中心词时的向量)和 u i \mathbf{u}_i ui(作为上下文词时的向量)。在自然语言处理应用中,通常使用 skip-gram 模型的中心词向量作为词的表示。

连续词袋(CBOW)模型

连续词袋模型 (continuous bag of words,CBOW)与 skip-gram 模型相似。二者的主要区别在于:连续词袋模型假设中心词是基于文本序列中它周围的上下文词生成的。例如,在同一个文本序列 "the""man""loves""his""son" 中,以 "loves" 为中心词,并把上下文窗口大小设为 2,连续词袋模型会考虑基于上下文词 "the""man""his""son" 生成中心词 "loves" 的条件概率(如图 14.1.2 所示),也就是:

P ( "loves" ∣ "the" , "man" , "his" , "son" ) . P(\textrm{"loves"}\mid\textrm{"the"},\textrm{"man"},\textrm{"his"},\textrm{"son"}). P("loves"∣"the","man","his","son").

图 14.1.2:连续词袋模型在给定周围上下文词的条件下,考虑生成中心词的条件概率。

由于连续词袋模型中有多个上下文词,在计算条件概率时,会对这些上下文词向量取平均。具体来说,对于词典中索引为 i i i 的任意词,分别用 v i ∈ R d \mathbf{v}i\in\mathbb{R}^d vi∈Rd 和 u i ∈ R d \mathbf{u}i\in\mathbb{R}^d ui∈Rd 表示它作为上下文词中心词 时的两个向量(与 skip-gram 模型中的含义相反)。给定周围上下文词 w o 1 , ... , w o 2 m w{o_1}, \ldots, w{o_{2m}} wo1,...,wo2m(它们在词典中的索引分别为 o 1 , ... , o 2 m o_1, \ldots, o_{2m} o1,...,o2m)后,生成任意中心词 w c w_c wc(其在词典中的索引为 c c c)的条件概率可以建模为:

P ( w c ∣ w o 1 , ... , w o 2 m ) = exp ⁡ ( 1 2 m u c ⊤ ( v o 1 + ... + v o 2 m ) ) ∑ i ∈ V exp ⁡ ( 1 2 m u i ⊤ ( v o 1 + ... + v o 2 m ) ) . P(w_c \mid w_{o_1}, \ldots, w_{o_{2m}}) = \frac{\exp\left(\frac{1}{2m}\mathbf{u}c^\top (\mathbf{v}{o_1} + \ldots + \mathbf{v}{o{2m}}) \right)}{ \sum_{i \in \mathcal{V}} \exp\left(\frac{1}{2m}\mathbf{u}i^\top (\mathbf{v}{o_1} + \ldots + \mathbf{v}{o{2m}}) \right)}. P(wc∣wo1,...,wo2m)=∑i∈Vexp(2m1ui⊤(vo1+...+vo2m))exp(2m1uc⊤(vo1+...+vo2m)).

为简洁起见,令 W o = { w o 1 , ... , w o 2 m } \mathcal{W}o= \{w{o_1}, \ldots, w_{o_{2m}}\} Wo={wo1,...,wo2m},并令 v ˉ o = ( v o 1 + ... + v o 2 m ) / ( 2 m ) \bar{\mathbf{v}}o = \left(\mathbf{v}{o_1} + \ldots + \mathbf{v}{o{2m}} \right)/(2m) vˉo=(vo1+...+vo2m)/(2m)。于是上式可以简化为:

P ( w c ∣ W o ) = exp ⁡ ( u c ⊤ v ˉ o ) ∑ i ∈ V exp ⁡ ( u i ⊤ v ˉ o ) . P(w_c \mid \mathcal{W}_o) = \frac{\exp\left(\mathbf{u}_c^\top \bar{\mathbf{v}}o\right)}{\sum{i \in \mathcal{V}} \exp\left(\mathbf{u}_i^\top \bar{\mathbf{v}}_o\right)}. P(wc∣Wo)=∑i∈Vexp(ui⊤vˉo)exp(uc⊤vˉo).

给定一个长度为 T T T 的文本序列,其中时间步 t t t 上的词记为 w ( t ) w^{(t)} w(t)。对于上下文窗口大小 m m m,连续词袋模型的似然函数就是:给定每个中心词的上下文词后,生成所有中心词的概率:

∏ t = 1 T P ( w ( t ) ∣ w ( t − m ) , ... , w ( t − 1 ) , w ( t + 1 ) , ... , 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)}). t=1∏TP(w(t)∣w(t−m),...,w(t−1),w(t+1),...,w(t+m)).

训练

训练连续词袋模型与训练 skip-gram 模型几乎相同。连续词袋模型的最大似然估计等价于最小化下面的损失函数:

− ∑ t = 1 T log   P ( w ( t ) ∣ w ( t − m ) , ... , w ( t − 1 ) , w ( t + 1 ) , ... , w ( t + m ) ) . -\sum_{t=1}^T \textrm{log}\, P(w^{(t)} \mid w^{(t-m)}, \ldots, w^{(t-1)}, w^{(t+1)}, \ldots, w^{(t+m)}). −t=1∑TlogP(w(t)∣w(t−m),...,w(t−1),w(t+1),...,w(t+m)).

注意:

log ⁡   P ( w c ∣ W o ) = u c ⊤ v ˉ o − log ⁡   ( ∑ i ∈ V exp ⁡ ( u i ⊤ v ˉ o ) ) . \log\,P(w_c \mid \mathcal{W}_o) = \mathbf{u}_c^\top \bar{\mathbf{v}}o - \log\,\left(\sum{i \in \mathcal{V}} \exp\left(\mathbf{u}_i^\top \bar{\mathbf{v}}_o\right)\right). logP(wc∣Wo)=uc⊤vˉo−log(i∈V∑exp(ui⊤vˉo)).

通过求导,可以得到它关于任意上下文词向量 v o i \mathbf{v}_{o_i} voi( i = 1 , ... , 2 m i = 1, \ldots, 2m i=1,...,2m)的梯度:

∂ log ⁡   P ( w c ∣ W o ) ∂ v o i = 1 2 m ( u c − ∑ j ∈ V exp ⁡ ( u j ⊤ v ˉ o ) u j ∑ i ∈ V exp ⁡ ( u i ⊤ v ˉ o ) ) = 1 2 m ( u c − ∑ j ∈ V P ( w j ∣ W o ) u j ) . \frac{\partial \log\, P(w_c \mid \mathcal{W}o)}{\partial \mathbf{v}{o_i}} = \frac{1}{2m} \left(\mathbf{u}c - \sum{j \in \mathcal{V}} \frac{\exp(\mathbf{u}_j^\top \bar{\mathbf{v}}_o)\mathbf{u}j}{ \sum{i \in \mathcal{V}} \exp(\mathbf{u}_i^\top \bar{\mathbf{v}}_o)} \right) = \frac{1}{2m}\left(\mathbf{u}c - \sum{j \in \mathcal{V}} P(w_j \mid \mathcal{W}_o) \mathbf{u}_j \right). ∂voi∂logP(wc∣Wo)=2m1 uc−j∈V∑∑i∈Vexp(ui⊤vˉo)exp(uj⊤vˉo)uj =2m1 uc−j∈V∑P(wj∣Wo)uj .

其他词向量的梯度也可以用同样的方法得到。与 skip-gram 模型不同,连续词袋模型通常使用上下文词向量作为词的表示。

小结

  • 词向量是用来表示词的向量,也可以看作词的特征向量或表示。把词映射为实数向量的技术称为词嵌入。
  • word2vec 工具同时包含 skip-gram 模型和连续词袋模型。
  • skip-gram 模型假设,一个词可以用来生成文本序列中它周围的词;而连续词袋模型则假设,中心词是基于它周围的上下文词生成的。

练习

  1. 计算每个梯度的计算复杂度是多少?如果词典规模非常大,会出现什么问题?
  2. 英语中的一些固定短语由多个词组成,例如 "new york"。应该如何训练这类短语的词向量?提示:参见 word2vec 论文(Mikolov、Sutskever、Chen 等,2013)的第 4 节。
  3. 让我们以 skip-gram 模型为例来反思 word2vec 的设计。skip-gram 模型中两个词向量的点积与余弦相似度之间有什么关系?对于一对语义相近的词,为什么由 skip-gram 模型训练得到的词向量可能具有较高的余弦相似度?

原文讨论区:D2L Discussion 381

相关推荐
阳光是sunny1 小时前
LangGraph实战教程:控制流详解
前端·人工智能·后端
黄华SJ520it1 小时前
AI智能穿搭系统开发:从技术选型到落地实践
人工智能·系统开发
szxinmai主板定制专家2 小时前
RK3568+FPGA高速并行采集|半导体探针测试设备多通道同步数据采集系统设计
人工智能·嵌入式硬件·计算机视觉·fpga开发
心如鉄补2 小时前
FastAPI Agent 函数调用实战:我让 AI 学会了“自己动手查天气“
人工智能·fastapi
QN1幻化引擎3 小时前
两个 AI 互相“创造自己“:Dalin X × Dalin L 自创造闭环全记录
大数据·人工智能
smartpi_ai3 小时前
离线语音识别的“数字变量“限制:为什么不能识别“20.5度“?
人工智能·语音识别·xcode
IT小盘3 小时前
05-企业项目统一接入多个大模型-适配器模式实战
前端·人工智能·适配器模式
张彦峰ZYF3 小时前
从 Claude 到 Mythos:Anthropic 模型体系、对齐路线与企业级智能体实践分享
人工智能·claude·ai 安全·claude code·fable 5·mythos 5·企业级 ai
大鱼>3 小时前
Transformer时间序列预测:从Informer到TimesFM的完整演进
人工智能·深度学习·transformer