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