1. 程式人生 > >深度學習(二十四)——L2 Normalization, Attention(1)

深度學習(二十四)——L2 Normalization, Attention(1)

L2 Normalization

L2 Normalization本身並不複雜,然而多數資料都只提到1維的L2 Normalization的計算公式:

x=[x1,x2,,xd]y=[y1,y2,,yd]y=xi=1dxi2=xxTx

對於多維L2 Normalization幾乎未曾提及,這裡以3維tensor:A[width, height, channel]為例介紹一下多維L2 Normalization的計算方法。

多維L2 Normalization有一個叫axis(有時也叫dim)的引數,如果axis=0的話,實際上就是將整個tensor flatten之後,再L2 Normalization。這個是比較簡單的。

這裡說說axis=3的情況。axis=3意味著對channel進行Normalization,也就是:

Bxy=z=0ZAxyz2Cxyz=AxyzBxyDxyz=CxyzSz

一般來說,求出C被稱作L2 Normalization,而求出D被稱作L2 Scale Normalization,S被稱為Scale。

Attention

概述

眾所周知,RNN在處理長距離依賴關係時會出現問題。理論上,LSTM這類結構能夠處理這個問題,但在實踐中,長距離依賴關係仍舊是個問題。例如,研究人員發現將原文倒序(將其倒序輸入編碼器)產生了顯著改善的結果,因為從解碼器到編碼器對應部分的路徑被縮短了。同樣,兩次輸入同一個序列似乎也有助於網路更好地記憶。

倒序句子這種方法屬於“hack”手段。它屬於被實踐證明有效的方法,而不是有理論依據的解決方法。

大多數翻譯的基準都是用法語、德語等語種,它們和英語非常相似(即使漢語的詞序與英語也極其相似)。但是有些語種(像日語)句子的最後一個詞語在英語譯文中對第一個詞語有高度預言性。那麼,倒序輸入將使得結果更糟糕。

還有其它辦法嗎?那就是Attention機制。

這裡寫圖片描述

上圖是Attention機制的結構圖。y是編碼器生成的譯文詞語,x是原文的詞語。上圖使用了雙向遞迴網路,但這並不是重點,你先忽略反向的路徑吧。重點在於現在每個解碼器輸出的詞語yt取決於所有輸入狀態的一個權重組合,而不只是最後一個狀態。a是決定每個輸入狀態對輸出狀態的權重貢獻。因此,如果

a3,2的值很大,這意味著解碼器在生成譯文的第三個詞語時,會更關注於原文句子的第二個狀態。a求和的結果通常歸一化到1(因此它是輸入狀態的一個分佈)。

Attention機制的一個主要優勢是它讓我們能夠解釋並可視化整個模型。舉個例子,通過對attention權重矩陣a的視覺化,我們能夠理解模型翻譯的過程。

這裡寫圖片描述

我們注意到當從法語譯為英語時,網路模型順序地關注每個輸入狀態,但有時輸出一個詞語時會關注兩個原文的詞語,比如將“la Syrie”翻譯為“Syria”。

如果再仔細觀察attention的等式,我們會發現attention機制有一定的成本。我們需要為每個輸入輸出組合分別計算attention值。50個單詞的輸入序列和50個單詞的輸出序列需要計算2500個attention值。這還不算太糟糕,但如果你做字元級別的計算,而且字元序列長達幾百個字元,那麼attention機制將會變得代價昂貴。

attention機制解決的根本問題是允許網路返回到輸入序列,而不是把所有資訊編碼成固定長度的向量。正如我在上面提到,我認為使用attention有點兒用詞不當。換句話說,attention機制只是簡單地讓網路模型訪問它的內部儲存器,也就是編碼器的隱藏狀態。在這種解釋中,網路選擇從記憶中檢索東西,而不是選擇“注意”什麼。不同於典型的記憶體,這裡的記憶體訪問機制是彈性的,也就是說模型檢索到的是所有記憶體位置的加權組合,而不是某個獨立離散位置的值。彈性的記憶體訪問機制好處在於我們可以很容易地用反向傳播演算法端到端地訓練網路模型(雖然有non-fuzzy的方法,其中的梯度使用抽樣方法計算,而不是反向傳播)。

論文:

《Learning to combine foveal glimpses with a third-order Boltzmann machine》

