【深度学习】04-01-自注意力机制(Self-attention)-李宏毅老师2122深度学习课程笔记
04-01-自注意力機(jī)制Self-attention
- 模型輸入
- 文字處理
- 語音處理
- Graph
- 模型輸出
- 類型一:一對(duì)一(Sequence Labeling)
- 類型二:多對(duì)一
- 類型三:多對(duì)多(由模型自定seq2seq)
- 一對(duì)一類型:序列標(biāo)注問題 - 無上下文信息
- 序列標(biāo)注問題 - 解決方法一:滑動(dòng)窗口相鄰向量信息
- 序列標(biāo)注問題 - 解決方法二:全連接網(wǎng)絡(luò)(Fully Connected Network)
- 序列標(biāo)注問題 - 解決方法三:Self-attention
- Self-attention
- 如何保證每個(gè)輸出都能分析所有輸入上下文? - 關(guān)聯(lián)度
- 如何確定兩個(gè)輸入向量的關(guān)聯(lián)程度α?- 計(jì)算關(guān)聯(lián)度的模組(Dot-product & Additive)
- 計(jì)算關(guān)聯(lián)度的模組 Dot-product(transformer中的方法)
- 計(jì)算關(guān)聯(lián)度的模組 Additive
- Self-attention 如何利用 Dot-product 計(jì)算出關(guān)聯(lián)度?
- 如何基于關(guān)聯(lián)度抽取信息?- 加權(quán)求和
- Self-attention 原理
- 多頭注意力機(jī)制 (Multi-head Self-attention)
- 為什么需要多種注意力?- 相關(guān)性可能有多種
- 如何計(jì)算多頭注意力中的相關(guān)性?- 按相關(guān)類型計(jì)算
- 注意力機(jī)制問題:沒有位置信息
- 為什么需要位置信息?- 位置信息很重要
- 如何為Self-attention添加位置信息?- Positional Encoding
- 如何表示位置信息 e i e^i ei? - 人工標(biāo)注 & 數(shù)據(jù)集訓(xùn)練
- 人工標(biāo)注表示位置信息
- 訓(xùn)練集訓(xùn)練
- 自注意力機(jī)制的應(yīng)用
- 語音處理
- 問題:超大輸入序列導(dǎo)致復(fù)雜度很高 - Truncated Self-attention
- 圖像處理
- Self-attention Vs CNN
- Self-attention Vs RNN
- Self-attention 應(yīng)用圖論(GNN)
- Self-attention 眾多變形
模型輸入
文字處理
無論是預(yù)測(cè)視頻觀看人數(shù)還是圖像處理,輸入都可以看作是一個(gè)向量,輸出是一個(gè)數(shù)值或類別。然而,若輸入是一系列向量(序列),同時(shí)長(zhǎng)度會(huì)改變,例如把句子里的單詞都描述為向量,那么模型的輸入就是一個(gè)向量集合,并且每個(gè)向量集合的大小都不一樣。
一種將單詞表示為向量的方法:One-hot Encoding(獨(dú)熱編碼)。
向量的長(zhǎng)度就是世界上所有詞匯的數(shù)目,用不同位的1(其余位置為0)表示一個(gè)詞匯,如下所示:
apple = [1, 0, 0, 0, 0, …]
bag = [0, 1, 0, 0, 0, …]
cat = [0, 0, 1, 0, 0, …]
dog = [0, 0, 0, 1, 0, …]
computer = [0, 0, 0, 0, 1, …]
但是這種表示方式默認(rèn)了所有詞匯間沒有任何關(guān)系,貓和狗都是動(dòng)物這種關(guān)系在向量集中體現(xiàn)不出來,里面沒有任何有意義的信息。
one hot representation編碼的每個(gè)單詞都是一個(gè)維度,彼此independent。
另一種將單詞表示為向量方法:Word Embedding。
給單詞一個(gè)向量,這個(gè)向量有語義的信息,一個(gè)句子就是一排長(zhǎng)度不一的向量。將Word Embedding畫出來,就會(huì)發(fā)現(xiàn)同類的單詞就會(huì)聚集,因此它能區(qū)分出類別:
To learn more: https://youtu.be/X7PH3NuYW0Q (in Mandarin)
什么是 word embedding? - YJango的回答 - 知乎
語音處理
取一段語音信號(hào)作為窗口,可以將10ms內(nèi)的信息描述為一個(gè)向量(幀),滑動(dòng)這個(gè)窗口就得到這段語音的所有向量(一個(gè)向量集)。
Graph
社交網(wǎng)絡(luò)的每個(gè)節(jié)點(diǎn)就是一個(gè)人,節(jié)點(diǎn)之間的關(guān)系用線連接。每一個(gè)人就是一個(gè)向量。
分子上的每個(gè)原子就是一個(gè)向量(每個(gè)元素可用One-hot編碼表示),分子就是一堆向量。
模型輸出
按照輸入向量與輸出標(biāo)簽的數(shù)量關(guān)系,可以分為一對(duì)一、多對(duì)一及多對(duì)多。
類型一:一對(duì)一(Sequence Labeling)
每個(gè)輸入向量對(duì)應(yīng)一個(gè)輸出標(biāo)簽。
文字處理:詞性標(biāo)注(每個(gè)輸入的單詞都輸出對(duì)應(yīng)的詞性)。
語音處理:一段聲音信號(hào)里面有一串向量,每個(gè)向量對(duì)應(yīng)一個(gè)音標(biāo)。
圖像處理:在社交網(wǎng)絡(luò)中,推薦某個(gè)用戶商品(可能會(huì)買或者不買)。
類型二:多對(duì)一
多個(gè)輸入向量對(duì)應(yīng)一個(gè)輸出標(biāo)簽。
語義分析:正面評(píng)價(jià)、負(fù)面評(píng)價(jià)。
語音識(shí)別:識(shí)別某人的音色。
圖像:給出分子的結(jié)構(gòu),判斷其親水性。
類型三:多對(duì)多(由模型自定seq2seq)
不知道應(yīng)該輸出多少個(gè)標(biāo)簽,機(jī)器自行決定。
翻譯:語言A到語言B,單詞字符數(shù)目不同
語音識(shí)別
接下來先討論一對(duì)一類型。
一對(duì)一類型:序列標(biāo)注問題 - 無上下文信息
序列標(biāo)注:Sequnce Labeling
利用全連接網(wǎng)絡(luò),輸入一個(gè)句子,輸出對(duì)應(yīng)單詞數(shù)目的標(biāo)簽。
問題:當(dāng)一個(gè)句子里出現(xiàn)兩個(gè)相同的單詞,并且它們的詞性不同(例如:I saw a saw. 我看見一把鋸子)。期望模型輸出第一個(gè)saw為動(dòng)詞,第二個(gè)saw為名詞,但是這種結(jié)構(gòu)的神經(jīng)網(wǎng)絡(luò)不可能做到。
序列標(biāo)注問題 - 解決方法一:滑動(dòng)窗口相鄰向量信息
解決:讓神經(jīng)網(wǎng)絡(luò)考慮上下文,利用滑動(dòng)窗口,每個(gè)向量查看窗口中相鄰的其他向量的性質(zhì)。
考慮整條語句分析的情況,需要獲取整條語句的詞匯信息,需要滑動(dòng)窗口包含語句所有詞匯的向量,這樣會(huì)導(dǎo)致全連接神經(jīng)網(wǎng)絡(luò)的參數(shù)暴增,進(jìn)而導(dǎo)致超大運(yùn)算量甚至是過擬合。
所以,這種方法不能解決整條語句的分析問題,即語義分析。這就引出了 Self-attention 技術(shù)。
序列標(biāo)注問題 - 解決方法二:全連接網(wǎng)絡(luò)(Fully Connected Network)
既然是尋找上下文關(guān)系,為什么不使用全連接網(wǎng)絡(luò)?- 運(yùn)算量大&容易過擬合
考慮訓(xùn)練集中最長(zhǎng)的語句的長(zhǎng)度作為滑動(dòng)窗口的尺寸,這意為著Fully Connected Network需要大量參數(shù),運(yùn)算量很大,而且容易o(hù)verfeating。
序列標(biāo)注問題 - 解決方法三:Self-attention
輸入整個(gè)語句的向量到self-attention中,輸出相等個(gè)數(shù)的向量,且輸出的每個(gè)向量都考慮輸入的整個(gè)語句向量集的信息。
一種方式是考慮訓(xùn)練集中最長(zhǎng)的語句的長(zhǎng)度作為滑動(dòng)窗口的尺寸,這意為著Fully Connected Network需要大量參數(shù),運(yùn)算量很大,而且容易o(hù)verfeating。
輸入整個(gè)語句的向量到self-attention中,輸出對(duì)應(yīng)個(gè)數(shù)的向量,再將其結(jié)果輸入到全連接網(wǎng)絡(luò),最后輸出標(biāo)簽。以上過程可多次重復(fù),fully connected network 與 self-attention 交替使用:
Google 根據(jù)自注意力機(jī)制在論文 Attention is all you need 中提出了 Transformer 架構(gòu),注意力機(jī)制在該論文之前就已經(jīng)存在,但是,是在Attention is all you need論文中將注意力機(jī)制稱為Self-attention,并使其發(fā)揚(yáng)光大。
self attention :專注整個(gè)序列的信息。FC:專注某個(gè)位置的信息
Self-attention
a表示輸入層或隱藏層,每個(gè)輸出b與所有輸入a都相關(guān)。
如何保證每個(gè)輸出都能分析所有輸入上下文? - 關(guān)聯(lián)度
α 表示a1與a4的關(guān)聯(lián)程度。又稱為 attention score。
在類似語義分析的任務(wù)場(chǎng)景中,每個(gè)輸出b都需要分析所有a,但是使用滑動(dòng)窗口又會(huì)導(dǎo)致參數(shù)量暴增,所以需要根據(jù)a1找出輸入向量集中 哪些向量與 ’ 判斷a1的類別 ’ 相關(guān)。
如何確定兩個(gè)輸入向量的關(guān)聯(lián)程度α?- 計(jì)算關(guān)聯(lián)度的模組(Dot-product & Additive)
計(jì)算關(guān)聯(lián)度的模組很多,輸入兩個(gè)[輸入向量],輸出兩個(gè)[輸入向量]的關(guān)聯(lián)程度。
下面的講解以 Dot-product 和 Additive 為例。
計(jì)算關(guān)聯(lián)度的模組 Dot-product(transformer中的方法)
計(jì)算關(guān)聯(lián)度的模組 Additive
Self-attention 如何利用 Dot-product 計(jì)算出關(guān)聯(lián)度?
注意:a1與自己也要計(jì)算關(guān)聯(lián)程度。
【待補(bǔ)充】a1與自己計(jì)算關(guān)聯(lián)程度的重要性?
α i , j \alpha_{i,j} αi,j?表示兩個(gè)輸入向量的關(guān)聯(lián)程度,通過 q i q^i qi和 k j k^j kj的內(nèi)積運(yùn)算得到,其中i表示 q i q^i qi是由 a i a_i ai?計(jì)算出來的,j表示 k j k^j kj是由 a j a_j aj?計(jì)算出來的
計(jì)算出相關(guān)性之后,可加一層softmax層(也可以加別的激活函數(shù),比如ReLu)。
注: b i ( 1 ≤ i ≤ 4 ) b^i (1≤i≤4) bi(1≤i≤4) 是同時(shí)計(jì)算出來的。
如何基于關(guān)聯(lián)度抽取信息?- 加權(quán)求和
哪個(gè) a i j ′ × v i a'_{ij} × v^i aij′?×vi 更大,哪個(gè) a 1 a^1 a1就更能決定結(jié)果 b i b_i bi?
Self-attention 原理
這里需要三個(gè)向量:Query,Key,Value。其解釋參考文章 《如何理解 Transformer 中的 Query、Key 與 Value》- yafee123
注意:KTQ的結(jié)果A,需要經(jīng)過SoftMax處理。
上述過程可以總結(jié)為:
① 輸入矩陣 I I I分別乘以 W q , W k , W v W^q,W^k,W^v Wq,Wk,Wv得到三個(gè)矩陣 Q , K , V Q,K,V Q,K,V。
② A = K T Q A=K^TQ A=KTQ,經(jīng)過激活函數(shù)處理得到注意力矩陣 A ′ = s o f t m a x ( K T Q d k ) A'=softmax(\frac {K^TQ}{\sqrt{d_k}}) A′=softmax(dk??KTQ?)
③ 輸出 O = V A ′ O=VA' O=VA′
即:
A t t e n t i o n ( Q , K , V ) = V ? s o f t m a x ( K T Q d k ) Attention(Q,K,V) = V \cdot softmax(\frac {K^TQ}{\sqrt{d_k}}) Attention(Q,K,V)=V?softmax(dk??KTQ?)
其中, d k \sqrt{d_k} dk??為向量長(zhǎng)度。唯一要訓(xùn)練出的參數(shù)就是 W q , W k , W v W^q,W^k,W^v Wq,Wk,Wv。
注意力系數(shù)計(jì)算:
階段1:根據(jù)Query和Key計(jì)算兩者的相似性或者相關(guān)性
階段2:對(duì)第一階段的原始分值進(jìn) 行歸一化處理
階段3:根據(jù)權(quán)重系數(shù)對(duì)Value進(jìn)行加權(quán)求和,得到Attention Value
所有輸入向量中,誰的 attention score 大,誰就能決定Attention Value,即b。
具體計(jì)算參考:動(dòng)手推導(dǎo)Self-Attention
多頭注意力機(jī)制 (Multi-head Self-attention)
為什么需要多種注意力?- 相關(guān)性可能有多種
有些任務(wù)(例如:翻譯、語音辨識(shí)等)中,multi-head會(huì)得到更好的結(jié)果。
之前的例子,都是用Q去找K,來計(jì)算相關(guān)性。但是兩個(gè)事物之間相關(guān)性可能有多種不同的類型。因此設(shè)置多種Q(head),多種K(Key),多種V(Value),不同的Q來負(fù)責(zé)不同的相關(guān)性。
head的個(gè)數(shù)是超參數(shù)。
如何計(jì)算多頭注意力中的相關(guān)性?- 按相關(guān)類型計(jì)算
所有 b i , j b^{i,j} bi,j單獨(dú)計(jì)算,同時(shí)得出。比如 b i , 1 b^{i,1} bi,1, b i , 2 b^{i,2} bi,2, b i , 3 b^{i,3} bi,3單獨(dú)計(jì)算同時(shí)得出。
如上述公式,在Multi-head的情況下,輸入還是Q,K,V,輸出是不同head的輸出的拼接結(jié)果,再投影到 W 0 W^0 W0中。其中,對(duì)每一個(gè)head,可以將 Q,K,V 通過不同的可學(xué)習(xí)的參數(shù) W Q , W K , W V W^Q,W^K,W^V WQ,WK,WV 投影到一個(gè)低維上面,再做注意力函數(shù)Attention,最后輸出結(jié)果。
Query,Key,Value首先經(jīng)過一個(gè)線性變換,然后輸入到放縮點(diǎn)積attention,注意這里要做 h 次,其實(shí)也就是所謂的多頭,每一次算一個(gè)頭。而且每次Q,K,V進(jìn)行線性變換的參數(shù)W是不一樣的 W Q , W K , W V W^Q,W^K,W^V WQ,WK,WV 。然后將 h 次的放縮點(diǎn)積attention結(jié)果進(jìn)行拼接,再進(jìn)行一次線性變換得到的值作為多頭attention的結(jié)果。
注意力機(jī)制問題:沒有位置信息
在語義分析任務(wù)中,對(duì)于Self-attention來說,并沒有序列中字符位置的信息。之前的計(jì)算過程中,字母右上角出現(xiàn)的數(shù)字,與位置信息無關(guān),只是為了講解而標(biāo)注的。
為什么需要位置信息?- 位置信息很重要
在語義分析任務(wù)中,例如動(dòng)詞是不太可能出現(xiàn)在句首的,因此可以降低動(dòng)詞在句首的可能性,但是自注意力機(jī)制并沒有該能力。因此需要加入 Positional Encoding 的技術(shù)來標(biāo)注每個(gè)詞匯在句子中的位置信息。
如何為Self-attention添加位置信息?- Positional Encoding
每一個(gè)不同的位置都有一個(gè)專屬的向量 e i e^i ei,然后再做 e i + a i e^i+a^i ei+ai 的操作,之后的計(jì)算看到 e i e^i ei 就知道 a i a^i ai 的位置是 i i i。
如何表示位置信息 e i e^i ei? - 人工標(biāo)注 & 數(shù)據(jù)集訓(xùn)練
人工標(biāo)注表示位置信息
如下圖所示,在attention is all you need論文中, e i e^i ei為圖中的一列。
這種 e i e^i ei 是人工標(biāo)注(hand-crafted)的。就會(huì)出現(xiàn)很多問題:在確定 e i e^i ei 的時(shí)候只定到128,但是序列長(zhǎng)度是129。在最早的論文attention is all you need中是沒有這個(gè)問題的,它通過某個(gè)規(guī)則(sin、cos函數(shù))產(chǎn)生。
位置編碼如何表示更好?是一個(gè)待研究的問題。
訓(xùn)練集訓(xùn)練
位置編碼可以自定義表示方法,也可以通過對(duì)訓(xùn)練集學(xué)習(xí)來得出。
下圖展示的是幾種位置表示方法的效果。
自注意力機(jī)制的應(yīng)用
Transformer 、BERT 模型用到了自注意力機(jī)制。
Self-attention 還可以用在除NLP以外的問題上:語音處理,圖像處理。
語音處理
問題:超大輸入序列導(dǎo)致復(fù)雜度很高 - Truncated Self-attention
attention matrix復(fù)雜度是輸入向量個(gè)數(shù)的平方,在語音處理任務(wù)中,假設(shè)一個(gè)向量表示10ms內(nèi)的語音信息,那么一段語音將由上千個(gè)向量組成,這將導(dǎo)致語音處理任務(wù)的計(jì)算量很大,并且需要很大的存儲(chǔ)空間記錄計(jì)算信息。
針對(duì)該問題,提出了 Truncated Self-attention 思想。計(jì)算注意力時(shí),只關(guān)注小范圍(自定義)上下文信息,而不是整句的上下文信息,加快運(yùn)算速度,節(jié)省存儲(chǔ)空間。
考慮多大范圍內(nèi)的上下文信息,視任務(wù)而定。
圖像處理
使用CNN時(shí),一張圖片可看做一個(gè)很長(zhǎng)的向量。
一張圖片也可看做一組向量:一張5?10的RGB圖像可以看做5?10的三個(gè)(通道)矩陣,把一個(gè)像素的三個(gè)通道數(shù)值看作一個(gè)三維向量。
既然一張圖片可以看做一組向量,那么也可以使用self-attention進(jìn)行圖像處理。例如:GAN、DETR。
Self-attention Vs CNN
CNN只考慮感受野中的信息。Self-attention考慮整張圖片的信息。
CNN是簡(jiǎn)化版的Self-attention。Self-attention是復(fù)雜化的CNN。CNN中感受野的大小是自定義的,Self-attention中使用attention找出相關(guān)的像素,這些相關(guān)的像素可以看作是自動(dòng)學(xué)習(xí)得到的“感受野”。
在論文On the Relationship between Self-Attention and Convolutional Layers中,用數(shù)學(xué)嚴(yán)謹(jǐn)?shù)淖C明了CNN就是self-attention的特例,self-attention只要設(shè)置合適的參數(shù)可以做到CNN同樣的效果。
如果用不同的數(shù)據(jù)量來訓(xùn)練CNN和self-attention,會(huì)出現(xiàn)不同的結(jié)果。大模型self-attention彈性大,需要更多的訓(xùn)練數(shù)據(jù),如果用少量數(shù)據(jù)訓(xùn)練,容易出現(xiàn)過擬合;而小的模型CNN彈性小,在少量數(shù)據(jù)集上不容易出現(xiàn)過擬合,但在大數(shù)據(jù)集
相關(guān)論文:An Image is Worth 16×16 Words: Transformers for Image Recognition at Scale
Self-attention Vs RNN
1 RNN中,如果想讓后面的RNN考慮前面RNN的輸入,就需要memory保存前面RNN的輸入。而self-attention中每一個(gè)輸出都分析了所有輸入的信息。
2 RNN中,不能平行處理數(shù)據(jù),每一層RNN只考慮前一層的輸出。而self-attention中可以平行處理數(shù)據(jù),同時(shí)計(jì)算注意力并得到輸出。
3 可以使用雙向RNN實(shí)現(xiàn)跟self-attention一樣考慮所有input sequence的功能。但是,即使使用雙向RNN,上圖中最右FC(黃)想考慮最左輸入(藍(lán)),需要memory保存最左輸入,一直保存?zhèn)鬟f到最右FC。
因此很多的應(yīng)用逐漸把RNN的架構(gòu)改為Self-attention架構(gòu)。
在論文Transformers are RNNs: Fast autoregressive transformers with linear attention中,詳細(xì)介紹了Self-attention 與 RNN的關(guān)系,self-attention加上其他結(jié)構(gòu)可等效于RNN。
Self-attention 應(yīng)用圖論(GNN)
GNN:Graph Neural Network
將圖中使用Self-attention,圖中頂點(diǎn)的關(guān)聯(lián)關(guān)系不需要經(jīng)過學(xué)習(xí)得到,關(guān)聯(lián)關(guān)系可以直接根據(jù)邊得到。
Self-attention 眾多變形
自注意力機(jī)制的缺點(diǎn)就是計(jì)算量非常大,因此如何優(yōu)化其計(jì)算量是未來研究的重點(diǎn),所以出現(xiàn)了很多Self-attention的變形。
以下論文中,分析了多種self-attention的變形。
Long Range Arena: A Benchmark for Efficient Transformers
Efficient Transformers: A Survey
總結(jié)
以上是生活随笔為你收集整理的【深度学习】04-01-自注意力机制(Self-attention)-李宏毅老师2122深度学习课程笔记的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 还在熬夜干论文——Python带你一键起
- 下一篇: DeepLearing—CV系列(二十二