# 10.9 編碼器—解碼器(seq2seq)
我們已經在前兩節中表征并變換了不定長的輸入序列。但在自然語言處理的很多應用中,輸入和輸出都可以是不定長序列。以機器翻譯為例,輸入可以是一段不定長的英語文本序列,輸出可以是一段不定長的法語文本序列,例如
> 英語輸入:“They”、“are”、“watching”、“.”
> 法語輸出:“Ils”、“regardent”、“.”
當輸入和輸出都是不定長序列時,我們可以使用編碼器—解碼器(encoder-decoder)[1] 或者seq2seq模型 [2]。這兩個模型本質上都用到了兩個循環神經網絡,分別叫做編碼器和解碼器。編碼器用來分析輸入序列,解碼器用來生成輸出序列。
圖10.8描述了使用編碼器—解碼器將上述英語句子翻譯成法語句子的一種方法。在訓練數據集中,我們可以在每個句子后附上特殊符號“<eos>”(end of sequence)以表示序列的終止。編碼器每個時間步的輸入依次為英語句子中的單詞、標點和特殊符號“<eos>”。圖10.8中使用了編碼器在最終時間步的隱藏狀態作為輸入句子的表征或編碼信息。解碼器在各個時間步中使用輸入句子的編碼信息和上個時間步的輸出以及隱藏狀態作為輸入。我們希望解碼器在各個時間步能正確依次輸出翻譯后的法語單詞、標點和特殊符號"<eos>"。需要注意的是,解碼器在最初時間步的輸入用到了一個表示序列開始的特殊符號"<bos>"(beginning of sequence)。
:-: 
<div align=center>圖10.8 使用編碼器—解碼器將句子由英語翻譯成法語。編碼器和解碼器分別為循環神經網絡</div>
接下來,我們分別介紹編碼器和解碼器的定義。
## 10.9.1 編碼器
編碼器的作用是把一個不定長的輸入序列變換成一個定長的背景變量`$ \boldsymbol{c} $`,并在該背景變量中編碼輸入序列信息。常用的編碼器是循環神經網絡。
讓我們考慮批量大小為1的時序數據樣本。假設輸入序列是`$ x_1,\ldots,x_T $`,例如`$ x_i $` 是輸入句子中的第`$ i $`個詞。在時間步`$ t $`,循環神經網絡將輸入`$ x_t $`的特征向量`$ \boldsymbol{x}_t $`和上個時間步的隱藏狀態`$ \boldsymbol{h}_{t-1} $`變換為當前時間步的隱藏狀態`$ \boldsymbol{h}_t $`。我們可以用函數`$ f $`表達循環神經網絡隱藏層的變換:
```[tex]
\boldsymbol{h}_t = f(\boldsymbol{x}_t, \boldsymbol{h}_{t-1}).
```
接下來,編碼器通過自定義函數$q$將各個時間步的隱藏狀態變換為背景變量
```[tex]
\boldsymbol{c} = q(\boldsymbol{h}_1, \ldots, \boldsymbol{h}_T).
```
例如,當選擇`$ q(\boldsymbol{h}_1, \ldots, \boldsymbol{h}_T) = \boldsymbol{h}_T $`時,背景變量是輸入序列最終時間步的隱藏狀態`$ \boldsymbol{h}_T $`。
以上描述的編碼器是一個單向的循環神經網絡,每個時間步的隱藏狀態只取決于該時間步及之前的輸入子序列。我們也可以使用雙向循環神經網絡構造編碼器。在這種情況下,編碼器每個時間步的隱藏狀態同時取決于該時間步之前和之后的子序列(包括當前時間步的輸入),并編碼了整個序列的信息。
## 10.9.2 解碼器
剛剛已經介紹,編碼器輸出的背景變量 `$ \boldsymbol{c} $`編碼了整個輸入序列` $x_1, \ldots, x_T $`的信息。給定訓練樣本中的輸出序列`$ y_1, y_2, \ldots, y_{T'} $`,對每個時間步`$ t' $`(符號與輸入序列或編碼器的時間步`$ t $`有區別),解碼器輸出`$ y_{t'} $`的條件概率將基于之前的輸出序列`$ y_1,\ldots,y_{t'-1} $`和背景變量`$ \boldsymbol{c} $`,即`$ P(y_{t'} \mid y_1, \ldots, y_{t'-1}, \boldsymbol{c}) $`。
為此,我們可以使用另一個循環神經網絡作為解碼器。在輸出序列的時間步$t^\prime$,解碼器將上一時間步的輸出`$ y_{t^\prime-1} $`以及背景變量`$ \boldsymbol{c} $`作為輸入,并將它們與上一時間步的隱藏狀態`$ \boldsymbol{s}_{t^\prime-1} $`變換為當前時間步的隱藏狀態`$ \boldsymbol{s}_{t^\prime} $`。因此,我們可以用函數`$ g $`表達解碼器隱藏層的變換:
```[tex]
\boldsymbol{s}_{t^\prime} = g(y_{t^\prime-1}, \boldsymbol{c}, \boldsymbol{s}_{t^\prime-1}).
```
有了解碼器的隱藏狀態后,我們可以使用自定義的輸出層和softmax運算來計算`$ P(y_{t^\prime} \mid y_1, \ldots, y_{t^\prime-1}, \boldsymbol{c}) $`,例如,基于當前時間步的解碼器隱藏狀態 `$ \boldsymbol{s}_{t^\prime} $`、上一時間步的輸出`$ y_{t^\prime-1} $`以及背景變量`$ \boldsymbol{c} $`來計算當前時間步輸出`$ y_{t^\prime} $`的概率分布。
## 10.9.3 訓練模型
根據最大似然估計,我們可以最大化輸出序列基于輸入序列的條件概率
```[tex]
\begin{aligned}
P(y_1, \ldots, y_{T'} \mid x_1, \ldots, x_T)
&= \prod_{t'=1}^{T'} P(y_{t'} \mid y_1, \ldots, y_{t'-1}, x_1, \ldots, x_T)\\
&= \prod_{t'=1}^{T'} P(y_{t'} \mid y_1, \ldots, y_{t'-1}, \boldsymbol{c}),
\end{aligned}
```
并得到該輸出序列的損失
```[tex]
-\log P(y_1, \ldots, y_{T'} \mid x_1, \ldots, x_T) = -\sum_{t'=1}^{T'} \log P(y_{t'} \mid y_1, \ldots, y_{t'-1}, \boldsymbol{c}),
```
在模型訓練中,所有輸出序列損失的均值通常作為需要最小化的損失函數。在圖10.8所描述的模型預測中,我們需要將解碼器在上一個時間步的輸出作為當前時間步的輸入。與此不同,在訓練中我們也可以將標簽序列(訓練集的真實輸出序列)在上一個時間步的標簽作為解碼器在當前時間步的輸入。這叫作強制教學(teacher forcing)。
## 小結
* 編碼器-解碼器(seq2seq)可以輸入并輸出不定長的序列。
* 編碼器—解碼器使用了兩個循環神經網絡。
* 在編碼器—解碼器的訓練中,可以采用強制教學。
## 參考文獻
[1] Cho, K., Van Merri?nboer, B., Gulcehre, C., Bahdanau, D., Bougares, F., Schwenk, H., & Bengio, Y. (2014). Learning phrase representations using RNN encoder-decoder for statistical machine translation. arXiv preprint arXiv:1406.1078.
[2] Sutskever, I., Vinyals, O., & Le, Q. V. (2014). Sequence to sequence learning with neural networks. In Advances in neural information processing systems (pp. 3104-3112).
-----------
> 注:本節與原書基本相同,[原書傳送門](https://zh.d2l.ai/chapter_natural-language-processing/seq2seq.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 機器翻譯