# 10.1 詞嵌入(word2vec)
> 注:個人覺得本節和下一節寫得過于簡潔,對于初學者來說可能比較難懂。所以強烈推薦讀一讀博客[Word2Vec-知其然知其所以然](https://www.zybuluo.com/Dounm/note/591752)。
自然語言是一套用來表達含義的復雜系統。在這套系統中,詞是表義的基本單元。顧名思義,詞向量是用來表示詞的向量,也可被認為是詞的特征向量或表征。把詞映射為實數域向量的技術也叫詞嵌入(word embedding)。近年來,詞嵌入已逐漸成為自然語言處理的基礎知識。
## 10.1.1 為何不采用one-hot向量
我們在6.4節(循環神經網絡的從零開始實現)中使用one-hot向量表示詞(字符為詞)。回憶一下,假設詞典中不同詞的數量(詞典大小)為`$ N $`,每個詞可以和從0到`$ N-1 $`的連續整數一一對應。這些與詞對應的整數叫作詞的索引。
假設一個詞的索引為`$ i $`,為了得到該詞的one-hot向量表示,我們創建一個全0的長為`$ N $`的向量,并將其第`$ i $`位設成1。這樣一來,每個詞就表示成了一個長度為`$ N $`的向量,可以直接被神經網絡使用。
雖然one-hot詞向量構造起來很容易,但通常并不是一個好選擇。一個主要的原因是,one-hot詞向量無法準確表達不同詞之間的相似度,如我們常常使用的余弦相似度。對于向量`$ \boldsymbol{x}, \boldsymbol{y} \in \mathbb{R}^d $`,它們的余弦相似度是它們之間夾角的余弦值
```[tex]
\frac{\boldsymbol{x}^\top \boldsymbol{y}}{\|\boldsymbol{x}\| \|\boldsymbol{y}\|} \in [-1, 1].
```
由于任何兩個不同詞的one-hot向量的余弦相似度都為0,多個不同詞之間的相似度難以通過one-hot向量準確地體現出來。
word2vec工具的提出正是為了解決上面這個問題 [1]。它將每個詞表示成一個定長的向量,并使得這些向量能較好地表達不同詞之間的相似和類比關系。word2vec工具包含了兩個模型,即跳字模型(skip-gram)[2] 和連續詞袋模型(continuous bag of words,CBOW)[3]。接下來讓我們分別介紹這兩個模型以及它們的訓練方法。
## 10.1.2 跳字模型
跳字模型假設基于某個詞來生成它在文本序列周圍的詞。舉個例子,假設文本序列是“the”“man”“loves”“his”“son”。以“loves”作為中心詞,設背景窗口大小為2。如圖10.1所示,跳字模型所關心的是,給定中心詞“loves”,生成與它距離不超過2個詞的背景詞“the”“man”“his”“son”的條件概率,即
```[tex]
P(\textrm{``the"},\textrm{``man"},\textrm{``his"},\textrm{``son"}\mid\textrm{``loves"}).
```
假設給定中心詞的情況下,背景詞的生成是相互獨立的,那么上式可以改寫成
```[tex]
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"}).
```
:-: 
<div align=center>圖10.1 跳字模型關心給定中心詞生成背景詞的條件概率</div>
在跳字模型中,每個詞被表示成兩個`$ d $`維向量,用來計算條件概率。假設這個詞在詞典中索引為`$ i $`,當它為中心詞時向量表示為`$ \boldsymbol{v}_i\in\mathbb{R}^d $`,而為背景詞時向量表示為`$ \boldsymbol{u}_i\in\mathbb{R}^d $`。設中心詞`$ w_c $` 在詞典中索引為`$ c $`,背景詞`$ w_o $`在詞典中索引為`$ o $`,給定中心詞生成背景詞的條件概率可以通過對向量內積做softmax運算而得到:
```[tex]
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)},
```
其中詞典索引集`$ \mathcal{V} = \{0, 1, \ldots, |\mathcal{V}|-1\} $`。假設給定一個長度為`$ T $`的文本序列,設時間步`$ t $`的詞為`$ w^{(t)} $`。假設給定中心詞的情況下背景詞的生成相互獨立,當背景窗口大小為`$ m $`時,跳字模型的似然函數即給定任一中心詞生成所有背景詞的概率
```[tex]
\prod_{t=1}^{T} \prod_{-m \leq j \leq m,\ j \neq 0} P(w^{(t+j)} \mid w^{(t)}),
```
這里小于1和大于`$ T $`的時間步可以忽略。
### 10.1.2.1 訓練跳字模型
跳字模型的參數是每個詞所對應的中心詞向量和背景詞向量。訓練中我們通過最大化似然函數來學習模型參數,即最大似然估計。這等價于最小化以下損失函數:
```[tex]
- \sum_{t=1}^{T} \sum_{-m \leq j \leq m,\ j \neq 0} \text{log}\, P(w^{(t+j)} \mid w^{(t)}).
```
如果使用隨機梯度下降,那么在每一次迭代里我們隨機采樣一個較短的子序列來計算有關該子序列的損失,然后計算梯度來更新模型參數。梯度計算的關鍵是條件概率的對數有關中心詞向量和背景詞向量的梯度。根據定義,首先看到
```[tex]
\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)
```
通過微分,我們可以得到上式中`$ \boldsymbol{v}_c $` 的梯度
```[tex]
\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}
```
它的計算需要詞典中所有詞以`$ w_c $`為中心詞的條件概率。有關其他詞向量的梯度同理可得。
訓練結束后,對于詞典中的任一索引為`$ i $`的詞,我們均得到該詞作為中心詞和背景詞的兩組詞向量`$ \boldsymbol{v}_i $`和`$ \boldsymbol{u}_i $`。在自然語言處理應用中,一般使用跳字模型的中心詞向量作為詞的表征向量。
## 10.1.3 連續詞袋模型
連續詞袋模型與跳字模型類似。與跳字模型最大的不同在于,連續詞袋模型假設基于某中心詞在文本序列前后的背景詞來生成該中心詞。在同樣的文本序列“the”“man”“loves”“his”“son”里,以“loves”作為中心詞,且背景窗口大小為2時,連續詞袋模型關心的是,給定背景詞“the”“man”“his”“son”生成中心詞“loves”的條件概率(如圖10.2所示),也就是
```[tex]
P(\textrm{``loves"}\mid\textrm{``the"},\textrm{``man"},\textrm{``his"},\textrm{``son"}).
```
:-: 
<div align=center>圖10.2 連續詞袋模型關心給定背景詞生成中心詞的條件概率</div>
因為連續詞袋模型的背景詞有多個,我們將這些背景詞向量取平均,然后使用和跳字模型一樣的方法來計算條件概率。設`$ \boldsymbol{v_i}\in\mathbb{R}^d $`和`$ \boldsymbol{u_i}\in\mathbb{R}^d $`分別表示詞典中索引為`$ i $`的詞作為背景詞和中心詞的向量(注意符號的含義與跳字模型中的相反)。設中心詞`$ w_c $`在詞典中索引為`$ c $`,背景詞`$ w_{o_1}, \ldots, w_{o_{2m}} $`在詞典中索引為`$ o_1, \ldots, o_{2m} $`,那么給定背景詞生成中心詞的條件概率
```[tex]
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) $`,那么上式可以簡寫成
```[tex]
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 $`。連續詞袋模型的似然函數是由背景詞生成任一中心詞的概率
```[tex]
\prod_{t=1}^{T} P(w^{(t)} \mid w^{(t-m)}, \ldots, w^{(t-1)}, w^{(t+1)}, \ldots, w^{(t+m)}).
```
### 10.1.3.1 訓練連續詞袋模型
訓練連續詞袋模型同訓練跳字模型基本一致。連續詞袋模型的最大似然估計等價于最小化損失函數
```[tex]
-\sum_{t=1}^T \text{log}\, P(w^{(t)} \mid w^{(t-m)}, \ldots, w^{(t-1)}, w^{(t+1)}, \ldots, w^{(t+m)}).
```
注意到
```[tex]
\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 $`)的梯度
```[tex]
\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).
```
有關其他詞向量的梯度同理可得。同跳字模型不一樣的一點在于,我們一般使用連續詞袋模型的背景詞向量作為詞的表征向量。
## 小結
* 詞向量是用來表示詞的向量。把詞映射為實數域向量的技術也叫詞嵌入。
* word2vec包含跳字模型和連續詞袋模型。跳字模型假設基于中心詞來生成背景詞。連續詞袋模型假設基于背景詞來生成中心詞。
## 參考文獻
[1] word2vec工具。https://code.google.com/archive/p/word2vec/
[2] Mikolov, T., Sutskever, I., Chen, K., Corrado, G. S., & Dean, J. (2013). Distributed representations of words and phrases and their compositionality. In Advances in neural information processing systems (pp. 3111-3119).
[3] Mikolov, T., Chen, K., Corrado, G., & Dean, J. (2013). Efficient estimation of word representations in vector space. arXiv preprint arXiv:1301.3781.
-----------
> 注:本節與原書完全相同,[原書傳送門](https://zh.d2l.ai/chapter_natural-language-processing/word2vec.html)
- Home
- Introduce
- 1.深度學習簡介
- 深度學習簡介
- 2.預備知識
- 2.1環境配置
- 2.2數據操作
- 2.3自動求梯度
- 3.深度學習基礎
- 3.1 線性回歸
- 3.2 線性回歸的從零開始實現
- 3.3 線性回歸的簡潔實現
- 3.4 softmax回歸
- 3.5 圖像分類數據集(Fashion-MINST)
- 3.6 softmax回歸的從零開始實現
- 3.7 softmax回歸的簡潔實現
- 3.8 多層感知機
- 3.9 多層感知機的從零開始實現
- 3.10 多層感知機的簡潔實現
- 3.11 模型選擇、反向傳播和計算圖
- 3.12 權重衰減
- 3.13 丟棄法
- 3.14 正向傳播、反向傳播和計算圖
- 3.15 數值穩定性和模型初始化
- 3.16 實戰kaggle比賽:房價預測
- 4 深度學習計算
- 4.1 模型構造
- 4.2 模型參數的訪問、初始化和共享
- 4.3 模型參數的延后初始化
- 4.4 自定義層
- 4.5 讀取和存儲
- 4.6 GPU計算
- 5 卷積神經網絡
- 5.1 二維卷積層
- 5.2 填充和步幅
- 5.3 多輸入通道和多輸出通道
- 5.4 池化層
- 5.5 卷積神經網絡(LeNet)
- 5.6 深度卷積神經網絡(AlexNet)
- 5.7 使用重復元素的網絡(VGG)
- 5.8 網絡中的網絡(NiN)
- 5.9 含并行連結的網絡(GoogLeNet)
- 5.10 批量歸一化
- 5.11 殘差網絡(ResNet)
- 5.12 稠密連接網絡(DenseNet)
- 6 循環神經網絡
- 6.1 語言模型
- 6.2 循環神經網絡
- 6.3 語言模型數據集(周杰倫專輯歌詞)
- 6.4 循環神經網絡的從零開始實現
- 6.5 循環神經網絡的簡單實現
- 6.6 通過時間反向傳播
- 6.7 門控循環單元(GRU)
- 6.8 長短期記憶(LSTM)
- 6.9 深度循環神經網絡
- 6.10 雙向循環神經網絡
- 7 優化算法
- 7.1 優化與深度學習
- 7.2 梯度下降和隨機梯度下降
- 7.3 小批量隨機梯度下降
- 7.4 動量法
- 7.5 AdaGrad算法
- 7.6 RMSProp算法
- 7.7 AdaDelta
- 7.8 Adam算法
- 8 計算性能
- 8.1 命令式和符號式混合編程
- 8.2 異步計算
- 8.3 自動并行計算
- 8.4 多GPU計算
- 9 計算機視覺
- 9.1 圖像增廣
- 9.2 微調
- 9.3 目標檢測和邊界框
- 9.4 錨框
- 10 自然語言處理
- 10.1 詞嵌入(word2vec)
- 10.2 近似訓練
- 10.3 word2vec實現
- 10.4 子詞嵌入(fastText)
- 10.5 全局向量的詞嵌入(Glove)
- 10.6 求近義詞和類比詞
- 10.7 文本情感分類:使用循環神經網絡
- 10.8 文本情感分類:使用卷積網絡
- 10.9 編碼器--解碼器(seq2seq)
- 10.10 束搜索
- 10.11 注意力機制
- 10.12 機器翻譯