transformer
視頻原作者:https://www.bilibili.com/video/BV1Di4y1c7Zm?p=4&spm_id_from=pageDriver
1.位置編碼
2.多頭注意力機(jī)制
3.殘差和layerNorm
4.前饋神經(jīng)網(wǎng)絡(luò)
5.面試題講解
TRM在做一個(gè)什么事情
1.transformer多用于機(jī)器翻譯翁狐,簡單來說就是 輸入 處理 輸出
2.細(xì)化transformer糯累,上圖輸入 輸出沒有變化 transformer模塊是由encoders(編碼) decoders(解碼)組成拌屏;類似sequens2sequens;
3.再細(xì)化encoders decoders模塊跺讯,encoders由6個(gè)小encoders組成;decoders由6個(gè)小decoders組成世剖;這里的6可以自己定间聊,這是一個(gè)×N的結(jié)構(gòu),是一個(gè)循環(huán)壳贪,我們需要注意的一個(gè)特點(diǎn)是陵珍,這6個(gè)encoder結(jié)構(gòu)相同6個(gè)decoder結(jié)構(gòu)相同,但是encoder與decoder的結(jié)構(gòu)是不同的撑碴。還有一個(gè)需要注意的點(diǎn),6個(gè)encoder結(jié)構(gòu)上是完全相同朝墩,參數(shù)是不一樣的(說明在訓(xùn)練的時(shí)候并不是訓(xùn)練了一個(gè)參數(shù)之后就進(jìn)行copy而是6個(gè)都在訓(xùn)練醉拓;為什么說這個(gè) 因?yàn)楹笃赼lbert就是共享transformer中某些層的參數(shù)去減少bert參數(shù)量的目的伟姐;decoder同理)。
4.transformer原論文中的圖:比較清晰的給出了具體的結(jié)構(gòu)亿卤,我們可以從中間切成兩部分愤兵,左半部分是encoders 右半部分是decoders。XN說明N可以由自己定排吴,原論文N=6秆乳,還有一個(gè)特點(diǎn)encoder與decoder的架構(gòu)是不相同的 decoder中間多了一層交互層,下面變成了一個(gè)masked(被掩蓋的多頭注意力機(jī)制)钻哩。
5.我們單獨(dú)剖析出一個(gè)encoder屹堰,詳細(xì)的了解里面的細(xì)節(jié)。我們可以把單個(gè)的encoder分成3個(gè)部分街氢,輸入 注意力機(jī)制 前饋神經(jīng)網(wǎng)絡(luò)
輸入部分: ①embedding ②位置嵌入
5.1 位置編碼
為什么需要:
從RNN引入扯键,對于RNN來說一個(gè)共識(很多人會忽略的點(diǎn)):RNN的參數(shù) u輸入?yún)?shù),w隱層參數(shù)珊肃,v輸出參數(shù)這是一套參數(shù) 對于RNN的所有的timesteps他們都共享一套參數(shù)荣刑。也就是說有100個(gè)timesteps 但是只有一套參數(shù),更新的時(shí)候是更新一套u(yù)wv伦乔。所以RNN這種展開的結(jié)構(gòu)厉亏,符合天然的時(shí)序關(guān)系,但是對于transformer的多頭注意力機(jī)制部分來說烈和,我們在處理的時(shí)候是有并行化機(jī)制的爱只,一句話所有的單詞是可以一起處理的,而不是像RNN這樣一個(gè)一個(gè)的喂斥杜。這樣做增快速度虱颗,但是忽略單詞之間的序列關(guān)系或者說先后關(guān)系,所以說transformer相比RNN就缺少了某種東西蔗喂,這個(gè)時(shí)候我們就需要位置編碼忘渔。
5.2 位置編碼公式
2i代表偶數(shù),2i+1表示奇數(shù)缰儿,偶數(shù)位置使用sin 奇數(shù)位置使用cos畦粮。得到位置編碼512維度和字向量中的512個(gè)維度相加,得到一個(gè)最終的512維度作為整個(gè)transformer的輸入乖阵,為什么位置嵌入式有用的宣赔?首先要明確一個(gè)點(diǎn):正余弦這個(gè)函數(shù)對于同一個(gè)位置不同的向量使用不同的sin或者cos體現(xiàn)出的是一種絕對位置信息,與此同時(shí)絕對位置向量中蘊(yùn)含著相對位置信息瞪浸。
但是儒将,這種相對位置信息會在注意力機(jī)制那里消失
小tips:RNN的梯度消失有什么不同?
RNN的梯度消失與普通網(wǎng)絡(luò)的梯度消失并不相同对蒲,RNN是一個(gè)總的梯度和钩蚊,他的梯度消失并不是變?yōu)?贡翘,而是說總梯度被近距離梯度主導(dǎo)被遠(yuǎn)距離梯度忽略不計(jì)。
6.transformer中最核心的部分——attention機(jī)制
6.1 基本的注意力機(jī)制
人類在看一張圖的時(shí)候砰逻,有重點(diǎn)關(guān)注鸣驱,進(jìn)一步我們引申一下,嬰兒在干嘛這句話更關(guān)注的是圖片中的哪個(gè)區(qū)域蝠咆?這就是注意力機(jī)制的基本形式
上圖是原論文中的公式踊东,抓住三個(gè)重點(diǎn)QKV三個(gè)矩陣,我們計(jì)算注意力機(jī)制的時(shí)候一定要有QKV矩陣刚操,QK轉(zhuǎn)置相乘除以某個(gè)值做softmax歸一化闸翅,softmax之后我們得到的是相似度向量,乘以一個(gè)V矩陣赡茸,得到的應(yīng)該是一個(gè)加權(quán)的和缎脾。
例子1:
Q:嬰兒單詞對應(yīng)的某種向量,
K1~K4代表某種向量
V1~V4代表某種向量
首先是嬰兒和左上左下右上右下分別做點(diǎn)乘得到某個(gè)值占卧。點(diǎn)乘的結(jié)果是一個(gè)向量在另一個(gè)向量的投影長度遗菠,是一個(gè)標(biāo)量,可以反應(yīng)向量的相似度也就是說兩個(gè)向量越相似點(diǎn)乘結(jié)果也就越大华蜒。點(diǎn)乘之后我們要判斷嬰兒這個(gè)詞和哪個(gè)區(qū)域的點(diǎn)乘結(jié)果越大辙纬。得到結(jié)果之后和V矩陣相乘得到attention-value一個(gè)加權(quán)和。
首先輸入的是Q和K1~K4做F函數(shù) 叭喜,得到點(diǎn)乘的結(jié)果做softmax得到相似度贺拣,他們相加為1.和value值相加做乘法得到attention-value
我們已經(jīng)知道我們需要三個(gè)矩陣QKV但是我們在這里都沒有說明怎么獲取QKV向量,在transformer中是怎么操作的呢捂蕴?
6.2 在transformer中怎么操作的
輸入的詞做embedding 分別乘以一個(gè)矩陣得到QKV向量譬涡。向量相乘得到score 然后除以一個(gè)值。為什么要除以一個(gè)值啥辨,如果qk相乘值很大softmax在反向傳播的時(shí)候梯度很小涡匀,很容易造成梯度的消失。為什么除以根號DK不是其他值溉知,是為了保持方差控制為1 得到之后就可以得到加權(quán)和陨瘩。在實(shí)際操作中我們一般使用矩陣,方便并行速度更快级乍。
還有一個(gè)細(xì)節(jié)是多頭舌劳,我們在上圖中只用了一套參數(shù)。但是實(shí)際參數(shù)中我們會使用多套玫荣。分別得到各自的QKV甚淡;為什么這么做。首先捅厂,作者做實(shí)驗(yàn)效果很好贯卦,以此很多人猜測倒槐,多頭相當(dāng)于把原始信息打到不同的空間愁铺。原來是一個(gè)空間走搁,現(xiàn)在變成兩個(gè)空間扇住。保證transformer可以注意到不同子空間的信息盈厘。捕捉到更全的信息睁枕。最后我們需要把多個(gè)頭合在一起輸出,然后乘以一個(gè)矩陣沸手,就得到我們多頭注意力機(jī)制的一個(gè)輸出
7.殘差和LayNorm
x1 x2代表詞向量進(jìn)行輸入外遇,和位置編碼對位相加得到新的x1 x2經(jīng)過attention層得到輸出結(jié)果z1 z2。 現(xiàn)在的輸出是z 把x拿過來和輸出結(jié)果z對位相加(x是經(jīng)過位置編碼的x) x和z相加作為殘差的一個(gè)結(jié)果契吉。經(jīng)過layernormalization作為一個(gè)輸出跳仿。
7.1殘差
原來如果沒有殘差網(wǎng)絡(luò),直接輸出fx就可以了捐晶,現(xiàn)在有了殘差網(wǎng)絡(luò)菲语,需要把原來的x拿到下面與fx的矩陣進(jìn)行對位相加。為什么殘差結(jié)構(gòu)有用呢惑灵?經(jīng)過BC兩層網(wǎng)絡(luò)A的輸出就是x山上。梯度消失一般是因?yàn)檫B乘產(chǎn)生梯度消失,在殘差網(wǎng)絡(luò)中因?yàn)橛辛? 所以確保了梯度不會為0英支,所以緩解了梯度消失的出現(xiàn)佩憾。這就是NLP中用了殘差網(wǎng)絡(luò)之后可以比較深的原因。
8.Layer Normalization
經(jīng)典面試題:為什么在這里使用layer normalization而不是使用傳統(tǒng)的BN
在NLP中干花,很少使用BN妄帘。因?yàn)锽N在NLP任務(wù)中效果比較差所以不用。但是后期很多論文對BN進(jìn)行了改進(jìn)池凄,現(xiàn)在先不去深究
8.1 BN提出的背景
無論在機(jī)器學(xué)習(xí)還是深度學(xué)習(xí)中抡驼,都會經(jīng)常使用feature scaling 主要是為了消除量綱的影響讓模型收斂得更快。
BN的重點(diǎn)在哪里:BN的重點(diǎn)是針對整個(gè)batch中的樣本在同一緯度的特征的處理修赞。
BN的優(yōu)點(diǎn):
第一個(gè)是可以解決內(nèi)部協(xié)變量的偏移
第二個(gè)是緩解了梯度飽和問題(如果使用sigmoid激活函數(shù)的話)婶恼,加快收斂
BN的缺點(diǎn):
第一個(gè)是batch_size比較小的時(shí)候,效果比較差
第二個(gè)是在RNN中柏副,效果比較差勾邦。比如現(xiàn)在有一堆樣本 batch_size為10 9個(gè)樣本長度為5。1個(gè)樣本長度為20.那么在輸入的時(shí)候前5個(gè)單詞的均值和方差可以用10個(gè)樣本算出來割择。但是第6個(gè)單詞到第20個(gè)單詞的均值和方差怎么計(jì)算呢眷篇?如果只用一個(gè)樣本計(jì)算,就回到第一個(gè)問題batch_size很小的時(shí)候效果很差荔泳。RNN的輸入是動態(tài)的蕉饼,所以她不能得到整個(gè)batch_size的均值和方差
9.為什么使用layer-norm
理解:為什么layerNorm單獨(dú)對一個(gè)樣本的所有單詞做縮放可以起到效果虐杯。
LN的特點(diǎn):舉個(gè)例子:上面講的最后一個(gè)樣本有20個(gè)單詞,LN就是對這20個(gè)單詞做縮放做均值方差昧港。而BN做的是對第一個(gè)單詞做均值方差..對第二個(gè)單詞做均值方差..這樣BN的操作在NLP中就會遇到問題擎椰,把BN引申到RNN看下圖:
如果是針對同一個(gè)位置做均值方差,我和今做均值方差创肥,愛和天做均值方差达舒,默認(rèn)的假設(shè)是我和今代表同樣的信息,愛和天代表同樣的信息叹侄。而LN是針對"我愛中國共產(chǎn)黨"進(jìn)行均值方差 他的假設(shè)是"我愛中國共產(chǎn)黨"是出現(xiàn)在同一個(gè)意義信息里巩搏。我們這么來想這個(gè)問題,我們在獲取我愛中國共產(chǎn)黨這個(gè)句子的句向量的時(shí)候趾代,一個(gè)常規(guī)的做法是做加權(quán)的詞向量贯底。加權(quán)詞向量基本假設(shè)就是"我愛中國共產(chǎn)黨"這句話的所有詞是在同一個(gè)語義信息下的。所以我們才認(rèn)為他可以理解的(個(gè)人理解)撒强。
9.1前饋神經(jīng)網(wǎng)絡(luò)
前饋神經(jīng)網(wǎng)絡(luò)其實(shí)比較簡單禽捆,就是這張圖的上半部分,Z1通過一個(gè)feed forward Z2通過一個(gè)feed forward 再加上一個(gè)兩層全連接再過一個(gè)殘差和Normalization飘哨。
上述就是整個(gè)encoder的過程睦擂。
10.Decoder
Decoder和encoder一樣由完全相同的幾個(gè)模塊堆疊而成Nx
模塊1:多頭注意力機(jī)制,但是這里有個(gè)細(xì)節(jié)點(diǎn)就是masked
masked: 需要對當(dāng)前時(shí)刻之后的單詞都mask掉
為什么需要mask:
比如我在輸入love的時(shí)候輸出的是you 如果decoder的輸入沒有mask和encoder一樣的多頭注意力機(jī)制杖玲,那么就是所有的次S I LOVE YOU NOW都會為生成YOU這個(gè)結(jié)果提供信息顿仇。但是這樣訓(xùn)練出來的模型在預(yù)測時(shí)候就會出現(xiàn)一個(gè)問題:我們在預(yù)測YOU這個(gè)單詞的時(shí)候是沒有后面的那些信息的。模型看不見未來時(shí)刻的單詞摆马。如果不masked YOU NOW 那么模型訓(xùn)練和預(yù)測的時(shí)候就會存在gap臼闻,也就是說訓(xùn)練的時(shí)候可以看見YOU NOW 預(yù)測的時(shí)候看不到,那么預(yù)測效果肯定不好囤采。所以我們需要mask述呐。把YOU NOW給的信息抹點(diǎn)不看到他 預(yù)測的時(shí)候也看不到,這樣gap就消失了蕉毯。
模塊2:交互層乓搬,比encoder多了一層。
encoder 與 decoder交互的地方代虾。
所有encoder的輸出生成值與每個(gè)decoder進(jìn)行交互
encoder生成KV矩陣 decoder生成Q矩陣进肯,交互的時(shí)候就是QKV進(jìn)行交互生成多頭注意力機(jī)制。
虛線代表KV矩陣的輸出棉磨,和第一個(gè)decoder的Q做一個(gè)交互