1. 前言
本文翻譯自《Attention?Attention!》博客
最近幾年,注意力——在深度學(xué)習(xí)社區(qū)中,已然成為最廣為流行的概念和實(shí)用工具。在這篇博客里,我們將一起回顧它是如何被“發(fā)明”出來(lái)的,以及引申出來(lái)的各種變種和模型,如 transformer和SNAIL。
2. 目錄
- Seq2Seq問題所在
- 為”翻譯“而生
- 定義
- 注意力機(jī)制”家族“
- 概要
- 自注意力機(jī)制(Self-Attention)
- 柔性 vs 剛性注意力
- 全局 vs 局部注意力
- 指針網(wǎng)絡(luò)(Pointer Network)
- Transformer
- key, Value, Query
- Multi-Head 自注意力
- 編碼器
- 解碼器
- 整體結(jié)構(gòu)
- SNAIL
- 自注意力 GAG
- 文獻(xiàn)
注意力,在某種程度上,受啟發(fā)于我們是如何關(guān)注圖片中的某些區(qū)域,或者句子中的某些相關(guān)詞。舉個(gè)栗子:

人類的視覺注意力,使得我們能夠在圖片的“低解析度”背景下,更加關(guān)注具有“高解析度或辨識(shí)度”(High resolution)的特定區(qū)域(如黃色區(qū)域中狗的耳朵),然后逐漸調(diào)整焦點(diǎn),移動(dòng)到另一個(gè)耳朵、眼睛、鼻子等,最后進(jìn)行推斷整張圖片的信息。給定圖片中的一小塊補(bǔ)丁區(qū)域,圖片中其余的像素點(diǎn)也可以提供這塊補(bǔ)丁應(yīng)該展示什么的信息。在上圖中,假設(shè)我們先看到了狗的鼻子、尖尖的右耳和Shiba迷離的眼睛,因此我們就會(huì)理所當(dāng)然的期望在黃色區(qū)域看到另一只尖尖的耳朵。但是像毯子和毛衣的信息對(duì)于解析狗的特征信息幾乎沒有什么幫助。
同樣地,我們可以解釋一句話或者上下文中詞與詞之間的關(guān)系。當(dāng)看到“eating”這個(gè)詞時(shí),我們會(huì)期望在后面不遠(yuǎn)的位置看到“食物“描述的詞。下圖中有色詞表示食物,但并不是每個(gè)詞都與”eating“直接強(qiáng)相關(guān)。

簡(jiǎn)而言之,在深度學(xué)習(xí)中,注意力可以廣泛的借助重要性權(quán)重向量來(lái)實(shí)現(xiàn):在預(yù)測(cè)或推斷一個(gè)元素時(shí),如圖片中的像素點(diǎn)或句中的一個(gè)詞,我們使用注意力向量來(lái)判斷,它與其他元素有多強(qiáng)的關(guān)聯(lián)性,然后對(duì)加權(quán)后的向量求和以逼近最后的目標(biāo)值(target)。
3. Seq2Seq問題所在
Seq2Seq模型誕生于語(yǔ)言模型領(lǐng)域(Sutskever, et al. 2014)——廣泛的講,它是將一個(gè)輸入序列(source)轉(zhuǎn)化為另一個(gè)序列(target),兩個(gè)序列都可以是不定長(zhǎng)的。轉(zhuǎn)化任務(wù)的場(chǎng)景包括多語(yǔ)言機(jī)器翻譯(文本或語(yǔ)音)、問答對(duì)話對(duì)話生成系統(tǒng)、甚至是句子解析為語(yǔ)法樹。
Seq2Seq模型一般都會(huì)包含編碼-解碼結(jié)構(gòu),包括:
- 編碼器——處理序列輸入并壓縮信息到一個(gè)固定長(zhǎng)度的上下文向量中(sentence embedding 或者 “thought” vector)。上下文向量被當(dāng)做是輸入序列的語(yǔ)義概要。
- 解碼器——由上下文向量初始化,并每次產(chǎn)生一個(gè)轉(zhuǎn)碼輸出。早期的研究?jī)H使用編碼網(wǎng)絡(luò)的最后一個(gè)狀態(tài)作為下次解碼的初始狀態(tài)。
編碼器和解碼器都是循環(huán)神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu),如LSTM或者GRU單元

