seq2seq通俗理解----編碼器和解碼器(TensorFlow實現)
1. 什麼是seq2seq
在⾃然語⾔處理的很多應⽤中,輸⼊和輸出都可以是不定⻓序列。以機器翻譯為例,輸⼊可以是⼀段不定⻓的英語⽂本序列,輸出可以是⼀段不定⻓的法語⽂本序列,例如:
英語輸⼊:“They”、“are”、“watching”、“.”
法語輸出:“Ils”、“regardent”、“.”
當輸⼊和輸出都是不定⻓序列時,我們可以使⽤編碼器—解碼器(encoder-decoder)或者seq2seq模型。 序列到序列模型,簡稱seq2seq模型。這兩個模型本質上都⽤到了兩個迴圈神經⽹絡,分別叫做編碼器和解碼器。編碼器⽤來分析輸⼊序列,解碼器⽤來⽣成輸出序列。兩 個迴圈神經網路是共同訓練的。
下圖描述了使⽤編碼器—解碼器將上述英語句⼦翻譯成法語句⼦的⼀種⽅法。在訓練資料集中,我們可以在每個句⼦後附上特殊符號“\
編碼器的作⽤是把⼀個不定⻓的輸⼊序列變換成⼀個定⻓的背景變數 c,並在該背景變數中編碼輸⼊序列資訊。常⽤的編碼器是迴圈神經⽹絡。 讓我們考慮批量⼤小為1的時序資料樣本。假設輸⼊序列是 x1, . . . , xT,例如 xi 是輸⼊句⼦中的第 i 個詞。在時間步 t,迴圈神經⽹絡將輸⼊ xt 的特徵向量 xt 和上個時間步的隱藏狀態
變換為當前時間步的隱藏狀態ht。我們可以⽤函式 f 表達迴圈神經⽹絡隱藏層的變換:
)
接下來,編碼器通過⾃定義函式 q 將各個時間步的隱藏狀態變換為背景變數:
)
例如,當選擇
q(
h1
, . . . ,
h*T
) = **h
*T 時,背景變數是輸⼊序列最終時間步的隱藏狀態*h
**T*。 以上描述的編碼器是⼀個單向的迴圈神經⽹絡,每個時間步的隱藏狀態只取決於該時間步及之前的輸⼊⼦序列。我們也可以使⽤雙向迴圈神經⽹絡構造編碼器。在這種情況下,編碼器每個時間步的隱藏狀態同時取決於該時間步之前和之後的⼦序列(包括當前時間步的輸⼊),並編碼了整個序列的資訊。 剛剛已經介紹,編碼器輸出的背景變數 c 編碼了整個輸⼊序列 x1, . . . , xT 的資訊。給定訓練樣本中的輸出序列 y1, y2, . . . , yT′ ,對每個時間步 t′(符號與輸⼊序列或編碼器的時間步 t 有區別),解碼器輸出 yt′ 的條件概率將基於之前的輸出序列
和背景變數 c,即:
為此,我們可以使⽤另⼀個迴圈神經⽹絡作為解碼器。在輸出序列的時間步 t′,解碼器將上⼀時間步的輸出
以及背景變數 c 作為輸⼊,並將它們與上⼀時間步的隱藏狀態
變換為當前時間步的隱藏狀態st′。因此,我們可以⽤函式 g 表達解碼器隱藏層的變換:
有了解碼器的隱藏狀態後,我們可以使⽤⾃定義的輸出層和softmax運算來計算
,例如,基於當XQ前時間步的解碼器隱藏狀態 st′、上⼀時間步的輸出
以及背景變數 c 來計算當前時間步輸出 yt′ 的概率分佈。
根據最⼤似然估計,我們可以最⼤化輸出序列基於輸⼊序列的條件概率:
並得到該輸出序列的損失:
在模型訓練中,所有輸出序列損失的均值通常作為需要最小化的損失函式。在上圖所描述的模型預測中,我們需要將解碼器在上⼀個時間步的輸出作為當前時間步的輸⼊。與此不同,在訓練中我們也可以將標籤序列(訓練集的真實輸出序列)在上⼀個時間步的標籤作為解碼器在當前時間步的輸⼊。這叫作強制教學(teacher forcing)。 以上介紹瞭如何訓練輸⼊和輸出均為不定⻓序列的編碼器—解碼器。本節我們介紹如何使⽤編碼器—解碼器來預測不定⻓的序列。 在準備訓練資料集時,我們通常會在樣本的輸⼊序列和輸出序列後面分別附上⼀個特殊符號“\
貪婪搜尋(greedy search)。對於輸出序列任⼀時間步t′,我們從|Y|個詞中搜尋出條件概率最⼤的詞:
作為輸出。⼀旦搜尋出“\
下⾯來看⼀個例⼦。假設輸出詞典⾥⾯有“A”“B”“C”和“\
接下來,觀察下面演⽰的例⼦。與上圖中不同,在時間步2中選取了條件概率第⼆⼤的詞“C”
如果⽬標是得到最優輸出序列,我們可以考慮窮舉搜尋(exhaustive search):窮舉所有可能的輸出序列,輸出條件概率最⼤的序列。 雖然窮舉搜尋可以得到最優輸出序列,但它的計算開銷
很容易過⼤。例如,當|Y| =10000且T′ = 10時,我們將評估
個序列:這⼏乎不可能完成。而貪婪搜尋的計算開銷是
,通常顯著小於窮舉搜尋的計算開銷。例如,當|Y| = 10000且T′ = 10時,我們只需評估
個序列。
束搜尋(beam search)是對貪婪搜尋的⼀個改進演算法。它有⼀個束寬(beam size)超引數。我們將它設為 k。在時間步 1 時,選取當前時間步條件概率最⼤的 k 個詞,分別組成 k 個候選輸出序列的⾸詞。在之後的每個時間步,基於上個時間步的 k 個候選輸出序列,從 k |Y| 個可能的輸出序列中選取條件概率最⼤的 k 個,作為該時間步的候選輸出序列。最終,我們從各個時間步的候選輸出序列中篩選出包含特殊符號“\
束寬為2,輸出序列最⼤⻓度為3。候選輸出序列有A、C、AB、CE、ABD和CED。我們將根據這6個序列得出最終候選輸出序列的集合。在最終候選輸出序列的集合中,我們取以下分數最⾼的序列作為輸出序列:
其中 L 為最終候選序列⻓度,α ⼀般可選為0.75。分⺟上的 Lα 是為了懲罰較⻓序列在以上分數中較多的對數相加項。分析可知,束搜尋的計算開銷為
。這介於貪婪搜尋和窮舉搜尋的計算開銷之間。此外,貪婪搜尋可看作是束寬為 1 的束搜尋。束搜尋通過靈活的束寬 k 來權衡計算開銷和搜尋質量。
評價機器翻譯結果通常使⽤BLEU(Bilingual Evaluation Understudy)(雙語評估替補)。對於模型預測序列中任意的⼦序列,BLEU考察這個⼦序列是否出現在標籤序列中。 具體來說,設詞數為 n 的⼦序列的精度為 pn。它是預測序列與標籤序列匹配詞數為 n 的⼦序列的數量與預測序列中詞數為 n 的⼦序列的數量之⽐。舉個例⼦,假設標籤序列為A、B、C、D、E、F,預測序列為A、B、B、C、D,那麼:
預測序列一元片語:A/B/C/D,都在標籤序列裡存在,所以P1=4/5,以此類推,p2 = 3/4, p3 = 1/3, p4 = 0。設
分別為標籤序列和預測序列的詞數,那麼,BLEU的定義為:
其中 k 是我們希望匹配的⼦序列的最⼤詞數。可以看到當預測序列和標籤序列完全⼀致時,BLEU為1。 因為匹配較⻓⼦序列⽐匹配較短⼦序列更難,BLEU對匹配較⻓⼦序列的精度賦予了更⼤權重。例如,當 pn 固定在0.5時,隨著n的增⼤,
。另外,模型預測較短序列往往會得到較⾼pn 值。因此,上式中連乘項前⾯的係數是為了懲罰較短的輸出而設的。舉個例⼦,當k = 2時,假設標籤序列為A、B、C、D、E、F,而預測序列為A、 B。雖然p1 = p2 = 1,但懲罰係數exp(1-6/2) ≈ 0.14,因此BLEU也接近0.14。
【
機器學習通俗易懂系列文章】
作者:
@mantchs
2. 編碼器
3. 解碼器
4. 訓練模型
5. seq2seq模型預測
5.1 貪婪搜尋
下的4個數字分別代表了該時間步⽣成“A”“B”“C”和“\
。由於時間步3所基於的時間步1和2的輸出⼦序列由上圖中的“A”“B”變為了下圖中的“A”“C”,下圖中時間步3⽣成各個詞的條件概率發⽣了變化。我們選取條件概率最⼤的詞“B”。此時時間步4所基於的前3個時間步的輸出⼦序列為“A”“C”“B”,與上圖中的“A”“B”“C”不同。因此,下圖中時間步4⽣成各個詞的條件概率也與上圖中的不同。我們發現,此時的輸出序列“A”“C”“B”“\
5.2 窮舉搜尋
5.3 束搜尋
6. Bleu得分
7. 程式碼實現
8. 參考文獻
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69942346/viewspace-2655522/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- TensorFlow上實現AutoEncoder自編碼器
- 利用 TensorFlow 實現卷積自編碼器卷積
- TensorFlow實現seq2seq
- Keras上實現AutoEncoder自編碼器Keras
- 乾貨 | 如何從編碼器和解碼器兩方面改進生成式句子摘要?
- 機器學習(四):通俗理解支援向量機SVM及程式碼實踐機器學習
- netty系列之:自定義編碼和解碼器要注意的問題Netty
- MMKV的編碼和解碼
- 基於Netty實現Redis協議的編碼解碼器NettyRedis協議
- 實時程式碼編輯器
- [java IO流]之編碼和解碼Java
- python中字串的編碼和解碼Python字串
- ==和is的區別 以及編碼和解碼
- 自動編碼器
- 【Netty】編解碼器Netty
- 簡述小資料池,編碼和解碼
- CKKS Part2: CKKS的編碼和解碼
- Asp.Net Core 使用Monaco Editor 實現程式碼編輯器ASP.NET
- Vue(27)vue-codemirror實現線上程式碼編譯器Vue編譯
- 影像壓縮編碼碼matlab實現——行程編碼Matlab行程
- 影像壓縮編碼碼matlab實現——DM編碼Matlab
- 通俗理解kaggle比賽大殺器xgboost
- EditRocket (原始碼編輯器)原始碼
- Java 8中的Base64編碼和解碼Java
- 結合例項學習|字元編碼和解碼字元
- 影像壓縮編碼碼matlab實現——變換編碼Matlab
- 影像壓縮編碼碼matlab實現——算術編碼Matlab
- 直播平臺搭建原始碼,純js實現編輯器撤消/重做原始碼JS
- 編解碼器軟體支援 WMP,因為它使用 Directshow 編解碼器
- 【Codecs系列】硬體編碼器編碼引數分析
- 實現指令碼直譯器 - 詞法分析器指令碼詞法分析
- 圖卷積神經網路(GCN)理解與tensorflow2.0程式碼實現卷積神經網路GC
- 電位器和編碼器的區別
- netty系列之:自定義編碼解碼器Netty
- 機器uuid對應編碼UI
- VAE變分自編碼器
- 重新理解熵編碼熵
- ☕【Java技術指南】「編譯器專題」深入分析探究“靜態編譯器”(JAVA\IDEA\ECJ編譯器)是否可以實現程式碼優化?Java編譯Idea優化