GRU單元(Gated Recurrent Unit(GRU))
你已經瞭解了基礎的RNN模型的運行機制,在本節中你將會學習門控循環單元,它改變了RNN的隱藏層,使其可以更好地捕捉深層連接,並改善了梯度消失問題,讓我們看一看。
你已經見過了這個公式,
a^(
我把這個畫個圖,把RNN的單元畫個圖,畫一個方框,輸入a^(
然後激活值a^(
許多GRU的想法都來分別自於Yu Young Chang, Kagawa,Gaza Hera, Chang Hung Chu和 Jose Banjo的兩篇論文。
我再引用上個筆記中你已經見過的這個句子,“The cat, which already ate……, was full.”,你需要記得貓是單數的,為了確保你已經理解了為什麼這裡是was而不是were,“The cat was full.”或者是“The cats were full”。
當我們從左到右讀這個句子,GRU單元將會有個新的變量稱為c,代表細胞(cell),即記憶細胞(下圖編號1所示)。記憶細胞的作用是提供了記憶的能力,比如說一隻貓是單數還是複數,所以當它看到之後的句子的時候,它仍能夠判斷句子的主語是單數還是複數。於是在時間t處,有記憶細胞c^(
於是我們想要使用不同的符號c和a來表示記憶細胞的值和輸出的激活值,即使它們是一樣的。我現在使用這個標記是因為當我們等會說到LSTMs的時候,這兩個會是不同的值,但是現在對於GRU,c^(
所以這些等式表示了GRU單元的計算,在每個時間步,我們將用一個候選值重寫記憶細胞,即̃c^(
重點來了,在GRU中真正重要的思想是我們有一個門,我先把這個門叫做Γ_u(上圖編號4所示),這是個下標為u的大寫希臘字母Γ,u代表更新門,這是一個0到1之間的值。
為了讓你直觀思考GRU的工作機制,先思考Γ_u,這個一直在0到1之間的門值,實際上這個值是把這個式子帶入sigmoid函數得到的,Γ_u=σ(W_u [c^(
我們還記得sigmoid函數是上圖編號5所示這樣的,它的輸出值總是在0到1之間,對於大多數可能的輸入,sigmoid函數的輸出總是非常接近0或者非常接近1。
在這樣的直覺下,可以想到Γ_u在大多數的情況下非常接近0或1。然後這個字母u表示“update”,我選了字母Γ是因為它看起來像門。還有希臘字母G,G是門的首字母,所以G表示門。
然後GRU的關鍵部分就是上圖編號3所示的等式,我們剛才寫出來的用̃c更新c的等式。然後門決定是否要真的更新它。於是我們這麼看待它,記憶細胞c^(
所以我們接下來要給GRU用的式子就是c^(
對於所有在這中間的值,你應該把門的值設為0,即Γ_u=0,意思就是說不更新它,就用舊的值。因為如果Γ_u=0,則c^(
讓我再畫個圖來(下圖所示)解釋一下GRU單元,順便說一下,當你在看網絡上的博客或者教科書或者教程之類的,這些圖對於解釋GRU和我們稍後會講的LSTM是相當流行的,我個人感覺式子在圖片中比較容易理解,那麼即使看不懂圖片也沒關係,我就畫畫,萬一能幫得上忙就最好了。
GRU單元輸入c^(
再用一個不同的參數集,通過sigmoid激活函數算出Γ_u,Γ_u=σ(W_u [c^(
這就是GRU單元或者說是一個簡化過的GRU單元,它的優點就是通過門決定,當你從左(上圖編號10所示)到右掃描一個句子的時候,這個時機是要更新某個記憶細胞,還是不更新,不更新(上圖編號11所示,中間Γ_u=0一直為0,表示一直不更新)直到你到你真的需要使用記憶細胞的時候(上圖編號12所示),這可能在句子之前就決定了。
因為sigmoid的值,現在因為門很容易取到0值,只要這個值是一個很大的負數,再由於數值上的四捨五入,上面這些門大體上就是0,或者說非常非常非常接近0。
所以在這樣的情況下,這個更新式子(上圖編號13所示的等式)就會變成c^(
現在我想說下一些實現的細節,在這個我寫下的式子中c^(
當然在實際應用中Γ_u不會真的等於0或者1,有時候它是0到1的一箇中間值(上圖編號5所示),但是這對於直觀思考是很方便的,就把它當成確切的0,完全確切的0或者就是確切的1。元素對應的乘積做的就是告訴GRU單元哪個記憶細胞的向量維度在每個時間步要做更新,所以你可以選擇保存一些比特不變,而去更新其他的比特。比如說你可能需要一個比特來記憶貓是單數還是複數,其他比特來理解你正在談論食物,因為你在談論吃飯或者食物,然後你稍後可能就會談論“The cat was full.”,你可以每個時間點只改變一些比特。
你現在已經理解GRU最重要的思想了,幻燈片中展示的實際上只是簡化過的GRU單元,現在來描述一下完整的GRU單元。
對於完整的GRU單元我要做的一個改變就是在我們計算的第一個式子中給記憶細胞的新候選值加上一個新的項,我要添加一個門Γ_r(下圖編號1所示),你可以認為r代表相關性(relevance)。這個Γ_r門告訴你計算出的下一個c^(
正如你所見,有很多方法可以來設計這些類型的神經網絡,然後我們為什麼有Γ_r?為什麼不用上一張幻燈片裡的簡單的版本?這是因為多年來研究者們試驗過很多很多不同可能的方法來設計這些單元,去嘗試讓神經網絡有更深層的連接,去嘗試產生更大範圍的影響,還有解決梯度消失的問題,GRU就是其中一個研究者們最常使用的版本,也被發現在很多不同的問題上也是非常健壯和實用的。你可以嘗試發明新版本的單元,只要你願意。但是GRU是一個標準版本,也就是最常使用的。你可以想象到研究者們也嘗試了很多其他版本,類似這樣的但不完全是,比如我這裡寫的這個。然後另一個常用的版本被稱為LSTM,表示長短時記憶網絡,這個我們會在下節中講到,但是GRU和LSTM是在神經網絡結構中最常用的兩個具體實例。
還有在符號上的一點,我嘗試去定義固定的符號讓這些概念容易理解,如果你看學術文章的話,你有的時候會看到有些人使用另一種符號̃x,u,r和h表示這些量。但我試著在GRU和LSTM之間用一種更固定的符號,比如使用更固定的符號Γ來表示門,所以希望這能讓這些概念更好理解。
所以這就是GRU,即門控循環單元,這是RNN的其中之一。
這個結構可以更好捕捉非常長範圍的依賴,讓RNN更加有效。然後我簡單提一下其他常用的神經網絡,比較經典的是這個叫做LSTM,即長短時記憶網絡,我們在下節中講解。
(Chung J, Gulcehre C, Cho K H, et al. Empirical Evaluation of Gated Recurrent Neural Networks on Sequence Modeling[J]. Eprint Arxiv, 2014.
Cho K, Merrienboer B V, Bahdanau D, et al. On the Properties of Neural Machine Translation: Encoder-Decoder Approaches[J]. Computer Science, 2014.)
閱讀更多 極客Array 的文章