從今天開始珊肃,我會再看一遍Transformer(這是第3遍了吧……)媚污。
這次是依據(jù)Transformer 模型的 PyTorch 實現(xiàn)進行學習扔涧,再梳理一下Transformer模型的重點囤踩,最后用Pytorch實現(xiàn)珍特。
本來想用AllenNLP一步到位祝峻,但是前天敲了一天發(fā)現(xiàn)不行,我對Pytorch不懂扎筒,同時還是不了AllenNLP莱找,干脆從頭再來。
2. encoder和decoder
一般都會把encoder和decoder分開介紹砸琅,感覺還是合在一起有對比宋距。
在這里我僅截取了encoder和decoder。
在原始論文中症脂,encoder和decoder都包含有6層谚赎。
- encoder的每一層是由一個Multi head self-attention和一個FeedForward構成淫僻,兩個部分都會使用殘差連接(residual connection)和Layer Normalization。
- decoder的每一層比encoder多了一個multi-head context-attention壶唤,即是說雳灵,每一層包括multi-head context-attention、Multi head self-attention和一個FeedForward闸盔,同樣三個部分都會使用殘差連接(residual connection)和Layer Normalization悯辙。
- encoder和decoder通過context-attention進行連接。
對比會發(fā)現(xiàn)迎吵,紅框是相同的躲撰,籃框是多出來的那個block。
3. Attention機制
看到了encoder和decoder里面的block击费,就自然會考慮“什么是Attention”拢蛋。
前面已經(jīng)說了,Attention實際上可以理解為權重蔫巩。attention機制也可以分成很多種谆棱。Attention? Attention!一文有一張比較全面的表格
multi head self-attention
attention機制有兩個隱狀態(tài),分別是輸入序列隱狀態(tài)和輸出序列隱狀態(tài)
圆仔,前者是輸入序列第i個位置產(chǎn)生的隱狀態(tài)垃瞧,后者是輸出序列在第t個位置產(chǎn)生的隱狀態(tài)。
所謂multi head self-attention實際上就是輸出序列就是輸入序列坪郭,即是說計算自己的attention得分个从,就叫做self-attention。
multi head context-attention
multi head context-attention是encoder和decoder之間的attention截粗,是兩個不同序列之間的attention信姓,與self-attention相區(qū)別。
如何實現(xiàn)Attention绸罗?
Attention的實現(xiàn)有很多種方式意推,上面的表列出了7種attention,在Transformer中珊蟀,使用的是scaled dot-product attention菊值。
為什么使用scaled dot-product attention。Google給出的解答就是Q(Query)育灸、V(Value)腻窒、K(Key),注意看看這里的描述磅崭。通過query和key的相似性程度來確定value的權重分布儿子。
scaled dot-product attention 和 dot-product attention 唯一的區(qū)別就是切黔,scaled dot-product attention 有一個縮放因子期丰, 叫畜隶。
表示 Key 的維度享钞,默認用 64。
使用縮放因子的原因是愉适,對于d_k很大的時候犯助,點積得到的結(jié)果維度很大,使得結(jié)果處于softmax函數(shù)梯度很小的區(qū)域维咸。而在梯度很小的情況時剂买,對反向傳播不利。為了克服這個負面影響癌蓖,除以一個縮放因子瞬哼,可以一定程度上減緩這種情況。
我們對比一下公式和論文中的圖示费坊。
以下為實現(xiàn)scaled dot-product attention的算法和圖示對比倒槐,我盡量搞得清楚點。
可以發(fā)現(xiàn)scale就是比例的意思附井,所以多了scale就是多了一個。
接下來就是一個softmax两残,然后與V相乘
在decoder的self-attention中永毅,Q、K人弓、V都來自于同一個地方(相等)沼死,它們是上一層decoder的輸出。對于第一層decoder崔赌,它們就是word embedding和positional encoding相加得到的輸入意蛀。但是對于decoder,我們不希望它能獲得下一個time step(即將來的信息)健芭,因此我們需要進行sequence masking县钥。可以看到里面還有一個Mask慈迈,這個在下面會詳細介紹若贮。
如何實現(xiàn)multi-heads attention?
理解了Scaled dot-product attention痒留,Multi-head attention也很簡單了谴麦。論文提到,他們發(fā)現(xiàn)將Q伸头、K匾效、V通過一個線性映射之后,分成h份恤磷,對每一份進行scaled dot-product attention效果更好面哼。然后野宜,把各個部分的結(jié)果合并起來,再次經(jīng)過線性映射精绎,得到最終的輸出速缨。這就是所謂的multi-head attention。上面的超參數(shù)h就是heads數(shù)量代乃。論文默認是8旬牲。
Multi-head attention允許模型加入不同位置的表示子空間的信息。
我們對比一下公式和論文中的圖示搁吓。
其中