在上個(gè)筆記中你已經(jīng)見到了,注意力模型如何讓一個(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>)來(lái)一起表示這些聯(lián)系。
所以a^(<t>)就是時(shí)間步t上的特征向量。但是為了保持記號(hào)的一致性,我們用第二個(gè),也就是t',實(shí)際上我將用t'來(lái)索引法語(yǔ)句子里面的詞。接下來(lái)我們只進(jìn)行前向計(jì)算,就是說這是個(gè)單向的RNN,用狀態(tài)S表示生成翻譯。
所以第一個(gè)時(shí)間步,它應(yīng)該生成y^(<1>),當(dāng)你輸入上下文C的時(shí)候就會(huì)這樣,如果你想用時(shí)間來(lái)索引它,你可以寫C^(<1>),但有時(shí)候我就寫個(gè)C,就是沒有上標(biāo)的C,這個(gè)會(huì)取決于注意力參數(shù),即a^(<1,1>),a^(<1,2>)以此類推,告訴我們應(yīng)該花多少注意力。
同樣的,這個(gè)a參數(shù)告訴我們上下文有多少取決于我們得到的特征,或者我們從不同時(shí)間步中得到的激活值。
所以我們定義上下文的方式實(shí)際上來(lái)源于被注意力權(quán)重加權(quán)的不同時(shí)間步中的特征值。于是更公式化的注意力權(quán)重將會(huì)滿足非負(fù)的條件,所以這就是個(gè)0或正數(shù),它們加起來(lái)等于1。我們等會(huì)會(huì)見到我們?nèi)绾未_保這個(gè)成立,我們將會(huì)有上下文,或者說在t=1時(shí)的上下文,我會(huì)經(jīng)常省略上標(biāo),這就會(huì)變成對(duì)t'的求和。這個(gè)權(quán)重的所有的t'值,加上這些激活值。
所以這里的這項(xiàng)(上圖編號(hào)1所示)就是注意力權(quán)重,這里的這項(xiàng)(上圖編號(hào)2)來(lái)自于這里(上圖編號(hào)3),于是a^(<t,t'>)就是y^(<t>)應(yīng)該在t'時(shí)花在a上注意力的數(shù)量。換句話來(lái)說,當(dāng)你在t處生成輸出詞,你應(yīng)該花多少注意力在第t'個(gè)輸入詞上面,這是生成輸出的其中一步。然后下一個(gè)時(shí)間步,你會(huì)生成第二個(gè)輸出。
于是相似的,你現(xiàn)在有了一個(gè)新的注意力權(quán)重集,再找到一個(gè)新的方式將它們相加,這就產(chǎn)生了一個(gè)新的上下文,這個(gè)也是輸入,且允許你生成第二個(gè)詞。只有現(xiàn)在才用這種方式相加,它會(huì)變成第二個(gè)時(shí)間步的上下文。即對(duì)t'的a^(<2,t'>)進(jìn)行求和,于是使用這些上下文向量,C^(<1>)寫到這里,C^(<2>)也同理。
這里的神經(jīng)網(wǎng)絡(luò)看起來(lái)很像相當(dāng)標(biāo)準(zhǔn)的RNN序列,這里有著上下文向量作為輸出,我們可以一次一個(gè)詞地生成翻譯,我們也定義了如何通過這些注意力權(quán)重和輸入句子的特征值來(lái)計(jì)算上下文向量。剩下唯一要做的事情就是定義如何計(jì)算這些注意力權(quán)重。讓我們下張幻燈片看看。
回憶一下a^(<t,t'>),是你應(yīng)該花費(fèi)在a^(<t'>)上的注意力的數(shù)量,當(dāng)你嘗試去生成第t個(gè)輸出的翻譯詞,讓我們先把式子寫下來(lái),再討論它是怎么來(lái)的。這個(gè)式子你可以用來(lái)計(jì)算a^(<t,t'>),在此之前我們要先計(jì)算e^(<t,t'>),關(guān)鍵要用softmax,來(lái)確保這些權(quán)重加起來(lái)等于1。如果你對(duì)t'求和,比如每一個(gè)固定的t值,這些加起來(lái)等于1。如果你對(duì)t'求和,然后優(yōu)先使用softmax,確保這些值加起來(lái)等于1。
現(xiàn)在我們?nèi)绾斡?jì)算這些e項(xiàng),一種我們可以用的方式是用下面這樣的小的神經(jīng)網(wǎng)絡(luò),于是s^(<t-1>)就是神經(jīng)網(wǎng)絡(luò)在上個(gè)時(shí)間步的狀態(tài),于是這里我們有一個(gè)神經(jīng)網(wǎng)絡(luò),如果你想要生成y^(<t>),那么s^(<t-1>)就是上一時(shí)間步的隱藏狀態(tài),即s^(<t>)。
這是給小神經(jīng)網(wǎng)絡(luò)的其中一個(gè)輸入,也就是在神經(jīng)網(wǎng)絡(luò)中的一個(gè)隱藏層,因?yàn)槟阈枰?jīng)常計(jì)算它們,然后a^(<t'>),即上個(gè)時(shí)間步的的特征是另一個(gè)輸入。直觀來(lái)想就是,如果你想要決定要花多少注意力在t'的激活值上。于是,似乎它會(huì)很大程度上取決于你上一個(gè)時(shí)間步的的隱藏狀態(tài)的激活值。你還沒有當(dāng)前狀態(tài)的激活值,因?yàn)樯舷挛臅?huì)輸入到這里,所以你還沒計(jì)算出來(lái),但是看看你生成上一個(gè)翻譯的RNN的隱藏狀態(tài),然后對(duì)于每一個(gè)位置,每一個(gè)詞都看向他們的特征值,這看起來(lái)很自然,即a^(<t,t'>)和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īng)該花多少注意力在a^(<t>)上面,然后這個(gè)式子確保注意力權(quán)重加起來(lái)等于1,于是當(dāng)你持續(xù)地一次生成一個(gè)詞,這個(gè)神經(jīng)網(wǎng)絡(luò)實(shí)際上會(huì)花注意力在右邊的這個(gè)輸入句子上,它會(huì)完全自動(dòng)的通過梯度下降來(lái)學(xué)習(xí)。
這個(gè)算法的一個(gè)缺點(diǎn)就是它要花費(fèi)三次方的時(shí)間,就是說這個(gè)算法的復(fù)雜是O(n3)的,如果你有T_x個(gè)輸入單詞和T_y個(gè)輸出單詞,于是注意力參數(shù)的總數(shù)就會(huì)是T_x×T_y,所以這個(gè)算法有著三次方的消耗。但是在機(jī)器翻譯的應(yīng)用上,輸入和輸出的句子一般不會(huì)太長(zhǎng),可能三次方的消耗是可以接受,但也有很多研究工作,嘗試去減少這樣的消耗。那么講解注意想法在機(jī)器翻譯中的應(yīng)用,就到此為止了。雖然沒有講到太多的細(xì)節(jié),但這個(gè)想法也被應(yīng)用到了其他的很多問題中去了,比如圖片加標(biāo)題(image captioning),圖片加標(biāo)題就是看一張圖,寫下這張圖的標(biāo)題。底下的這篇論文來(lái)源于Kevin Chu,Jimmy Barr, Ryan Kiros, Kelvin Shaw, Aaron Korver, Russell Zarkutnov, Virta Zemo, 和 Andrew Benjo。
因?yàn)闄C(jī)器翻譯是一個(gè)非常復(fù)雜的問題,在之前的練習(xí)中,你應(yīng)用了注意力,在日期標(biāo)準(zhǔn)化的問題(the date normalization problem)上面,問題輸入了像這樣的一個(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)系中見到的,你可以訓(xùn)練一個(gè)神經(jīng)網(wǎng)絡(luò),輸入任何形式的日期,生成標(biāo)準(zhǔn)化的日期形式。其他可以做的有意思的事情是看看可視化的注意力權(quán)重(the visualizations of the attention weights)。這個(gè)一個(gè)機(jī)器翻譯的例子,這里被畫上了不同的顏色,不同注意力權(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)大的想法。
聯(lián)系客服