1. 前言
本文翻譯自《Attention?Attention!》博客
最近幾年债蓝,注意力——在深度學(xué)習(xí)社區(qū)中,已然成為最廣為流行的概念和實用工具徙融。在這篇博客里,我們將一起回顧它是如何被“發(fā)明”出來的米死,以及引申出來的各種變種和模型,如 transformer和SNAIL贮庞。
2. 目錄
- Seq2Seq問題所在
- 為”翻譯“而生
- 定義
- 注意力機制”家族“
- 概要
- 自注意力機制(Self-Attention)
- 柔性 vs 剛性注意力
- 全局 vs 局部注意力
- 指針網(wǎng)絡(luò)(Pointer Network)
- Transformer
- key, Value, Query
- Multi-Head 自注意力
- 編碼器
- 解碼器
- 整體結(jié)構(gòu)
- SNAIL
- 自注意力 GAG
- 文獻
注意力哲身,在某種程度上,受啟發(fā)于我們是如何關(guān)注圖片中的某些區(qū)域贸伐,或者句子中的某些相關(guān)詞。舉個栗子:
人類的視覺注意力怔揩,使得我們能夠在圖片的“低解析度”背景下捉邢,更加關(guān)注具有“高解析度或辨識度”(High resolution)的特定區(qū)域(如黃色區(qū)域中狗的耳朵),然后逐漸調(diào)整焦點商膊,移動到另一個耳朵伏伐、眼睛、鼻子等晕拆,最后進行推斷整張圖片的信息藐翎。給定圖片中的一小塊補丁區(qū)域,圖片中其余的像素點也可以提供這塊補丁應(yīng)該展示什么的信息实幕。在上圖中吝镣,假設(shè)我們先看到了狗的鼻子、尖尖的右耳和Shiba迷離的眼睛昆庇,因此我們就會理所當(dāng)然的期望在黃色區(qū)域看到另一只尖尖的耳朵末贾。但是像毯子和毛衣的信息對于解析狗的特征信息幾乎沒有什么幫助。
同樣地整吆,我們可以解釋一句話或者上下文中詞與詞之間的關(guān)系拱撵。當(dāng)看到“eating”這個詞時,我們會期望在后面不遠的位置看到“食物“描述的詞表蝙。下圖中有色詞表示食物拴测,但并不是每個詞都與”eating“直接強相關(guān)。
簡而言之府蛇,在深度學(xué)習(xí)中集索,注意力可以廣泛的借助重要性權(quán)重向量來實現(xiàn):在預(yù)測或推斷一個元素時,如圖片中的像素點或句中的一個詞,我們使用注意力向量來判斷抄谐,它與其他元素有多強的關(guān)聯(lián)性渺鹦,然后對加權(quán)后的向量求和以逼近最后的目標(biāo)值(target)。
3. Seq2Seq問題所在
Seq2Seq模型誕生于語言模型領(lǐng)域(Sutskever, et al. 2014)——廣泛的講蛹含,它是將一個輸入序列(source)轉(zhuǎn)化為另一個序列(target)毅厚,兩個序列都可以是不定長的。轉(zhuǎn)化任務(wù)的場景包括多語言機器翻譯(文本或語音)浦箱、問答對話對話生成系統(tǒng)吸耿、甚至是句子解析為語法樹。
Seq2Seq模型一般都會包含編碼-解碼結(jié)構(gòu)酷窥,包括:
- 編碼器——處理序列輸入并壓縮信息到一個固定長度的上下文向量中(sentence embedding 或者 “thought” vector)咽安。上下文向量被當(dāng)做是輸入序列的語義概要。
- 解碼器——由上下文向量初始化蓬推,并每次產(chǎn)生一個轉(zhuǎn)碼輸出妆棒。早期的研究僅使用編碼網(wǎng)絡(luò)的最后一個狀態(tài)作為下次解碼的初始狀態(tài)。
編碼器和解碼器都是循環(huán)神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)沸伏,如LSTM或者GRU單元
固定長度上下文向量具有一個明顯的致命缺點——無法記憶長句子糕珊。一旦完成編碼器輸入序列的處理,就會遺忘開始的部分毅糟。因此注意力機制(Bahdanau et al., 2015)被提出红选,解決這個問題。
4. 為”翻譯“而生
注意力機制”生來“就是為機器翻譯任務(wù)幫助記憶長序列的句子輸入姆另。相對于原始借助編碼器的最后一個隱藏單元的輸出構(gòu)建單一上下文向量喇肋,注意力機制的獨家”秘方“在于,其考慮了上下文向量和所有序列輸入的信息迹辐,構(gòu)建了”連接“蝶防。每一個輸出元素下的連接的權(quán)重都是自動學(xué)習(xí)的。
上下文向量已經(jīng)考慮了整體輸入序列信息明吩,我們不需要擔(dān)心遺忘的問題慧脱。源輸入和目標(biāo)輸出的語義對齊問題由上下文向量學(xué)習(xí)和控制。實際上上下文向量處理三方面的信息:
- 編碼器的隱藏狀態(tài)
- 解碼器的隱藏狀態(tài)
- 源輸入和目標(biāo)輸出的對齊
4.1 定義
接下來我們以理論的角度定義注意力機制贺喝。我們用X表示長度為n的源輸入序列菱鸥,用Y表示長度為m*的目標(biāo)輸出序列:
(加粗的變量表示向量,下同)
編碼器是一個雙向RNN結(jié)構(gòu)(也可選其他RNN結(jié)構(gòu))——包括前向和后向隱藏層狀態(tài)躏鱼。簡單的維度拼接可以表示當(dāng)下編碼狀態(tài)氮采,可以理解為同時考慮了中心詞的上、下文信息:
解碼網(wǎng)絡(luò)在t時刻有隱藏狀態(tài)St——包括上一個序列隱藏狀態(tài)染苛,上一輸出和上下文向量(所有輸入序列的加權(quán)求和)鹊漠,權(quán)重如下:
對齊模型會針對第i個輸入序列和第t個輸出序列主到,分配一個對齊得分,以評判(yt躯概,xi)的對齊效果登钥。在Bahdanau的文章中,對齊得分向量是由單個隱藏層的前向網(wǎng)絡(luò)來組織的娶靡,并和整體網(wǎng)絡(luò)的其他部分進行聯(lián)合訓(xùn)練牧牢。score計算函數(shù)方式輸入下:
對齊得分矩陣是一個很好的副產(chǎn)物,并可以可視化的表示輸入序列和輸出序列的關(guān)聯(lián)程度姿锭。
這里有一個Tensorflow團隊提供的一個實現(xiàn)方法的很好教程塔鳍。
5. 注意力機制”家族“
由于注意力的幫助,源輸入和目標(biāo)輸出序列之間的依賴不再受限于距離問題呻此。這在機器翻譯任務(wù)中轮纫,收益頗大。不久被很好的拓展到計算機視覺領(lǐng)域(Xu et al. 2015)焚鲜,人們開始探索注意力機制的各種變種(Luong, et al., 2015; Britz et al., 2017; Vaswani, et al., 2017)掌唾。
5.1 概要
下表是幾種主流的注意力機制(或更寬泛的注意力機制)
- (*)在Luong, et al., 2015表示”concat“,在Vaswani, et al.表示”累積注意力(additive attention)“
- (^) 添加了尺度因子1/sqrt(n)——當(dāng)輸入很大時忿磅,softmax函數(shù)可能具有極小的梯度糯彬,導(dǎo)致難以高效的更新學(xué)習(xí)
- (&) 指“intra-attention”
5.2 自注意力
自注意力,又稱”intra-attention“贝乎,是一種在計算同一序列表示時,權(quán)重和序列的位置相關(guān)機制叽粹,被證明在機器閱讀理解览效,抽象概要(abstractive summarization)和圖片描述生成中非常有效。
這篇[long short-term memory network]論文使用了自注意力機制做機器閱讀虫几。如下圖锤灿,自注意力機制能夠?qū)W習(xí)到當(dāng)前詞和句中先前詞之前的關(guān)聯(lián)性。
在[show, attend and tell]這篇文章中辆脸,自注意力機制被應(yīng)用在圖片生成描述任務(wù)中但校。圖片首先被CNN編碼,然后輸入到帶有自注意力機制的RNN網(wǎng)絡(luò)中啡氢,來學(xué)習(xí)圖片各個特征與描述中每個詞之前的映射關(guān)系状囱。注意力權(quán)重的可視化清晰地的展示了模型每關(guān)注一部分特征都會輸出一個詞。
5.3 柔性 vs 剛性注意力
”柔性“ vs ”剛性“是如何定義注意力的另一種方式倘是,原始思想最初在[show, attend and tell]文章中提出——基于注意力是否需要處整篇圖片還是僅僅局部一小塊:
-
柔性注意力:對齊權(quán)重通過源圖片所有的”patch“進行學(xué)習(xí)映射亭枷,和Bahdanau et al., 2015想法一致
- Pro: 模型是平滑且可導(dǎo)的
- Con: 當(dāng)輸入圖片很大時,訓(xùn)練代價很高
-
剛性注意力:每次僅選取圖片中一個”patch“
- Pro: 在inference階段計算量更小
- Con: 模型是不可導(dǎo)的搀崭,需要更復(fù)雜的技術(shù)手段——如降低方差(variance reduction)或者強化學(xué)習(xí)去訓(xùn)練(Luong, et al., 2015)
5.4 全局 vs 局部注意力
Luong, et al., 2015提出了”全局“和”局部“注意力的概念叨粘。全局注意力和柔性注意力很相似;局部注意力是”柔性“和”剛性“的糅合——相對于剛性,改進使其可導(dǎo):模型首先預(yù)測當(dāng)前目標(biāo)詞的粗略對齊位置升敲,然后在這個源輸入的位置上應(yīng)用一個中心窗口框住答倡,計算上下文向量。
6. 指針網(wǎng)絡(luò)(Pointer Network)
在排序或者旅行推銷員問題上驴党,輸入和輸入都是序列數(shù)據(jù)瘪撇。輸出元素的離散類別總數(shù)事先是未知的,取決于輸入變量的尺度鼻弧。這很難通過經(jīng)典的Seq2Seqm或者NMT模型來解決设江。指針網(wǎng)絡(luò)(Ptr-Net; Vinyals, et al. 2015)被提出來解決此類問題:當(dāng)輸出元素和輸入序列的位置相關(guān)時,指針網(wǎng)絡(luò)并非是借助注意力來將編碼器的隱藏狀態(tài)糅合僅上下文向量(如圖8)攘轩,而是將注意力機制應(yīng)用在輸入元素上叉存,每次選取一個座位解碼步驟的輸出。
Ptr-Net輸出的是序列的整數(shù)索引c=(c1, ..., cm)度帮,給定輸入序列向量x=(x1, ..., xn)且1<ci<n (可以取等號)歼捏。模型仍然沿用了編碼-解碼框架。編碼解碼的隱藏狀態(tài)分別為(h1, ..., hn)和(s1, ..., sm)笨篷。其中si是解碼器單元激活的輸出門瞳秽。指針網(wǎng)絡(luò)在隱藏狀態(tài)間應(yīng)用了了累積注意力,人后通過softmax進行歸一化率翅。
注意力機制被簡化了练俐,因為指針網(wǎng)絡(luò)并非是借助注意力權(quán)重將編碼狀態(tài)糅合僅輸出。在這里冕臭,輸出僅和位置相關(guān)腺晾,和輸入內(nèi)容無關(guān)。
7. Transformer
[Attention is All you Need]這篇文章辜贵,毫無疑問是2017年最有影響力的文章悯蝉。它表示柔性注意力有了很大的提升,并使無RNN單元的Seq2Seq建模成為了可能托慨,提出的”transformer“模型全部僅由自注意力機制構(gòu)建鼻由。
秘密在于它的網(wǎng)絡(luò)架構(gòu)。
7.1 key, Value 和 Query
transformer的主要由稱之為multi-head self-attention mechanism的單元組成——它將輸入元素的編碼表示看做key-value對(k, v)厚棵,均為n維(n為輸入序列長度)蕉世;在NMT的上下文中,keys和values都是編碼器的隱藏狀態(tài)婆硬。在解碼器中讨彼,先前步的輸出被壓縮進一個queryQ中(m維),且下一步輸出由這個query映射到keys和values集合來產(chǎn)生。
transformer采用了scaled dot-product attention:輸出是有values加權(quán)求和得到柿祈,其中分配給每一項的權(quán)重由query和所有keys點積求得哈误。
7.2 multi-head自注意力機制
相對于一次性計算注意力哩至,multi-head注意力機制借助尺度化的點積注意力機制進行并行化多次計算。每個獨立的注意力輸出通過簡單拼接并線性的轉(zhuǎ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 編碼器
編碼器能夠生成一個基于注意力的表示,具有從潛在的無限大上下文空間中定位相關(guān)信息片段的能力重荠。
- N=6的相同層堆疊
- 每一層都有一個multi-head self-attention layer和一個位置敏感的全連接前向網(wǎng)絡(luò)
- 每一個子網(wǎng)絡(luò)層都采用了殘差連接和網(wǎng)絡(luò)層正則化箭阶。所有的子層輸出數(shù)據(jù)都是512維
7.4 解碼器
解碼器能夠從編碼器的表示中抽取分析信息。
- N=6的相同層堆疊
- 每一層都有兩個帶有multi-head self-attention layer的子網(wǎng)絡(luò)結(jié)構(gòu)和一個全連接前向網(wǎng)絡(luò)
- 和解碼器相似戈鲁,每一個子網(wǎng)絡(luò)層采用了殘差和網(wǎng)絡(luò)正則化
- 第一個multi-head self-attention sub-layer被修改以防止位置信息被傳導(dǎo)到后續(xù)位置仇参,正如當(dāng)我們預(yù)測當(dāng)下位置的信息時,并不想要偷瞥屬于目標(biāo)序列的未來信息婆殿。
7.5 整體結(jié)構(gòu)
最后我們整體看一下transformer的網(wǎng)絡(luò)結(jié)構(gòu):
- 源輸入和目標(biāo)輸出序列首先都會經(jīng)過embedding層得到均為512維度的數(shù)據(jù)
- 為了保留位置信息诈乒,一個基于正弦波的位置編碼器被整合應(yīng)用到embedding層
- softmax和線性層被添加到最后的解碼輸出中
嘗試去實現(xiàn)Transformer網(wǎng)絡(luò)是很有趣的事情,這個是原博主實現(xiàn)的代碼:lilianweng/transformer-tensorflow
8. SNAIL
transformer模型中沒有RNN或者CNN結(jié)構(gòu)婆芦,即使在embedding向量中引入了位置相關(guān)的編碼怕磨,也是一種序列順序的弱整合。對于位置敏感的任務(wù)如增強學(xué)習(xí)消约,這是一個問題肠鲫。
Simple Neural Attention Meta-Learner(SNAIL)被提出部分解決了這個問題——借助帶有temporal的Transformer自注意力機制。實驗表明這種網(wǎng)絡(luò)在監(jiān)督學(xué)習(xí)和強化學(xué)習(xí)任務(wù)中都比較擅長或粮。
SNAIL 誕生于元學(xué)習(xí)(meta-learning)——很值得另開一個博客單獨介紹它导饲。簡單地說,he meta-learning model is expected to be generalizable to novel, unseen tasks in the similar distribution
詳細的內(nèi)容可以參考這里
9. 自注意力GAN
最后我想提一下最近流行的對抗生成網(wǎng)絡(luò)氯材,以及自注意力GAN(SAGAN; Zhang et al., 2018),并展示注意力機制是如何提高生成圖片的質(zhì)量的渣锦。
經(jīng)典的深度卷積對抗生成網(wǎng)絡(luò)(DCGAN)均用多層CNN網(wǎng)絡(luò)表示生成器和判別器。但是網(wǎng)絡(luò)表示能力受限于卷積核大小浓体,因為一個像素的特征被限制在很小的局部區(qū)域里泡挺。為了連接更遠的區(qū)域辈讶,特征必須通過卷積操作被稀釋命浴,并且依賴性信息不保征被保留。
在視覺任務(wù)里贱除,柔性注意力機制下的上下文向量可以明確的學(xué)習(xí)一個像素和其他位置之間的關(guān)系生闲,即使相隔較遠的區(qū)域,這可以很容易的捕捉全局依賴性月幌。因此帶有注意力機制的GAN也同樣能夠捕捉這種細節(jié)碍讯。
SAGAN采用了非局部神經(jīng)網(wǎng)絡(luò)來計算注意力權(quán)重。卷積的圖片特征可以將x映射成三份copy扯躺,分別與Transformer中的key捉兴,value和query相對應(yīng)蝎困。
之后我們采用點擊計算最后特征輸出的注意力權(quán)重:
其中αij是注意力映射中的一個實例,表明當(dāng)模型合成第j位置像素時應(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)重給較遠的區(qū)域去更新學(xué)習(xí)剩胁。
*如果你注意到本博客中的一些錯誤地方诉植,請及時聯(lián)系liujiezhangbupt@gmail.com。
10. 文獻
- [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.