67 自注意力【動(dòng)手學(xué)深度學(xué)習(xí)v2】

自注意力
- 在深度學(xué)習(xí)中,經(jīng)常使用卷積神經(jīng)網(wǎng)絡(luò)或者循環(huán)神經(jīng)網(wǎng)絡(luò)對(duì)序列進(jìn)行編碼
- 對(duì)于 key 、value 和 query ,自注意力有自己的一套選法,因?yàn)?strong> key 、value 和 query 的值來(lái)自同一組輸入,因此被稱為自注意力(self-attention)或者內(nèi)部注意力(intra-attention)
自注意力

- 給定序列是一個(gè)長(zhǎng)為 n 的序列,每個(gè) xi 是一個(gè)長(zhǎng)為 d 的向量
- 自注意力將 xi 同時(shí)作為 key 、value 和 query ,以此來(lái)對(duì)序列抽取特征
- 基本上可以認(rèn)為給定一個(gè)序列,會(huì)對(duì)序列中的每一個(gè)元素進(jìn)行輸出,也就是說(shuō),每個(gè)查詢都會(huì)關(guān)注所有的鍵-值對(duì)并生成一個(gè)注意力輸出
- 自注意力之所以叫做自注意力,是因?yàn)?key,value,query 都是來(lái)自于自身,xi 既作為 key ,又作為 value ,同時(shí)還作為 query (self-attention 中的 self 所強(qiáng)調(diào)的是 key,value,query 的取法)
和 CNN,RNN 對(duì)比

- ?自注意力 P1 - 03:08?
- CNN、RNN、自注意力都可以用來(lái)處理序列
- CNN 如何處理序列:給定一個(gè)序列,將其看作是一個(gè)一維的輸入(之前在處理圖片時(shí),圖片具有高和寬,而且每個(gè)像素都具有 chanel 數(shù),也就是特征數(shù)),如果用 CNN 做序列的話,經(jīng)過(guò)一個(gè) 1d 的卷積(只有寬沒(méi)有高)之后,將每個(gè)元素的特征看作是 channel 數(shù),這樣就可以用來(lái)處理文本序列了
- k:窗口大小,每次看到的長(zhǎng)度為 k
- n:長(zhǎng)度
- d:dimension,每個(gè) x 的維度(長(zhǎng)度)
- 并行度:每個(gè)輸出( yi )可以自己并行做運(yùn)算,因?yàn)?GPU 有大量的并行單元,所以并行度越高,計(jì)算的速度就越快
- 最長(zhǎng)路徑:對(duì)于最長(zhǎng)的那個(gè)序列,前面時(shí)刻的信息通過(guò)神經(jīng)元傳遞到后面時(shí)刻,對(duì)應(yīng)于計(jì)算機(jī)視覺(jué)中的感受野的概念(每一個(gè)神經(jīng)元的輸出對(duì)應(yīng)的圖片中的視野)
- 卷積神經(jīng)網(wǎng)絡(luò)和自注意力都擁有并行計(jì)算的優(yōu)勢(shì),而且自注意力的最大路徑長(zhǎng)度最短。但是因?yàn)樽宰⒁饬Φ挠?jì)算復(fù)雜度是關(guān)于序列長(zhǎng)度的二次方,所以在很長(zhǎng)的序列中計(jì)算會(huì)非常慢
位置編碼(position encoding)
1、和 CNN / RNN 不同,自注意力并沒(méi)有記錄位置信息
- CNN 中其實(shí)是有記錄位置信息的,從輸出可以反推出輸入所在的窗口的位置,窗口大小可以看成是位置信息
- RNN 本身就是序列相關(guān)的,它是通過(guò)逐個(gè)的重復(fù)地處理詞元
- 對(duì)于自注意力來(lái)說(shuō),如果將輸入進(jìn)行隨機(jī)打亂,對(duì)應(yīng)輸出的位置可能會(huì)發(fā)生變化,但是每個(gè)輸出的內(nèi)容不會(huì)發(fā)生變化
- 所以如果是想純用自注意力機(jī)制來(lái)做序列模型的話,沒(méi)有位置信息的話可能會(huì)出現(xiàn)問(wèn)題,所以可以通過(guò)加入位置編碼來(lái)加入位置信息
2、為了使用序列的順序信息,通過(guò)在輸入表示中添加位置編碼將位置信息注入到輸入里

- 位置編碼不是將位置信息加入到模型中,一旦位置信息加入到模型中,會(huì)出現(xiàn)各種問(wèn)題(比如在 CNN 中就需要看一個(gè)比較長(zhǎng)的序列,RNN 中會(huì)降低模型的并行度)
- P 中的每個(gè)元素根據(jù)對(duì)應(yīng)的 X 中元素位置的不同而不同
3、P 的元素具體計(jì)算如下:

- 對(duì)于 P 中的每一列,奇數(shù)列是一個(gè) cos 函數(shù),偶數(shù)列是一個(gè) sin 函數(shù),不同的列之間的周期是不一樣的
位置編碼矩陣

