3.8 注意力模型-深度学习第五课《序列模型》-Stanford吴恩达教授
注意力模型 (Attention Model)
在上個(gè)視頻中你已經(jīng)見(jiàn)到了,注意力模型如何讓一個(gè)神經(jīng)網(wǎng)絡(luò)只注意到一部分的輸入句子。當(dāng)它在生成句子的時(shí)候,更像人類翻譯。讓我們把這些想法轉(zhuǎn)化成確切的式子,來(lái)實(shí)現(xiàn)注意力模型。
跟上個(gè)視頻一樣,我們先假定有一個(gè)輸入句子,并使用雙向的RNN,或者雙向的GRU或者雙向的LSTM,去計(jì)算每個(gè)詞的特征。實(shí)際上GRU和LSTM經(jīng)常應(yīng)用于這個(gè),可能LSTM更經(jīng)常一點(diǎn)。對(duì)于前向傳播(the forward occurrence),你有第一個(gè)時(shí)間步的前向傳播的激活值(a forward occurrence first time step),第一個(gè)時(shí)間步后向傳播的激活值,后向的激活值,以此類推。他們一共向前了五個(gè)時(shí)間步,也向后了五個(gè)時(shí)間步,技術(shù)上我們把這里設(shè)置為0。我們也可以后向傳播6次,設(shè)一個(gè)都是0的因子,實(shí)際上就是個(gè)都是0的因子。為了簡(jiǎn)化每個(gè)時(shí)間步的記號(hào),即使你在雙向RNN已經(jīng)計(jì)算了前向的特征值和后向的特征值,我就用 a<t>a^{<t>}a<t> 來(lái)一起表示這些聯(lián)系。所以 a<t>a^{<t>}a<t> 就是時(shí)間步 ttt 上的特征向量。但是為了保持記號(hào)的一致性,我們用第二個(gè),也就是 t′t\primet′ ,實(shí)際上我將用 t′t\primet′ 來(lái)索引法語(yǔ)句子里面的詞。接下來(lái)我們只進(jìn)行前向計(jì)算,就是說(shuō)這是個(gè)單向的RNN,用狀態(tài) SSS 表示生成翻譯。所以第一個(gè)時(shí)間步,它應(yīng)該生成 y<1>y^{<1>}y<1> ,當(dāng)你輸入上下文 CCC 的時(shí)候就會(huì)這樣,如果你想用時(shí)間來(lái)索引它,你可以寫(xiě) C<1>C^{<1>}C<1> ,但有時(shí)候我就寫(xiě)個(gè) CCC ,就是沒(méi)有上標(biāo)的 CCC ,這個(gè)會(huì)取決于注意力參數(shù),即 a<1,1>a^{<1,1>}a<1,1> , a<1,2>a^{<1,2>}a<1,2> 以此類推,告訴我們應(yīng)該花多少注意力。同樣的,這個(gè) α\alphaα 參數(shù)告訴我們上下文有多少取決于我們得到的特征,或者我們從不同時(shí)間步中得到的激活值。所以我們定義上下文的方式實(shí)際上來(lái)源于被注意力權(quán)重加權(quán)的不同時(shí)間步中的特征值。于是更公式化的注意力權(quán)重將會(huì)滿足非負(fù)的條件,所以這就是個(gè)0或正數(shù),它們加起來(lái)等于1。我們等會(huì)會(huì)見(jiàn)到我們?nèi)绾未_保這個(gè)成立,我們將會(huì)有上下文,或者說(shuō)在 t=1t=1t=1 時(shí)的上下文,我會(huì)經(jīng)常省略上標(biāo),這就會(huì)變成對(duì) t′t\primet′ 的求和。這個(gè)權(quán)重的所有 t′t\primet′ 的值,加上這些激活值。所以這里的這項(xiàng)(上圖編號(hào)1所示)就是注意力權(quán)重,這里的這項(xiàng)(上圖編號(hào)2)來(lái)自于這里(上圖編號(hào)3),于是 α<t,t′>\alpha^{<t,t\prime>}α<t,t′> 就是 y<t>y^{<t>}y<t> 應(yīng)該在 t′t\primet′ 時(shí)花在 aaa 上注意力的數(shù)量。換句話來(lái)說(shuō),當(dāng)你在 ttt 處生成輸出詞,你應(yīng)該花多少注意力在第 t′t\primet′ 個(gè)輸入詞上面,這是生成輸出的其中一步。然后下一個(gè)時(shí)間步,你會(huì)生成第二個(gè)輸出。于是相似的,你現(xiàn)在有了一個(gè)新的注意力權(quán)重集,再找到一個(gè)新的方式將它們相加,這就產(chǎn)生了一個(gè)新的上下文,這個(gè)也是輸入,且允許你生成第二個(gè)詞。只有現(xiàn)在才用這種方式相加,它會(huì)變成第二個(gè)時(shí)間步的上下文。即對(duì) t′t\primet′ 的 α<2,t′>\alpha^{<2,t\prime>}α<2,t′> 進(jìn)行求和,于是使用這些上下文向量, C<1>C^{<1>}C<1> 寫(xiě)到這里, C<2>C^{<2>}C<2> 也同理。這里的神經(jīng)網(wǎng)絡(luò)看起來(lái)很像相當(dāng)標(biāo)準(zhǔn)的RNN序列,這里有著上下文向量作為輸出,我們可以一次一個(gè)詞地生成翻譯,我們也定義了如何通過(guò)這些注意力權(quán)重和輸入句子的特征值來(lái)計(jì)算上下文向量。剩下唯一要做的事情就是定義如何計(jì)算這些注意力權(quán)重。讓我們下張幻燈片看看。
回憶一下 α<t,t′>\alpha^{<t,t\prime>}α<t,t′> ,是你應(yīng)該花費(fèi)在 a<t′>a^{<t\prime>}a<t′> 上的注意力的數(shù)量,當(dāng)你嘗試去生成第 ttt 個(gè)輸出的翻譯詞,讓我們先把式子寫(xiě)下來(lái),再討論它是怎么來(lái)的。這個(gè)式子你可以用來(lái)計(jì)算 α<t,t′>\alpha^{<t,t\prime>}α<t,t′> ,在此之前我們要先計(jì)算 e<t,t′>e^{<t,t\prime>}e<t,t′>,關(guān)鍵要用softmax,來(lái)確保這些權(quán)重加起來(lái)等于1。如果你對(duì) t′t\primet′ 求和,比如每一個(gè)固定的 ttt 值,這些加起來(lái)等于1。如果你對(duì) t′t\primet′ 求和,然后優(yōu)先使用softmax,確保這些值加起來(lái)等于1。
現(xiàn)在我們?nèi)绾斡?jì)算這些 eee 項(xiàng),一種我們可以用的方式是用下面這樣的小的神經(jīng)網(wǎng)絡(luò),于是 s<t?1>s^{<t-1>}s<t?1> 就是神經(jīng)網(wǎng)絡(luò)在上個(gè)時(shí)間步的狀態(tài),于是這里我們有一個(gè)神經(jīng)網(wǎng)絡(luò),如果你想要生成 y<t>y^{<t>}y<t> ,那么 s<t?1>s^{<t-1>}s<t?1> 就是上一時(shí)間步的隱藏狀態(tài),即 s<t>s^{<t>}s<t> 。這是給小神經(jīng)網(wǎng)絡(luò)的其中一個(gè)輸入,也就是在神經(jīng)網(wǎng)絡(luò)中的一個(gè)隱藏層,因?yàn)槟阈枰?jīng)常計(jì)算它們,然后 a<t′>a^{<t\prime>}a<t′> ,即上個(gè)時(shí)間步的的特征是另一個(gè)輸入。直觀來(lái)想就是,如果你想要決定要花多少注意力在的激活值上。于是,似乎它會(huì)很大程度上取決于你上一個(gè)時(shí)間步的的隱藏狀態(tài)的激活值。你還沒(méi)有當(dāng)前狀態(tài)的激活值,因?yàn)樯舷挛臅?huì)輸入到這里,所以你還沒(méi)計(jì)算出來(lái),但是看看你生成上一個(gè)翻譯的RNN的隱藏狀態(tài),然后對(duì)于每一個(gè)位置,每一個(gè)詞都看向他們的特征值,這看起來(lái)很自然,即 α<t,t′>\alpha^{<t,t\prime>}α<t,t′> 和 e<t,t′>e^{<t,t\prime>}e<t,t′> 應(yīng)該取決于這兩個(gè)量。但是我們不知道具體函數(shù)是什么,所以我們可以做的事情就是訓(xùn)練一個(gè)很小的神經(jīng)網(wǎng)絡(luò),去學(xué)習(xí)這個(gè)函數(shù)到底是什么。相信反向傳播算法,相信梯度下降算法學(xué)到一個(gè)正確的函數(shù)。這表示,如果你應(yīng)用這整個(gè)的模型,然后用梯度下降來(lái)訓(xùn)練它,這是可行的。這個(gè)小型的神經(jīng)網(wǎng)絡(luò)做了一件相當(dāng)棒的事情,告訴你 y<t>y^{<t>}y<t> 應(yīng)該花多少注意力在 a<t′>a^{<t\prime>}a<t′> 上面,然后這個(gè)式子確保注意力權(quán)重加起來(lái)等于1,于是當(dāng)你持續(xù)地一次生成一個(gè)詞,這個(gè)神經(jīng)網(wǎng)絡(luò)實(shí)際上會(huì)花注意力在右邊的這個(gè)輸入句子上,它會(huì)完全自動(dòng)的通過(guò)梯度下降來(lái)學(xué)習(xí)。
這個(gè)算法的一個(gè)缺點(diǎn)就是它要花費(fèi)三次方的時(shí)間,就是說(shuō)這個(gè)算法的復(fù)雜是 O(n3)O(n3)O(n3) 的,如果你有 TxT_xTx? 個(gè)輸入單詞和 TyT_yTy? 個(gè)輸出單詞,于是注意力參數(shù)的總數(shù)就會(huì)是 Tx?TyT_x*T_yTx??Ty? ,所以這個(gè)算法有著三次方的消耗。但是在機(jī)器翻譯的應(yīng)用上,輸入和輸出的句子一般不會(huì)太長(zhǎng),可能三次方的消耗是可以接受,但也有很多研究工作,嘗試去減少這樣的消耗。那么講解注意想法在機(jī)器翻譯中的應(yīng)用,就到此為止了。雖然沒(méi)有講到太多的細(xì)節(jié),但這個(gè)想法也被應(yīng)用到了其他的很多問(wèn)題中去了,比如圖片加標(biāo)題(image captioning),圖片加標(biāo)題就是看一張圖,寫(xiě)下這張圖的標(biāo)題。底下的這篇論文來(lái)源于Kevin Chu,Jimmy Barr, Ryan Kiros, Kelvin Shaw, Aaron Korver, Russell Zarkutnov, Virta Zemo, 和 Andrew Benjo。他們也顯示了你可以有一個(gè)很相似的結(jié)構(gòu)看圖片,然后,當(dāng)你在寫(xiě)圖片標(biāo)題的時(shí)候,一次只花注意力在一部分的圖片上面。如果你感興趣,那么我鼓勵(lì)你,也去看看這篇論文,做一些編程練習(xí)。
因?yàn)闄C(jī)器翻譯是一個(gè)非常復(fù)雜的問(wèn)題,在之前的練習(xí)中,你應(yīng)用了注意力,在日期標(biāo)準(zhǔn)化的問(wèn)題(the date normalization problem)上面,問(wèn)題輸入了像這樣的一個(gè)日期,這個(gè)日期實(shí)際上是阿波羅登月的日期,把它標(biāo)準(zhǔn)化成標(biāo)準(zhǔn)的形式,或者這樣的日期。用一個(gè)序列的神經(jīng)網(wǎng)絡(luò),即序列模型去標(biāo)準(zhǔn)化到這樣的形式,這個(gè)日期實(shí)際上是威廉·莎士比亞的生日。一般認(rèn)為是這個(gè)日期正如你之前聯(lián)系中見(jiàn)到的,你可以訓(xùn)練一個(gè)神經(jīng)網(wǎng)絡(luò),輸入任何形式的日期,生成標(biāo)準(zhǔn)化的日期形式。其他可以做的有意思的事情是看看可視化的注意力權(quán)重(the visualizations of the attention weights)。這有一個(gè)機(jī)器翻譯的例子,這里被畫(huà)上了不同的顏色,不同注意力權(quán)重的大小,我不想在這上面花太多時(shí)間,但是你可以發(fā)現(xiàn),對(duì)應(yīng)的輸入輸出詞,你會(huì)發(fā)現(xiàn)注意力權(quán)重,會(huì)變高,因此這顯示了當(dāng)它生成特定的輸出詞時(shí)通常會(huì)花注意力在輸入的正確的詞上面,包括學(xué)習(xí)花注意在哪。 在注意力模型中,使用反向傳播時(shí), 什么時(shí)候?qū)W習(xí)完成。
這就是注意力模型,在深度學(xué)習(xí)中真的是個(gè)非常強(qiáng)大的想法。在本周的編程練習(xí)中,我希望你可以享受自己應(yīng)用它的過(guò)程。
總結(jié)
以上是生活随笔為你收集整理的3.8 注意力模型-深度学习第五课《序列模型》-Stanford吴恩达教授的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 3.7 注意力模型直观理解-深度学习第五
- 下一篇: 3.10 触发字检测-深度学习第五课《序