引言
這是李宏毅老師講的機(jī)器學(xué)習(xí)視頻中與自然語(yǔ)言處理有關(guān)的随闺,本文主要關(guān)注Self-attention砂心。
處理序列的模型
我們已經(jīng)知道如何處理輸入是一個(gè)向量的問(wèn)題驾荣。假設(shè)我們遇到了更加復(fù)雜的問(wèn)題夺欲。比如谓罗,輸入是一系列向量媒至。
并且輸入的這一系列向量的長(zhǎng)度不是固定的顶别。
比如,在文字處理的場(chǎng)景中拒啰。輸入是一個(gè)句子驯绎,將每個(gè)句子的詞匯描述成一個(gè)向量,這樣模型的輸入就是一排向量谋旦。
如何把詞匯表示成向量呢剩失,我們知道有one-hot編碼屈尼。
但是這種表示方法不能表示語(yǔ)義信息,并且維度還非常大拴孤。另一種表示方法是詞嵌入向量脾歧。
還有圖結(jié)構(gòu)也可以是一系列向量。
那這些模型的輸出是什么乞巧?
有三種類型:
每個(gè)輸入的向量都有一個(gè)標(biāo)簽涨椒,比如詞性標(biāo)注任務(wù)。
第二種類型是整個(gè)序列的輸出就是一標(biāo)簽绽媒。
比如情感分類任務(wù)蚕冬、或者是輸入一段語(yǔ)言,識(shí)別說(shuō)話者是誰(shuí)等是辕。
最后一種類型就是囤热,我們也不知道有多少個(gè)輸出,由機(jī)器自己決定要輸出多少获三。比如機(jī)器翻譯任務(wù)旁蔼。
我們今天關(guān)注第一種類型。這種任務(wù)又叫序列標(biāo)注(Sequence Labeling)疙教。
我們不能直接用全連接網(wǎng)絡(luò)(FC)來(lái)做棺聊,因?yàn)槿B接網(wǎng)絡(luò)同樣的輸入會(huì)得到同樣的輸出。而我們上面的例子中“I saw a saw”贞谓,第一個(gè)“saw”是動(dòng)詞限佩,第二個(gè)“saw”是名詞。
如果能考慮到上下文就好了裸弦。這是有可能的祟同,可以設(shè)定一個(gè)窗口大小,把窗口大小內(nèi)的輸入都串起來(lái)理疙,一起丟到FC中晕城。但是窗口大小始終是有限的,如何考慮整個(gè)句子呢窖贤,難道設(shè)定一個(gè)巨大的窗口包含整個(gè)語(yǔ)句砖顷?
有沒(méi)有更好的考慮整個(gè)序列的模型呢?有赃梧,那便是Self-atention!
Self-attention
Self-attention可以接收一整個(gè)序列的輸入择吊,序列中有多少個(gè)輸入,它就可以得到多少個(gè)輸出槽奕。
比如上面輸入4個(gè)向量到Self-attention中,我們就得到了4個(gè)輸出向量房轿。這4個(gè)輸出向量特別之處在于粤攒,它們都是考慮了整個(gè)序列得到的結(jié)果所森。
在把這些特別的向量丟給FC之后,再來(lái)決定要輸出什么樣的東西夯接。
Self-attention的輸出還可以疊加焕济。比如,我們得到考慮整個(gè)序列的向量后盔几,喂給FC晴弃,得到FC的輸出后,再過(guò)一次Self-attention逊拍,重新考慮FC的所有輸出上鞠,再丟給另一個(gè)FC之后,得到最終的輸出芯丧,如下圖:
所以可以把FC和Self-attention交替使用芍阎,用Self-attention處理整個(gè)序列的信息,F(xiàn)C專注于處理某個(gè)位置的信息缨恒。
Self-attention的原理
那Self-attention是怎么運(yùn)作的呢谴咸?
它的輸入就是向量序列,這些向量可能是整個(gè)網(wǎng)絡(luò)的輸入骗露,也可能是某個(gè)隱藏層的輸出岭佳。
再?gòu)?qiáng)調(diào)一次,每個(gè)Self-attention的輸出萧锉,都是考慮了所有的輸入向量才生成出來(lái)的珊随。
下面我們來(lái)看一下是如何生成這些向量的。
我們重點(diǎn)來(lái)看一下是如何產(chǎn)生這個(gè)向量的驹暑,其他的同理玫恳。
① 我們想要根據(jù)找出序列中其他與有關(guān)的向量。每個(gè)向量與關(guān)聯(lián)程度用一個(gè)數(shù)值來(lái)表示优俘。第一步要考慮的問(wèn)題就是京办,Self-attention模型如何決定兩個(gè)向量的關(guān)聯(lián)性呢。
那么就需要一個(gè)計(jì)算關(guān)聯(lián)性(注意力)的模組帆焕。
它拿兩個(gè)向量作為輸入惭婿,直接輸出它們的相關(guān)性數(shù)值。如何計(jì)算這個(gè)數(shù)值叶雹,就有各種各樣的做法财饥。
常用的做法有使用點(diǎn)乘(Dot product)的方式。
點(diǎn)乘的方式做法如下:
- 把輸入的向量分別乘上兩個(gè)不同的權(quán)重矩陣折晦,分別得到兩個(gè)向量钥星,記為和。
- 然后讓就可以得到一個(gè)標(biāo)量满着,這個(gè)標(biāo)量就作為數(shù)值谦炒。
還有一種叫作Additive的方式:
也是乘上兩個(gè)權(quán)重矩陣贯莺,得到之后,再拼接起來(lái)宁改,然后輸入到一個(gè)激活函數(shù)中缕探,激活函數(shù)輸出的結(jié)果通過(guò)矩陣進(jìn)行線性變換得到。
我們下面的討論基于點(diǎn)乘的方式还蹲。
② 計(jì)算和其他向量的關(guān)聯(lián)性爹耗。
怎么做呢? 先用乘上矩陣得到谜喊,這個(gè)被稱為為query潭兽。
然后乘上分別得到,這些被稱為key锅论。
接下來(lái)用與做點(diǎn)積得到值讼溺,表示和之間的關(guān)聯(lián)性,這種記法說(shuō)明query是提供的最易,key是提供的怒坯。這個(gè)值還被稱為attention score。計(jì)算出與的關(guān)聯(lián)性后藻懒,還要跟計(jì)算一下剔猿。
計(jì)算的時(shí)候也是乘以矩陣得到的,然后再與做點(diǎn)積得到嬉荆。
實(shí)際上归敬,我們還要利用同樣的公式計(jì)算自己與自己的關(guān)聯(lián)性。
③ 計(jì)算Softmax
我們還要對(duì)這些attention score做一個(gè)Softmax鄙早,得到汪茧,相當(dāng)于與與各個(gè)向量的相關(guān)性系數(shù),我們就可以知道哪些向量與相關(guān)性比較大限番。
④ 計(jì)算最終的
在計(jì)算之前呢舱污,還有一個(gè)向量要計(jì)算。
這個(gè)向量就是向量弥虐,把到都乘上扩灯,得到到。這個(gè)可以看成是向量所攜帶的信息編碼霜瘪。
然后與Softmax之后的做一個(gè)加權(quán)求和就得到了:
假設(shè)與關(guān)聯(lián)性較大珠插,那么得到的權(quán)重系數(shù)就很大,在計(jì)算時(shí)颖对,就會(huì)有很大程度的信息來(lái)自于,也就是來(lái)自于捻撑。
下面得到是一樣的,雖然這里先探討的產(chǎn)生顾患,其實(shí)是可以同時(shí)產(chǎn)生的琳拭。
不過(guò)計(jì)算時(shí),是以計(jì)算的作為query的描验。同理以得到就可以計(jì)算。
剛才我們說(shuō)是可以同時(shí)計(jì)算的坑鱼,是怎么回事呢膘流。其實(shí)計(jì)算無(wú)非就是不同的向量與矩陣相乘得到的,如果把這些向量寫在一起鲁沥,寫成一個(gè)矩陣呼股,不就可以一次得到了嗎。
把拼成一個(gè)矩陣画恰,然后讓矩陣乘以它得到矩陣彭谁,矩陣可以分解為。
剩下的也是同樣的道理允扇。
接下來(lái)缠局,計(jì)算attention score也可以寫成矩陣運(yùn)算。
我們先看考润,它計(jì)算可以寫成矩陣與向量的乘積。
同理不難理解也可以寫成唱矛。
這樣把拼成矩陣,然后通過(guò)得到井辜,經(jīng)過(guò)Softmax之后就得到了矩陣绎谦,矩陣中每列之和為,也被成為Attenion Matrix粥脚。
接下來(lái)看
相當(dāng)于是把組成的矩陣乘以的第一列窃肠,就得到了。
那么用矩陣乘以就可以得到得到的矩陣阿逃。
總結(jié)下來(lái)铭拧,這一連串的操作,其實(shí)就是矩陣的乘法而已恃锉。我們用一個(gè)圖來(lái)總結(jié)一下搀菩。
是Self-attention模型的輸入組成的矩陣,是三個(gè)可以學(xué)習(xí)的權(quán)重矩陣破托;
用這三個(gè)矩陣乘分別得到矩陣肪跋;
然后用矩陣做個(gè)轉(zhuǎn)置乘上就得到了,經(jīng)過(guò)Softmax得到土砂;
用乘上得到最終的輸出州既。
其中需要學(xué)習(xí)的參數(shù)谜洽,就是。
Multi-head Self-attention
Multi-head Self-attention是Self-attention的一個(gè)升級(jí)版本吴叶,Multi-head指的是計(jì)算出多個(gè)矩陣阐虚。
為什么這樣有意義呢? Self-attention是用query去找相關(guān)性,但是相關(guān)性可能有很多個(gè)種類蚌卤,這時(shí)得到多個(gè)就分別代表不同種類实束。多出來(lái)的矩陣是怎么計(jì)算的呢。
同理用乘上不同的矩陣分別得到和。
然后計(jì)算和的時(shí)候囊榜,把這些第二個(gè)上標(biāo)為的進(jìn)行計(jì)算审胸,最后得到;上標(biāo)為的進(jìn)行計(jì)算锦聊,得到
接下來(lái)也可以拼接歹嘹,然后乘以一個(gè)矩陣得到。
Positional Encoding
現(xiàn)在整個(gè)過(guò)程看下來(lái)孔庭,Self-attention少了一個(gè)重要的信息尺上,即位置信息。
我們上面在進(jìn)行矩陣運(yùn)算的時(shí)候圆到,對(duì)于不同的位置的輸入怎抛,都是同等對(duì)待的。沒(méi)有說(shuō)像RNN那樣后面的輸入考慮了前面輸入的信息芽淡。也沒(méi)有考慮輸入的距離遠(yuǎn)近马绝。
本小節(jié)介紹的Positional Encoding就是用于解決這個(gè)問(wèn)題的。具體就是為每個(gè)位置的輸入設(shè)置一個(gè)獨(dú)立的位置向量挣菲。
在Attention is all you need中用的是下圖中的每一列:
即每一列代表一個(gè)位置向量富稻,這些位置向量是通過(guò)sin和cos函數(shù)形成一個(gè)公式生成的。當(dāng)然還有其他的生成方法白胀,甚至可以當(dāng)成一個(gè)可以學(xué)習(xí)的參數(shù)椭赋。
Self-attention的應(yīng)用
比較出名的兩個(gè)就是Transformer和BERT。
這兩個(gè)家伙常年活躍在自然語(yǔ)言處理領(lǐng)域或杠。
當(dāng)然還可以應(yīng)用在語(yǔ)音和圖像上哪怔。
對(duì)于圖像來(lái)說(shuō),把每個(gè)位置的輸入看成一個(gè)3維(rgb)的向量。
Self-attention vs CNN
CNN在做卷積的時(shí)候认境,考慮的是感受野之內(nèi)的信息胚委,而Selt-attention考慮的是整個(gè)輸入的信息。
因此CNN可以看成是一個(gè)簡(jiǎn)化版的Self-attention叉信。
這樣好像是讓Self-attention自己去決定感受野的形狀是什么樣的亩冬。
Self-attention只要設(shè)置合適的參數(shù),就可以做到CNN能做到的事情硼身。
Self-attention在數(shù)據(jù)量大時(shí)表現(xiàn)更好鉴未,而CNN在小數(shù)據(jù)量時(shí)表現(xiàn)更好。這樣不難理解鸠姨,顯然Self-attention比CNN更復(fù)雜,需要的數(shù)據(jù)量顯然更多淹真。
Self-attention vs RNN
Self-attention和RNN都可以處理序列數(shù)據(jù)讶迁,RNN得到結(jié)果時(shí)必須按照時(shí)間步的順序(正序或逆序)來(lái)生成,利用雙向RNN的設(shè)計(jì)可以考慮整個(gè)序列信息核蘸。
而Self-attention每個(gè)輸出都也是考慮了整個(gè)序列信息巍糯。雖然雙向RNN也考慮了整個(gè)序列信息,但是如果將它倆進(jìn)行對(duì)比客扎,還是可以發(fā)現(xiàn)一些不同祟峦。
比如考慮上面紅框框出來(lái)的(深藍(lán)色)輸入,RNN要考慮這個(gè)輸入徙鱼,必須保存到內(nèi)存中宅楞,然后一步一步傳遞到最后,得到紅框框出來(lái)的黃色輸出袱吆。所以是很難考慮到比較遠(yuǎn)的輸入厌衙。
而Self-attention就沒(méi)有這個(gè)問(wèn)題,只要它們的query和key比較相關(guān)绞绒,得到的相關(guān)性系數(shù)較大婶希,不管多遠(yuǎn),都能輕易地抽取出信息蓬衡。
還有一個(gè)重要的不同就是并行化喻杈,這影響到訓(xùn)練效率。RNN是不能并行化的狰晚,而Self-attention可以筒饰。這樣Self-attention完勝RNN。
想要了解更多Self-attention和RNN的關(guān)系家肯,可以參考這篇論文?Transformers are RNNs: Fast Autoregressive Transformers with Linear Attention
Self-attentioni for Graph
Self-attention還可以用在圖結(jié)構(gòu)上龄砰,圖中每個(gè)節(jié)點(diǎn)看成一個(gè)輸入,圖結(jié)構(gòu)中邊的概念,可以看成有關(guān)聯(lián)的向量换棚∈礁洌可以形成一個(gè)稀疏矩陣,其中白色空白區(qū)域代表無(wú)關(guān)聯(lián)性固蚤。
比如上圖節(jié)點(diǎn)1和5娘汞,6,8相連夕玩,所以我們只需要計(jì)算它們之間的attenion score你弦。
Self-attention的變體
Self-attention有很多種變體,Self-attention最早用在Transformer上面燎孟,后來(lái)就出來(lái)了各種“xxformer”禽作。