- ?自注意力 P1 - 17:28?
- X 軸橫坐標(biāo)表示 P 矩陣中的行數(shù)
- 圖中不同顏色的曲線表示 P 矩陣中不同的列
- 這里可以理解為 X 軸上任意一點(diǎn)對(duì)應(yīng)的 j 列的曲線上在 Y 軸的值,就表示 P 矩陣第 X 行第 j 列的元素的值
- 圖中的四條曲線分別代表了第 6 、7 、8 、9 列,從圖中可以看出,第 6 列是一個(gè) sin 函數(shù),第 7 列在第 6 列的基礎(chǔ)上發(fā)生了位移,變成了 cos 函數(shù),第 8 列在第 6 列的基礎(chǔ)上周期變長(zhǎng)了一倍,仍然是 sin 函數(shù),第 9 列在第 8 列的基礎(chǔ)上發(fā)生了唯一,變成了 cos 函數(shù)
- 從圖中可以看出,對(duì)于 P 矩陣中同一行,不同的列的元素的數(shù)值是不同的,也就是說(shuō),對(duì)于輸入序列(X + P 作為自編碼輸入)來(lái)講,每個(gè) dimension 所加的值是不同的;同樣的,對(duì)于同一個(gè)輸入序列,不同的樣本所加的值也是不同的(對(duì)于同一條曲線,X 不同的情況下,即不同的行,元素的值也是不同的,這里 sin 函數(shù)和 cos 函數(shù)都是周期函數(shù),應(yīng)該講的是在同一個(gè)周期內(nèi)的樣本)
- P 實(shí)際上是對(duì)每一個(gè)樣本(row)、每一個(gè)維度(dimension)添加一點(diǎn)不一樣的值,使得模型能夠分辨這種細(xì)微的差別,作為位置信息
- 這種方式跟之前的方式的不同之處在于,之前是將位置信息放進(jìn)模型中或者將位置信息與數(shù)據(jù)分開(kāi)然后進(jìn)行拼接(concat),位置編碼是直接將位置信息加入到了數(shù)據(jù)中,這樣做的好處是不改變模型和數(shù)據(jù)的大小,缺點(diǎn)是需要模型對(duì)于 P 中元素的細(xì)微信息進(jìn)行辨認(rèn),取決于模型是否能夠有效地使用 P 中的位置信息
絕對(duì)位置信息
計(jì)算機(jī)使用的是二進(jìn)制編碼

- 可以認(rèn)為,假設(shè)計(jì)算機(jī)要表示八個(gè)數(shù)字的話,可以用一個(gè)長(zhǎng)為 3 的特征來(lái)表示,可以認(rèn)為是一個(gè)三維的特征,每一個(gè)維度都在 0 和 1 之間進(jìn)行變化,而且變化的頻率不同,最后一維變化的頻率最快,最前面一維變化的頻率最慢
位置矩陣編碼可以認(rèn)為和計(jì)算機(jī)的二進(jìn)制編碼類似
- 首先,位置編碼是實(shí)數(shù)(因?yàn)閷?duì)應(yīng)的輸入也是實(shí)數(shù)),是在 1 和 -1 之間進(jìn)行實(shí)數(shù)的變化,所以能編碼的范圍更廣,可以在任意多的維度上進(jìn)行編碼
- 其次,因?yàn)槲恢镁幋a中所使用的 sin 函數(shù)和 cos 函數(shù)都是周期函數(shù),所以位置編碼也是存在周期性的

- 上圖是一個(gè)熱度圖,和上一個(gè)圖是一樣的,只不過(guò)將 X 軸和 Y 軸進(jìn)行了翻轉(zhuǎn)
- X 軸表示特征
- Y 軸表示樣本
- 可以認(rèn)為是對(duì)每一行的位置信息進(jìn)行了編碼,將第 i 個(gè)樣本用一個(gè)長(zhǎng)為 d 的向量進(jìn)行編碼
- 這里和計(jì)算機(jī)的二進(jìn)制編碼有一點(diǎn)不同,最前面的維度變化頻率比較高,越到后面變化頻率越來(lái)越慢
- 核心思想是對(duì)序列中的第 i 個(gè)樣本,給定長(zhǎng)為 d 的獨(dú)一無(wú)二的位置信息,然后加入到數(shù)據(jù)中作為自編碼輸入,使得模型能夠看到數(shù)據(jù)的位置信息
相對(duì)位置信息
為什么要使用 sin 函數(shù)和 cos 函數(shù)?
- 編碼的是一個(gè)相對(duì)位置信息,位置位于 i + σ 處的位置編碼可以線性投影位置 i 處的位置編碼來(lái)表示,也就是說(shuō)位置信息和絕對(duì)位置 i 無(wú)關(guān),只是和相對(duì)位置 σ 有關(guān)

