1.3 循环神经网络模型-深度学习第五课《序列模型》-Stanford吴恩达教授
| 1.2 數學符號 | 回到目錄 | 1.4 通過時間的方向傳播 |
循環神經網絡模型 (Recurrent Neural Network Model)
上節視頻中,你了解了我們用來定義序列學習問題的符號。現在我們討論一下怎樣才能建立一個模型,建立一個神經網絡來學習 XXX 到 YYY 的映射。
可以嘗試的方法之一是使用標準神經網絡,在我們之前的例子中,我們有9個輸入單詞。想象一下,把這9個輸入單詞,可能是9個one-hot向量,然后將它們輸入到一個標準神經網絡中,經過一些隱藏層,最終會輸出9個值為0或1的項,它表明每個輸入單詞是否是人名的一部分。
但結果表明這個方法并不好,主要有兩個問題,
一、是輸入和輸出數據在不同例子中可以有不同的長度,不是所有的例子都有著同樣輸入長度 TxT_xTx? 或是同樣輸出長度的 TyT_yTy? 。即使每個句子都有最大長度,也許你能夠填充(pad)或零填充(zero pad)使每個輸入語句都達到最大長度,但仍然看起來不是一個好的表達方式。
二、一個像這樣單純的神經網絡結構,它并不共享從文本的不同位置上學到的特征。具體來說,如果神經網絡已經學習到了在位置1出現的Harry可能是人名的一部分,那么如果Harry出現在其他位置,比如 x<t>x^{<t>}x<t> 時,它也能夠自動識別其為人名的一部分的話,這就很棒了。這可能類似于你在卷積神經網絡中看到的,你希望將部分圖片里學到的內容快速推廣到圖片的其他部分,而我們希望對序列數據也有相似的效果。和你在卷積網絡中學到的類似,用一個更好的表達方式也能夠讓你減少模型中參數的數量。
之前我們提到過這些(上圖編號1所示的 x<1>……x<t>……x<Tx>x^{<1>}……x^{<t>}……x^{<T_x>}x<1>……x<t>……x<Tx?> )都是10,000維的one-hot向量,因此這會是十分龐大的輸入層。如果總的輸入大小是最大單詞數乘以10,000,那么第一層的權重矩陣就會有著巨量的參數。但循環神經網絡就沒有上述的兩個問題。
那么什么是循環神經網絡呢?我們先建立一個(下圖編號1所示)。如果你以從左到右的順序讀這個句子,第一個單詞就是,假如說是 x<1>x^{<1>}x<1> ,我們要做的就是將第一個詞輸入一個神經網絡層,我打算這樣畫,第一個神經網絡的隱藏層,我們可以讓神經網絡嘗試預測輸出,判斷這是否是人名的一部分。循環神經網絡做的是,當它讀到句中的第二個單詞時,假設是 x<2>x^{<2>}x<2> ,它不是僅用 x<2>x^{<2>}x<2> 就預測出 y^<2>\hat{y}^{<2>}y^?<2> ,他也會輸入一些來自時間步1的信息。具體而言,時間步1的激活值就會傳遞到時間步2。然后,在下一個時間步,循環神經網絡輸入了單詞 x<3>x^{<3>}x<3> ,然后它嘗試預測輸出了預測結果 y^<3>\hat{y}^{<3>}y^?<3> ,等等,一直到最后一個時間步,輸入了 x<Tx>x^{<T_x>}x<Tx?> ,然后輸出了 y^<Ty>\hat{y}^{<T_y>}y^?<Ty?> 。至少在這個例子中 Tx=TyT_x=T_yTx?=Ty? ,同時如果 TxT_xTx? 和 TyT_yTy? 不相同,這個結構會需要作出一些改變。所以在每一個時間步中,循環神經網絡傳遞一個激活值到下一個時間步中用于計算。
要開始整個流程,在零時刻需要構造一個激活值 a<0>a^{<0>}a<0> ,這通常是零向量。有些研究人員會隨機用其他方法初始化 a<0>a^{<0>}a<0> ,不過使用零向量作為零時刻的偽激活值是最常見的選擇,因此我們把它輸入神經網絡。
在一些研究論文中或是一些書中你會看到這類神經網絡,用這樣的圖形來表示(上圖編號2所示),在每一個時間步中,你輸入 x<t>x^{<t>}x<t> 然后輸出 y<t>y^{<t>}y<t> 。然后為了表示循環連接有時人們會像這樣畫個圈,表示輸回網絡層,有時他們會畫一個黑色方塊,來表示在這個黑色方塊處會延遲一個時間步。我個人認為這些循環圖很難理解,所以在本次課程中,我畫圖更傾向于使用左邊這種分布畫法(上圖編號1所示)。不過如果你在教材中或是研究論文中看到了右邊這種圖表的畫法(上圖編號2所示),它可以在心中將這圖展開成左圖那樣。
循環神經網絡是從左向右掃描數據,同時每個時間步的參數也是共享的,所以下頁幻燈片中我們會詳細講述它的一套參數,我們用 WaxW_{ax}Wax? 來表示管理著從 x<1>x^{<1>}x<1> 到隱藏層的連接的一系列參數,每個時間步使用的都是相同的參數 WaxW_{ax}Wax? 。而激活值也就是水平聯系是由參數 WaaW_{aa}Waa? 決定的,同時每一個時間步都使用相同的參數 WaaW_{aa}Waa? ,同樣的輸出結果由 WyaW_{ya}Wya? 決定。下圖詳細講述這些參數是如何起作用。
在這個循環神經網絡中,它的意思是在預測 y^<3>\hat{y}^{<3>}y^?<3> 時,不僅要使用 x<3>x^{<3>}x<3> 的信息,還要使用來自 x<1>x^{<1>}x<1> 和 x<2>x^{<2>}x<2> 的信息,因為來自 x<1>x^{<1>}x<1> 的信息可以通過這樣的路徑(上圖編號1所示的路徑)來幫助預測 y^<3>\hat{y}^{<3>}y^?<3> 。這個循環神經網絡的一個缺點就是它只使用了這個序列中之前的信息來做出預測,尤其當預測 y^<3>\hat{y}^{<3>}y^?<3> 時,它沒有用到 x<4>,x<5>,x<6>x^{<4>},x^{<5>},x^{<6>}x<4>,x<5>,x<6> 等等的信息。所以這就有一個問題,因為如果給定了這個句子,“Teddy Roosevelt was a great President.”,為了判斷Teddy是否是人名的一部分,僅僅知道句中前兩個詞是完全不夠的,還需要知道句中后部分的信息,這也是十分有用的,因為句子也可能是這樣的,“Teddy bears are on sale!”。因此如果只給定前三個單詞,是不可能確切地知道Teddy是否是人名的一部分,第一個例子是人名,第二個例子就不是,所以你不可能只看前三個單詞就能分辨出其中的區別。
所以這樣特定的神經網絡結構的一個限制是它在某一時刻的預測僅使用了從序列之前的輸入信息并沒有使用序列中后部分的信息,我們會在之后的雙向循環神經網絡(BRNN)的視頻中處理這個問題。但對于現在,這個更簡單的單向神經網絡結構就夠我們來解釋關鍵概念了,之后只要在此基礎上作出修改就能同時使用序列中前面和后面的信息來預測 y^<3>\hat{y}^{<3>}y^?<3> ,不過我們會在之后的視頻講述這些內容,接下來我們具體地寫出這個神經網絡計算了些什么。
這里是一張清理后的神經網絡示意圖,和我之前提及的一樣,一般開始先輸入 a<0>a^{<0>}a<0> ,它是一個零向量。接著就是前向傳播過程,先計算激活值 a<1>a^{<1>}a<1> ,然后再計算 y<1>y^{<1>}y<1> 。
a<1>=g1(Waaa<0>+Waxx<1>+ba)a^{<1>}=g_1(W_{aa}a^{<0>}+W_{ax}x^{<1>}+b_a)a<1>=g1?(Waa?a<0>+Wax?x<1>+ba?)
y^<1>=g2(Wyaa<1>+by)\hat{y}^{<1>}=g_2(W_{ya}a^{<1>}+b_y)y^?<1>=g2?(Wya?a<1>+by?)
我將用這樣的符號約定來表示這些矩陣下標,舉個例子 WaxW_{ax}Wax? ,第二個下標意味著 WaxW_{ax}Wax? 要乘以某個 xxx 類型的量,然后第一個下標 aaa 表示它是用來計算某個 aaa 類型的變量。同樣的,可以看出這里的 WyaW_{ya}Wya? 乘上了某個 aaa 類型的量,用來計算出某個 y^\hat{y}y^? 類型的量。
循環神經網絡用的激活函數經常是tanh,不過有時候也會用ReLU,但是tanh是更通常的選擇,我們有其他方法來避免梯度消失問題,我們將在之后進行講述。選用哪個激活函數是取決于你的輸出 yyy ,如果它是一個二分問題,那么我猜你會用sigmoid函數作為激活函數,如果是 kkk 類別分類問題的話,那么可以選用softmax作為激活函數。不過這里激活函數的類型取決于你有什么樣類型的輸出 yyy ,對于命名實體識別來說 yyy 只可能是0或者1,那我猜這里第二個激活函數 ggg 可以是sigmoid激活函數。
更一般的情況下,在 ttt 時刻,
a<t>=g1(Waaa<t?1>+Waxx<t>+ba)a^{<t>}=g_1(W_{aa}a^{<t-1>}+W_{ax}x^{<t>}+b_a)a<t>=g1?(Waa?a<t?1>+Wax?x<t>+ba?)
y^<t>=g2(Wyaa<t>+by)\hat{y}^{<t>}=g_2(W_{ya}a^{<t>}+b_y)y^?<t>=g2?(Wya?a<t>+by?)
所以這些等式定義了神經網絡的前向傳播,你可以從零向量 a<0>a^{<0>}a<0> 開始,然后用 a<0>a^{<0>}a<0> 和 x<1>x^{<1>}x<1> 來計算出 a<1>a^{<1>}a<1> 和 y^<1>\hat{y}^{<1>}y^?<1> ,然后用 x<2>x^{<2>}x<2> 和 a<1>a^{<1>}a<1> 一起算出 a<2>a^{<2>}a<2> 和 y^<2>\hat{y}^{<2>}y^?<2> 等等,像圖中這樣,從左到右完成前向傳播。
現在為了幫我們建立更復雜的神經網絡,我實際要將這個符號簡化一下,我在下一張幻燈片里復制了這兩個等式(上圖編號1所示的兩個等式)。
接下來為了簡化這些符號,我要將這部分( Waaa<t?1>+Waxx<t>W_{aa}a^{<t-1>}+W_{ax}x^{<t>}Waa?a<t?1>+Wax?x<t> )(上圖編號1所示)以更簡單的形式寫出來,我把它寫做 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?) (上圖編號2所示),那么左右兩邊劃線部分應該是等價的。所以我們定義 WaW_aWa? 的方式是將矩陣 WaaW_{aa}Waa? 和矩陣 WaxW_{ax}Wax? 水平并列放置, [Waa?Wax]=Wa[W_{aa}\vdots W_{ax}]=W_a[Waa??Wax?]=Wa? (上圖編號3所示)。舉個例子,如果 aaa 是100維的,然后延續之前的例子, xxx 是10,000維的,那么 WaaW_{aa}Waa? 就是個
( 100,100100,100100,100 )維的矩陣, WaxW_{ax}Wax? 就是個( 100,10,000100,10,000100,10,000 )維的矩陣,因此如果將這兩個矩陣堆起來, WaW_{a}Wa? 就會是個( 100,10,100100,10,100100,10,100 )維的矩陣。
用這個符號( [a<t?1>,x<t>][a^{<t-1>},x^{<t>}][a<t?1>,x<t>] )的意思是將這兩個向量堆在一起,我會用這個符號表示,即 [a<t?1>x<t>]\left[\begin{matrix} a^{<t-1>}\\x^{<t>} \end{matrix}\right][a<t?1>x<t>?] (上圖編號4所示),最終這就是個10,100維的向量。你可以自己檢查一下,用這個矩陣乘以這個向量,剛好能夠得到原來的量,因為此時,矩陣 [Waa?Wax][W_{aa}\vdots W_{ax}][Waa??Wax?] 乘以 [a<t?1>x<t>]\left[\begin{matrix} a^{<t-1>}\\x^{<t>} \end{matrix}\right][a<t?1>x<t>?] ,剛好等于 Waaa<t?1>+Waxx<t>W_{aa}a^{<t-1>}+W_{ax}x^{<t>}Waa?a<t?1>+Wax?x<t> ,剛好等于之前的這個結論(上圖編號5所示)。這種記法的好處是我們可以不使用兩個參數矩陣 WaaW_{aa}Waa? 和 WaxW_{ax}Wax? ,而是將其壓縮成一個參數矩陣 WaW_aWa? ,所以當我們建立更復雜模型時這就能夠簡化我們要用到的符號。
同樣對于這個例子( y^<t>=g(Wyaa<t>+by)\hat{y}^{<t>}=g(W_{ya}a^{<t>}+b_y)y^?<t>=g(Wya?a<t>+by?) ),我會用更簡單的方式重寫, y^<t>=g(Wya<t>+by)\hat{y}^{<t>}=g(W_ya^{<t>}+b_y)y^?<t>=g(Wy?a<t>+by?) (上圖編號6所示)。現在 WyW_yWy? 和 byb_yby? 符號僅有一個下標,它表示在計算時會輸出什么類型的量,所以 WyW_yWy? 就表明它是計算 yyy 類型的量的權重矩陣,而上面的 WaW_aWa? 和 bab_aba? 則表示這些參數是用來計算 aaa 類型或者說是激活值的。
RNN前向傳播示意圖:
好就這么多,你現在知道了基本的循環神經網絡,下節課我們會一起來討論反向傳播,以及你如何能夠用RNN進行學習。
課程板書
| 1.2 數學符號 | 回到目錄 | 1.4 通過時間的方向傳播 |
總結
以上是生活随笔為你收集整理的1.3 循环神经网络模型-深度学习第五课《序列模型》-Stanford吴恩达教授的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1.2 数学符号-深度学习第五课《序列模
- 下一篇: 1.4 通过时间的反向传播-深度学习第五