transformer
視頻原作者:https://www.bilibili.com/video/BV1Di4y1c7Zm?p=4&spm_id_from=pageDriver
1.位置編碼
2.多頭注意力機制
3.殘差和layerNorm
4.前饋神經(jīng)網(wǎng)絡(luò)
5.面試題講解
TRM在做一個什么事情

1.transformer多用于機器翻譯,簡單來說就是 輸入 處理 輸出

2.細(xì)化transformer,上圖輸入 輸出沒有變化 transformer模塊是由encoders(編碼) decoders(解碼)組成;類似sequens2sequens;

3.再細(xì)化encoders decoders模塊,encoders由6個小encoders組成;decoders由6個小decoders組成;這里的6可以自己定,這是一個×N的結(jié)構(gòu),是一個循環(huán),我們需要注意的一個特點是,這6個encoder結(jié)構(gòu)相同6個decoder結(jié)構(gòu)相同,但是encoder與decoder的結(jié)構(gòu)是不同的。還有一個需要注意的點,6個encoder結(jié)構(gòu)上是完全相同,參數(shù)是不一樣的(說明在訓(xùn)練的時候并不是訓(xùn)練了一個參數(shù)之后就進(jìn)行copy而是6個都在訓(xùn)練;為什么說這個 因為后期albert就是共享transformer中某些層的參數(shù)去減少bert參數(shù)量的目的;decoder同理)。

4.transformer原論文中的圖:比較清晰的給出了具體的結(jié)構(gòu),我們可以從中間切成兩部分,左半部分是encoders 右半部分是decoders。XN說明N可以由自己定,原論文N=6,還有一個特點encoder與decoder的架構(gòu)是不相同的 decoder中間多了一層交互層,下面變成了一個masked(被掩蓋的多頭注意力機制)。

5.我們單獨剖析出一個encoder,詳細(xì)的了解里面的細(xì)節(jié)。我們可以把單個的encoder分成3個部分,輸入 注意力機制 前饋神經(jīng)網(wǎng)絡(luò)
輸入部分: ①embedding ②位置嵌入
5.1 位置編碼
為什么需要:

從RNN引入,對于RNN來說一個共識(很多人會忽略的點):RNN的參數(shù) u輸入?yún)?shù),w隱層參數(shù),v輸出參數(shù)這是一套參數(shù) 對于RNN的所有的timesteps他們都共享一套參數(shù)。也就是說有100個timesteps 但是只有一套參數(shù),更新的時候是更新一套uwv。所以RNN這種展開的結(jié)構(gòu),符合天然的時序關(guān)系,但是對于transformer的多頭注意力機制部分來說,我們在處理的時候是有并行化機制的,一句話所有的單詞是可以一起處理的,而不是像RNN這樣一個一個的喂。這樣做增快速度,但是忽略單詞之間的序列關(guān)系或者說先后關(guān)系,所以說transformer相比RNN就缺少了某種東西,這個時候我們就需要位置編碼。
5.2 位置編碼公式



2i代表偶數(shù),2i+1表示奇數(shù),偶數(shù)位置使用sin 奇數(shù)位置使用cos。得到位置編碼512維度和字向量中的512個維度相加,得到一個最終的512維度作為整個transformer的輸入,為什么位置嵌入式有用的?首先要明確一個點:正余弦這個函數(shù)對于同一個位置不同的向量使用不同的sin或者cos體現(xiàn)出的是一種絕對位置信息,與此同時絕對位置向量中蘊含著相對位置信息。
但是,這種相對位置信息會在注意力機制那里消失
小tips:RNN的梯度消失有什么不同?
RNN的梯度消失與普通網(wǎng)絡(luò)的梯度消失并不相同,RNN是一個總的梯度和,他的梯度消失并不是變?yōu)?,而是說總梯度被近距離梯度主導(dǎo)被遠(yuǎn)距離梯度忽略不計。
6.transformer中最核心的部分——attention機制
6.1 基本的注意力機制

人類在看一張圖的時候,有重點關(guān)注,進(jìn)一步我們引申一下,嬰兒在干嘛這句話更關(guān)注的是圖片中的哪個區(qū)域?這就是注意力機制的基本形式

上圖是原論文中的公式,抓住三個重點QKV三個矩陣,我們計算注意力機制的時候一定要有QKV矩陣,QK轉(zhuǎn)置相乘除以某個值做softmax歸一化,softmax之后我們得到的是相似度向量,乘以一個V矩陣,得到的應(yīng)該是一個加權(quán)的和。
例子1:

Q:嬰兒單詞對應(yīng)的某種向量,
K1~K4代表某種向量
V1~V4代表某種向量
首先是嬰兒和左上左下右上右下分別做點乘得到某個值。點乘的結(jié)果是一個向量在另一個向量的投影長度,是一個標(biāo)量,可以反應(yīng)向量的相似度也就是說兩個向量越相似點乘結(jié)果也就越大。點乘之后我們要判斷嬰兒這個詞和哪個區(qū)域的點乘結(jié)果越大。得到結(jié)果之后和V矩陣相乘得到attention-value一個加權(quán)和。


首先輸入的是Q和K1~K4做F函數(shù) ,得到點乘的結(jié)果做softmax得到相似度,他們相加為1.和value值相加做乘法得到attention-value
我們已經(jīng)知道我們需要三個矩陣QKV但是我們在這里都沒有說明怎么獲取QKV向量,在transformer中是怎么操作的呢?
6.2 在transformer中怎么操作的