固定長(zhǎng)度上下文向量具有一個(gè)明顯的致命缺點(diǎn)——無(wú)法記憶長(zhǎng)句子。一旦完成編碼器輸入序列的處理,就會(huì)遺忘開始的部分。因此注意力機(jī)制(Bahdanau et al., 2015)被提出,解決這個(gè)問題。
4. 為”翻譯“而生
注意力機(jī)制”生來(lái)“就是為機(jī)器翻譯任務(wù)幫助記憶長(zhǎng)序列的句子輸入。相對(duì)于原始借助編碼器的最后一個(gè)隱藏單元的輸出構(gòu)建單一上下文向量,注意力機(jī)制的獨(dú)家”秘方“在于,其考慮了上下文向量和所有序列輸入的信息,構(gòu)建了”連接“。每一個(gè)輸出元素下的連接的權(quán)重都是自動(dòng)學(xué)習(xí)的。
上下文向量已經(jīng)考慮了整體輸入序列信息,我們不需要擔(dān)心遺忘的問題。源輸入和目標(biāo)輸出的語(yǔ)義對(duì)齊問題由上下文向量學(xué)習(xí)和控制。實(shí)際上上下文向量處理三方面的信息:
- 編碼器的隱藏狀態(tài)
- 解碼器的隱藏狀態(tài)
- 源輸入和目標(biāo)輸出的對(duì)齊

4.1 定義
接下來(lái)我們以理論的角度定義注意力機(jī)制。我們用X表示長(zhǎng)度為n的源輸入序列,用Y表示長(zhǎng)度為m*的目標(biāo)輸出序列:

(加粗的變量表示向量,下同)
編碼器是一個(gè)雙向RNN結(jié)構(gòu)(也可選其他RNN結(jié)構(gòu))——包括前向和后向隱藏層狀態(tài)。簡(jiǎn)單的維度拼接可以表示當(dāng)下編碼狀態(tài),可以理解為同時(shí)考慮了中心詞的上、下文信息:

解碼網(wǎng)絡(luò)在t時(shí)刻有隱藏狀態(tài)St——包括上一個(gè)序列隱藏狀態(tài),上一輸出和上下文向量(所有輸入序列的加權(quán)求和),權(quán)重如下:

對(duì)齊模型會(huì)針對(duì)第i個(gè)輸入序列和第t個(gè)輸出序列,分配一個(gè)對(duì)齊得分,以評(píng)判(yt,xi)的對(duì)齊效果。在Bahdanau的文章中,對(duì)齊得分向量是由單個(gè)隱藏層的前向網(wǎng)絡(luò)來(lái)組織的,并和整體網(wǎng)絡(luò)的其他部分進(jìn)行聯(lián)合訓(xùn)練。score計(jì)算函數(shù)方式輸入下:

對(duì)齊得分矩陣是一個(gè)很好的副產(chǎn)物,并可以可視化的表示輸入序列和輸出序列的關(guān)聯(lián)程度。

這里有一個(gè)Tensorflow團(tuán)隊(duì)提供的一個(gè)實(shí)現(xiàn)方法的很好教程。
5. 注意力機(jī)制”家族“
由于注意力的幫助,源輸入和目標(biāo)輸出序列之間的依賴不再受限于距離問題。這在機(jī)器翻譯任務(wù)中,收益頗大。不久被很好的拓展到計(jì)算機(jī)視覺領(lǐng)域(Xu et al. 2015),人們開始探索注意力機(jī)制的各種變種(Luong, et al., 2015; Britz et al., 2017; Vaswani, et al., 2017)。
5.1 概要
下表是幾種主流的注意力機(jī)制(或更寬泛的注意力機(jī)制)

- (*)在Luong, et al., 2015表示”concat“,在Vaswani, et al.表示”累積注意力(additive attention)“
- (^) 添加了尺度因子1/sqrt(n)——當(dāng)輸入很大時(shí),softmax函數(shù)可能具有極小的梯度,導(dǎo)致難以高效的更新學(xué)習(xí)
- (&) 指“intra-attention”
5.2 自注意力
自注意力,又稱”intra-attention“,是一種在計(jì)算同一序列表示時(shí),權(quán)重和序列的位置相關(guān)機(jī)制,被證明在機(jī)器閱讀理解,抽象概要(abstractive summarization)和圖片描述生成中非常有效。
這篇[long short-term memory network]論文使用了自注意力機(jī)制做機(jī)器閱讀。如下圖,自注意力機(jī)制能夠?qū)W習(xí)到當(dāng)前詞和句中先前詞之前的關(guān)聯(lián)性。

