【NLP】選擇目標序列:貪心搜索和Beam search


構建seq2seq模型,並訓練完成后,我們只要將源句子輸入進訓練好的模型,執行一次前向傳播就能得到目標句子,但是值得注意的是:

seq2seq模型的decoder部分實際上相當於一個語言模型,相比於RNN語言模型,decoder的初始輸入並非0向量,而是encoder對源句子提取的信息。因此整個seq2seq模型相當於一個條件語言模型,本質上學習的是一個條件概率,即給定輸入\(x\),學習概率分布\(P(y|x)\)。得到這個概率后,對應概率最大的目標句子\(y\)就是模型認為的最好的輸出。我們不希望目標的輸出是隨機的(這相當於對學習的概率分布\(P(y|x)\)隨機取樣),但要選擇最好的句子\(y\)需要在decoder的每一步遍歷所有可能的單詞,假如目標句子的長度為\(n\),詞典大小為\(v\),那么顯然,可能的句子數量是\(v^n\),這顯然是做不到的。

一個自然的想法是貪心搜索(greedy search),即decoder的每一步都選擇最可能的單詞,最后得到句子的每一個單詞都是每一步認為最合適的單詞。但這樣並不保證整個句子的概率是最大的,即不能保證整個句子最合適。實際上,貪心搜索的每一步搜索都處理成僅僅與前面剛生成的一個單詞相關,類似於馬爾科夫假設。這顯然是不合理的,具體來說,貪心搜索到的句子\(y\)概率是使得下式概率最大:

\(P(y|x) = \prod_{k=1}^{n}{p(y_k|x,y_{k-1})}\)

而實際上,根據全概率公式計算得到\(P(y|x)\)為:

\(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\)個結果。

進行第三步搜索,從第二步中確定的\(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比較合適。

4 誤差分析

對於訓練的seq2seq模型,對它輸出的句子\(y\),以及實際的句子\(y^*\),若概率\(y\)大於\(y^*\),(統計所有句子,平均來說是這個結果),則說明,seq2seq模型出錯了。否則,說明,baem search並沒有找到最合適的結果,可以考慮增大beam size大小。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM