吳恩達深度學習筆記(135) | 注意力模型 | 注意力模型

注意力模型(Attention Model)

在上個筆記中你已經見到了,注意力模型如何讓一個神經網絡只注意到一部分的輸入句子。當它在生成句子的時候,更像人類翻譯。讓我們把這些想法轉化成確切的式子,來實現注意力模型。

吳恩達深度學習筆記(135) | 注意力模型 | 注意力模型

跟上個筆記一樣,我們先假定有一個輸入句子,並使用雙向的RNN,或者雙向的GRU或者雙向的LSTM,去計算每個詞的特徵。實際上GRU和LSTM經常應用於這個,可能LSTM更經常一點。

對於前向傳播(the forward occurrence),你有第一個時間步的前向傳播的激活值(a forward occurrence first time step),第一個時間步後向傳播的激活值,後向的激活值,以此類推。

他們一共向前了五個時間步,也向後了五個時間步,技術上我們把這裡設置為0。我們也可以後向傳播6次,設一個都是0的因子,實際上就是個都是0的因子。為了簡化每個時間步的記號,即使你在雙向RNN已經計算了前向的特徵值和後向的特徵值,我就用a^()來一起表示這些聯繫。

所以a^()就是時間步t上的特徵向量。但是為了保持記號的一致性,我們用第二個,也就是t',實際上我將用t'來索引法語句子裡面的詞。接下來我們只進行前向計算,就是說這是個單向的RNN,用狀態S表示生成翻譯。

所以第一個時間步,它應該生成y^(<1>),當你輸入上下文C的時候就會這樣,如果你想用時間來索引它,你可以寫C^(

<1>),但有時候我就寫個C,就是沒有上標的C,這個會取決於注意力參數,即a^(<1,1>),a^(<1,2>)以此類推,告訴我們應該花多少注意力。

同樣的,這個a參數告訴我們上下文有多少取決於我們得到的特徵,或者我們從不同時間步中得到的激活值。

所以我們定義上下文的方式實際上來源於被注意力權重加權的不同時間步中的特徵值。於是更公式化的注意力權重將會滿足非負的條件,所以這就是個0或正數,它們加起來等於1。我們等會會見到我們如何確保這個成立,我們將會有上下文,或者說在t=1時的上下文,我會經常省略上標,這就會變成對t'的求和。這個權重的所有的t'值,加上這些激活值。

所以這裡的這項(上圖編號1所示)就是注意力權重,這裡的這項(上圖編號2)來自於這裡(上圖編號3),於是a^()就是y^()應該在t'時花在a上注意力的數量。換句話來說,當你在t處生成輸出詞,你應該花多少注意力在第t'個輸入詞上面,這是生成輸出的其中一步。然後下一個時間步,你會生成第二個輸出。

於是相似的,你現在有了一個新的注意力權重集,再找到一個新的方式將它們相加,這就產生了一個新的上下文,這個也是輸入,且允許你生成第二個詞。只有現在才用這種方式相加,它會變成第二個時間步的上下文。即對t'的a^(

<2,t'>)進行求和,於是使用這些上下文向量,C^(<1>)寫到這裡,C^(<2>)也同理。

這裡的神經網絡看起來很像相當標準的RNN序列,這裡有著上下文向量作為輸出,我們可以一次一個詞地生成翻譯,我們也定義瞭如何通過這些注意力權重和輸入句子的特徵值來計算上下文向量。剩下唯一要做的事情就是定義如何計算這些注意力權重。讓我們下張幻燈片看看。

吳恩達深度學習筆記(135) | 注意力模型 | 注意力模型

回憶一下a^(),是你應該花費在a^()上的注意力的數量,當你嘗試去生成第t個輸出的翻譯詞,讓我們先把式子寫下來,再討論它是怎麼來的。這個式子你可以用來計算a^(),在此之前我們要先計算e^(),關鍵要用softmax,來確保這些權重加起來等於1。如果你對t'求和,比如每一個固定的t值,這些加起來等於1。如果你對t'求和,然後優先使用softmax,確保這些值加起來等於1。

