1、seq2seq架構圖算法
seq2seq模型左邊綠色的部分咱們稱之爲encoder,左邊的循環輸入最終生成一個固定向量做爲右側的輸入,右邊紫色的部分咱們稱之爲decoder。單看右側這個結構跟咱們以前學習的語言模型很是類似,以下:架構
惟一不一樣的是,語言模型的輸入a<0>是一個零向量,而seq2seq模型decoder部分的輸入是由encoder編碼獲得的一個固定向量。因此能夠稱seq2seq模型爲條件語言模型p(y|x)。函數
語言模型生成的序列y是能夠隨機生成的,而seq2seq模型用於到機器翻譯中,咱們是要找到機率最大的序列y,即最可能或者說最好的翻譯結果,max p(y|x)。性能
seq2seq模型如何尋找到最可能的序列y呢?學習
是否是能夠採用貪心算法呢?若是採用貪心算法找的結果不必定是最優的,只能說是其中一個結果。由於貪心算法的思路是先找到第一個最好的y<1>,第一個輸出結果y<1>再找到第二個最好的y<2>,以此類推。這種方式的最終結果是每個元素多是最優的,可是整個句子卻未必是最好的。例以下面的句子:優化
採用貪心算法,最可能的結果就是第二句,由於若是前兩個是Jane is ,第三個最可能的是going,而不是visiting,這是由於is going在英語中大量存在。可是最好的結果倒是第一個句子。編碼
2、beam search(集束搜索)spa
仍是以上述機器翻譯的例子來解釋集束搜索算法流程,第一步以下:翻譯
第一步就是先根據左側的輸入,生成第一個輸出y<1>,y<1>是softmax轉換後的機率輸出。集束搜索須要設置集束寬度,本次設置B(beam width)=3,也就是每次僅保留機率最大的top3個。因此,第一步就是選擇y<1>中機率最大的前三個詞,假設本例子中是in,jane,september,就保留這三個詞在內存中。code
第二步:
第二步就是在y<1>爲in,jane,September的狀況下,分別計算第二個詞的機率,如上圖所示套入三個seq2seq模型中去各自尋找。由於詞典維度|v|=10000,因此三個詞最終會計算出30000個後面銜接第二個詞的機率,最終從這30000個裏面選出機率最大的top3個便可,由於集束寬度依然爲3。假設第二步篩選出來的結果是in september, jane is,jane visits;September開頭的由於鏈接後面的詞後機率偏低,已經被去掉了。
第三步:
第三步實際上是跟第二步同樣,直到最後選出EOS結束。
3、beam search的優化
優化一:
將機率的乘積轉化成爲機率的對數求和。
由於乘積的話,會越乘越小,甚至會致使數值的下溢問題。取對數後就變成了連加,就基本解決了這個問題,並且對數後的目標函數與原目標函數解是一致的。
優化二:
歸一化目標函數,除以翻譯結果的單詞數量,減小了對長的結果的懲罰。由於從上述目標函數能夠看出,不管原目標函數仍是對數目標函數,都不利於長的結果的輸出,由於結果越長,連乘或者連加(每一個元素取對數後都是負數)都使得機率愈來愈小。
這裏的Ty就是翻譯結果的單詞數量,α是一個超參數,能夠設置0(至關於不作歸一化),0.7,1,須要根據實際狀況調整獲得一個最優的結果。
集束寬度B的選擇:
large B:效果好,計算代價大,運行慢。
small B:效果差,計算代價小,運行快。
工業中,B=10,每每是一個不錯的選擇;科研中,爲了充分實驗,能夠嘗試100,1000,3000.
B從1~10,性能提高比較明顯,可是B從1000~3000,提高就沒有那麼明顯了。
總結,相比於BFS(廣度優先搜索)、DFS,beam search不能保證必定能找到arg max 的準確最大值,是一個近似的最大值。