5.3序列模型與注意力機制
覺得有用的話,歡迎一起討論相互學習~
3.3 集束搜索Beam Search
- 對於機器翻譯來說,給定輸入的句子,會返回一個隨機的英語翻譯結果,但是你想要一個最好的英語翻譯結果。對於語音識別也是一樣,給定一個輸入的語音片段,你不會想要一個隨機的文本翻譯結果,你想要一個最接近願意的翻譯結果。
- Jane visite l'Afrique en septembre 希望翻譯成英文句子 Jane is visiting Africa in September
-
集束搜索第一步就是挑選出英文翻譯句子中的第一個單詞。
- 首先英語字典可表示為:
- 第一個英語翻譯的單詞的概率可表示為:
\(P(y^{<1>}|x)\) , 其中x表示輸入的法語句子,\(y^{<1>}\)表示輸出的第一個英語單詞。 - 此步驟的結構可表示為:
- 貪婪算法只會挑出最可能的那個單詞,然后繼續,然而 集束搜索算法 會考慮多個結果, 集束搜索算法 會有一個參數B, 叫做 集束寬(beam width) 在這個例子中,設置集束寬(beam width) 為3 這表明其會一次性考慮三個候選單詞。然后 集束搜索算法 會把結果存到計算機內存中,以便后面嘗試使用這三個詞。
- 過程是先將整個待翻譯的句子輸入到 綠色 的編碼網絡中,然后使用 紫色 的解碼網絡進行解碼,結果是一個1W維的向量,用來表示第一個英文單詞的概率,選擇概率最大的 3個(集束寬) 單詞存儲在內存中。
- 首先英語字典可表示為:
-
對於第二個單詞,是要在確定第一個單詞的情況下進行搜索。
- 假設第一個單詞被設置為 in 或 jane 或 september
- 將第一個單詞 in 作為 解碼器 的第一個節點的輸出,並且將其作為第二個節點的輸入。這樣這個網絡就能評估第二個詞的概率了 \(P(y^{<2>}|x,"in")\)
- Note 在第二步中,第一個和第二個單詞的聯合概率是關心的重點即\(P(y^{<1>},y^{<2>}|x)\),根據概率公式,有:\(P(y^{<1>},y^{<2>}|x)=p(y^{<1>}|x)P(y^{<2>}|x,y^{<1>})\).
- 同樣,對第一個翻譯結果的其他候選詞("jane, september")進行如上操作.
- 由於使用的 集束寬 為3 ,並且詞匯表中單詞的數量為 1W, 所以最終會有3W(集束寬 * 詞典中詞匯總量)個可能的結果
- 再從3W個結果中挑選出3(集束寬)個概率最大的結果
- Note 對於第二個單詞的挑選,使用三(集束寬)個不同的網絡,因為每個網絡的 \(y^{<1>}\) 不同。
- 假設第一個單詞被設置為 in 或 jane 或 september
-
保存已經挑選出的前兩個單詞與在輸入為x的條件下,前兩個單詞的概率,同上述操作挑選出第三個詞:
-
集束搜索通過這種方法每次找到一個詞,最終 得到 Jane visits africa in september 這個句子終止在句尾符號
3.4 改進集束搜索Refinements to beam search
長度歸一化 Length Normalization
取log值
- 集束搜索的目的是最大化下式
其中: 上式也可表示為下式
\[P(y^{<1>}y^{<2>}...y^{T_{y}})=P(y^{<1>}|x)P(y^{<2>}|x,y^{<1>})...P(y^{T_{y}}|x,y^{<1>}...,y^{T_{y}-1}) \]
- 但是\(P(y^{<1>}|x)P(y^{<2>}|x,y^{<1>})...P(y^{<T_{y}>}|x,y^{<1>}...,y^{<T_{y}-1>})\)這個乘積式中的因子都是小數,其乘積會是一個十分小的數,會造成 數值下溢(numerical underflow)
- 為了解決這個問題 ,將最大化的乘積式取對數 ,由 logM*N=logM+logN 公式可得,上述需要最大化的乘積式可以轉化為:
即乘積的log變成了log的求和,最大化這個log的求和值能夠得到同樣的結果,並且不會出現 數值下溢和四舍五入
歸一化
- 由於\(P(y^{<1>}|x)P(y^{<2>}|x,y^{<1>})...P(y^{<T_{y}>}|x,y^{<1>}...,y^{<T_{y}-1>})\)乘積式中各個因此都是小數,所以隨着翻譯句子的增長,P的乘積會越來越小。而 集束搜索 的結果會選取較大的P的乘積式。這樣搜索方法會不自然的偏向 更短的翻譯輸出 因為 短句子 的概率是由更少的小於1的數字乘積得到的。而對於乘積的 對數式 ,由於取對數后的結果是負數,要取得更大的概率值,也會偏向於 更短的翻譯結果
- 因此將原先的公式 除以翻譯后句子的總長度/翻譯后句子總長度的指數(指數小於1) ,這樣很明顯的減少了對輸出長的結果的懲罰
束寬選擇 Beam width B
-
束寬B越大,你考慮的選擇越多,找到的句子可能越好,但是B越大,算法的計算代價越大,程序運行的也會相對較慢,因為要把更多可能的選擇保存下來。
-
束寬B越小,需要考慮的選擇越少,內存占用小,程序運行越快,但是效果沒有那么好。
-
普通時候B一般選擇10,工業界上也可以選擇100,科研任務中需要得到最好的結果,也有將B設置為1000或3000的時候。
-
Note 相對於 深度優先搜索 , 廣度優先搜索 等算法來說,束搜索運行的更快但是不能包含保證一定能找到arg max的准確的最大值
3.5 集束搜索誤差分析 Error analysis on beam search
- 束搜索算法是一種 近似搜索算法(approximate search algorithm) , 也被稱為 heuristic search algorithm 啟發式搜索算法 , 其不總是輸出可能性最大的句子 , 它僅記錄着B為前3或者10或者100種可能。 所以束搜索方法也會出現錯誤。 本節將使用 誤差分析 的方法對 束搜索(beam search) 進行改進,發現到底是束搜索方法出現了問題還是構造的RNN模型出現了問題導致整個系統的失效。
- 例句 Jane visite l'Afrique en septembre ,驗證集中人工翻譯的正確答案為 Jane visits Africa in September 將人工翻譯的結果標記為 \(y^{ * }\) ,使用訓練完成的機器翻譯模型翻譯為 Jane visited Africa last September 並將其標記為 \(\hat{y}\)
- 當然,機器翻譯的結果不能算是好的翻譯,其中機器翻譯可以被分成兩個部分 編碼器與解碼器 ,束搜索B 。必須有方法判斷出是兩部分中的哪部分的問題,導致翻譯系統不能很好的工作。
- 增大束寬B 意味着在選擇單詞時有更好的選擇 ,但是一味的增大束寬B也會帶來不好的結果。
- RNN的功能是計算P(y|x),所以可以通過比較 \(P(y^{ * }|x)\) 和 \(P(\hat{y}|x)\) 的值的大小來判斷RNN和束搜索方法的好壞。
\(P(y^{ * }|x) \ge P(\hat{y}|x)\)
- 束搜索方法選擇了 \(\hat{y}\) , RNN計算P(y|x), 而束搜索方法就是找到了 \(\hat{y}\) ,使得P(y|x)達到最大。所以此時能夠判斷 束搜索方法不能提供一個能是P(y|x)達到最大的y值
\(P(y^{ * }|x) \le P(\hat{y}|x)\)
- 在例子中設定 \(y^{ * }\) 是比 \(\hat{y}\) 更好的翻譯結果,不過根據RNN的概率計算 \(P(y^{ * }|x) \le P(\hat{y}|x)\) 這與P(x|y)的實際定義不符合,RNN應該判斷更好的翻譯結果具有更高的P(x|y)值,所以此時可以認為是RNN模型出了問題,不能對P(x|y)做出有效的判斷。
總結
- 通過這個過程,你就能執行誤差分析得出束搜索算法和RNN模型出錯的比例是多少。可以通過對開發集中每一個錯誤例子(即翻譯比人工差的情況)嘗試確定這些錯誤,是搜索算法還是RNN模型出錯。並且通過這個過程可以發現其中哪個對翻譯出錯的影響更大。並且只有當發現是束搜索算法引發了大量錯誤時,才可以決定增大集束寬度B。如果是發現RNN出了問題,你可以進行更深層次的分析來決定是需要增加正則化還是獲取更多的訓練數據或是嘗試一個不同的網絡結構