輸入的詞做embedding 分別乘以一個矩陣得到QKV向量。向量相乘得到score 然后除以一個值。為什么要除以一個值,如果qk相乘值很大softmax在反向傳播的時候梯度很小,很容易造成梯度的消失。為什么除以根號DK不是其他值,是為了保持方差控制為1 得到之后就可以得到加權(quán)和。在實際操作中我們一般使用矩陣,方便并行速度更快。



還有一個細(xì)節(jié)是多頭,我們在上圖中只用了一套參數(shù)。但是實際參數(shù)中我們會使用多套。分別得到各自的QKV;為什么這么做。首先,作者做實驗效果很好,以此很多人猜測,多頭相當(dāng)于把原始信息打到不同的空間。原來是一個空間,現(xiàn)在變成兩個空間。保證transformer可以注意到不同子空間的信息。捕捉到更全的信息。最后我們需要把多個頭合在一起輸出,然后乘以一個矩陣,就得到我們多頭注意力機制的一個輸出
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相加作為殘差的一個結(jié)果。經(jīng)過layernormalization作為一個輸出。
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。梯度消失一般是因為連乘產(chǎn)生梯度消失,在殘差網(wǎng)絡(luò)中因為有了1 所以確保了梯度不會為0,所以緩解了梯度消失的出現(xiàn)。這就是NLP中用了殘差網(wǎng)絡(luò)之后可以比較深的原因。

8.Layer Normalization
經(jīng)典面試題:為什么在這里使用layer normalization而不是使用傳統(tǒng)的BN
在NLP中,很少使用BN。因為BN在NLP任務(wù)中效果比較差所以不用。但是后期很多論文對BN進(jìn)行了改進(jìn),現(xiàn)在先不去深究
8.1 BN提出的背景

無論在機器學(xué)習(xí)還是深度學(xué)習(xí)中,都會經(jīng)常使用feature scaling 主要是為了消除量綱的影響讓模型收斂得更快。

BN的重點在哪里:BN的重點是針對整個batch中的樣本在同一緯度的特征的處理。
BN的優(yōu)點:
第一個是可以解決內(nèi)部協(xié)變量的偏移
第二個是緩解了梯度飽和問題(如果使用sigmoid激活函數(shù)的話),加快收斂
BN的缺點:
第一個是batch_size比較小的時候,效果比較差
第二個是在RNN中,效果比較差。比如現(xiàn)在有一堆樣本 batch_size為10 9個樣本長度為5。1個樣本長度為20.那么在輸入的時候前5個單詞的均值和方差可以用10個樣本算出來。但是第6個單詞到第20個單詞的均值和方差怎么計算呢?如果只用一個樣本計算,就回到第一個問題batch_size很小的時候效果很差。RNN的輸入是動態(tài)的,所以她不能得到整個batch_size的均值和方差
9.為什么使用layer-norm
理解:為什么layerNorm單獨對一個樣本的所有單詞做縮放可以起到效果。
LN的特點:舉個例子:上面講的最后一個樣本有20個單詞,LN就是對這20個單詞做縮放做均值方差。而BN做的是對第一個單詞做均值方差..對第二個單詞做均值方差..這樣BN的操作在NLP中就會遇到問題,把BN引申到RNN看下圖:

如果是針對同一個位置做均值方差,我和今做均值方差,愛和天做均值方差,默認(rèn)的假設(shè)是我和今代表同樣的信息,愛和天代表同樣的信息。而LN是針對"我愛中國共產(chǎn)黨"進(jìn)行均值方差 他的假設(shè)是"我愛中國共產(chǎn)黨"是出現(xiàn)在同一個意義信息里。我們這么來想這個問題,我們在獲取我愛中國共產(chǎn)黨這個句子的句向量的時候,一個常規(guī)的做法是做加權(quán)的詞向量。加權(quán)詞向量基本假設(shè)就是"我愛中國共產(chǎn)黨"這句話的所有詞是在同一個語義信息下的。所以我們才認(rèn)為他可以理解的(個人理解)。
9.1前饋神經(jīng)網(wǎng)絡(luò)

前饋神經(jīng)網(wǎng)絡(luò)其實比較簡單,就是這張圖的上半部分,Z1通過一個feed forward Z2通過一個feed forward 再加上一個兩層全連接再過一個殘差和Normalization。
上述就是整個encoder的過程。
10.Decoder

Decoder和encoder一樣由完全相同的幾個模塊堆疊而成Nx
模塊1:多頭注意力機制,但是這里有個細(xì)節(jié)點就是masked
masked: 需要對當(dāng)前時刻之后的單詞都mask掉
為什么需要mask:

比如我在輸入love的時候輸出的是you 如果decoder的輸入沒有mask和encoder一樣的多頭注意力機制,那么就是所有的次S I LOVE YOU NOW都會為生成YOU這個結(jié)果提供信息。但是這樣訓(xùn)練出來的模型在預(yù)測時候就會出現(xiàn)一個問題:我們在預(yù)測YOU這個單詞的時候是沒有后面的那些信息的。模型看不見未來時刻的單詞。如果不masked YOU NOW 那么模型訓(xùn)練和預(yù)測的時候就會存在gap,也就是說訓(xùn)練的時候可以看見YOU NOW 預(yù)測的時候看不到,那么預(yù)測效果肯定不好。所以我們需要mask。把YOU NOW給的信息抹點不看到他 預(yù)測的時候也看不到,這樣gap就消失了。
模塊2:交互層,比encoder多了一層。
encoder 與 decoder交互的地方。

所有encoder的輸出生成值與每個decoder進(jìn)行交互

encoder生成KV矩陣 decoder生成Q矩陣,交互的時候就是QKV進(jìn)行交互生成多頭注意力機制。

虛線代表KV矩陣的輸出,和第一個decoder的Q做一個交互