Seq2Seq中的beam search演算法
在Sequence to Sequence模型中我們介紹了seq2seq模型,並介紹了機器翻譯的應用,在得到訓練模型之後,我們希望能夠得到句子序列的條件概率最大的序列,例如
法語句子"Jane visite lAfrique en septembre."翻譯1-Jane is visiting Africa in September.翻譯2-Jane is going to be visiting Africa in September.
顯然翻譯2聽起來比較笨拙,並不是最好的翻譯,也就是
因此我們希望得到一個單詞序列表示英文句子使得條件概率最大:
1. Why not a greedy search?
一個很直觀的方法是採用貪心搜索(greedy search),在生成第一個詞 的分布之後,根據條件語言模型挑選出最有可能的第一個詞 ,然後生成第二個詞 的概率分布挑選第二個詞 ,依此類推。可以看出貪心演算法始終是選擇每一個最大概率的詞,但我們真正需要的是一次性挑選整個單詞序列 使得整體的條件概率最大,所以貪心演算法先挑出最好的第一個詞,在這之後再挑最好的第二詞,然後再挑第三個,這種方法其實並不管用,我們用上面的例子進行說明。
法語句子"Jane visite lAfrique en septembre."翻譯1-Jane is visiting Africa in September.翻譯2-Jane is going to be visiting Africa in September.
翻譯1顯然比翻譯2要更好,更加簡潔的表達了意思,第二個就很啰嗦並且有很多不重要的詞。如果貪心演算法挑選了 (Jane , is),那麼在英語中"is going"更加常見,因此在選擇 時就會得到 going,於是對於法語句子來說"Jane is going"相比"Jane is visiting"會有更高的概率作為法語的翻譯,所以很有可能如果你僅僅根據前兩個詞來估計第三個詞的可能性,得到的就是going,最終你會得到一個欠佳的句子。
2. Beam Search
在Beam Search中只有一個參數B,叫做beam width(集束寬),用來表示在每一次挑選top B的結果。
我們用下面這個例子來做說明,假設字典大小為10000,B=3
法語句子"Jane visite lAfrique en septembre."翻譯1-Jane is visiting Africa in September.翻譯2-Jane is going to be visiting Africa in September.
在第一步的時候,我們通過模型計算得到 的分布概率,選擇前B個作為候選結果,比如如下圖所示的"in", "jane", "september"
第二步的時候,我們已經選擇出了in、jane、September作為第一個單詞的三個最可能選擇,beam search針對每個第一個單詞考慮第二個單詞的概率,例如針對單詞「in」,我們將 =in,然後將它餵給 ,輸出結果 作為第二個單詞的概率輸出。因為我們關注的是最有可能的 ,因此我們的選擇方法為:
然後同樣將「jane」作為將 ,然後將它餵給 ,計算得到 ,然後計算得到:
同樣將"september"作為將 ,然後將它餵給 ,計算得到 ,然後計算得到:
這樣我們就計算得到了 個選擇,那麼選擇前3個,比如得到的結果是:
- in september
- jane is
- jane visits
這樣我們就找到了第一個和第二個單詞對最可能的三個選擇,這也意味著我們去掉了September作為英語翻譯結果第一個單詞的選擇。
第三步的時候,同樣我們將我們將 =in, =september,然後將它餵給 ,輸出結果 作為第三個單詞的概率輸出
這樣我們得到前三的結果是:
- in september jane
- jane is visiting
- jane visits africa
第四步的時候同理,增加一個單詞作為輸入,這樣最終會找到「Jane visits africa in september」這個句子,終止在句尾符號。
在集束寬為3時,集束搜索一次只考慮3個可能結果。注意如果集束寬等於1,只考慮1種可能結果,這實際上就變成了貪婪搜索演算法,上面里我們已經討論過了。但是如果同時考慮多個,可能的結果比如3個,10個或者其他的個數,集束搜索通常會找到比貪婪搜索更好的輸出結果。
推薦閱讀:
※調整數組順序使奇數位於偶數前面
※計數排序
※布爾表達式求值
※fibo數列第n項
※精選 TOP45 值得學習的Python項目
TAG:機器學習 | 深度學習DeepLearning | 演算法 |