解碼是seq2seq模型的常見問題,常用方法有貪心搜索(Greedy Search)集束搜索(Beam Search)。
簡單貪心搜索
From [1]
如圖,Decoder根據Encoder的中間語義編碼向量 和<s>
標籤得到第一個輸出的概率分佈 ,選擇概率最大的0.4,即moi
。
根據隱向量 和moi
得到第二個輸出的概率分佈 ,選擇概率最大的0.6,即suis
。
以此類推,直到遇到<\s>
標籤,得到最終的序列moi suis étudiant
。
集束搜索
上面的貪心搜索只選擇了概率最大的一個,而集束搜索則選擇了概率最大的前k個。這個k值也叫做集束寬度(Beam Width)。
還是以上面的例子作爲說明,k值等於2,則集束搜索的過程如下圖:
得到第一個輸出的概率分佈 ,選擇概率最大的前兩個,0.3和0.4,即Je
和moi
。
然後Je和moi分別作爲Decoder的輸入,得到兩個概率分佈,然後再選擇概率和最大的前兩個序列,0.3+0.8和0.4+0.6,即Je suis
和moi suis
。
以此類推,最終可以得到兩個序列,即Je suis étudiant
和moi suis étudiant
,很明顯前者的概率和最大,爲2.2,所以這個序列是最終得到的結果。
集束搜索本質上也是貪心的思想,只不過它考慮了更多的候選搜索空間,因此可以得到更多的翻譯結果。