68 Transformer【動手學(xué)深度學(xué)習(xí)v2】

Transformer
- Transformer 模型是完全基于注意力機制,沒有任何卷積層或循環(huán)神經(jīng)網(wǎng)絡(luò)
- Transformer 最初應(yīng)用在文本數(shù)據(jù)上的序列到序列學(xué)習(xí),現(xiàn)在已經(jīng)推廣到各種現(xiàn)代的深度學(xué)習(xí)中,如語言、視覺、語音和強化學(xué)習(xí)領(lǐng)域
Transformer 架構(gòu)

基于編碼器-解碼器的架構(gòu)來處理序列對,Transformer 的編碼器和解碼器是基于自注意力的模塊疊加而成的,源(source,輸入)序列和目標(biāo)(target,輸出)序列的嵌入(embedding)表示通過加上位置編碼(positional encoding)加入位置信息,再分別輸入到編碼器和解碼器中
- ?Transformer P1 - 02:30?
1、Transformer 的編碼器是由多個相同的層疊加而成的,每個層都有兩個子層(每個子層都采用了殘差連接,并且在殘差連接的加法計算之后,都使用了層歸一化,因此 Transformer 編碼器都將輸出一個 d 維表示向量)
第一個子層是多頭自注意力匯聚
- Transformer 塊中的多頭注意力實際上就是自注意力(自注意力同時具有并行計算和最短的最大路徑長度這兩個優(yōu)勢)
- 在計算編碼器的自注意力時,key 、value 和 query 的值都來自前一個編碼器層的輸出
第二個子層是基于位置的前饋網(wǎng)絡(luò)
- Positionwise FFN 實際上是全連接
- 本質(zhì)上和編碼器-解碼器的架構(gòu)沒有本質(zhì)上的區(qū)別,將 Transformer 編碼器最后一層的輸出作為解碼器的輸入來完成信息的傳遞
2、Transformer 解碼器也是由多個相同的層疊加而成的,每層都有三個子層,并且在每個子層中也使用了殘差連接和層歸一化
第一個子層是解碼器自注意力(帶掩碼的多頭自注意力)
- 在解碼器自注意力中,key 、value 和 query 都來自上一個解碼器層的輸出
- 解碼器中的每個位置只能考慮該位置之前的所有位置
- 帶掩碼的自注意力保留了自回歸的屬性,確保預(yù)測僅僅依賴于已生成的輸出詞元(為了在解碼器中保留自回歸的屬性,帶掩碼的自注意力設(shè)定了有效長度(dec_valid_lens)作為參數(shù),以便任何查詢都只會與解碼器中所有已經(jīng)生成的詞元的位置(即直到該查詢?yōu)橹梗┻M行注意力計算,而不會對當(dāng)前位置之后的 key-value 對進行注意力計算)
第二個子層是編碼器-解碼器注意力
- 除了編碼器中所描述的兩個子層之外,解碼器還在這兩個子層之間插入了編碼器-解碼器注意力層,作為第三個子層,它的 query 來自上一個解碼器層的輸出,key 和 value 來自整個編碼器的輸出
第三個子層是基于位置的前饋網(wǎng)絡(luò)
對比 seq2seq

- 和使用注意力的 seq2seq 的不同之處在于:Transformer 是純基于注意力(具體來講,它是一個純基于自注意力的架構(gòu),里面沒有 RNN)
- Transformer 將使用注意力的 seq2seq 中的 RNN 全部換成了 Transformer 塊
多頭注意力(Multi-head attention)

1、對同一個 key 、value 、query 抽取不同的信息
- 例如短距離關(guān)系和長距離關(guān)系
2、多頭注意力使用 h 個獨立的注意力池化
- 合并各個頭(head)輸出得到最終輸出

- key 、value 、query 都是長為 1 的向量,通過全連接層映射到一個低一點的維度,然后進入到注意力模塊中

帶掩碼的多頭注意力(Masked Multi-head attention)

1、解碼器對序列中一個元素輸出時,不應(yīng)該考慮該元素之后的元素
- 注意力中是沒有時間信息的,在輸出中間第 i 個信息的時候,也能夠看到后面的所有信息,這在編碼的時候是可以的,但是在解碼的時候是不行的,在解碼的時候不應(yīng)該考慮該元素本身或者該元素之后的元素
2、可以通過掩碼來實現(xiàn)
- 也就是計算 xi 輸出時,假裝當(dāng)前序列長度為 i
基于位置的前饋網(wǎng)絡(luò)(Positionwise FFN)
- 基于位置的前饋網(wǎng)絡(luò)對序列中的所有位置的表示進行變換時使用的是同一個多層感知機(MLP),這就是稱前饋網(wǎng)絡(luò)是基于位置的原因

其實就是全連接層,將輸入形狀由(b,n,d)變成(bn,d),然后作用兩個全連接層,最后輸出形狀由(bn,d)變回(b,n,d),等價于兩層核窗口為 1 的一維卷積層
- b:batchsize
- n:序列長度
- d:dimension
- 在做卷積的時候是將 n 和 d 合成一維,變成 nd ;但是現(xiàn)在 n 是序列的長度,會變化,要使模型能夠處理任意的特征,所以不能將 n 作為一個特征,因此對每個序列中的每個元素作用一個全連接(將每個序列中的 xi 當(dāng)作是一個樣本)
殘差連接和歸一化(Add & norm)

1、Add 就是一個 Residual_block

1、加入歸一化能夠更好地訓(xùn)練比較深的網(wǎng)絡(luò),但是這里不能使用批量歸一化,批量歸一化對每個特征/通道里元素進行歸一化
- 這里的特征指的是每個序列中 D 中的一維,所以在做歸一化的時候就是將其方差變 1 ,均值變 0
- 在做 NLP 的時候,如果選擇將 d 作為特征的話,那么批量歸一化的輸入是 n*b ,b 是批量大小,n 是序列長度,序列的長度是會變的,所以每次做批量歸一化的輸入大小都不同,所以會導(dǎo)致不穩(wěn)定,訓(xùn)練和預(yù)測的長度本來就不一樣,預(yù)測的長度會慢慢變長,所以批量歸一化不適合長度會變的 NLP 應(yīng)用
2、層歸一化對每個樣本里的元素進行歸一化

- b 代表 batchsize
- d 代表特征維度
- len 表示序列長度
- 層歸一化和批量歸一化的目標(biāo)相同,但是層歸一化是基于特征維度進行歸一化的
- 層歸一化和批量歸一化的區(qū)別在于:批量歸一化在 d 的維度上找出一個矩陣,將其均值變成 0 ,方差變成 1,層歸一化每次選的是一個元素,也就是每個 batch 里面的一個樣本進行歸一化
- 盡管批量歸一化在計算機視覺中被廣泛應(yīng)用,但是在自然語言處理任務(wù)中,批量歸一化通常不如層歸一化的效果好,因為在自然語言處理任務(wù)中,輸入序列的長度通常是變化的
- 雖然在做層歸一化的時候,長度也是變化的,但是至少來說還是在一個單樣本中,不管批量多少,都給定一個特征,這樣對于變化的長度來講,稍微穩(wěn)定一點,不會因為長度變化,導(dǎo)致穩(wěn)定性發(fā)生很大的變化
信息傳遞

假設(shè)編碼器中的輸出是 y1,... ,yn ,將其作為解碼中第 i 個 Transformer 塊中多頭注意力的 key 和 value
- 一共有三個多頭注意力(包括一個帶掩碼的多頭注意力),位于帶掩碼的多頭注意力與其它兩個不同,其他兩個都是自注意力(key 、value 和 query 都相同),而它是普通的注意力(它的 key 和 value 來自編碼器的輸出, query 來自目標(biāo)序列)
這就意味著編碼器和解碼器中塊的個數(shù)和輸出維度都是一樣的
預(yù)測

