文章目錄
前言
??注意力機(jī)制(Attention Mechanism)并非是在最近才被提出的,但它確實(shí)在最近幾年才變得火熱起來(lái),尤其是谷歌2017年發(fā)表的那篇《Attention is all you need》,為人們提供了一種用Attention結(jié)構(gòu)完全替代傳統(tǒng)CNN和RNN結(jié)構(gòu)的新思路,在那之后似乎有著層出不窮的Attention結(jié)構(gòu)應(yīng)用。Attention,顧名思義,是由人類觀察環(huán)境的習(xí)慣規(guī)律總結(jié)而來(lái)的,人類在觀察環(huán)境時(shí),大腦往往只關(guān)注某幾個(gè)特別重要的局部,獲取需要的信息,構(gòu)建出關(guān)于環(huán)境的某種描述,而Attention Mechanism正是如此,去學(xué)習(xí)不同局部的重要性,再結(jié)合起來(lái)。
??聽起來(lái)簡(jiǎn)單,實(shí)現(xiàn)起來(lái)其實(shí)也簡(jiǎn)單,我認(rèn)為對(duì)于Attention可以有三種理解。
- 首先,從數(shù)學(xué)公式上和代碼實(shí)現(xiàn)上Attention可以理解為加權(quán)求和。
- 其次,從形式上Attention可以理解為鍵值查詢。
- 最后,從物理意義上Attention可以理解為相似性度量。
Sequence to Sequence
??Attention Mechanism的大量使用源于機(jī)器翻譯,機(jī)器翻譯本質(zhì)上是解決一個(gè)Sequence-to-Sequence問題,所以這里從Sequence-to-Sequence講起,將要說(shuō)明為什么需要Attention,哪里使用Attention,以及如何使用Attention。
Sequence to Sequence 的各種形式
??如上圖所示,Sequence-to-Sequence一般有5種形式,區(qū)別無(wú)非在于輸入和輸出序列的長(zhǎng)度,以及是否同步產(chǎn)出,具體到每一個(gè)基本的模塊,又能用不同的網(wǎng)絡(luò)結(jié)構(gòu)實(shí)現(xiàn),包括CNN、RNN,但是萬(wàn)變不離其宗,即它們的實(shí)現(xiàn)基本上離不開一個(gè)固定的結(jié)構(gòu):Encoder-Decoder 結(jié)構(gòu)。
??Encoder-Decoder結(jié)構(gòu)作為Sequence-to-Sequence任務(wù)的最佳拍檔,常見于各種深度學(xué)習(xí)任務(wù),從簡(jiǎn)單的時(shí)序預(yù)測(cè)分類,到GAN里都有它的影子。之所以強(qiáng)調(diào)這個(gè)結(jié)構(gòu),就是因?yàn)锳ttention解決了它的“分心問題”。下圖給出了一個(gè)通用的Encoder-Decoder結(jié)構(gòu),它可能會(huì)給你某種強(qiáng)烈的既視感。Encoder負(fù)責(zé)從輸入序列X中學(xué)習(xí)某種表達(dá)C,然后Decoder參考該表達(dá)C生成每一個(gè)輸出Yi?。
??Encoder-Decoder這種原始的做法是不太合理的,因?yàn)樵谏擅恳粋€(gè)Yi?時(shí),Decoder參照的是同一個(gè)表征C,它沒有抓住重點(diǎn)。這有點(diǎn)像老師讓一個(gè)小學(xué)生寫作文,結(jié)果他寫了一篇流水賬一樣。在機(jī)器翻譯中,輸出序列的每一個(gè)局部,往往只與輸入序列的某個(gè)或幾個(gè)局部有關(guān)。這里舉一個(gè)例子,英譯中任務(wù):
"Billy eats a banana."
??顯然答案是:
“比利吃香蕉?!?/font>
??在Sequence-to-Sequence里我們要解決的是這樣一個(gè)問題:
(Billy, eats, a, banana)→ (比利, 吃, 香蕉)
??按照Encoder-Decoder的原始做法,我們?yōu)槿齻€(gè)中文單詞分別計(jì)算C:
C比利?=h(Billy)+h(eats)+h(a)+h(banana)C吃?=h(Billy)+h(eats)+h(a)+h(banana)C香蕉?=h(Billy)+h(eats)+h(a)+h(banana)
??這并不合理,為什么翻譯輸出“比利”這個(gè)詞要關(guān)注整個(gè)原句子呢?只關(guān)注或者主要關(guān)注“Billy”這個(gè)詞不是更好嗎?同理,輸出“吃”這個(gè)詞時(shí)應(yīng)該更多地關(guān)注“eat”,所以下面這種計(jì)算C的方式要更加合理一些。
C比利?=0.6?h(Billy)+0.2?h(eats)+0.1?h(an)+0.1?h(banana)C吃?=0.2?h(Billy)+0.6?h(eats)+0.1?h(an)+0.1?h(banana)C香蕉?=0.1?h(Billy)+0.1?h(eats)+0.2?h(an)+0.6?h(banana)
??下圖是一個(gè)簡(jiǎn)單的Encoder-Decoder,它的Encoder和Decoder都是RNN結(jié)構(gòu),輸入序列表征C有多種計(jì)算方法,包括取最后一個(gè)時(shí)刻的Encoder隱層輸出、取所有時(shí)刻Encoder隱層輸出的均值或加權(quán)平均、取最大值等等。它實(shí)現(xiàn)了對(duì)不同的局部采取不同的權(quán)重,然而它對(duì)于任意輸出都采用同一套權(quán)重,本質(zhì)上沒有做出任何改進(jìn)。
??總結(jié)一下,我們的要求有兩個(gè):
- 對(duì)輸入序列的不同局部,賦予不同的重要性(權(quán)重)
- 對(duì)于不同的輸出序列局部,給輸入局部不一樣賦權(quán)規(guī)劃或方案
Attention Mechanism
??有了上面的分析以及需求,就能自然而然地引出注意力機(jī)制(Attention Mechanism)——它一定程度上解決了上述問題。對(duì)于上面給出的疑問(那些權(quán)重應(yīng)該怎么給),Attention給出的答案是,讓輸出序列決定。如下圖所示,這是文獻(xiàn)中的結(jié)構(gòu),我簡(jiǎn)化了畫出來(lái)。
??假設(shè)當(dāng)前Docoder要輸出的是 Yt?,已知Decoder上一時(shí)刻的隱層輸出 St?1?,用它與Encoder的各時(shí)刻隱層輸出 hj? 做某種操作 fatt?,計(jì)算出來(lái)的相應(yīng)用 softmax 轉(zhuǎn)化為概率,就是我們所需的權(quán)重 a,對(duì)輸入加權(quán)求和,計(jì)算出輸入序列的表達(dá) C,作為Decoder當(dāng)前的部分輸入,從而生成 Yt?。這就是Attention的工作機(jī)制。
??可以說(shuō)Attention的核心就是C的計(jì)算,不同的Attention變體主要體現(xiàn)在 fatt?上,常見的計(jì)算方法有相乘(dot)與拼接(concat),此外,參與計(jì)算的 s 和 h 也可以做文章,搞出不同的花樣,你甚至可以發(fā)現(xiàn),即使跳出Encoder-Decoder這個(gè)框架,Attention也可以單獨(dú)存在,因?yàn)樗谋举|(zhì)就是“加權(quán)求和”。
??還可以從另一個(gè)角度看Attention,那就是鍵值查詢。鍵值查詢應(yīng)該有三個(gè)基本元素:索引(Query ),鍵(Key )和值(Value ),你可以理解為這是一個(gè)查字典的過(guò)程,Key-Value 對(duì)構(gòu)成一個(gè)字典,用戶給一個(gè)Query,系統(tǒng)找到與之相同的Key,返回對(duì)應(yīng)的Value。那么問題來(lái)了,字典里沒有與Query相同的Key怎么辦?答案是分別計(jì)算Query和每一個(gè)已有的Key的相似度w,作為權(quán)重分配到所有的Value上,并返回它們的加權(quán)求和。對(duì)應(yīng)到上面機(jī)器翻譯的例子,輸出序列的局部信息是Query,輸入序列的局部信息是Key,w是二者的相似度,而Value設(shè)為1即可。從上面的分析看出,Attention也可以理解為某種相似性度量。
Attention 于機(jī)器翻譯
"Bahdanau D, Cho K, Bengio Y. Neural Machine Translation by Jointly Learning to Align and Translate. 2015."
??下圖即文獻(xiàn)給出的法譯英任務(wù)的Attention概率圖,這是兩個(gè)句子,橫軸表示英語(yǔ),縱軸表示法語(yǔ),矩陣上的像素值表示概率 a(或稱重要性、權(quán)重、對(duì)齊概率等等),顏色越亮表示概率越大。可以明顯地看出,由于英語(yǔ)和法語(yǔ)的語(yǔ)法結(jié)構(gòu)不一樣,注意力是有所偏移的。
"Wu Y, et al. Google's Neural Machine Translation System: Bridging the Gap between Human and Machine Translation. 2016."
??下圖是谷歌在2017年發(fā)布的線上機(jī)器翻譯框架,這是一個(gè)Encoder-Decoder結(jié)構(gòu),兩者都是多層的LSTM或Bi-LSTM堆疊而成,在中間加入了Attention,看上去比較復(fù)雜,但實(shí)際上就是上文所述的Attention的使用方法。文章表示,引入Attention之后,中譯英任務(wù)的相對(duì)錯(cuò)誤率下降了60%,英譯西(西班牙語(yǔ))錯(cuò)誤率甚至下降了83%,這表明Attention確實(shí)是有效的。
Self-Attention
??有一種特殊的Attention,叫做Self-Attention(自注意力機(jī)制)。它是Attention的特例,在Encoder-Decoder中,輸入和輸出序列是同一個(gè)序列時(shí),稱為Self-Attention。普通的Attention,在機(jī)器翻譯中的物理意義是目標(biāo)語(yǔ)單詞和源語(yǔ)單詞之間的一種單詞對(duì)齊機(jī)制,而Self-Attention學(xué)習(xí)的是句子內(nèi)部的聯(lián)系(語(yǔ)法結(jié)構(gòu)等),例如下圖中的動(dòng)詞“making”與下文的“more difficult”產(chǎn)生了較大聯(lián)系。
??引入Self-Attention的好處在于可以在O(1)的代價(jià)聯(lián)系序列中兩個(gè)長(zhǎng)期依賴的特征,對(duì)于RNN結(jié)構(gòu)可能需要累積更多的時(shí)間步驟才能反應(yīng)過(guò)來(lái),因此Self-Attention能夠提升網(wǎng)絡(luò)的可并行性。
文字識(shí)別中的 Attention
"Zbigniew Wojna, et al, Attention-based Extraction of Structured Information from Street View Imagery. 2017."
??Attention在場(chǎng)景文字識(shí)別中有所應(yīng)用,如上圖所示,該識(shí)別框架是一個(gè)Encoder-Decoder結(jié)構(gòu),底層由CNN結(jié)構(gòu)提取原始圖像及其Augmentation的feature map,即 fi,j,c?),此處的 i,j 表示圖像中的坐標(biāo),c 表示通道,并由當(dāng)前時(shí)刻的對(duì)齊概率向量 at,i,j? 加權(quán)求和,得到上下文變量 ut,c?。
??at,i,j? 可以理解為當(dāng)前時(shí)刻對(duì)輸入圖像的每一個(gè)局部的關(guān)注程度,從圖像處理的角度也可以理解為一個(gè)mask,它是由Decoder網(wǎng)絡(luò)前一時(shí)刻的隱層輸出與 f 經(jīng)過(guò)某種操作后產(chǎn)生的,at,i,j? 與 f 加權(quán)得到的 u 可以理解為網(wǎng)絡(luò)對(duì)輸入圖像選擇性觀察得到的結(jié)果。u 既作為RNN的輸入,也參與生成RNN的預(yù)測(cè) c。
??這么說(shuō)可能有些難懂,看公式就好了。
at,i,j?=VaT?tanh(Ws?st?+Wf?fi,j,??)at?=softmaxi,j?(at,i,j?)
ut,c?=i∑?j∑?at,i,j?fi,j,c?
xt?=Wc?ct?1?+Wu1??ut?1?(ot?,st?)=RNN(xt?,st?1?)ot?^?=softmax(Wo?ot?+Wu2??ut?)
ct?=argcmax?ot?^?(c)
??此外,文章指出計(jì)算at,i,j?時(shí)對(duì)位置不敏感,需要引入位置編碼,于是分別引入了兩個(gè)軸的編碼 ei? 和 ej?,詳情請(qǐng)參考論文。作者表示引入了Attention之后在FSNS數(shù)據(jù)庫(kù)(French Street Name Signs)上的正確率達(dá)到了84.2%,之前最好的只有72.46%(2016年)。此外,在將 at,i,j? 可視化之后,可以明顯地看出在生成輸出序列中不同的字母時(shí),網(wǎng)絡(luò)關(guān)注著輸入圖像的不同部位。
at,i,j?=VaT?tanh(Ws?st?+Wf1??fi,j,??+Wf2??ei?+Wf3??ej?)
推薦系統(tǒng)中的 Attention
"Jun Xiao, et al. Attentional Factorization Machines: Learning the Weight of Feature Interactions via Attention Networks. 2017."
??因子分解機(jī)(Factorization Machines, FM)是CTR預(yù)估中常用的模型,它相當(dāng)于在LR的基礎(chǔ)上引入了Embedding以及Embedding之間的兩兩內(nèi)積(Pair-wise Production)。從每一個(gè)特征的角度看,它與任意其他特征做配對(duì)內(nèi)積時(shí),參與計(jì)算的都是同一個(gè)Embedding向量,這是高效的但可能是不夠合理,為了解決這個(gè)問題,文獻(xiàn)提出了AFM(Attentional FM),給每一個(gè)Pair-wise Production乘上一個(gè)權(quán)重,然后再加起來(lái)。這個(gè)乘上權(quán)重的操作就是Attention,具體地,它是一個(gè)類MLP結(jié)構(gòu),內(nèi)置一系列權(quán)重,由Pair-wise Production作為Query查詢返回對(duì)應(yīng)的比例參數(shù)。
??對(duì)一個(gè)特定的特征來(lái)說(shuō),Attention的作用是為不同的配對(duì)對(duì)象分配不同的Embedding,打個(gè)比方就像是一個(gè)管家,大小姐要與不同的人會(huì)晤時(shí),給她搭配不一樣的衣服。實(shí)際上,“Field-aware FM”(FFM)本質(zhì)上實(shí)現(xiàn)的也是這樣的功能,它在與不同的field的特征做內(nèi)積時(shí)使用的是不同的參數(shù),可以估計(jì)AFM最多能達(dá)到FFM的性能,但是FFM的參數(shù)比AFM要多得多。
??AFM在實(shí)現(xiàn)上類似NFM(Neural FM),區(qū)別在于Embedding送入MLP之前需要Reshape,這里不做贅述,有興趣可以去github找代碼,這里是傳送門。
"Guorui Zhou, Chengru Song, et.al. Deep Interest Network for Click-Through Rate Prediction. 2017."
??最近廣告算法似乎都偏向于使用 Embedding+MLP 類方法,即首先將高維極其稀疏的輸入特征Embedding到低維稠密特征,然后拼起來(lái)輸入到MLP結(jié)構(gòu),好處是可以節(jié)省大量人工特征工程的步驟,同時(shí)大幅度提升模型性能。然而,這類方法需要將用戶興趣編碼成定長(zhǎng)向量,這可能會(huì)損失信息。什么意思呢?我們的輸入特征一般有三種,數(shù)值連續(xù)型、單值離散型和多值離散型,比如年齡段或性別就是單值離散型特征,它們的特點(diǎn)是只能同時(shí)取一個(gè)值(例如不可能同時(shí)處于兩個(gè)年齡段),做Embedding之后就是定長(zhǎng)向量。多值離散型特征就有些特殊了,用戶的興趣和行為特征是“diverse”的,每個(gè)人可能有多個(gè)興趣、多個(gè)購(gòu)買歷史,因此該類特征一般不等長(zhǎng)。為了構(gòu)造等長(zhǎng)向量(否則無(wú)法送入MLP),一般的做法是將每個(gè)興趣、行為的Embedding做一個(gè)Pooling。
??然而用戶的興趣是“l(fā)ocally activated”的,即用戶雖然興趣有多樣性,但特定的廣告會(huì)激活用戶的一個(gè)或幾個(gè)興趣。例如某肥宅(我)的興趣包括游戲和垃圾食品,這些興趣可以從我的歷史購(gòu)買記錄中發(fā)掘出來(lái),然后當(dāng)我被展示一款新手游的廣告時(shí),我關(guān)于游戲的興趣會(huì)被激活,但我關(guān)于垃圾食品的興趣則不會(huì),反之,當(dāng)我被展示麥當(dāng)勞一款新漢堡的廣告時(shí),我關(guān)于垃圾食品的興趣就會(huì)被激活。Embedding&MLP類方法限制了模型的表達(dá)能力。
??因此論文的作者提出了Deep Interest Network,結(jié)構(gòu)如右下圖,在多值離散型特征的Embedding進(jìn)入Pooling之前,先引入一個(gè)Attention,乘上權(quán)重。論文將Attention定義為“Local Activation Unit”,它接受兩個(gè)輸入:廣告的Embedding,用戶特定興趣或行為的Embedding。Attention的作用、權(quán)重的物理意義是特定的廣告對(duì)用戶的某個(gè)或某幾個(gè)興趣產(chǎn)生的特定的激活。
??值得一提的是,該網(wǎng)絡(luò)是由阿里媽媽蓋坤團(tuán)隊(duì)于2017年提出的。
Attention is all you need
"Ashish Vaswani, et al. Attention is all you need. NIPS 2017."
??Attention is all you need. 這句話聽上去是不是特別霸氣?沒錯(cuò),它是由 Google Brain 提出的“大招”,最重大的貢獻(xiàn)在于提出一個(gè)由純粹的Attention+MLP結(jié)構(gòu)組成的網(wǎng)絡(luò),完全拋棄了CNN和RNN結(jié)構(gòu),用于機(jī)器翻譯任務(wù)。該結(jié)構(gòu)被稱為 transformer (變形金剛?),仍然是一個(gè) Encoder-Decoder 結(jié)構(gòu),Encoder與Decoder都由多個(gè)基本模塊堆疊而成。Encoder的基本模塊有兩個(gè)子層:一個(gè)多抽頭自注意力模塊(Multi-head Self-Attention)和一個(gè)前向神經(jīng)網(wǎng)絡(luò)(FN),Decoder的基本模塊有三個(gè)子層:一個(gè)多抽頭自注意力模塊、一個(gè)多抽頭注意力模塊(非Self)和一個(gè)前向神經(jīng)網(wǎng)絡(luò)。
??從功能上講,我認(rèn)為Encoder的Self-Attention是用來(lái)提取輸入序列(在翻譯問題中是源語(yǔ)種句子)中的長(zhǎng)短期依賴的,然后輸入到FN提取更高層次的響應(yīng),同時(shí)Decoder的Self-Attention提取目標(biāo)語(yǔ)種句子中的長(zhǎng)短期依賴,作為Query與Encoder提供Key和Value共同輸入另一個(gè)Attention模塊進(jìn)行對(duì)齊,再進(jìn)入Decoder的FN并產(chǎn)生最終的概率輸出。整個(gè)流程從功能上完整地復(fù)現(xiàn)了之前的基于RNN的Encoder-Decoder經(jīng)典結(jié)構(gòu),而且可并行性很高,沒有RNN中的時(shí)間依賴。
??所謂多抽頭Attention,實(shí)際上是由多個(gè)普通的Attention拼起來(lái)的。基本的Attention形式即 Scaled Dot-Product,類似于余弦相似度,作者認(rèn)為將輸入的Q、K和V分別進(jìn)行多次(h次)的線性變換然后拼起來(lái)能獲得更好的效果,于是產(chǎn)生了這種新穎的Attention結(jié)構(gòu)。Attention可變的地方還很多,預(yù)計(jì)今后(可能已經(jīng))還會(huì)出現(xiàn)更多靈活的Attention變體。
Attention 的用途與缺陷
Attention的用武之地,我感覺是幾乎萬(wàn)能的。
- 多任務(wù):分類、預(yù)測(cè)、強(qiáng)化學(xué)習(xí)、聚類…
- 多領(lǐng)域:機(jī)器翻譯、推薦系統(tǒng)、圖像處理、語(yǔ)音識(shí)別…
- 多結(jié)構(gòu):幾乎任何包含“求和”或“局部貢獻(xiàn)總體”的結(jié)構(gòu)都可以用
Attention的局限性和缺陷:
- 引入新參數(shù)來(lái)彌補(bǔ)某方面的擬合能力,可能比不上原有的方法,例如AFM比不上FFM
- 引入新參數(shù),可能造成過(guò)擬合
- 引入新參數(shù),帶來(lái)計(jì)算復(fù)雜度的增加
最后一點(diǎn)話
??Attention在某些論文中說(shuō)的玄之又玄,其實(shí)他解決的問題正是加權(quán)求和中權(quán)重的合理性配置,之前不乏有相似的想法,只不過(guò)做法不同罷了。Attention之所以這么火,我認(rèn)為一方面跟Google的應(yīng)用離不開,另一方面也因?yàn)樗鼘?shí)在太萬(wàn)能了。最近一段時(shí)間看了不少有關(guān)Attention的博客和文獻(xiàn)資料,非常有幸能學(xué)到這么有趣的東西,由于畢設(shè)應(yīng)該也會(huì)用到,所以我以后也會(huì)繼續(xù)關(guān)注Attention的。
參考文獻(xiàn)
【博客】深度學(xué)習(xí)中的注意力機(jī)制
【博客】深度學(xué)習(xí)中的注意力機(jī)制(2017版)
【博客】深度學(xué)習(xí)中的Attention模型介紹及其進(jìn)展
【博客】注意力機(jī)制(Attention Mechanism)在自然語(yǔ)言處理中的應(yīng)用
【博客】深度學(xué)習(xí)和自然語(yǔ)言處理中的attention和memory機(jī)制
【博客】Attention Networks with Keras
【博客】The fall of RNN / LSTM
【博客】從2017年頂會(huì)論文看 Attention Model
【博客】Attention Model(mechanism)的 套路
【博客】DIN(Deep Interest Network of CTR) [Paper筆記]
【博客】自然語(yǔ)言處理中的自注意力機(jī)制(Self-Attention Mechanism)
【博客】一文讀懂「Attention is All You Need」| 附代碼實(shí)現(xiàn)
【博客】計(jì)算廣告CTR預(yù)估系列(五)–阿里Deep Interest Network理論
【博客】機(jī)器翻譯模型Transformer代碼詳細(xì)解析
【知乎】模型匯總24 - 深度學(xué)習(xí)中Attention Mechanism詳細(xì)介紹:原理、分類及應(yīng)用
【論文】Recurrent Models of Visual Attention
【論文】Neural Machine Translation by Jointly Learning to Align and Translate
【論文】Effective Approaches to Attention-based Neural Machine Translation
【論文】ABCNN: Attention-Based Convolutional Neural Network for Modeling Sentence Pairs
【論文】TGIF-QA: Toward Spatio-Temporal Reasoning in Visual Question Answering
【論文】Attention Is All You Need
【論文】Google’s Neural Machine Translation System: Bridging the Gap between Human and Machine Translation(谷歌機(jī)器翻譯系統(tǒng)框架)
【論文】Dynamic Attention Deep Model for Article Recommendation by Learning Human Editors Demonstration(新聞推薦)
【論文】Dipole: Diagnosis Prediction in Healthcare via Attention-based Bidirectional Recurrent Neural Networks(醫(yī)療診斷預(yù)測(cè))
【論文】A Context-aware Attention Network for Interactive Question Answering(問答系統(tǒng))
【論文】Multiple Object Recognition with Visual Attention
【論文】Attentional Factorization Machines: Learning the Weight of Feature Interactions via Attention Networks(AFM,推薦系統(tǒng))
【論文】Deep Interest Network for Click-Through Rate Prediction(DIN,推薦系統(tǒng))
【論文】Attention-based Extraction of Structured Information from Street View Imagery(文字識(shí)別)
【github】attention_tf
【github】attention_keras
【github】transformer
【github】attentional_factorization_machine
|