構建seq2seq模型,並訓練完成後,咱們只要將源句子輸入進訓練好的模型,執行一次前向傳播就能獲得目標句子,可是值得注意的是:學習
seq2seq模型的decoder部分實際上至關於一個語言模型,相比於RNN語言模型,decoder的初始輸入並不是0向量,而是encoder對源句子提取的信息。所以整個seq2seq模型至關於一個條件語言模型,本質上學習的是一個條件機率,即給定輸入\(x\),學習機率分佈\(P(y|x)\)。獲得這個機率後,對應機率最大的目標句子\(y\)就是模型認爲的最好的輸出。咱們不但願目標的輸出是隨機的(這至關於對學習的機率分佈\(P(y|x)\)隨機取樣),但要選擇最好的句子\(y\)須要在decoder的每一步遍歷全部可能的單詞,假如目標句子的長度爲\(n\),詞典大小爲\(v\),那麼顯然,可能的句子數量是\(v^n\),這顯然是作不到的。spa
一個天然的想法是貪心搜索(greedy search),即decoder的每一步都選擇最可能的單詞,最後獲得句子的每個單詞都是每一步認爲最合適的單詞。但這樣並不保證整個句子的機率是最大的,即不能保證整個句子最合適。實際上,貪心搜索的每一步搜索都處理成僅僅與前面剛生成的一個單詞相關,相似於馬爾科夫假設。這顯然是不合理的,具體來講,貪心搜索到的句子\(y\)機率是使得下式機率最大:code
\(P(y|x) = \prod_{k=1}^{n}{p(y_k|x,y_{k-1})}\)內存
而實際上,根據全機率公式計算獲得\(P(y|x)\)爲:class
\(P(y|x) = \prod_{k=1}^{n}p(y_k|x,y_1,y_2,...,y_{k-1})\)搜索
譯爲束搜索。思想是,每步選取最可能的\(k\)個結果,再從最後的\(k\)個結果中選取最合適的句子。\(k\)稱爲beam size。遍歷
具體作法是:統計
首先decoder第一步搜索出最可能的\(k\)個單詞,即找到\(y_{11},y_{12},...,y_{1k}\),他們的機率\(p(y_{11}|x),...,p(y_{1k}|x)\)爲最大的\(k\)個。語言
進行第二步搜索,分別進行\(k\)個模型副本的搜索。每一個副本\(i\),根據上一步選取的單詞\(y_{1i}\),選取機率最大的\(k\)個結果\(y_{21},y_{22},...,y_{2k}\)。這樣,就有了\(k*k\)個可能的結果,從這些結果中選擇\(k\)個機率最大的結果,即\(p(y_{1i}|x)*p(y_{2j}|x,y_{1i})\)最大的\(k\)個結果。co
進行第三步搜索,從第二步中肯定的\(k\)個結果出發,再進行\(k\)個模型副本的搜索,直到最後一步,從最後的\(k\)個結果中選取機率最大者。
顯然,若\(k=1\)則爲貪心搜索,\(k\)越大則佔用內存越大,計算代價越大,實際應用中取10便可。
另外,能夠發現機率的連乘使得機率愈來愈小,極可能溢出,爲了保證模型的穩定性,常對機率連乘計算+log變爲加法。
\(P(y|x) = log(\prod_{k=1}^{n}p(y_k|x,y_1,y_2,...,y_{k-1}))\)
從Beam search的搜索過程當中能夠發現,Beam search偏向於找到更短的句子,也就是說,若是搜索過程當中有一支搜索提早發現了\(<EOS>\),而另外\(k-1\)支繼續搜索找到其他更長的結果,那麼因爲機率連乘(或log連加),越長的結果機率確定越小。所以有必要進行模型修正,即進行長度歸一化,具體來講,即:
選擇機率\(P(y|x) = \frac{1}{n}log(\prod_{k=1}^{n}p(y_k|x,y_1,y_2,...,y_{k-1}))\)最大的句子,式中,\(n\)爲該結果序列長度。
另外,實踐中還作了以下修正:
\(P(y|x) = \frac{1}{n^\alpha}log(\prod_{k=1}^{n}p(y_k|x,y_1,y_2,...,y_{k-1}))\)
式中,超參數\(\alpha\)取0.7比較合適。
對於訓練的seq2seq模型,對它輸出的句子\(y\),以及實際的句子\(y^*\),若機率\(y\)大於\(y^*\),(統計全部句子,平均來講是這個結果),則說明,seq2seq模型出錯了。不然,說明,baem search並無找到最合適的結果,能夠考慮增大beam size大小。