- 投影矩陣和序列中的位置 i 是無(wú)關(guān)的,但是和 j 是相關(guān)的(和 dimension 的信息是相關(guān)的),意味著在一個(gè)序列中,假設(shè)一個(gè)詞出現(xiàn)在另外一個(gè)詞兩個(gè)或者三個(gè)位置的時(shí)候,不管這對(duì)詞出現(xiàn)在序列中的什么位置,對(duì)于位置信息來(lái)講,都是可以通過(guò)一個(gè)同樣的線性變換查找出來(lái)的
- 相對(duì)來(lái)講,這樣編碼的好處在于模型能夠更加關(guān)注相對(duì)的位置信息,而不是關(guān)注一個(gè)詞出現(xiàn)在一個(gè)句子中的絕對(duì)位置
總結(jié)
1、自注意力池化層將 xi 當(dāng)作 key ,value query 來(lái)對(duì)序列抽取特征
2、完全并行、最長(zhǎng)序列為 1 、但對(duì)長(zhǎng)序列計(jì)算復(fù)雜度高
- 可以完全并行,和 CNN 是一樣的,所以計(jì)算效率比較高
- 最長(zhǎng)序列為 1 ,對(duì)于任何一個(gè)輸出都能夠看到整個(gè)序列信息,所以這也是為什么當(dāng)處理的文本比較大、序列比較長(zhǎng)的時(shí)候,通常會(huì)用注意力和自注意力
- 但是問(wèn)題是對(duì)長(zhǎng)序列的計(jì)算復(fù)雜度比較高,這也是一大痛點(diǎn)
3、位置編碼在輸入中加入位置信息,使得自注意力能夠記憶位置信息
- 類似于計(jì)算機(jī)的數(shù)字編碼,對(duì)每個(gè)樣本,給定一個(gè)長(zhǎng)為 d 的編碼
- 編碼使用的是 sin 函數(shù)或者是 cos 函數(shù),使得它對(duì)于序列中兩個(gè)固定距離的位置編碼,不管它們處于序列中的哪個(gè)位置,他們的編碼信息都能夠通過(guò)一個(gè)線性變換進(jìn)行轉(zhuǎn)換
Q&A
- 1、老師,輸入是 n 維,卷積大小是 k ,為什么 CNN 的最長(zhǎng)路徑是 n/k ,最長(zhǎng)路徑是和層數(shù)無(wú)關(guān)嗎?
- ?QA P3 - 00:00?
- 2、如果做閱讀理解,比如 IELTS 或者高考語(yǔ)文,比如把幾個(gè)問(wèn)題(比如主觀題)作為 query,把整篇文章作為 key/value ,用注意力機(jī)制提取問(wèn)題可能指向的段落或者句子,理論上能夠?qū)崿F(xiàn)嗎,或者是以目前技術(shù)和硬件有什么局限?
- ?QA P3 - 00:42?
- 3、前面的余弦圖是怎么得到熱力圖這個(gè)編碼的?
- ?QA P3 - 02:15?
- 4、位置編碼里的位置在實(shí)際中指的是什么?
- ?QA P3 - 02:37?
- 5、相對(duì)位置的基準(zhǔn)位置是怎么確定的?每個(gè)序列的基準(zhǔn)位置是一樣的嗎?
- ?QA P3 - 03:22?
- 6、位置編碼是需要模型自動(dòng)學(xué)習(xí)嗎,是如何解碼的呢?
- ?QA P3 - 03:50?
- 7、可以介紹下可學(xué)習(xí)的相對(duì)位置編碼嗎?
- ?QA P3 - 04:31?
- 8、transformer 的輸入數(shù)據(jù)應(yīng)該是怎么組織的?
- ?QA P3 - 04:43?
- 9、位置編碼能否寫(xiě)成 nn.parameter 這種可訓(xùn)練的形式?
- ?QA P3 - 04:51?
- 10、老師,自注意力機(jī)制是不是也可以理解為一個(gè)網(wǎng)絡(luò)層,就像 CNN 或者 RNN 的一層來(lái)理解?
- ?QA P3 - 05:05?
- 11、位置編碼在經(jīng)過(guò) attention 之后會(huì)丟失相對(duì)位置信息嗎?
- ?QA P3 - 05:26?
- 12、通過(guò) NLP 提取文本中問(wèn)題對(duì)應(yīng)的內(nèi)容,這塊會(huì)講嗎?
- ?QA P3 - 05:59?
- 13、ViT 的位置編碼好像做的很簡(jiǎn)單,沒(méi)有用余弦,是一個(gè)一維向量?
- ?QA P3 - 06:14?
----end----
其他參考
1、《動(dòng)手學(xué)深度學(xué)習(xí)》,課程 PPT ,https://courses.d2l.ai/zh-v2/assets/pdfs/part-4_4.pdf
2、《動(dòng)手學(xué)深度學(xué)習(xí)》,教程,https://zh-v2.d2l.ai/chapter_attention-mechanisms/self-attention-and-positional-encoding.html
標(biāo)簽: