日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > pytorch >内容正文

pytorch

1.9 GRU 单元-深度学习第五课《序列模型》-Stanford吴恩达教授

發布時間:2025/4/5 pytorch 68 豆豆
生活随笔 收集整理的這篇文章主要介紹了 1.9 GRU 单元-深度学习第五课《序列模型》-Stanford吴恩达教授 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

←上一篇↓↑下一篇→
1.8 帶有神經網絡的梯度消失回到目錄1.10 長短期機器 (LSTM)

GRU 單元 (Gated Recurrent Unit (GRU))

你已經了解了基礎的RNN模型的運行機制,在本節視頻中你將會學習門控循環單元,它改變了RNN的隱藏層,使其可以更好地捕捉深層連接,并改善了梯度消失問題,讓我們看一看。

你已經見過了這個公式, a<t>=g(Wa[a<t?1>,x<t>]+ba)a^{<t>}=g(W_a[a^{<t-1>},x^{<t>}]+b_a)a<t>=g(Wa?[a<t?1>,x<t>]+ba?) ,在RNN的時間 ttt 處,計算激活值。我把這個畫個圖,把RNN的單元畫個圖,畫一個方框,輸入 a<t?1>a^{<t-1>}a<t?1> (上圖編號1所示),即上一個時間步的激活值,再輸入 x<t>x^{<t>}x<t> (上圖編號2所示),再把這兩個并起來,然后乘上權重項,在這個線性計算之后(上圖編號3所示),如果 ggg 是一個tanh激活函數,再經過tanh計算之后,它會計算出激活值 a<t>a^{<t>}a<t> 。然后激活值 a<t>a^{<t>}a<t> 將會傳softmax單元(上圖編號4所示),或者其他用于產生輸出 y<t>y^{<t>}y<t> 的東西。就這張圖而言,這就是RNN隱藏層的單元的可視化呈現。我向展示這張圖,因為我們將使用相似的圖來講解門控循環單元。


許多GRU的想法都來分別自于Yu Young Chang, Kagawa,Gaza Hera, Chang Hung ChuJose Banjo的兩篇論文。我再引用上個視頻中你已經見過的這個句子,“The cat, which already ate……, was full.”,你需要記得貓是單數的,為了確保你已經理解了為什么這里是was而不是were,“The cat was full.”或者是“The cats were full”。當我們從左到右讀這個句子,GRU單元將會有個新的變量稱為 ccc ,代表細胞(cell),即記憶細胞(下圖編號1所示)。記憶細胞的作用是提供了記憶的能力,比如說一只貓是單數還是復數,所以當它看到之后的句子的時候,它仍能夠判斷句子的主語是單數還是復數。于是在時間 ttt 處,有記憶細胞 c<t>c^{<t>}c<t> ,然后我們看的是,GRU實際上輸出了激活值 a<t>a^{<t>}a<t>c<t>=a<t>c^{<t>}=a^{<t>}c<t>=a<t> (下圖編號2所示)。于是我們想要使用不同的符號 cccaaa 來表示記憶細胞的值和輸出的激活值,即使它們是一樣的。我現在使用這個標記是因為當我們等會說到LSTMs的時候,這兩個會是不同的值,但是現在對于GRUc<t>c^{<t>}c<t> 的值等于 a<t>a^{<t>}a<t> 的激活值。

所以這些等式表示了GRU單元的計算,在每個時間步,我們將用一個候選值重寫記憶細胞,即 c~<t>\tilde{c}^{<t>}c~<t> 的值,所以它就是個候選值,替代了 c<t>c^{<t>}c<t> 的值。然后我們用tanh激活函數來計算, c~<t>=tanh(Wc[c<t?1>,x<t>]+bc)\tilde{c}^{<t>}=tanh(W_c[c^{<t-1>},x^{<t>}]+b_c)c~<t>=tanh(Wc?[c<t?1>,x<t>]+bc?) ,所以 x~<t>\tilde{x}^{<t>}x~<t> 的值就是個替代值,代替表示 c<t>c^{<t>}c<t> 的值(下圖編號3所示)。

重點來了,在GRU中真正重要的思想是我們有一個門,我先把這個門叫做 Γu\Gamma _uΓu? (上圖編號4所示),這是個下標為 uuu 的大寫希臘字母 Γ\GammaΓuuu 代表更新門,這是一個0到1之間的值。為了讓你直觀思考GRU的工作機制,先思考,這個一直在0到1之間的門值,實際上這個值是把這個式子帶入sigmoid函數得到的, Γu=σ(Wu[c<t?1>,x<t>]+bu)\Gamma_u=\sigma(W_u[c^{<t-1>},x^{<t>}]+b_u)Γu?=σ(Wu?[c<t?1>,x<t>]+bu?) 。我們還記得sigmoid函數是上圖編號5所示這樣的,它的輸出值總是在0到1之間,對于大多數可能的輸入,sigmoid函數的輸出總是非常接近0或者非常接近1。在這樣的直覺下,可以想到 Γu\Gamma_uΓu? 在大多數的情況下非常接近0或1。然后這個字母u表示“update”,我選了字母 Γ\GammaΓ 是因為它看起來像門。還有希臘字母GG是門的首字母,所以G表示門。

然后GRU的關鍵部分就是上圖編號3所示的等式,我們剛才寫出來的用 c~\tilde{c}c~ 更新 ccc 的等式。然后門決定是否要真的更新它。于是我們這么看待它,記憶細胞 c<t>c^{<t>}c<t> 將被設定為0或者1,這取決于你考慮的單詞在句子中是單數還是復數,因為這里是單數情況,所以我們先假定它被設為了1,或者如果是復數的情況我們就把它設為0。然后GRU單元將會一直記住 c<t>c^{<t>}c<t> 的值,直到上圖編號7所示的位置, c<t>c^{<t>}c<t> 的值還是1,這就告訴它,噢,這是單數,所以我們用was。于是門,即 Γu\Gamma_uΓu? 的作用就是決定什么時候你會更新這個值,特別是當你看到詞組the cat,即句子的主語貓,這就是一個好時機去更新這個值。然后當你使用完它的時候,“The cat, which already ate……, was full.”,然后你就知道,我不需要記住它了,我可以忘記它了。

所以我們接下來要給GRU用的式子就是 c<t>=Γu?c~<t>+(1?Γu)?c<t?1>c^{<t>}=\Gamma_u*\tilde{c}^{<t>}+(1-\Gamma_u)*c^{<t-1>}c<t>=Γu??c~<t>+(1?Γu?)?c<t?1> (上圖編號1所示)。你應該注意到了,如果這個更新值 Γu=1\Gamma_u=1Γu?=1 ,也就是說把這個新值,即 c<t>c^{<t>}c<t> 設為候選值( Γu=1\Gamma_u=1Γu?=1 時簡化上式, c<t>=c~<t>c^{<t>}=\tilde{c}^{<t>}c<t>=c~<t> )。將門值設為1(上圖編號2所示),然后往前再更新這個值。對于所有在這中間的值,你應該把門的值設為0,即 Γu=0\Gamma_u=0Γu?=0 ,意思就是說不更新它,就用舊的值。因為如果 Γu=0\Gamma_u=0Γu?=0 ,則 c<t>=c<t?1>c^{<t>}=c^{<t-1>}c<t>=c<t?1>c<t>c^{<t>}c<t> 等于舊的值。甚至你從左到右掃描這個句子,當門值為0的時候(上圖編號3所示,中間 Γu=0\Gamma_u=0Γu?=0 一直為0,表示一直不更新),就是說不更新它的時候,不要更新它,就用舊的值,也不要忘記這個值是什么,這樣即使你一直處理句子到上圖編號4所示, c<t>c^{<t>}c<t> 應該會一直等 c<t?1>c^{<t-1>}c<t?1> ,于是它仍然記得貓是單數的。

讓我再畫個圖來(下圖所示)解釋一下GRU單元,順便說一下,當你在看網絡上的博客或者教科書或者教程之類的,這些圖對于解釋GRU和我們稍后會講的LSTM是相當流行的,我個人感覺式子在圖片中比較容易理解,那么即使看不懂圖片也沒關系,我就畫畫,萬一能幫得上忙就最好了。