《Learning where to Attend with Deep Architectures for Image Tracking》

《Neural Machine Translation by Jointly Learning to Align and Translate》

Neural Turing Machines

以下章節主要翻譯自下文:

Attention and Augmented Recurrent Neural Networks

distill.pub雖然blog數量不多,但篇篇都是經典。背後站臺的更有Yoshua Bengio、Ian Goodfellow、Andrej Karpathy等大牛。

該文主要講述了Attention在RNN領域的應用。

NTM是一種使用Neural Network為基礎來實現傳統圖靈機的理論計算模型。利用該模型,可以通過訓練的方式讓系統“學會”具有時序關聯的任務流。

圖靈機的詳細定義可參見:

這裡寫圖片描述

和傳統圖靈機相比,這裡的memory中儲存的是向量,我們的目標是根據輸入序列,確定讀寫操作。具體的步驟如下圖所示:

這裡寫圖片描述

1.計算query vector和memory中每個vector的相似度。

2.將相似度softmax為一個分佈。

3.用之前訓練好的attention模型調整分佈值。

4.圖靈機的Shift操作也可以引入attention模型。

5.sharpen分佈值,選擇最終的讀寫操作。sharpen操作,實際上就是選擇較大的概率值,而忽略較小的概率值。

Attentional Interfaces

以下是另外的一些Attention的用例。

這裡寫圖片描述

上圖中,一個RNN模型可以輸入另一個RNN模型的輸出。它在每一步都會關注另一個RNN模型的不同位置。

這裡寫圖片描述

這是一個和NTM非常類似的模型。RNN模型生成一個搜尋詞描述其希望關注的位置。然後計算每條內容與搜尋詞的點乘得分,表示其與搜尋詞的匹配程度。這些分數經過softmax函式的運算產生聚焦的分佈。

這裡寫圖片描述

上圖是語言翻譯方面的模型。若用傳統的序列到序列模型做翻譯,需要把整個輸入詞彙串縮簡為單個向量,然後再展開恢復為序列目標語言的詞彙串。Attention機制則可以避免上述操作,RNN模型逐個處理輸入詞語的資訊,隨即生成相對應的詞語。

這裡寫圖片描述

RNN模型之間的這類聚焦還有許多其它的應用。它可以用於語音識別,其中一個RNN模型處理語音訊號,另一個RNN模型則滑動處理其輸出,然後關注相關的區域生成文字內容。

Adaptive Computation Time

標準的RNN模型每一步所消耗的計算時間都相同。這似乎與我們的直覺不符。我們在思考難題的時候難道不需要更多的時間嗎?

適應性計算時間(Adaptive Computation Time)是解決RNN每一步消耗不同計算量的方法。籠統地說:就是讓RNN模型可以在每個時間片段內進行不同次數的計算步驟。

這裡寫圖片描述

上圖是ACT的網路結構圖。下面來分步講解一下。

這裡寫圖片描述

這一步就是典型的RNN+輸出各個狀態的帶權重組合。

這裡寫圖片描述

每一步的權重值由“halting neuron”決定。這個神經元事實上是一個sigmoid函式,輸出一個終止權重,可以理解為需要在當前步驟終止的概率值。

這裡寫圖片描述

停止權重值的總和等於1,每一步結束後要減去相應的值。一旦這個值小於了epsilon,我們就停止計算。

這裡寫圖片描述

當訓練Adaptive Computation Time模型時,可以在損失函式新增一項“ponder cost”,用來懲罰模型的累積計算時間。這一項的值越大,就更不傾向於降低計算時間。

Scaled Dot-Product Attention

以下內容摘自:

《Attention is All You Need》淺讀

《Attention is All You Need》是Google 2017年的作品。論文中提出了若干Attention的變種。比如下圖所示的Scaled Dot-Product Attention。

這裡寫圖片描述

上圖用公式表述就是:

Attention(Q,K,V)=softmax(QKdk)V

如果忽略啟用函式softmax的話,那麼事實上它就是三個n×dk,dk×m,m×dv的矩陣相乘,最後的結果就是一個n×dv的矩陣。於是我們可以認為:這是一個Attention層,將n×dk的序列Q編碼成了一個新的n×dv的序列。

那怎麼理解這種結構呢?我們不妨逐個向量來看。