seq2seq模型中beam search的改進

在Seq2Seq中的beam search演算法中我們介紹了採用beam search來搜索得到使得條件語言模型概率最大的序列,並介紹了搜索方法。

argmax_{y} P( y^{<1>},y^{<2>},y^{<3>},...y^{<T_y>}|x^{<1>},x^{<2>},...x^{<T_x>}) 	ag{1}

其中 P( y^{<1>},y^{<2>},y^{<3>},...y^{<T_y>}|x)=P(y^{<1>}|x)P(y^{<2>}|y^{<1>},x)...P(y^{<T_y>}|y^{<1>},...,y^{<T_y-1>},x) 	ag{2}

因此我們的條件概率模型可以看作是求解下式3:

argmax_{y}prod_{t=1}^{T_y} P(y^{<t>}|x,y^{<1>},...,y^{<t-1>}) 	ag{3}

這裡存在兩個問題:

  1. 數值下溢(numerical underflow)
  2. 傾向於短的翻譯結果

我們對兩個問題逐個進行說明,並給出normalized log likelihood objective來實現beam search。


1 問題1—數值下溢

在(3)式子中是條件概率的乘積,由於每一項 P(y^{<t>}|x,y^{<1>},...,y^{<t-1>}) 都是小於1甚至於遠遠小於1的,很多小於1的數乘起來,會得到很小很小的數字,會造成數值下溢(numerical underflow)。數值下溢就是數值太小了,導致電腦的浮點表示不能精確地儲存,因此在實踐中,我們不會最大化這個乘積,而是取 log 值。如果在這加上一個 log ,最大化這個 log 求和的概率值,在選擇最可能的句子時,你會得到同樣的結果。所以通過取 log ,我們會得到一個數值上更穩定的演算法,不容易出現四捨五入的誤差,數值的舍入誤差(rounding errors)或者說數值下溢(numerical underflow).因此目標函數我們採用概率的對數和,而不是概率的乘積,如下所示:

argmax_{y} sum_{t=1}^{T_y}{log P(y^{<t>}|x,y^{<1>},...,y^{<t-1>})} 	ag{4}

圖1 log函數示意圖


2. 問題2—傾向於短的翻譯

在原本的目標函數(3)中,如果有一個很長的句子,那麼這個句子的概率會很低,因為乘了很多項小於1的數字來估計句子的概率。如果乘起來很多小於1的數字,那麼就會得到一個更小的概率值。所以這個目標函數有一個缺點,它可能不自然地傾向於簡短的翻譯結果,因為短句子的概率是由更少數量的小於1的數字乘積得到的,所以這個乘積不會那麼小。

在我們提出的新的目標函數(4)中也存在這樣的問題,每一項 {log P(y^{<t>}|x,y^{<1>},...,y^{<t-1>})} 都小於0,因此長句子的概率項越多,加起來就得到絕對值更大的負數,因此也會傾向於選擇簡短的翻譯結果。

為了解決這個問題,我們對目標函數進行歸一化,得到歸一化的對數似然目標函數,如下式子(5):

argmax_{y} frac{1}{T_y}sum_{t=1}^{T_y}{log P(y^{<t>}|x,y^{<1>},...,y^{<t-1>})} 	ag{5}

在實踐中,我們通常採用更加柔和的方法,在 T_y 上加上指數 ain (0,1) ,例如 a=0.7 。如果 a=1 ,就相當於完全用長度來歸一化,如果 a=0 ,就相當於完全沒有歸一化, ain (0,1) 就是在完全歸一化和沒有歸一化之間,如式子(6)所示:

argmax_{y} frac{1}{T_y}sum_{t=1}^{T_y}{log P(y^{<t>}|x,y^{<1>},...,y^{<t-1>})} 	ag{6}


3. 超參數豎寬B的調節

超參數B的調節在實踐中非常重要,一般存在以下規律

  1. B越大
    1. 優點是:可考慮的選擇越多,能找到的句子越好
    2. 缺點是:計算代價更大,速度越慢,內存消耗越大
  2. B越小
    1. 優點是:計算代價小,速度快,內存佔用越小
    2. 缺點是:可考慮的選擇變少,結果沒那麼好

在Seq2Seq中的beam search演算法中我們選擇 B=3 ,在實踐中這個值有點偏小。在產品中,經常可以看到把束寬設到10,束寬為100對於產品系統來說有點大了,這也取決於不同應用。

但是對科研而言,人們想壓榨出全部性能,這樣有個最好的結果用來發論文,也經常看到大家用束寬為1000或者3000,這也是取決於特定的應用和特定的領域。

在你實現你的應用時,嘗試不同的束寬的值,當B很大的時候,性能提高會越來越少。對於很多應用來說,從束寬1,也就是貪心演算法,到束寬為3、到10,你會看到一個很大的改善。但是當束寬從1000增加到3000時,效果就沒那麼明顯了。


推薦閱讀:

CS231n Assignment3
深度學習 神經網路 中文 入門 書籍 課程 推薦 (附 免費 下載 鏈接)
GAN之父:讓機器擁有天賦 我還在對付利用AI作惡的人
譯文:如何使用TensorFlow實現神經網路(上)
獨家 | 一文讀懂人工神經網路

TAG:深度學習DeepLearning | 神經網路 | 機器學習 |