transformer是《attention is all you need》提出來的,結構如下所示:
講解transformer的文章很多,這裡不再重複,可以參考文獻1和文獻2
問題一:為什麼要除以d
k\sqrt
dk
?當d
kd_k
dk增大時,意味著q和k之間的點乘操作會增加,只要qik
iq_ik_i
qiki
稍微比其它值大一點,經過softmax之後絕大部分值就會變得很小,接近於0,使得其梯度很小。
我們假設q和k的分布均服從標準正太分布,即其均值為0,方差為1,當進行點乘操作後:
分布變成均值為0,方差為d
kd_k
dk【利用均值和方差的性質即可推得】,當d
kd_k
dk很大時,意味著q*k的方差就很大,分布會趨於陡峭(分布的方差大,分布就會集中在絕對值大的區域),就會使得softmax()之後使得值出現兩極分化的狀態。
做個簡單的實驗,d
kd_k
dk分別取5和100時,隨機生成d
kd_k
dk個服從標準正太分布的q和k,點乘後經過softmax函式,影象如下所示:
當d
kd_k
dk=5時:
當d
kd_k
dk=100時:
當我把d
kd_k
dk=100,q和k點乘之後除以d
k\sqrt
dk
後,影象變成:
問題二:multi-head attention的作用
attention是將query和key對映到同一高維空間中去計算相似度,而對應的multi-head attention把query和key分成h個小序列分別對映到高維空間的不同子空間中去計算相似度,這樣的好處是在兩種方法的引數總量保持不變的情況下,attention在不同子空間有不同的分布,進行concat後使得attention層資訊多樣化,增加了attention的表達能力。
問題三:positional encoding
因為transformer是處理序列問題,沒有捕獲資料位置的能力,所以需要加上額外的位置資訊,這裡位置資訊可以是絕對位置也可以是相對位置,可以是可訓練的位置資訊也可以是不可訓練的位置資訊,在文中作者提出使用sin和cos來表示序列的相對位置資訊:
其中pos是位置,i是維度。
sin和cos是週期性的函式,且對任意的x值,函式值都是唯一確定的,當位置pos
pospo
s偏移了k個單位(記為pos
+kpos+k
pos+
k),pep
os+k
pe_pe
pos+
k可以用pep
ospe_pe
pos
的線性倍數表示。
問題四:layer normal和batch normal
假定輸入為[batch_size,channels,h,w]
batch normal如第一張圖所示,是針對小批次(batch_size)中所有樣本每乙個通道分別做計算均值和方差,然後再進行歸一化。batch normal和batch_size有關係,當batch_size較小時,對每個小批次進行歸一化不足以代表整個資料的分布情況,而且計算的均值方差等資訊需要額外的儲存空間,對於有著固定的深度的dnn和cnn來說比較適合。
layer normal如第二張圖所示,是對每乙個樣本計算均值和方差做歸一化,不依賴於batch_size的大小和輸入sequence的深度,比較適合rnn。【參考】
以上就是我在看transformer**時遇到的問題和自己的一些想法,如果有寫的不正確或者表達不清楚的請各位多指教。
幾個問題,別人問的
udp丟包,丟的是啥?rtp頭?udp頭?資料幀?還是完整包全丟?tcp和udp丟包的區別以及如何通過二進位制資料或者抓包檔案快速區別 udp丟包和tcp丟包的區別啊?udp丟包,丟的是rtp頭?udp頭?udp包?還是資料流?如何判斷丟包是否是由擁塞控制導致?還是包大小導致?udp如何做資料分頁 ...
Transformer的殘差連線
在學習transformer的過程中,編碼器和解碼器都用到了殘差連線,下面我總結一下殘差連線。假如我們的輸入為x,要得到的輸出為h x 那麼我們可以通過 h f x x,轉換為學習f。等得到f的輸出後,在此基礎上加上x即可得h的輸出。在transformer中,此時的f即是下圖中的multi hea...
Transformer的原理及框架
transformer是谷歌2017年發表的attention is all you need 中提到的seq2seq模型,我們常用的bert和gpt等都是基於transformer衍生的。本文主要參考了wmathor大佬的transformer 詳解和transformer 的 pytorch 實...