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