seq2seq模型中beam search的改進
在Seq2Seq中的beam search演算法中我們介紹了採用beam search來搜索得到使得條件語言模型概率最大的序列,並介紹了搜索方法。
其中
因此我們的條件概率模型可以看作是求解下式3:
這裡存在兩個問題:
- 數值下溢(numerical underflow)
- 傾向於短的翻譯結果
我們對兩個問題逐個進行說明,並給出normalized log likelihood objective來實現beam search。
1 問題1—數值下溢
在(3)式子中是條件概率的乘積,由於每一項 都是小於1甚至於遠遠小於1的,很多小於1的數乘起來,會得到很小很小的數字,會造成數值下溢(numerical underflow)。數值下溢就是數值太小了,導致電腦的浮點表示不能精確地儲存,因此在實踐中,我們不會最大化這個乘積,而是取 值。如果在這加上一個 ,最大化這個 求和的概率值,在選擇最可能的句子時,你會得到同樣的結果。所以通過取 ,我們會得到一個數值上更穩定的演算法,不容易出現四捨五入的誤差,數值的舍入誤差(rounding errors)或者說數值下溢(numerical underflow).因此目標函數我們採用概率的對數和,而不是概率的乘積,如下所示:
2. 問題2—傾向於短的翻譯
在原本的目標函數(3)中,如果有一個很長的句子,那麼這個句子的概率會很低,因為乘了很多項小於1的數字來估計句子的概率。如果乘起來很多小於1的數字,那麼就會得到一個更小的概率值。所以這個目標函數有一個缺點,它可能不自然地傾向於簡短的翻譯結果,因為短句子的概率是由更少數量的小於1的數字乘積得到的,所以這個乘積不會那麼小。
在我們提出的新的目標函數(4)中也存在這樣的問題,每一項 都小於0,因此長句子的概率項越多,加起來就得到絕對值更大的負數,因此也會傾向於選擇簡短的翻譯結果。
為了解決這個問題,我們對目標函數進行歸一化,得到歸一化的對數似然目標函數,如下式子(5):
在實踐中,我們通常採用更加柔和的方法,在 上加上指數 ,例如 。如果 ,就相當於完全用長度來歸一化,如果 ,就相當於完全沒有歸一化, 就是在完全歸一化和沒有歸一化之間,如式子(6)所示:
3. 超參數豎寬B的調節
超參數B的調節在實踐中非常重要,一般存在以下規律
- B越大
- 優點是:可考慮的選擇越多,能找到的句子越好
- 缺點是:計算代價更大,速度越慢,內存消耗越大
- B越小
- 優點是:計算代價小,速度快,內存佔用越小
- 缺點是:可考慮的選擇變少,結果沒那麼好
在Seq2Seq中的beam search演算法中我們選擇 ,在實踐中這個值有點偏小。在產品中,經常可以看到把束寬設到10,束寬為100對於產品系統來說有點大了,這也取決於不同應用。
但是對科研而言,人們想壓榨出全部性能,這樣有個最好的結果用來發論文,也經常看到大家用束寬為1000或者3000,這也是取決於特定的應用和特定的領域。
在你實現你的應用時,嘗試不同的束寬的值,當B很大的時候,性能提高會越來越少。對於很多應用來說,從束寬1,也就是貪心演算法,到束寬為3、到10,你會看到一個很大的改善。但是當束寬從1000增加到3000時,效果就沒那麼明顯了。
推薦閱讀:
※CS231n Assignment3
※深度學習 神經網路 中文 入門 書籍 課程 推薦 (附 免費 下載 鏈接)
※GAN之父:讓機器擁有天賦 我還在對付利用AI作惡的人
※譯文:如何使用TensorFlow實現神經網路(上)
※獨家 | 一文讀懂人工神經網路
TAG:深度學習DeepLearning | 神經網路 | 機器學習 |