預(yù)測第 t+1 個輸出時,解碼器中輸入前 t 個預(yù)測值
- 在自注意力中,前 t 個預(yù)測值作為 key 和 value ,第 t 個預(yù)測值還作為 query
關(guān)于序列到序列模型,在訓(xùn)練階段,輸出序列的所有位置(時間步)的詞元都是已知的;但是在預(yù)測階段,輸出序列的次元是逐個生成的
- 在任何解碼器時間步中,只有生成的詞元才能用于解碼器的自注意力計算中
總結(jié)
1、和 seq2seq 有點類似,不同之處在于 Transformer 是一個純使用注意力的編碼-解碼器
2、編碼器和解碼器都有 n 個 Transformer 塊
3、每個塊里使用多頭(自)注意力(multi-head attention),基于位置的前饋網(wǎng)絡(luò)(Positionwise FFN),殘差連接和層歸一化
- 編碼器和解碼器中各有一個自注意力,但是在編碼器和解碼器中傳遞信息的是一個正常的注意力
- 基于位置的前饋網(wǎng)絡(luò)使用同一個多層感知機,作用是對所有序列位置的表示進行轉(zhuǎn)換,實際上就是一個全連接,等價于 1*1 的卷積
- Add & norm:Add 實際上就是 Residual block 可以幫助將網(wǎng)絡(luò)做的更深,norm 使用的是 Layer Norm 使得訓(xùn)練起來更加容易;Transformer 中的殘差連接和層規(guī)范化是訓(xùn)練非常深度模型的重要工具
4、在 Transformer 中,多頭注意力用于表示輸入序列和輸出序列,但是解碼器必須通過掩碼機制來保留自回歸屬性
Q&A
- 1、正余弦編碼和自動學(xué)習(xí)位置編碼在最終效果上有區(qū)別嗎?
- ?QA P4 - 00:00?
- 2、在視覺領(lǐng)域,transformer 適合應(yīng)用在芯片上嗎?比如用在車載領(lǐng)域?
- ?QA P4 - 00:10?
- 3、請問老師現(xiàn)在在企業(yè)里面多輪對話都是用什么算法啊,還是用規(guī)則?
- ?QA P4 - 00:28?
- 4、多頭注意力,concat 和相加取平均,怎么選擇呢?
- ?QA P4 - 00:38?
- 5、請問老師,在 Transformer 中,為什么在獲取詞向量之后,需要對詞向量進行縮放?(乘以 embedding size 的開方之后再加上 PE )
- ?QA P4 - 00:52?
- 6、老師,請問 NLP 沒有競賽嗎?
- ?QA P4 - 01:33?
- 7、num of heads 做什么?
- ?QA P4 - 01:45?
- 8、后面還會講 DETR 嗎?
- ?QA P4 - 01:57?
- 9、老師,請問訓(xùn)練 transformer 的最低硬件要求,如果需要幾千張 GPU ,那么大部分人怎么復(fù)現(xiàn)它?
- ?QA P4 - 02:02?
- 10、DETR 的 query 是否有什么實際的含義,好像和機器翻譯的不太一樣?
- ?QA P4 - 02:21?
- 11、k、v、q 的大小一般怎么選擇呢?
- ?QA P4 - 02:38?
- 12、老師,pytorch 中的 nn.Embedding() 應(yīng)該是用的標(biāo)準(zhǔn)正態(tài)初始化吧?
- ?QA P4 - 02:53?
- 13、老師,看論文時很多模型只使用了 encoder ,沒有用 decoder ,想問下區(qū)別在哪里,有什么選擇依據(jù)呢?
- ?QA P4 - 03:17?
- 14、transformer 可以處理非序列圖像處理嗎?
- ?QA P4 - 03:25?
- 15、請教是否有多智能體處理 RNN 的論文或者模型推薦,即每個智能體處理一部分序列輸出,若都輸出合適的序列的話才能獲得正獎勵,是否有相關(guān)的論文或者模型推薦?
- ?QA P4 - 03:41?
- 16、請問老師,我想用 BERT 特征做文章抄襲檢測,一百萬的文章庫特征搜索太慢了,老師有什么好的技術(shù)方案可以指導(dǎo)一下嗎,直接文本比較的話有什么好的算法嗎?
- ?QA P4 - 03:59?
- 17、自回歸和自編碼有什么區(qū)別?
- ?QA P4 - 04:57?
- 18、RNN 處理非序列圖像也可以很多個 batch 組成序列去處理嗎?
- ?QA P4 - 05:20?
----end----
其他參考
1、《動手學(xué)深度學(xué)習(xí)》,課程 PPT ,https://courses.d2l.ai/zh-v2/assets/pdfs/part-4_5.pdf
2、《動手學(xué)深度學(xué)習(xí)》,教程,https://zh-v2.d2l.ai/chapter_attention-mechanisms/transformer.html