Seq2seq:
Encoder :
負責處理input的sequence,處理完之後當作Decoder的輸入。
給一排向量,輸出一排向量。
在encoder裡面有很多個block,每次輸入一堆vector,輸出一堆vector,接著輸入下一個block,而每一個block裡面做的事情是好幾層layer做的事情。
block裡面做self-attention,之後再丟到fully-connected的feed forward network 裡面,之後的vector就是輸出的vector。
Transformer會在self-attention的同時加上自己原有的Input,得到輸出,這種network架構稱作residual connection。之後再進行normalization,使用layer normalization(計算輸入的vector的mean和σ),與batch normalization不同的是他是計算同一個example的不同dimension的mean和σ,normalization之後的輸出才是fc的輸入。
故上圖的Add & Norm就是residual connection + layer normalization。
輸入的Input需要經過一次self之後residual,之後再fc的feed forward network,之後再做一次Add& Norm,最終輸出。
其實encoder就是BERT。
Decoder
Decoder 分兩種: Autoregressive(AT)、
Autoregressive: 以語音辨識當作例子說明。
一開始Decoder將Enconder輸出,輸入進Decoder,之後給Decoder一個特殊的符號,那個符號代表開始(one-hot-vector),之後的輸出也是One-hot-vector,且這個vector的長度跟vocabulary的長度一樣長(假設輸出是中文,可能就是很多中文的總辭彙當作一個vector),這個vector已先透過softmax,所以得分最高的值所代表的中文字,就是該輸出。
第一個輸出之後緊接著當作第二個輸入,此時Decoder看到begin,看到機,那麼他得分最高的就是器,之後依序持續輸出。
但有沒有可能如果其中一個輸入錯誤,會不會導致後面的輸出結果跟著錯呢?(error propagation)
看decoder跟encoder的差異,其實除了中間遮罩的部分外,其他蠻像的,在self-attention的部分有masked。
masked
masked self-attention不能看後面之後的vector,考慮b1時,只能考慮a1,考慮b2,只能考慮a1、a2。
為何要加masked? 因為decoder的output是一個一個產生的所以是先有a1才有a2,故要加mask。
因為機器不知道甚麼時候要停下來,要讓她學習如何停下來,我們將一個"斷"的特殊符號放在所有輸出的vector的其中一個。
Non-auto regressive Model(NAT)
他是一次輸出一整排vector,給他一整排的begin,他就會輸出一整排的結果。
Q: 要怎麼知道要輸出多少個begin呢?
A:
- 可以制定一個classifier,吃encoder的input,輸出是一個數字,代表decoder應該要輸入多少個BEGIN,
- 直接給他一大堆BEGIN(給他上限值的BEGIN),到時候Decoder輸出end的右邊都當作沒有輸出。
優點: 平行化,可控制長度。
缺點: performance比AT差
Encoder跟Decoder之間傳遞訊息
Encoder 產生的output a1,a2,a3,decoder的第一層self-attention(mask)產生向量,經過transfer => q,之後乘上k1,k2,k3,得到α'1,α’2,α’3,之後α’1,α’2,α’3分別乘上v1,v2,v3加總後得到v過fc(跟self-attention運作像)。
Training
首先要有一堆訓練資料,以語音辨識為例,要有一堆聲音訊號。
輸入一段聲音訊號,第一個正確輸出為機,當我們把begin輸入進去時,希望得到跟機愈接近愈好的答案,機這個答案會被表示成one-hot vector,在vector中,只有機這個維度的數值是1,其他都為0。
Decoder輸出是一個distribution,會希望這個機率分布跟one-hot vector愈接近愈好,計算中間的cross-entropy,希望這個值愈小愈好。這件事情跟分類很像。
每一個輸出都有一個cross entropy,最後要記得輸出"斷"這個vector。
Teaching force: 把正確答案當作decoder的輸入。
Beam Search
EX: 假設decoder只能產生兩個字(A、B),在第一個time step 決定一個,假如決定A,之後再繼續決定A、B要選誰,每次Decoder都是選分數最高的,這種方式稱作Greedy Decoding。
但是綠色這條雖然一開始選分數低的,但是之後都是高分數。那麼是不是應該要選綠色這條。但我們不能窮舉所有可能的solution。
Beam search 為一個演算法可以找出大概的solution。
這個方法有時有用有時沒用。需要機器有創造力的時候會沒有用。
#以上為參考李宏毅老師自己做筆記使用