GRU單元輸入 c<t?1>c^{<t-1>}c<t?1> (下圖編號1所示),對于上一個時間步,先假設它正好等于 a<t?1>a^{<t-1>}a<t?1> ,所以把這個作為輸入。然后 x<t>x^{<t>}x<t> 也作為輸入(下圖編號2所示),然后把這兩個用合適權重結合在一起,再用tanh計算,算出 c~<t>\tilde{c}^{<t>}c~<t>c~<t>=tanh(Wc[c<t?1>,x<t>]+bc)\tilde{c}^{<t>}=tanh(W_c[c^{<t-1>},x^{<t>}]+b_c)c~<t>=tanh(Wc?[c<t?1>,x<t>]+bc?) ,即 c<t>c^{<t>}c<t> 的替代值。

再用一個不同的參數集,通過sigmoid激活函數算出 Γu\Gamma_uΓu?Γu=σ(Wu[c<t?1>,x<t>]+bu)\Gamma_u=\sigma(W_u[c^{<t-1>},x^{<t>}]+b_u)Γu?=σ(Wu?[c<t?1>,x<t>]+bu?) ,即更新門。最后所有的值通過另一個運算符結合,我并不會寫出公式,但是我用紫色陰影標注的這個方框(下圖編號5所示,其所代表的運算過程即下圖編號13所示的等式),代表了這個式子。所以這就是紫色運算符所表示的是,它輸入一個門值(下圖編號6所示),新的候選值(下圖編號7所示),這再有一個門值(下圖編號8所示)和 c<t>c^{<t>}c<t> 的舊值(下圖編號9所示),所以它把這個(下圖編號1所示)、這個(下圖編號3所示)和這個(下圖編號4所示)作為輸入一起產生記憶細胞的新值 c<t>c^{<t>}c<t> ,所以 c<t>c^{<t>}c<t> 等于 a<t>a^{<t>}a<t> 。如果你想,你也可以也把這個代入softmax或者其他預測 y<t>y^{<t>}y<t> 的東西。

這就是GRU單元或者說是一個簡化過的GRU單元,它的優點就是通過門決定,當你從左(上圖編號10所示)到右掃描一個句子的時候,這個時機是要更新某個記憶細胞,還是不更新,不更新(上圖編號11所示,中間 Γu=0\Gamma_u=0Γu?=0 一直為0,表示一直不更新)直到你到你真的需要使用記憶細胞的時候(上圖編號12所示),這可能在句子之前就決定了。因為sigmoid的值,現在因為門很容易取到0值,只要這個值是一個很大的負數,再由于數值上的四舍五入,上面這些門大體上就是0,或者說非常非常非常接近0。所以在這樣的情況下,這個更新式子(上圖編號13所示的等式)就會變成 c<t>=c<t?1>c^{<t>}=c^{<t-1>}c<t>=c<t?1> ,這非常有利于維持細胞的值。因為 Γu\Gamma_uΓu? 很接近0,可能是0.000001或者更小,這就不會有梯度消失的問題了。因為 Γu\Gamma_uΓu? 很接近0,這就是說 c<t>c^{<t>}c<t> 幾乎就等于 c<t?1>c^{<t-1>}c<t?1> ,而且 c<t>c^{<t>}c<t> 的值也很好地被維持了,即使經過很多很多的時間步(上圖編號14所示)。這就是緩解梯度消失問題的關鍵,因此允許神經網絡運行在非常龐大的依賴詞上,比如說catwas單詞即使被中間的很多單詞分割開。

現在我想說下一些實現的細節,在這個我寫下的式子中 c<t>c^{<t>}c<t> 可以是一個向量(上圖編號1所示),如果你有100維的隱藏的激活值,那么 c<t>c^{<t>}c<t> 也是100維的, c~<t>\tilde{c}^{<t>}c~<t> 也是相同的維度( c~<t>=tanh(Wc[c<t?1>,x<t>]+bc)\tilde{c}^{<t>}=tanh(W_c[c^{<t-1>},x^{<t>}]+b_c)c~<t>=tanh(Wc?[c<t?1>,x<t>]+bc?) ), Γu\Gamma_uΓu? 也是相同的維度( Γu=σ(Wu[c<t?1>,x<t>]+bu)\Gamma_u=\sigma(W_u[c^{<t-1>},x^{<t>}]+b_u)Γu?=σ(Wu?[c<t?1>,x<t>]+bu?) ),還有畫在框中的其他值。這樣的話“ ?*? ”實際上就是元素對應的乘積( c<t>=Γu?c~<t>+(1?Γu)?c<t?1>c^{<t>}=\Gamma_u*\tilde{c}^{<t>}+(1-\Gamma_u)*c^{<t-1>}c<t>=Γu??c~<t>+(1?Γu?)?c<t?1> ),所以這里的 Γu\Gamma_uΓu? :( Γu=σ(Wu[c<t?1>,x<t>]+bu)\Gamma_u=\sigma(W_u[c^{<t-1>},x^{<t>}]+b_u)Γu?=σ(Wu?[c<t?1>,x<t>]+bu?) ),即如果門是一個100維的向量, Γu\Gamma_uΓu? 也就100維的向量,里面的值幾乎都是0或者1,就是說這100維的記憶細胞 c<t>c^{<t>}c<t>c<t>=a<t>c^{<t>}=a^{<t>}c<t>=a<t> 上圖編號1所示)就是你要更新的比特。

