2016-02-22 46 views
1

在seq2seq模型中,應用填充使桶中的所有序列具有相同的長度。而除此之外,它看起來像沒有特殊的處理應用到補白:Tensorflow序列2序列模型填充

的編碼器編碼的墊襯以及 基本解碼器的W/O注意使用一次編碼編碼的墊襯 與關注的解碼器解碼也會出現填充輸入的隱藏狀態 如果可以澄清,這將非常有幫助:是的,基本上填充只是一個特殊的ID /嵌入,而當前的seq2seq實現將它們視爲與其他嵌入類似?並且不需要特殊的機制來忽略這些填充,例如當編碼包含填充的序列時;或者使用基於注意力的解碼器解碼包含填充的序列?所以在填充之後,對填充沒有什麼特別之處,我們可以假裝填充只是另一種嵌入(除了使用target_weights做加權x-entropy之外)?

如果以上情況屬實,那麼當測試訓練好的模型時,是否需要填充(因爲在測試時間,每個句子單獨解碼而不是批量解碼)? ---從代碼看起來,在測試時間,輸入語句仍然是第一個,然後填充?

回答

1

我認爲你的基本前提是正確的:模型不會以與其他符號不同的方式處理填充符號。然而,在打包數據張量時,填充總是出現在'EOS'符號之後的解碼器訓練示例的末尾,並且在編碼器訓練示例的開始處(因爲編碼器序列被顛倒過來)。

推測模型將會知道編碼器端的填充沒有真正的語義信息,因爲它不會與其他單詞的任何內容相關聯......我想它可以傳達關於序列長度的一些事情,當注意力被考慮時,不是一件壞事。存儲桶方法試圖限制多餘的填充量。

在解碼器端,模型會很快知道填充總是出現在'EOS'符號之後,所以在'EOS'符號被髮射之後你會忽略所有的東西。

填充主要是有用的,因爲當批量運行張量時,序列都必須是相同的大小......所以當一次一個測試時,你真的不需要填充。但是,在測試大型驗證集時,使用填充方式批量運行仍然很有用。

(我對UNK符號有更多的問題和疑慮。)