現在我們如何計算這些e項,一種我們可以用的方式是用下面這樣的小的神經網絡,於是s^()就是神經網絡在上個時間步的狀態,於是這裡我們有一個神經網絡,如果你想要生成y^(),那麼s^()就是上一時間步的隱藏狀態,即s^()。

這是給小神經網絡的其中一個輸入,也就是在神經網絡中的一個隱藏層,因為你需要經常計算它們,然後a^(),即上個時間步的的特徵是另一個輸入。直觀來想就是,如果你想要決定要花多少注意力在t'的激活值上。於是,似乎它會很大程度上取決於你上一個時間步的的隱藏狀態的激活值。你還沒有當前狀態的激活值,因為上下文會輸入到這裡,所以你還沒計算出來,但是看看你生成上一個翻譯的RNN的隱藏狀態,然後對於每一個位置,每一個詞都看向他們的特徵值,這看起來很自然,即a^()和e^()應該取決於這兩個量。

但是我們不知道具體函數是什麼,所以我們可以做的事情就是訓練一個很小的神經網絡,去學習這個函數到底是什麼。

相信反向傳播算法,相信梯度下降算法學到一個正確的函數。

這表示,如果你應用這整個的模型,然後用梯度下降來訓練它,這是可行的。這個小型的神經網絡做了一件相當棒的事情,告訴你y^()應該花多少注意力在a^()上面,然後這個式子確保注意力權重加起來等於1,於是當你持續地一次生成一個詞,這個神經網絡實際上會花注意力在右邊的這個輸入句子上,它會完全自動的通過梯度下降來學習。

這個算法的一個缺點就是它要花費三次方的時間,就是說這個算法的複雜是O(n3)的,如果你有T_x個輸入單詞和T_y個輸出單詞,於是注意力參數的總數就會是T_x×T_y,所以這個算法有著三次方的消耗。但是在機器翻譯的應用上,輸入和輸出的句子一般不會太長,可能三次方的消耗是可以接受,但也有很多研究工作,嘗試去減少這樣的消耗。那麼講解注意想法在機器翻譯中的應用,就到此為止了。雖然沒有講到太多的細節,但這個想法也被應用到了其他的很多問題中去了,比如圖片加標題(image captioning),圖片加標題就是看一張圖,寫下這張圖的標題。底下的這篇論文來源於Kevin Chu,Jimmy Barr, Ryan Kiros, Kelvin Shaw, Aaron Korver, Russell Zarkutnov, Virta Zemo, 和 Andrew Benjo。

吳恩達深度學習筆記(135) | 注意力模型 | 注意力模型

因為機器翻譯是一個非常複雜的問題,在之前的練習中,你應用了注意力,在日期標準化的問題(the date normalization problem)上面,問題輸入了像這樣的一個日期,這個日期實際上是阿波羅登月的日期,把它標準化成標準的形式,或者這樣的日期。

用一個序列的神經網絡,即序列模型去標準化到這樣的形式,這個日期實際上是威廉·莎士比亞的生日。一般認為是這個日期正如你之前聯繫中見到的,你可以訓練一個神經網絡,輸入任何形式的日期,生成標準化的日期形式。其他可以做的有意思的事情是看看可視化的注意力權重(the visualizations of the attention weights)。這個一個機器翻譯的例子,這裡被畫上了不同的顏色,不同注意力權重的大小,我不想在這上面花太多時間,但是你可以發現,對應的輸入輸出詞,你會發現注意力權重,會變高,因此這顯示了當它生成特定的輸出詞時通常會花注意力在輸入的正確的詞上面,包括學習花注意在哪。 在注意力模型中,使用反向傳播時, 什麼時候學習完成。

這就是注意力模型,在深度學習中真的是個非常強大的想法。


分享到:


相關文章: