1. 程式人生 > 其它 >對NLP中transformer裡面decoder的理解

對NLP中transformer裡面decoder的理解

剛接觸NLP這塊,有兩個關於transformer的問題:

1)為什麼要有decoder?如果encoder後面直接接全連線不可以嗎?

2)為什麼decoder要有mask?為什麼要按時間步一個字一個字翻譯?這樣的話,是不是英語從句翻譯成漢語就不可行,比如 He is a person who wears a red t-shirt. -> 他是一個穿紅色t恤的人。

想了下應該是下面的原因:

1)decoder相當於有兩個輸入,一個是encoder編碼的全域性語義資訊(使得decoder能夠看到完整的上下文資訊),一個是模型的前期翻譯結果(這個資訊對最終的翻譯結果也很重要),根據這兩個輸入決定下一個輸出。

2)根據這個邏輯,每一個輸出依賴前面的結果,那麼必須mask掉後面的內容,因為這時後面的內容還沒有生成。decoder的輸入是模型的前期翻譯結果,也就是拿模型的前期翻譯結果做一個Q去和encoder編碼的全域性語義資訊生成的K、V做attention,相當於去找現有結果在全域性語義資訊裡面的相關性,根據這個相關性去決定下一個翻譯結果(比如翻譯到“他是一個”的時候,去encoder給的資訊裡面算attention,發現接下來需要翻譯的詞跟“wears a red t-shirt”相關性很強,那麼就給出翻譯“穿紅色T恤”,接下來才是翻譯“person”,也就是“的人”)。正是因為有從句這種需要跳躍翻譯的問題,才需要attention算全域性相關性,要不然直接查表就完事了。

3)mask也保證了模型在訓練的時候可以平行計算,因為訓練的時候我們知道label,也就是完整的翻譯結果,那麼為了平行計算需要把label後面的資訊掩蓋,因為每次計算需要用到前面的label資訊而不能輸入label後面的資訊。但在測試的時候,是序列輸出的,每個位置的翻譯結果只依賴前面的翻譯結果,mask不重要。
————————————————
版權宣告:本文為CSDN博主「xiav」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處連結及本宣告。
原文連結:https://blog.csdn.net/qq_26628975/article/details/115331368