前言
最近幾年,注意力——在深度學習社區中,已然成為最廣為流行的概念和實用工具。在這篇博客里,我們將一起回顧它是如何被“發明”出來的,以及引申出來的各種變種和模型,如 transformer和SNAIL。
目錄
- Seq2Seq問題所在
- 為”翻譯“而生
- 定義
- 注意力機制”家族“
- 概要
- 自注意力機制(Self-Attention)
- 柔性 vs 剛性注意力
- 全局 vs 局部注意力
- 指針網絡(Pointer Network)
- Transformer
- key, Value, Query
- Multi-Head 自注意力
- 編碼器
- 解碼器
- 整體結構
- SNAIL
- 自注意力 GAG
- 文獻
注意力,在某種程度上,受啟發於我們是如何關注圖片中的某些區域,或者句子中的某些相關詞。舉個栗子:
人類的視覺注意力,使得我們能夠在圖片的“低解析度”背景下,更加關注具有“高解析度或辨識度”(High resolution)的特定區域(如黃色區域中狗的耳朵),然后逐漸調整焦點,移動到另一個耳朵、眼睛、鼻子等,最后進行推斷整張圖片的信息。給定圖片中的一小塊補丁區域,圖片中其余的像素點也可以提供這塊補丁應該展示什么的信息。在上圖中,假設我們先看到了狗的鼻子、尖尖的右耳和Shiba迷離的眼睛,因此我們就會理所當然的期望在黃色區域看到另一只尖尖的耳朵。但是像毯子和毛衣的信息對於解析狗的特征信息幾乎沒有什么幫助。
同樣地,我們可以解釋一句話或者上下文中詞與詞之間的關系。當看到“eating”這個詞時,我們會期望在后面不遠的位置看到“食物“描述的詞。下圖中有色詞表示食物,但並不是每個詞都與”eating“直接強相關。
簡而言之,在深度學習中,注意力可以廣泛的借助重要性權重向量來實現:在預測或推斷一個元素時,如圖片中的像素點或句中的一個詞,我們使用注意力向量來判斷,它與其他元素有多強的關聯性,然后對加權后的向量求和以逼近最后的目標值(target)。
Seq2Seq問題所在
Seq2Seq模型誕生於語言模型領域(Sutskever, et al. 2014)——廣泛的講,它是將一個輸入序列(source)轉化為另一個序列(target),兩個序列都可以是不定長的。轉化任務的場景包括多語言機器翻譯(文本或語音)、問答對話對話生成系統、甚至是句子解析為語法樹。
Seq2Seq模型一般都會包含編碼-解碼結構,包括:
- 編碼器——處理序列輸入並壓縮信息到一個固定長度的上下文向量中(sentence embedding 或者 “thought” vector)。上下文向量被當做是輸入序列的語義概要。
- 解碼器——由上下文向量初始化,並每次產生一個轉碼輸出。早期的研究僅使用編碼網絡的最后一個狀態作為下次解碼的初始狀態。
編碼器和解碼器都是循環神經網絡結構,如LSTM或者GRU單元
固定長度上下文向量具有一個明顯的致命缺點——無法記憶長句子。一旦完成編碼器輸入序列的處理,就會遺忘開始的部分。因此注意力機制(Bahdanau et al., 2015)被提出,解決這個問題。
為”翻譯“而生
注意力機制”生來“就是為機器翻譯任務幫助記憶長序列的句子輸入。相對於原始借助編碼器的最后一個隱藏單元的輸出構建單一上下文向量,注意力機制的獨家”秘方“在於,其考慮了上下文向量和所有序列輸入的信息,構建了”連接“。每一個輸出元素下的連接的權重都是自動學習的。
上下文向量已經考慮了整體輸入序列信息,我們不需要擔心遺忘的問題。源輸入和目標輸出的語義對齊問題由上下文向量學習和控制。實際上上下文向量處理三方面的信息:
- 編碼器的隱藏狀態
- 解碼器的隱藏狀態
- 源輸入和目標輸出的對齊
定義
接下來我們以理論的角度定義注意力機制。我們用X表示長度為n的源輸入序列,用Y**表示長度為m*的目標輸出序列:
(加粗的變量表示向量,下同)
編碼器是一個雙向RNN結構(也可選其他RNN結構)——包括前向和后向隱藏層狀態。簡單的維度拼接可以表示當下編碼狀態,可以理解為同時考慮了中心詞的上、下文信息:
解碼網絡在t時刻有隱藏狀態St——包括上一個序列隱藏狀態,上一輸出和上下文向量(所有輸入序列的加權求和),權重如下:
對齊模型會針對第i個輸入序列和第t個輸出序列,分配一個對齊得分,以評判(yt,xi)的對齊效果。在Bahdanau的文章中,對齊得分向量是由單個隱藏層的前向網絡來組織的,並和整體網絡的其他部分進行聯合訓練。score計算函數方式輸入下:
對齊得分矩陣是一個很好的副產物,並可以可視化的表示輸入序列和輸出序列的關聯程度。
這里有一個Tensorflow團隊提供的一個實現方法的很好教程。
注意力機制”家族“
由於注意力的幫助,源輸入和目標輸出序列之間的依賴不再受限於距離問題。這在機器翻譯任務中,收益頗大。不久被很好的拓展到計算機視覺領域(Xu et al. 2015),人們開始探索注意力機制的各種變種(Luong, et al., 2015; Britz et al., 2017; Vaswani, et al., 2017)。
概要
下表是幾種主流的注意力機制(或更寬泛的注意力機制)
- (*)在Luong, et al., 2015表示”concat“,在Vaswani, et al.表示”累積注意力(additive attention)“
- (^) 添加了尺度因子1/sqrt(n)——當輸入很大時,softmax函數可能具有極小的梯度,導致難以高效的更新學習
- (&) 指“intra-attention”
自注意力
自注意力,又稱”intra-attention“,是一種在計算同一序列表示時,權重和序列的位置相關機制,被證明在機器閱讀理解,抽象概要(abstractive summarization)和圖片描述生成中非常有效。
這篇[long short-term memory network]論文使用了自注意力機制做機器閱讀。如下圖,自注意力機制能夠學習到當前詞和句中先前詞之前的關聯性。
在[show, attend and tell]這篇文章中,自注意力機制被應用在圖片生成描述任務中。圖片首先被CNN編碼,然后輸入到帶有自注意力機制的RNN網絡中,來學習圖片各個特征與描述中每個詞之前的映射關系。注意力權重的可視化清晰地的展示了模型每關注一部分特征都會輸出一個詞。
柔性 vs 剛性注意力
”柔性“ vs ”剛性“是如何定義注意力的另一種方式,原始思想最初在[show, attend and tell]文章中提出——基於注意力是否需要處整篇圖片還是僅僅局部一小塊:
- 柔性注意力:對齊權重通過源圖片所有的”patch“進行學習映射,和Bahdanau et al., 2015想法一致
- Pro: 模型是平滑且可導的
- Con: 當輸入圖片很大時,訓練代價很高
- 剛性注意力:每次僅選取圖片中一個”patch“
- Pro: 在inference階段計算量更小
- Con: 模型是不可導的,需要更復雜的技術手段——如降低方差(variance reduction)或者強化學習去訓練(Luong, et al., 2015)
全局 vs 局部注意力
Luong, et al., 2015提出了”全局“和”局部“注意力的概念。全局注意力和柔性注意力很相似;局部注意力是”柔性“和”剛性“的糅合——相對於剛性,改進使其可導:模型首先預測當前目標詞的粗略對齊位置,然后在這個源輸入的位置上應用一個中心窗口框住,計算上下文向量。
指針網絡(Pointer Network)
在排序或者旅行推銷員問題上,輸入和輸入都是序列數據。輸出元素的離散類別總數事先是未知的,取決於輸入變量的尺度。這很難通過經典的Seq2Seqm或者NMT模型來解決。指針網絡(Ptr-Net; Vinyals, et al. 2015)被提出來解決此類問題:當輸出元素和輸入序列的位置相關時,指針網絡並非是借助注意力來將編碼器的隱藏狀態糅合僅上下文向量(如圖8),而是將注意力機制應用在輸入元素上,每次選取一個座位解碼步驟的輸出。
Ptr-Net輸出的是序列的整數索引c=(c1, ..., cm),給定輸入序列向量x=(x1, ..., xn)且1<ci<n (可以取等號)。模型仍然沿用了編碼-解碼框架。編碼解碼的隱藏狀態分別為(h1, ..., hn)和(s1, ..., sm)。其中si是解碼器單元激活的輸出門。指針網絡在隱藏狀態間應用了了累積注意力,人后通過softmax進行歸一化。
注意力機制被簡化了,因為指針網絡並非是借助注意力權重將編碼狀態糅合僅輸出。在這里,輸出僅和位置相關,和輸入內容無關。
Transformer
[Attention is All you Need]這篇文章,毫無疑問是2017年最有影響力的文章。它表示柔性注意力有了很大的提升,並使無RNN單元的Seq2Seq建模成為了可能,提出的”transformer“模型全部僅由自注意力機制構建。
秘密在於它的網絡架構。
key, Value 和 Query
transformer的主要由稱之為multi-head self-attention mechanism的單元組成——它將輸入元素的編碼表示看做key-value對(k, v),均為n維(n為輸入序列長度);在NMT的上下文中,keys和values都是編碼器的隱藏狀態。在解碼器中,先前步的輸出被壓縮進一個queryQ中(m維),且下一步輸出由這個query映射到keys和values集合來產生。
transformer采用了scaled dot-product attention:輸出是有values加權求和得到,其中分配給每一項的權重由query和所有keys點積求得。
multi-head自注意力機制
相對於一次性計算注意力,multi-head注意力機制借助尺度化的點積注意力機制進行並行化多次計算。每個獨立的注意力輸出通過簡單拼接並線性的轉換到指定的維度空間。難道因為集成總是有效的?根據文章描述: ”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.”
編碼器
編碼器能夠生成一個基於注意力的表示,具有從潛在的無限大上下文空間中定位相關信息片段的能力。
- N=6的相同層堆疊
- 每一層都有一個multi-head self-attention layer和一個位置敏感的全連接前向網絡
- 每一個子網絡層都采用了殘差連接和網絡層正則化。所有的子層輸出數據都是512維
解碼器
解碼器能夠從編碼器的表示中抽取分析信息。
- N=6的相同層堆疊
- 每一層都有兩個帶有multi-head self-attention layer的子網絡結構和一個全連接前向網絡
- 和解碼器相似,每一個子網絡層采用了殘差和網絡正則化
- 第一個multi-head self-attention sub-layer被修改以防止位置信息被傳導到后續位置,正如當我們預測當下位置的信息時,並不想要偷瞥屬於目標序列的未來信息。
整體結構
最后我們整體看一下transformer的網絡結構:
- 源輸入和目標輸出序列首先都會經過embedding層得到均為512維度的數據
- 為了保留位置信息,一個基於正弦波的位置編碼器被整合應用到embedding層
- softmax和線性層被添加到最后的解碼輸出中
嘗試去實現Transformer網絡是很有趣的事情,這個是原博主實現的代碼:lilianweng/transformer-tensorflow
SNAIL
transformer模型中沒有RNN或者CNN結構,即使在embedding向量中引入了位置相關的編碼,也是一種序列順序的弱整合。對於位置敏感的任務如增強學習,這是一個問題。
Simple Neural Attention Meta-Learner(SNAIL)被提出部分解決了這個問題——借助帶有temporal的Transformer自注意力機制。實驗表明這種網絡在監督學習和強化學習任務中都比較擅長。
SNAIL 誕生於元學習(meta-learning)——很值得另開一個博客單獨介紹它。簡單地說,he meta-learning model is expected to be generalizable to novel, unseen tasks in the similar distribution
詳細的內容可以參考這里
自注意力GAN
最后我想提一下最近流行的對抗生成網絡,以及自注意力GAN(SAGAN; Zhang et al., 2018),並展示注意力機制是如何提高生成圖片的質量的。
經典的深度卷積對抗生成網絡(DCGAN)均用多層CNN網絡表示生成器和判別器。但是網絡表示能力受限於卷積核大小,因為一個像素的特征被限制在很小的局部區域里。為了連接更遠的區域,特征必須通過卷積操作被稀釋,並且依賴性信息不保征被保留。
在視覺任務里,柔性注意力機制下的上下文向量可以明確的學習一個像素和其他位置之間的關系,即使相隔較遠的區域,這可以很容易的捕捉全局依賴性。因此帶有注意力機制的GAN也同樣能夠捕捉這種細節。
SAGAN采用了非局部神經網絡來計算注意力權重。卷積的圖片特征可以將x映射成三份copy,分別與Transformer中的key,value和query相對應。
之后我們采用點擊計算最后特征輸出的注意力權重:
其中αij是注意力映射中的一個實例,表明當模型合成第j位置像素時應該分配給i位置多大權重。W均為1×1的卷積核。如果你覺得1×1的卷積核很詭異,可以瀏覽一下Andrew Ng的這篇教程。輸出oj是最終輸出o=(o1, ..., oj, ..., oN)的列向量。
然后,注意力層的輸出乘上尺度參數,累加原始的輸入特征映射:
其中尺度參數γ在訓練過程中從0開始增加,網絡首先比較依賴局部區域,然后漸漸的通過分配權重給較遠的區域去更新學習。
*如果你注意到本博客中的一些錯誤地方,請及時聯系liujiezhangbupt@gmail.com。
文獻
- [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.