# 10.2 近似訓練
回憶上一節的內容。跳字模型的核心在于使用softmax運算得到給定中心詞$w_c$來生成背景詞`$ w _o $`的條件概率
```[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)}.
```
該條件概率相應的對數損失
```[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).
```
由于softmax運算考慮了背景詞可能是詞典`$ \mathcal{V} $`中的任一詞,以上損失包含了詞典大小數目的項的累加。在上一節中我們看到,不論是跳字模型還是連續詞袋模型,由于條件概率使用了softmax運算,每一步的梯度計算都包含詞典大小數目的項的累加。對于含幾十萬或上百萬詞的較大詞典,每次的梯度計算開銷可能過大。為了降低該計算復雜度,本節將介紹兩種近似訓練方法,即負采樣(negative sampling)或層序softmax(hierarchical softmax)。由于跳字模型和連續詞袋模型類似,本節僅以跳字模型為例介紹這兩種方法。
## 10.2.1 負采樣
負采樣修改了原來的目標函數。給定中心詞`$ w_c $`的一個背景窗口,我們把背景詞`$ w_o $`出現在該背景窗口看作一個事件,并將該事件的概率計算為
```[tex]
P(D=1\mid w_c, w_o) = \sigma(\boldsymbol{u}_o^\top \boldsymbol{v}_c),
```
其中的`$ \sigma $`函數與sigmoid激活函數的定義相同:
```[tex]
\sigma(x) = \frac{1}{1+\exp(-x)}.
```
我們先考慮最大化文本序列中所有該事件的聯合概率來訓練詞向量。具體來說,給定一個長度為`$ T $`的文本序列,設時間步`$ t $`的詞為`$ w^{(t)} $`且背景窗口大小為 `$ m $`,考慮最大化聯合概率
```[tex]
\prod_{t=1}^{T} \prod_{-m \leq j \leq m,\ j \neq 0} P(D=1\mid w^{(t)}, w^{(t+j)}).
```
然而,以上模型中包含的事件僅考慮了正類樣本。這導致當所有詞向量相等且值為無窮大時,以上的聯合概率才被最大化為1。很明顯,這樣的詞向量毫無意義。負采樣通過采樣并添加負類樣本使目標函數更有意義。設背景詞`$ w_o $`出現在中心詞`$ w_c $` 的一個背景窗口為事件`$ P $`,我們根據分布`$ P(w) $`采樣`$ K $`個未出現在該背景窗口中的詞,即噪聲詞。設噪聲詞`$ w_k $`(`$ k=1, \ldots, K $`)不出現在中心詞`$ w_c $`的該背景窗口為事件`$ N_k $`。假設同時含有正類樣本和負類樣本的事件`$ P, N_1, \ldots, N_K $`相互獨立,負采樣將以上需要最大化的僅考慮正類樣本的聯合概率改寫為
```[tex]
\prod_{t=1}^{T} \prod_{-m \leq j \leq m,\ j \neq 0} P(w^{(t+j)} \mid w^{(t)}),
```
其中條件概率被近似表示為
```[tex]
P(w^{(t+j)} \mid w^{(t)}) =P(D=1\mid w^{(t)}, w^{(t+j)})\prod_{k=1,\ w_k \sim P(w)}^K P(D=0\mid w^{(t)}, w_k).
```
設文本序列中時間步`$ t $`的詞`$ w^{(t)} $`在詞典中的索引為`$ i_t $`,噪聲詞`$ w_k $`在詞典中的索引為`$ h_k $`。有關以上條件概率的對數損失為
```[tex]
\begin{aligned}
-\log P(w^{(t+j)} \mid w^{(t)})
=& -\log P(D=1\mid w^{(t)}, w^{(t+j)}) - \sum_{k=1,\ w_k \sim P(w)}^K \log P(D=0\mid w^{(t)}, w_k)\\
=&- \log\, \sigma\left(\boldsymbol{u}_{i_{t+j}}^\top \boldsymbol{v}_{i_t}\right) - \sum_{k=1,\ w_k \sim P(w)}^K \log\left(1-\sigma\left(\boldsymbol{u}_{h_k}^\top \boldsymbol{v}_{i_t}\right)\right)\\
=&- \log\, \sigma\left(\boldsymbol{u}_{i_{t+j}}^\top \boldsymbol{v}_{i_t}\right) - \sum_{k=1,\ w_k \sim P(w)}^K \log\sigma\left(-\boldsymbol{u}_{h_k}^\top \boldsymbol{v}_{i_t}\right).
\end{aligned}
```
現在,訓練中每一步的梯度計算開銷不再與詞典大小相關,而與`$ K $`線性相關。當`$ K $`取較小的常數時,負采樣在每一步的梯度計算開銷較小。
## 10.2.2 層序softmax
層序softmax是另一種近似訓練法。它使用了二叉樹這一數據結構,樹的每個葉結點代表詞典`$ \mathcal{V} $`中的每個詞。
:-: 
<div align=center>圖10.3 層序softmax。二叉樹的每個葉結點代表著詞典的每個詞</div>
假設`$ L(w) $`為從二叉樹的根結點到詞`$ w $`的葉結點的路徑(包括根結點和葉結點)上的結點數。設`$ n(w,j) $`為該路徑上第`$ j $`個結點,并設該結點的背景詞向量為`$ \boldsymbol{u}_{n(w,j)} $`。以圖10.3為例,`$ L(w_3) = 4 $`。層序softmax將跳字模型中的條件概率近似表示為
```[tex]
P(w_o \mid w_c) = \prod_{j=1}^{L(w_o)-1} \sigma\left( [\![ n(w_o, j+1) = \text{leftChild}(n(w_o,j)) ]\!] \cdot \boldsymbol{u}_{n(w_o,j)}^\top \boldsymbol{v}_c\right),
```
其中`$ \sigma $`函數與3.8節(多層感知機)中sigmoid激活函數的定義相同,`$ \text{leftChild}(n) $`是結點`$ n $`的左子結點:如果判斷`$ x $`為真,`$ [\![x]\!] = 1 $`;反之`$ [\![x]\!] = -1 $`。
讓我們計算圖10.3中給定詞`$ w_c $`生成詞`$ w_3 $`的條件概率。我們需要將`$ w_c $`的詞向量`$ \boldsymbol{v}_c $`和根結點到`$ w_3 $` 路徑上的非葉結點向量一一求內積。由于在二叉樹中由根結點到葉結點`$ w_3 $`的路徑上需要向左、向右再向左地遍歷(圖10.3中加粗的路徑),我們得到
```[tex]
P(w_3 \mid w_c) = \sigma(\boldsymbol{u}_{n(w_3,1)}^\top \boldsymbol{v}_c) \cdot \sigma(-\boldsymbol{u}_{n(w_3,2)}^\top \boldsymbol{v}_c) \cdot \sigma(\boldsymbol{u}_{n(w_3,3)}^\top \boldsymbol{v}_c).
```
由于`$ \sigma(x)+\sigma(-x) = 1 $`,給定中心詞`$ w_c $`生成詞典`$ \mathcal{V} $`中任一詞的條件概率之和為1這一條件也將滿足:
```[tex]
\sum_{w \in \mathcal{V}} P(w \mid w_c) = 1.
```
此外,由于`$ L(w_o)-1 $`的數量級為`$ \mathcal{O}(\text{log}_2|\mathcal{V}|) $`,當詞典`$ \mathcal{V} $`很大時,層序softmax在訓練中每一步的梯度計算開銷相較未使用近似訓練時大幅降低。
## 小結
* 負采樣通過考慮同時含有正類樣本和負類樣本的相互獨立事件來構造損失函數。其訓練中每一步的梯度計算開銷與采樣的噪聲詞的個數線性相關。
* 層序softmax使用了二叉樹,并根據根結點到葉結點的路徑來構造損失函數。其訓練中每一步的梯度計算開銷與詞典大小的對數相關。
-----------
> 注:本節與原書完全相同,[原書傳送門](https://zh.d2l.ai/chapter_natural-language-processing/approx-training.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 機器翻譯