在[show, attend and tell]這篇文章中,自注意力機(jī)制被應(yīng)用在圖片生成描述任務(wù)中。圖片首先被CNN編碼,然后輸入到帶有自注意力機(jī)制的RNN網(wǎng)絡(luò)中,來(lái)學(xué)習(xí)圖片各個(gè)特征與描述中每個(gè)詞之前的映射關(guān)系。注意力權(quán)重的可視化清晰地的展示了模型每關(guān)注一部分特征都會(huì)輸出一個(gè)詞。

5.3 柔性 vs 剛性注意力
”柔性“ vs ”剛性“是如何定義注意力的另一種方式,原始思想最初在[show, attend and tell]文章中提出——基于注意力是否需要處整篇圖片還是僅僅局部一小塊:
-
柔性注意力:對(duì)齊權(quán)重通過源圖片所有的”patch“進(jìn)行學(xué)習(xí)映射,和Bahdanau et al., 2015想法一致
- Pro: 模型是平滑且可導(dǎo)的
- Con: 當(dāng)輸入圖片很大時(shí),訓(xùn)練代價(jià)很高
-
剛性注意力:每次僅選取圖片中一個(gè)”patch“
- Pro: 在inference階段計(jì)算量更小
- Con: 模型是不可導(dǎo)的,需要更復(fù)雜的技術(shù)手段——如降低方差(variance reduction)或者強(qiáng)化學(xué)習(xí)去訓(xùn)練(Luong, et al., 2015)
5.4 全局 vs 局部注意力
Luong, et al., 2015提出了”全局“和”局部“注意力的概念。全局注意力和柔性注意力很相似;局部注意力是”柔性“和”剛性“的糅合——相對(duì)于剛性,改進(jìn)使其可導(dǎo):模型首先預(yù)測(cè)當(dāng)前目標(biāo)詞的粗略對(duì)齊位置,然后在這個(gè)源輸入的位置上應(yīng)用一個(gè)中心窗口框住,計(jì)算上下文向量。

6. 指針網(wǎng)絡(luò)(Pointer Network)
在排序或者旅行推銷員問題上,輸入和輸入都是序列數(shù)據(jù)。輸出元素的離散類別總數(shù)事先是未知的,取決于輸入變量的尺度。這很難通過經(jīng)典的Seq2Seqm或者NMT模型來(lái)解決。指針網(wǎng)絡(luò)(Ptr-Net; Vinyals, et al. 2015)被提出來(lái)解決此類問題:當(dāng)輸出元素和輸入序列的位置相關(guān)時(shí),指針網(wǎng)絡(luò)并非是借助注意力來(lái)將編碼器的隱藏狀態(tài)糅合僅上下文向量(如圖8),而是將注意力機(jī)制應(yīng)用在輸入元素上,每次選取一個(gè)座位解碼步驟的輸出。

Ptr-Net輸出的是序列的整數(shù)索引c=(c1, ..., cm),給定輸入序列向量x=(x1, ..., xn)且1<ci<n (可以取等號(hào))。模型仍然沿用了編碼-解碼框架。編碼解碼的隱藏狀態(tài)分別為(h1, ..., hn)和(s1, ..., sm)。其中si是解碼器單元激活的輸出門。指針網(wǎng)絡(luò)在隱藏狀態(tài)間應(yīng)用了了累積注意力,人后通過softmax進(jìn)行歸一化。

注意力機(jī)制被簡(jiǎn)化了,因?yàn)橹羔樉W(wǎng)絡(luò)并非是借助注意力權(quán)重將編碼狀態(tài)糅合僅輸出。在這里,輸出僅和位置相關(guān),和輸入內(nèi)容無(wú)關(guān)。
7. Transformer
[Attention is All you Need]這篇文章,毫無(wú)疑問是2017年最有影響力的文章。它表示柔性注意力有了很大的提升,并使無(wú)RNN單元的Seq2Seq建模成為了可能,提出的”transformer“模型全部?jī)H由自注意力機(jī)制構(gòu)建。
秘密在于它的網(wǎng)絡(luò)架構(gòu)。
7.1 key, Value 和 Query
transformer的主要由稱之為multi-head self-attention mechanism的單元組成——它將輸入元素的編碼表示看做key-value對(duì)(k, v),均為n維(n為輸入序列長(zhǎng)度);在NMT的上下文中,keys和values都是編碼器的隱藏狀態(tài)。在解碼器中,先前步的輸出被壓縮進(jìn)一個(gè)queryQ中(m維),且下一步輸出由這個(gè)query映射到keys和values集合來(lái)產(chǎn)生。
transformer采用了scaled dot-product attention:輸出是有values加權(quán)求和得到,其中分配給每一項(xiàng)的權(quán)重由query和所有keys點(diǎn)積求得。