當然在實際應用中 Γu\Gamma_uΓu? 不會真的等于0或者1,有時候它是0到1的一個中間值(上圖編號5所示),但是這對于直觀思考是很方便的,就把它當成確切的0,完全確切的0或者就是確切的1。元素對應的乘積做的就是告訴GRU單元哪個記憶細胞的向量維度在每個時間步要做更新,所以你可以選擇保存一些比特不變,而去更新其他的比特。比如說你可能需要一個比特來記憶貓是單數還是復數,其他比特來理解你正在談論食物,因為你在談論吃飯或者食物,然后你稍后可能就會談論“The cat was full.”,你可以每個時間點只改變一些比特。

你現在已經理解GRU最重要的思想了,幻燈片中展示的實際上只是簡化過的GRU單元,現在來描述一下完整的GRU單元。

對于完整的GRU單元我要做的一個改變就是在我們計算的第一個式子中給記憶細胞的新候選值加上一個新的項,我要添加一個門 Γr\Gamma_rΓr? (下圖編號1所示),你可以認為 rrr 代表相關性(relevance)。這個 Γr\Gamma_rΓr? 門告訴你計算出的下一個 c<t>c^{<t>}c<t> 的候選值 c~<t>\tilde{c}^{<t>}c~<t>c<t?1>c^{<t-1>}c<t?1> 有多大的相關性。計算這個門 Γr\Gamma_rΓr? 需要參數,正如你看到的這個,一個新的參數矩陣 WrW_rWr?Γr=σ(Wr[c<t?1>,x<t>]+br)\Gamma_r=\sigma(W_r[c^{<t-1>},x^{<t>}]+b_r)Γr?=σ(Wr?[c<t?1>,x<t>]+br?)

正如你所見,有很多方法可以來設計這些類型的神經網絡,然后我們為什么有 Γr\Gamma_rΓr? ?為什么不用上一張幻燈片里的簡單的版本?這是因為多年來研究者們試驗過很多很多不同可能的方法來設計這些單元,去嘗試讓神經網絡有更深層的連接,去嘗試產生更大范圍的影響,還有解決梯度消失的問題,GRU就是其中一個研究者們最常使用的版本,也被發現在很多不同的問題上也是非常健壯和實用的。你可以嘗試發明新版本的單元,只要你愿意。但是GRU是一個標準版本,也就是最常使用的。你可以想象到研究者們也嘗試了很多其他版本,類似這樣的但不完全是,比如我這里寫的這個。然后另一個常用的版本被稱為LSTM,表示長短時記憶網絡,這個我們會在下節視頻中講到,但是GRULSTM是在神經網絡結構中最常用的兩個具體實例。

還有在符號上的一點,我嘗試去定義固定的符號讓這些概念容易理解,如果你看學術文章的話,你有的時候會看到有些人使用另一種符號 x~,u,r\tilde{x},u,rx~urhhh 表示這些量。但我試著在GRULSTM之間用一種更固定的符號,比如使用更固定的符號 Γ\GammaΓ 來表示門,所以希望這能讓這些概念更好理解。

所以這就是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.)

課程板書





←上一篇↓↑下一篇→
1.8 帶有神經網絡的梯度消失回到目錄1.10 長短期機器 (LSTM)

總結

以上是生活随笔為你收集整理的1.9 GRU 单元-深度学习第五课《序列模型》-Stanford吴恩达教授的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。