詞嵌入(word2vec)
自然語言是一套用來表達含義的複雜系統。在這套系統中,詞是表義的基本單元。顧名思義,詞向量是用來表示詞的向量,也可被認爲是詞的特徵向量或表徵。把詞映射爲實數域向量的技術也叫詞嵌入(word embedding)。近年來,詞嵌入已逐漸成爲自然語言處理的基礎知識
介紹
word2vec是Google於2013年推出的開源的獲取詞向量word2vec的工具包。它包括了一組用於word embedding的模型,這些模型通常都是用淺層(兩層)神經網絡訓練詞向量。
Word2vec的模型以大規模語料庫作爲輸入,然後生成一個向量空間(通常爲幾百維)。詞典中的每個詞都對應了向量空間中的一個獨一的向量,而且語料庫中擁有共同上下文的詞映射到向量空間中的距離會更近。
爲何不採用one-hot向量
雖然one-hot詞向量構造起來很容易,但通常並不是一個好選擇。一個主要的原因是,one-hot詞向量無法準確表達不同詞之間的相似度,如我們常常使用的餘弦相似度。
x
,
y
∈
R
d
\boldsymbol{x}, \boldsymbol{y} \in \mathbb{R}^d
x , y ∈ R d ,它們的餘弦相似度是它們之間夾角的餘弦值
x
⊤
y
∣
x
∣
∣
y
∣
∈
[
−
1
,
1
]
.
\frac{\boldsymbol{x}^\top \boldsymbol{y}}{|\boldsymbol{x}| |\boldsymbol{y}|} \in [-1, 1].
∣ x ∣ ∣ y ∣ x ⊤ y ∈ [ − 1 , 1 ] . 由於任何兩個不同詞的one-hot向量的餘弦相似度都爲0,多個不同詞之間的相似度難以通過one-hot向量準確地體現出來。 例如: 1.「我愛學習」表示爲[1,2,3] 2.「我愛籃球」表示爲[1,3,3] 則它們的餘弦相似度是它們之間夾角的餘弦值:
x
⊤
y
∣
x
∣
∣
y
∣
=
1
∗
1
+
2
∗
3
+
3
∗
3
1
2
+
2
2
+
3
2
1
2
+
3
2
+
3
2
=
16
266
\frac{\boldsymbol{x}^\top \boldsymbol{y}}{|\boldsymbol{x}| |\boldsymbol{y}|} =\frac{1*1+2*3+3*3}{\sqrt{1^2+2^2+3^2}\sqrt{1^2+3^2+3^2}}=\frac{16}{\sqrt{266}}
∣ x ∣ ∣ y ∣ x ⊤ y = 1 2 + 2 2 + 3 2
1 2 + 3 2 + 3 2
1 ∗ 1 + 2 ∗ 3 + 3 ∗ 3 = 2 6 6
1 6 而使用one-hot編碼時,任何兩個不同詞的one-hot向量的餘弦相似度都爲0
word2vec工具的提出正是爲了解決上面這個問題 。 它將每個詞表示成一個定長的向量,並使得這些向量能較好地表達不同詞之間的相似和類比關係。word2vec工具包含了兩個模型,即跳字模型(skip-gram) 和連續詞袋模型(continuous bag of words,CBOW) 。接下來讓我們分別介紹這兩個模型以及它們的訓練方法。
跳字模型
跳字模型假設基於某個詞來生成它在文本序列周圍的詞 假設文本序列是「the」「man」「loves」「his」「son」。以「loves」作爲中心詞,設背景窗口大小爲2。 跳字模型所關心的是,給定中心詞「loves」,生成與它距離不超過2個詞的背景詞「the」「man」「his」「son」的條件概率,即
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" ) . 在跳字模型中,每個詞被表示成兩個
d
d
d 維向量,用來計算條件概率。假設這個詞在詞典中索引爲
i
i
i ,當它爲中心詞時向量表示爲
v
i
∈
R
d
\boldsymbol{v}_i\in\mathbb{R}^d
v i ∈ R d ,而爲背景詞時向量表示爲
u
i
∈
R
d
\boldsymbol{u}_i\in\mathbb{R}^d
u i ∈ R d 。設中心詞
w
c
w_c
w c 在詞典中索引爲
c
c
c ,背景詞
w
o
w_o
w o 在詞典中索引爲
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{\text{exp}(\boldsymbol{u}_o^\top \boldsymbol{v}c)}{ \sum{i \in \mathcal{V}} \text{exp}(\boldsymbol{u}_i^\top \boldsymbol{v}_c)},
P ( w o ∣ w c ) = ∑ i ∈ V exp ( u i ⊤ v c ) exp ( u o ⊤ v c ) ,
其中詞典索引集
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 時,跳字模型的似然函數即給定任一中心詞生成所有背景詞的概率
∏
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和大於
T
T
T 的時間步可以忽略。
訓練跳字模型
跳字模型的參數是每個詞所對應的中心詞向量和背景詞向量。訓練中我們通過最大化似然函數來學習模型參數,即最大似然估計。這等價於最小化以下損失函數:
−
∑
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} \text{log}, P(w^{(t+j)} \mid w^{(t)}).
− t = 1 ∑ T − m ≤ j ≤ m , j = 0 ∑ log , P ( w ( t + j ) ∣ w ( t ) ) .
如果使用隨機梯度下降,那麼在每一次迭代裏我們隨機採樣一個較短的子序列來計算有關該子序列的損失,然後計算梯度來更新模型參數。梯度計算的關鍵是條件概率的對數有關中心詞向量和背景詞向量的梯度。根據定義,首先看到
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) = \boldsymbol{u}_o^\top \boldsymbol{v}c - \log\left(\sum{i \in \mathcal{V}} \text{exp}(\boldsymbol{u}_i^\top \boldsymbol{v}_c)\right)
log P ( w o ∣ w c ) = u o ⊤ v c − log ( ∑ i ∈ V exp ( u i ⊤ v c ) )
通過微分,我們可以得到上式中
v
c
\boldsymbol{v}_c
v c 的梯度
∂
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 \text{log}, P(w_o \mid w_c)}{\partial \boldsymbol{v}_c} &= \boldsymbol{u}o - \frac{\sum{j \in \mathcal{V}} \exp(\boldsymbol{u}_j^\top \boldsymbol{v}_c)\boldsymbol{u}j}{\sum{i \in \mathcal{V}} \exp(\boldsymbol{u}_i^\top \boldsymbol{v}_c)}\ &= \boldsymbol{u}o - \sum{j \in \mathcal{V}} \left(\frac{\text{exp}(\boldsymbol{u}_j^\top \boldsymbol{v}c)}{ \sum{i \in \mathcal{V}} \text{exp}(\boldsymbol{u}_i^\top \boldsymbol{v}_c)}\right) \boldsymbol{u}_j\ &= \boldsymbol{u}o - \sum{j \in \mathcal{V}} P(w_j \mid w_c) \boldsymbol{u}_j. \end{aligned}
∂ v c ∂ log , P ( w o ∣ w c ) = u o − ∑ i ∈ V exp ( u i ⊤ v c ) ∑ j ∈ V exp ( u j ⊤ v c ) u j = u o − ∑ j ∈ V ( ∑ i ∈ V exp ( u i ⊤ v c ) exp ( u j ⊤ v c ) ) u j = u o − ∑ j ∈ V P ( w j ∣ w c ) u j .
它的計算需要詞典中所有詞以
w
c
w_c
w c 爲中心詞的條件概率。有關其他詞向量的梯度同理可得。
訓練結束後,對於詞典中的任一索引爲
i
i
i 的詞,我們均得到該詞作爲中心詞和背景詞的兩組詞向量
v
i
\boldsymbol{v}_i
v i 和
u
i
\boldsymbol{u}_i
u i 。在自然語言處理應用中,一般使用跳字模型的中心詞向量作爲詞的表徵向量。
連續詞袋模型
連續詞袋模型與跳字模型類似。與跳字模型最大的不同在於,連續詞袋模型假設基於某中心詞在文本序列前後的背景詞來生成該中心詞。在同樣的文本序列「the」「man」「loves」「his」「son」裏,以「loves」作爲中心詞,且背景窗口大小爲2時,連續詞袋模型關心的是,給定背景詞「the」「man」「his」「son」生成中心詞「loves」的條件概率,也就是
P
(
loves"
∣
the"
,
man"
,
his"
,
「son"
)
.
P(\textrm{loves"}\mid\textrm{the"},\textrm{man"},\textrm{his"},\textrm{``son"}).
P ( loves" ∣ the" , man" , his" , 「son" ) . 因爲連續詞袋模型的背景詞有多個,我們將這些背景詞向量取平均,然後使用和跳字模型一樣的方法來計算條件概率。設
v
i
∈
R
d
\boldsymbol{v_i}\in\mathbb{R}^d
v i ∈ R d 和
u
i
∈
R
d
\boldsymbol{u_i}\in\mathbb{R}^d
u i ∈ R d 分別表示詞典中索引爲
i
i
i 的詞作爲背景詞和中心詞的向量(注意符號的含義與跳字模型中的相反)。設中心詞
w
c
w_c
w c 在詞典中索引爲
c
c
c ,背景詞
w
o
1
,
…
,
w
o
2
m
w_{o_1}, \ldots, w_{o_{2m}}
w o 1 , … , w o 2 m 在詞典中索引爲
o
1
,
…
,
o
2
m
o_1, \ldots, o_{2m}
o 1 , … , o 2 m ,那麼給定背景詞生成中心詞的條件概率
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{\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)}.
P ( w c ∣ w w o 1 , … , w o 2 m 在詞典中索引爲
o
1
,
…
,
o
2
m
o_1, \ldots, o_{2m}
o 1 , … , o 2 m ,那麼給定背景詞生成中心詞的條件概率
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{\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)}.
P ( w c ∣ w o 1 , … , w o 2 m ) = ∑ i ∈ V exp ( 2 m 1 u i < style="height: 2.7em;">o 2 m 在詞典中索引爲
o
1
,
…
,
o
2
m
o_1, \ldots, o_{2m}
o 1 , … , o 2 m ,那麼給定背景詞生成中心詞的條件概率
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{\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)}.
P ( w c ∣ w o 1 , … , w o 2 m ) = ∑ i ∈ V exp ( 2 m 1 u i ⊤ ( v o
P ( w c ∣ w