7.2 multi-head自注意力機(jī)制

相對(duì)于一次性計(jì)算注意力,multi-head注意力機(jī)制借助尺度化的點(diǎn)積注意力機(jī)制進(jìn)行并行化多次計(jì)算。每個(gè)獨(dú)立的注意力輸出通過簡(jiǎn)單拼接并線性的轉(zhuǎn)換到指定的維度空間。難道因?yàn)榧煽偸怯行У??根?jù)文章描述: ”multi-head attention allows the model to jointly attend to information from different representation subspaces at different positions. With a single attention head, averaging inhibits this.”

7.3 編碼器

編碼器能夠生成一個(gè)基于注意力的表示,具有從潛在的無(wú)限大上下文空間中定位相關(guān)信息片段的能力。
- N=6的相同層堆疊
- 每一層都有一個(gè)multi-head self-attention layer和一個(gè)位置敏感的全連接前向網(wǎng)絡(luò)
- 每一個(gè)子網(wǎng)絡(luò)層都采用了殘差連接和網(wǎng)絡(luò)層正則化。所有的子層輸出數(shù)據(jù)都是512維
7.4 解碼器

解碼器能夠從編碼器的表示中抽取分析信息。
- N=6的相同層堆疊
- 每一層都有兩個(gè)帶有multi-head self-attention layer的子網(wǎng)絡(luò)結(jié)構(gòu)和一個(gè)全連接前向網(wǎng)絡(luò)
- 和解碼器相似,每一個(gè)子網(wǎng)絡(luò)層采用了殘差和網(wǎng)絡(luò)正則化
- 第一個(gè)multi-head self-attention sub-layer被修改以防止位置信息被傳導(dǎo)到后續(xù)位置,正如當(dāng)我們預(yù)測(cè)當(dāng)下位置的信息時(shí),并不想要偷瞥屬于目標(biāo)序列的未來(lái)信息。
7.5 整體結(jié)構(gòu)
最后我們整體看一下transformer的網(wǎng)絡(luò)結(jié)構(gòu):
- 源輸入和目標(biāo)輸出序列首先都會(huì)經(jīng)過embedding層得到均為512維度的數(shù)據(jù)
- 為了保留位置信息,一個(gè)基于正弦波的位置編碼器被整合應(yīng)用到embedding層
- softmax和線性層被添加到最后的解碼輸出中

嘗試去實(shí)現(xiàn)Transformer網(wǎng)絡(luò)是很有趣的事情,這個(gè)是原博主實(shí)現(xiàn)的代碼:lilianweng/transformer-tensorflow
8. SNAIL
transformer模型中沒有RNN或者CNN結(jié)構(gòu),即使在embedding向量中引入了位置相關(guān)的編碼,也是一種序列順序的弱整合。對(duì)于位置敏感的任務(wù)如增強(qiáng)學(xué)習(xí),這是一個(gè)問題。
Simple Neural Attention Meta-Learner(SNAIL)被提出部分解決了這個(gè)問題——借助帶有temporal的Transformer自注意力機(jī)制。實(shí)驗(yàn)表明這種網(wǎng)絡(luò)在監(jiān)督學(xué)習(xí)和強(qiáng)化學(xué)習(xí)任務(wù)中都比較擅長(zhǎng)。

