注:本文為《動(dòng)手學(xué)深度學(xué)習(xí)》開源內(nèi)容,部分標(biāo)注了個(gè)人理解,僅為個(gè)人學(xué)習(xí)記錄,無(wú)抄襲搬運(yùn)意圖
6.2 循環(huán)神經(jīng)網(wǎng)絡(luò)
上一節(jié)介紹的 n n n元語(yǔ)法中,時(shí)間步 t t t的詞 w t w_t wt?基于前面所有詞的條件概率只考慮了最近時(shí)間步的 n ? 1 n-1 n?1個(gè)詞。如果要考慮比 t ? ( n ? 1 ) t-(n-1) t?(n?1)更早時(shí)間步的詞對(duì) w t w_t wt?的可能影響,我們需要增大 n n n。但這樣模型參數(shù)的數(shù)量將隨之呈指數(shù)級(jí)增長(zhǎng)。
本節(jié)將介紹循環(huán)神經(jīng)網(wǎng)絡(luò)。它并非剛性地記憶所有固定長(zhǎng)度的序列,而是通過(guò)隱藏狀態(tài)來(lái)存儲(chǔ)之前時(shí)間步的信息。首先我們回憶一下前面介紹過(guò)的多層感知機(jī),然后描述如何添加隱藏狀態(tài)來(lái)將它變成循環(huán)神經(jīng)網(wǎng)絡(luò)。
6.2.1 不含隱藏狀態(tài)的神經(jīng)網(wǎng)絡(luò)
讓我們考慮一個(gè)含單隱藏層的多層感知機(jī)。給定樣本數(shù)為 n n n、輸入個(gè)數(shù)(特征數(shù)或特征向量維度)為 d d d的小批量數(shù)據(jù)樣本 X ∈ R n × d \boldsymbol{X} \in \mathbb{R}^{n \times d} X∈Rn×d。設(shè)隱藏層的激活函數(shù)為 ? \phi ?,那么隱藏層的輸出 H ∈ R n × h \boldsymbol{H} \in \mathbb{R}^{n \times h} H∈Rn×h計(jì)算為
H = ? ( X W x h + b h ) , \boldsymbol{H} = \phi(\boldsymbol{X} \boldsymbol{W}_{xh} + \boldsymbol_h), H=?(XWxh?+bh?),
其中隱藏層權(quán)重參數(shù) W x h ∈ R d × h \boldsymbol{W}_{xh} \in \mathbb{R}^{d \times h} Wxh?∈Rd×h,隱藏層偏差參數(shù) b h ∈ R 1 × h \boldsymbol_h \in \mathbb{R}^{1 \times h} bh?∈R1×h, h h h為隱藏單元個(gè)數(shù)。上式相加的兩項(xiàng)形狀不同,因此將按照廣播機(jī)制相加。把隱藏變量 H \boldsymbol{H} H作為輸出層的輸入,且設(shè)輸出個(gè)數(shù)為 q q q(如分類問(wèn)題中的類別數(shù)),輸出層的輸出為
O = H W h q + b q , \boldsymbol{O} = \boldsymbol{H} \boldsymbol{W}_{hq} + \boldsymbol_q, O=HWhq?+bq?,
其中輸出變量 O ∈ R n × q \boldsymbol{O} \in \mathbb{R}^{n \times q} O∈Rn×q, 輸出層權(quán)重參數(shù) W h q ∈ R h × q \boldsymbol{W}_{hq} \in \mathbb{R}^{h \times q} Whq?∈Rh×q, 輸出層偏差參數(shù) b q ∈ R 1 × q \boldsymbol_q \in \mathbb{R}^{1 \times q} bq?∈R1×q。如果是分類問(wèn)題,我們可以使用 softmax ( O ) \text{softmax}(\boldsymbol{O}) softmax(O)來(lái)計(jì)算輸出類別的概率分布。
6.2.2 含隱藏狀態(tài)的循環(huán)神經(jīng)網(wǎng)絡(luò)
現(xiàn)在我們考慮輸入數(shù)據(jù)存在時(shí)間相關(guān)性的情況。假設(shè) X t ∈ R n × d \boldsymbol{X}_t \in \mathbb{R}^{n \times d} Xt?∈Rn×d是序列中時(shí)間步 t t t的小批量輸入, H t ∈ R n × h \boldsymbol{H}_t \in \mathbb{R}^{n \times h} Ht?∈Rn×h是該時(shí)間步的隱藏變量。與多層感知機(jī)不同的是,這里我們保存上一時(shí)間步的隱藏變量 H t ? 1 \boldsymbol{H}_{t-1} Ht?1?,并引入一個(gè)新的權(quán)重參數(shù) W h h ∈ R h × h \boldsymbol{W}_{hh} \in \mathbb{R}^{h \times h} Whh?∈Rh×h,該參數(shù)用來(lái)描述在當(dāng)前時(shí)間步如何使用上一時(shí)間步的隱藏變量。具體來(lái)說(shuō),時(shí)間步 t t t的隱藏變量的計(jì)算由當(dāng)前時(shí)間步的輸入和上一時(shí)間步的隱藏變量共同決定:
H t = ? ( X t W x h + H t ? 1 W h h + b h ) . \boldsymbol{H}_t = \phi(\boldsymbol{X}_t \boldsymbol{W}_{xh} + \boldsymbol{H}_{t-1} \boldsymbol{W}_{hh} + \boldsymbol_h). Ht?=?(Xt?Wxh?+Ht?1?Whh?+bh?).
與多層感知機(jī)相比,我們?cè)谶@里添加了 H t ? 1 W h h \boldsymbol{H}_{t-1} \boldsymbol{W}_{hh} Ht?1?Whh?一項(xiàng)。由上式中相鄰時(shí)間步的隱藏變量 H t \boldsymbol{H}_t Ht?和 H t ? 1 \boldsymbol{H}_{t-1} Ht?1?之間的關(guān)系可知,這里的隱藏變量能夠捕捉截至當(dāng)前時(shí)間步的序列的歷史信息,就像是神經(jīng)網(wǎng)絡(luò)當(dāng)前時(shí)間步的狀態(tài)或記憶一樣。因此,該隱藏變量也稱為隱藏狀態(tài)。由于隱藏狀態(tài)在當(dāng)前時(shí)間步的定義使用了上一時(shí)間步的隱藏狀態(tài),上式的計(jì)算是循環(huán)的。使用循環(huán)計(jì)算的網(wǎng)絡(luò)即循環(huán)神經(jīng)網(wǎng)絡(luò)(recurrent neural network)。
循環(huán)神經(jīng)網(wǎng)絡(luò)有很多種不同的構(gòu)造方法。含上式所定義的隱藏狀態(tài)的循環(huán)神經(jīng)網(wǎng)絡(luò)是極為常見的一種。若無(wú)特別說(shuō)明,本章中的循環(huán)神經(jīng)網(wǎng)絡(luò)均基于上式中隱藏狀態(tài)的循環(huán)計(jì)算。在時(shí)間步 t t t,輸出層的輸出和多層感知機(jī)中的計(jì)算類似:
O t = H t W h q + b q . \boldsymbol{O}_t = \boldsymbol{H}_t \boldsymbol{W}_{hq} + \boldsymbol_q. Ot?=Ht?Whq?+bq?.
循環(huán)神經(jīng)網(wǎng)絡(luò)的參數(shù)包括隱藏層的權(quán)重 W x h ∈ R d × h \boldsymbol{W}_{xh} \in \mathbb{R}^{d \times h} Wxh?∈Rd×h、 W h h ∈ R h × h \boldsymbol{W}_{hh} \in \mathbb{R}^{h \times h} Whh?∈Rh×h和偏差 b h ∈ R 1 × h \boldsymbol_h \in \mathbb{R}^{1 \times h} bh?∈R1×h,以及輸出層的權(quán)重 W h q ∈ R h × q \boldsymbol{W}_{hq} \in \mathbb{R}^{h \times q} Whq?∈Rh×q和偏差 b q ∈ R 1 × q \boldsymbol_q \in \mathbb{R}^{1 \times q} bq?∈R1×q。值得一提的是,即便在不同時(shí)間步,循環(huán)神經(jīng)網(wǎng)絡(luò)也始終使用這些模型參數(shù)。因此,循環(huán)神經(jīng)網(wǎng)絡(luò)模型參數(shù)的數(shù)量不隨時(shí)間步的增加而增長(zhǎng)。
圖6.1展示了循環(huán)神經(jīng)網(wǎng)絡(luò)在3個(gè)相鄰時(shí)間步的計(jì)算邏輯。在時(shí)間步 t t t,隱藏狀態(tài)的計(jì)算可以看成是將輸入 X t \boldsymbol{X}_t Xt?和前一時(shí)間步隱藏狀態(tài) H t ? 1 \boldsymbol{H}_{t-1} Ht?1?連結(jié)后輸入一個(gè)激活函數(shù)為 ? \phi ?的全連接層。該全連接層的輸出就是當(dāng)前時(shí)間步的隱藏狀態(tài) H t \boldsymbol{H}_t Ht?,且模型參數(shù)為 W x h \boldsymbol{W}_{xh} Wxh?與 W h h \boldsymbol{W}_{hh} Whh?的連結(jié),偏差為 b h \boldsymbol_h bh?。當(dāng)前時(shí)間步 t t t的隱藏狀態(tài) H t \boldsymbol{H}_t Ht?將參與下一個(gè)時(shí)間步 t + 1 t+1 t+1的隱藏狀態(tài) H t + 1 \boldsymbol{H}_{t+1} Ht+1?的計(jì)算,并輸入到當(dāng)前時(shí)間步的全連接輸出層。
我們剛剛提到,隱藏狀態(tài)中
X
t
W
x
h
+
H
t
?
1
W
h
h
\boldsymbol{X}_t \boldsymbol{W}_{xh} + \boldsymbol{H}_{t-1} \boldsymbol{W}_{hh}
Xt?Wxh?+Ht?1?Whh?的計(jì)算等價(jià)于
X
t
\boldsymbol{X}_t
Xt?與
H
t
?
1
\boldsymbol{H}_{t-1}
Ht?1?連結(jié)后的矩陣乘以
W
x
h
\boldsymbol{W}_{xh}
Wxh?與
W
h
h
\boldsymbol{W}_{hh}
Whh?連結(jié)后的矩陣。接下來(lái),我們用一個(gè)具體的例子來(lái)驗(yàn)證這一點(diǎn)。首先,我們構(gòu)造矩陣X
、W_xh
、H
和W_hh
,它們的形狀分別為(3, 1)、(1, 4)、(3, 4)和(4, 4)。將X
與W_xh
、H
與W_hh
分別相乘,再把兩個(gè)乘法運(yùn)算的結(jié)果相加,得到形狀為(3, 4)的矩陣。
import torch
X, W_xh = torch.randn(3, 1), torch.randn(1, 4)
H, W_hh = torch.randn(3, 4), torch.randn(4, 4)
torch.matmul(X, W_xh) + torch.matmul(H, W_hh)
輸出:
tensor([[ 5.2633, -3.2288, 0.6037, -1.3321],
[ 9.4012, -6.7830, 1.0630, -0.1809],
[ 7.0355, -2.2361, 0.7469, -3.4667]])
將矩陣X
和H
按列(維度1)連結(jié),連結(jié)后的矩陣形狀為(3, 5)??梢?,連結(jié)后矩陣在維度1的長(zhǎng)度為矩陣X
和H
在維度1的長(zhǎng)度之和(
1
+
4
1+4
1+4)。然后,將矩陣W_xh
和W_hh
按行(維度0)連結(jié),連結(jié)后的矩陣形狀為(5, 4)。最后將兩個(gè)連結(jié)后的矩陣相乘,得到與上面代碼輸出相同的形狀為(3, 4)的矩陣。
torch.matmul(torch.cat((X, H), dim=1), torch.cat((W_xh, W_hh), dim=0))
輸出:
tensor([[ 5.2633, -3.2288, 0.6037, -1.3321],
[ 9.4012, -6.7830, 1.0630, -0.1809],
[ 7.0355, -2.2361, 0.7469, -3.4667]])
6.2.3 應(yīng)用:基于字符級(jí)循環(huán)神經(jīng)網(wǎng)絡(luò)的語(yǔ)言模型
最后我們介紹如何應(yīng)用循環(huán)神經(jīng)網(wǎng)絡(luò)來(lái)構(gòu)建一個(gè)語(yǔ)言模型。設(shè)小批量中樣本數(shù)為1,文本序列為“想”“要”“有”“直”“升”“機(jī)”。圖6.2演示了如何使用循環(huán)神經(jīng)網(wǎng)絡(luò)基于當(dāng)前和過(guò)去的字符來(lái)預(yù)測(cè)下一個(gè)字符。在訓(xùn)練時(shí),我們對(duì)每個(gè)時(shí)間步的輸出層輸出使用softmax運(yùn)算,然后使用交叉熵?fù)p失函數(shù)來(lái)計(jì)算它與標(biāo)簽的誤差。在圖6.2中,由于隱藏層中隱藏狀態(tài)的循環(huán)計(jì)算,時(shí)間步3的輸出 O 3 \boldsymbol{O}_3 O3?取決于文本序列“想”“要”“有”。 由于訓(xùn)練數(shù)據(jù)中該序列的下一個(gè)詞為“直”,時(shí)間步3的損失將取決于該時(shí)間步基于序列“想”“要”“有”生成下一個(gè)詞的概率分布與該時(shí)間步的標(biāo)簽“直”。
因?yàn)槊總€(gè)輸入詞是一個(gè)字符,因此這個(gè)模型被稱為字符級(jí)循環(huán)神經(jīng)網(wǎng)絡(luò)(character-level recurrent neural network)。因?yàn)椴煌址膫€(gè)數(shù)遠(yuǎn)小于不同詞的個(gè)數(shù)(對(duì)于英文尤其如此),所以字符級(jí)循環(huán)神經(jīng)網(wǎng)絡(luò)的計(jì)算通常更加簡(jiǎn)單。在接下來(lái)的幾節(jié)里,我們將介紹它的具體實(shí)現(xiàn)。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-838774.html
小結(jié)
- 使用循環(huán)計(jì)算的網(wǎng)絡(luò)即循環(huán)神經(jīng)網(wǎng)絡(luò)。
- 循環(huán)神經(jīng)網(wǎng)絡(luò)的隱藏狀態(tài)可以捕捉截至當(dāng)前時(shí)間步的序列的歷史信息。
- 循環(huán)神經(jīng)網(wǎng)絡(luò)模型參數(shù)的數(shù)量不隨時(shí)間步的增加而增長(zhǎng)。
- 可以基于字符級(jí)循環(huán)神經(jīng)網(wǎng)絡(luò)來(lái)創(chuàng)建語(yǔ)言模型。
注:除代碼外本節(jié)與原書此節(jié)基本相同,原書傳送門文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-838774.html
到了這里,關(guān)于【深度學(xué)習(xí)筆記】6_2 循環(huán)神經(jīng)網(wǎng)絡(luò)RNN(recurrent neural network)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!