李宏毅機器學習課程筆記-14.3 Seq2Seq:Tips for Generation

在訓練一個可以產生句子的網絡時,有哪些技巧呢?

Bad Attention

假如要做video的caption generation,某視頻有4個frame,即有4個時刻的圖片。

\(\alpha^i_t\)表示attention weight,其上標表示frame的索引、下標表示時刻的索引。在第1個時刻,產生attention \(\alpha^1_1,\alpha^2_1,\alpha^3_1,\alpha^4_1\),生成第1個word \(w_1\);在第2個時刻,產生attention \(\alpha^1_2,\alpha^2_2,\alpha^3_2,\alpha^4_2\),生成第2個word \(w_2\);以此類推……

這樣有時候會產生一些bad attention。比如,如果4個時刻的attention都集中在某一個frame上,就會產生一些奇怪的結果,比如每次生成的word都是相同的。

good attention需要關注到輸入中的每個frame,對每個frame的關注度不能太多也不能太少並且應該是同等級的。那如何實現這種好的attention呢?比如使用正則項\(\sum_i(\tau-\sum_t\alpha_t^i)\)使得每個frame在4個時刻的attention weight之和都接近\(\tau\),這個\(\tau\)是通過學習得到的,詳見《Show, Attend and Tell: Neural Image Caption Generation with Visual Attention》。

Mismatch between Train and Test

假如用RNN生成sentence,在訓練時模型refer了整個sentence,如果在某一步預測失敗可以通過損失函數優化每一次預測;而在測試時,模型的輸入是上一步的輸出,如果一步出錯,可能就會步步出錯。這個問題叫做Exposure Bias。那麼我們如何解決train和test之間的mismatch呢?

可以考慮修改訓練方法,假設模型現在應該輸出A,但現在模型輸出了B,即使是錯誤的輸出我們也應該讓這個錯誤的輸出作爲下一次的輸入,這樣train和testing就是match的,但實際上這種訓練方法是難以見效的。有一個可行的方法是Scheduled Sampling,按一定概率選擇模型上一步的輸出或者標註作爲模型的輸入,可以在剛開始時只使用標註作爲輸入然後慢慢開始使用模型上一步的輸出作爲輸入。

在一顆龐大的樹中搜索一條最優路徑時,我們無法窮舉所有路徑,貪心策略找到的路徑也不一定是最優路徑。Beam Search就是指在每一步保留最好的幾條路徑。

有人說直接把模型輸出的分佈直接作爲下次的輸入,但其實這樣的結果會比較差,因爲這樣無法區分出接近的分佈。

Object Level V.S. Component Level

假如我們要生成一個sentence,那我們就應該關注整個sentence(Object Level)而不僅僅是每個word(Component Level)。

如果是按照Component Level,那使用Cross Entropy計算損失的話,訓練前期loss會下降得很快,但後期loss會下降得很慢(“The dog is is fast”和"The dog is running fast"的loss的差距很小)。

那有沒有一個損失函數可以基於Object Level衡量兩個句子間的差異呢?目前是沒有的,因爲模型輸出的分佈是離散的,如果微小改變模型參數但保證模型輸出的句子相同,那損失函數的輸出就是一樣的,即微小擾動並沒有對loss產生影響。

那怎麼辦呢?

Reinforcement Learning

可以利用強化學習進行generation,每次生成一個word並不計算reward,知道生成整個sentence後才利用所生成的sentence和標註計算reward,詳見《SEQUENCE LEVEL TRAINING WITH RECURRENT NEURAL NETWORKS》。


Github(github.com):@chouxianyu

Github Pages(github.io):@臭鹹魚

知乎(zhihu.com):@臭鹹魚

博客園(cnblogs.com):@臭鹹魚

B站(bilibili.com):@絕版臭鹹魚

微信公衆號:@臭鹹魚

轉載請註明出處,歡迎討論和交流!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章