SNAIL 誕生于元學(xué)習(xí)(meta-learning)——很值得另開一個(gè)博客單獨(dú)介紹它。簡(jiǎn)單地說(shuō),he meta-learning model is expected to be generalizable to novel, unseen tasks in the similar distribution
詳細(xì)的內(nèi)容可以參考這里
9. 自注意力GAN
最后我想提一下最近流行的對(duì)抗生成網(wǎng)絡(luò),以及自注意力GAN(SAGAN; Zhang et al., 2018),并展示注意力機(jī)制是如何提高生成圖片的質(zhì)量的。
經(jīng)典的深度卷積對(duì)抗生成網(wǎng)絡(luò)(DCGAN)均用多層CNN網(wǎng)絡(luò)表示生成器和判別器。但是網(wǎng)絡(luò)表示能力受限于卷積核大小,因?yàn)橐粋€(gè)像素的特征被限制在很小的局部區(qū)域里。為了連接更遠(yuǎn)的區(qū)域,特征必須通過卷積操作被稀釋,并且依賴性信息不保征被保留。
在視覺任務(wù)里,柔性注意力機(jī)制下的上下文向量可以明確的學(xué)習(xí)一個(gè)像素和其他位置之間的關(guān)系,即使相隔較遠(yuǎn)的區(qū)域,這可以很容易的捕捉全局依賴性。因此帶有注意力機(jī)制的GAN也同樣能夠捕捉這種細(xì)節(jié)。

SAGAN采用了非局部神經(jīng)網(wǎng)絡(luò)來(lái)計(jì)算注意力權(quán)重。卷積的圖片特征可以將x映射成三份copy,分別與Transformer中的key,value和query相對(duì)應(yīng)。

之后我們采用點(diǎn)擊計(jì)算最后特征輸出的注意力權(quán)重:
其中αij是注意力映射中的一個(gè)實(shí)例,表明當(dāng)模型合成第j位置像素時(shí)應(yīng)該分配給i位置多大權(quán)重。W均為1×1的卷積核。如果你覺得1×1的卷積核很詭異,可以瀏覽一下Andrew Ng的這篇教程。輸出oj是最終輸出o=(o1, ..., oj, ..., oN)的列向量。
然后,注意力層的輸出乘上尺度參數(shù),累加原始的輸入特征映射:

其中尺度參數(shù)γ在訓(xùn)練過程中從0開始增加,網(wǎng)絡(luò)首先比較依賴局部區(qū)域,然后漸漸的通過分配權(quán)重給較遠(yuǎn)的區(qū)域去更新學(xué)習(xí)。
*如果你注意到本博客中的一些錯(cuò)誤地方,請(qǐng)及時(shí)聯(lián)系liujiezhangbupt@gmail.com。
10. 文獻(xiàn)
- [1] “Attention and Memory in Deep Learning and NLP.” - Jan 3, 2016 by Denny Britz
- [2] “Neural Machine Translation (seq2seq) Tutorial”
- [3] Dzmitry Bahdanau, Kyunghyun Cho, and Yoshua Bengio. “Neural machine translation by + jointly learning to align and translate.” ICLR 2015.
- [4] Kelvin Xu, Jimmy Ba, Ryan Kiros, Kyunghyun Cho, Aaron Courville, Ruslan Salakhudinov, Rich Zemel, and Yoshua Bengio. “Show, attend and tell: Neural image caption generation with visual attention.” ICML, 2015.
- [5] Ilya Sutskever, Oriol Vinyals, and Quoc V. Le. “Sequence to sequence learning with neural networks.” NIPS 2014.
- [6] Thang Luong, Hieu Pham, Christopher D. Manning. “Effective Approaches to Attention-based Neural Machine Translation.” EMNLP 2015.
- [7] Denny Britz, Anna Goldie, Thang Luong, and Quoc Le. “Massive exploration of neural machine translation architectures.” ACL 2017.
- [8] Ashish Vaswani, et al. “Attention is all you need.” NIPS 2017.
- [9] Jianpeng Cheng, Li Dong, and Mirella Lapata. “Long short-term memory-networks for machine reading.” EMNLP 2016.
- [10] Xiaolong Wang, et al. “Non-local Neural Networks.” CVPR 2018
- [11] Han Zhang, Ian Goodfellow, Dimitris Metaxas, and Augustus Odena. “Self-Attention Generative Adversarial Networks.” arXiv preprint arXiv:1805.08318 (2018).
- [12] Nikhil Mishra, Mostafa Rohaninejad, Xi Chen, and Pieter Abbeel. “A simple neural attentive meta-learner.” NIPS Workshop on Meta-Learning. 2017.
- [13] “WaveNet: A Generative Model for Raw Audio” - Sep 8, 2016 by DeepMind.
- [14] Oriol Vinyals, Meire Fortunato, and Navdeep Jaitly. “Pointer networks.” NIPS 2015.