(pytorch-深度学习)循环神经网络
循環神經網絡
在nnn元語法中,時間步ttt的詞wtw_twt?基于前面所有詞的條件概率只考慮了最近時間步的n?1n-1n?1個詞。如果要考慮比t?(n?1)t-(n-1)t?(n?1)更早時間步的詞對wtw_twt?的可能影響,需要增大nnn。
這樣模型參數的數量將隨之呈指數級增長。
循環神經網絡并非剛性地記憶所有固定長度的序列,而是通過隱藏狀態來存儲之前時間步的信息。
不含隱藏狀態的神經網絡
一個含單隱藏層的多層感知機
- 給定樣本數為nnn、輸入個數(特征數或特征向量維度)為ddd的小批量數據樣本X∈Rn×d\boldsymbol{X} \in \mathbb{R}^{n \times d}X∈Rn×d。設隱藏層的激活函數為?\phi?,那么隱藏層的輸出H∈Rn×h\boldsymbol{H} \in \mathbb{R}^{n \times h}H∈Rn×h計算為
H=?(XWxh+bh),\boldsymbol{H} = \phi(\boldsymbol{X} \boldsymbol{W}_{xh} + \boldsymbol{b}_h),H=?(XWxh?+bh?),
其中隱藏層權重參數Wxh∈Rd×h\boldsymbol{W}_{xh} \in \mathbb{R}^{d \times h}Wxh?∈Rd×h,隱藏層偏差參數 bh∈R1×h\boldsymbol{b}_h \in \mathbb{R}^{1 \times h}bh?∈R1×h,hhh為隱藏單元個數。上式相加的兩項形狀不同,因此將按照廣播機制相加。
- 把隱藏變量H\boldsymbol{H}H作為輸出層的輸入,且設輸出個數為qqq(如分類問題中的類別數),輸出層的輸出為
O=HWhq+bq,\boldsymbol{O} = \boldsymbol{H} \boldsymbol{W}_{hq} + \boldsymbol{b}_q,O=HWhq?+bq?,
其中輸出變量O∈Rn×q\boldsymbol{O} \in \mathbb{R}^{n \times q}O∈Rn×q, 輸出層權重參數Whq∈Rh×q\boldsymbol{W}_{hq} \in \mathbb{R}^{h \times q}Whq?∈Rh×q, 輸出層偏差參數bq∈R1×q\boldsymbol{b}_q \in \mathbb{R}^{1 \times q}bq?∈R1×q。如果是分類問題,我們可以使用softmax(O)\text{softmax}(\boldsymbol{O})softmax(O)來計算輸出類別的概率分布。
含隱藏狀態的循環神經網絡
考慮輸入數據存在時間相關性,假設Xt∈Rn×d\boldsymbol{X}_t \in \mathbb{R}^{n \times d}Xt?∈Rn×d是序列中時間步ttt的小批量輸入,Ht∈Rn×h\boldsymbol{H}_t \in \mathbb{R}^{n \times h}Ht?∈Rn×h是該時間步的隱藏變量。
- 與多層感知機不同的是,這里我們保存上一時間步的隱藏變量Ht?1\boldsymbol{H}_{t-1}Ht?1?,并引入一個新的權重參數Whh∈Rh×h\boldsymbol{W}_{hh} \in \mathbb{R}^{h \times h}Whh?∈Rh×h,該參數用來描述在當前時間步如何使用上一時間步的隱藏變量。
- 具體來說,時間步ttt的隱藏變量的計算由當前時間步的輸入和上一時間步的隱藏變量共同決定:
Ht=?(XtWxh+Ht?1Whh+bh)\boldsymbol{H}_t = \phi(\boldsymbol{X}_t \boldsymbol{W}_{xh} + \boldsymbol{H}_{t-1} \boldsymbol{W}_{hh} + \boldsymbol{b}_h)Ht?=?(Xt?Wxh?+Ht?1?Whh?+bh?)
與多層感知機相比,這里多了了Ht?1Whh\boldsymbol{H}{t-1} \boldsymbol{W}{hh}Ht?1Whh一項。
由上式中相鄰時間步的隱藏變量Ht\boldsymbol{H}tHt和Ht?1\boldsymbol{H}{t-1}Ht?1之間的關系可知,這里的隱藏變量能夠捕捉截至當前時間步的序列的歷史信息,就像是神經網絡當前時間步的狀態或記憶一樣。因此,該隱藏變量也稱為隱藏狀態。
- 由于隱藏狀態在當前時間步的定義使用了上一時間步的隱藏狀態,上式的計算是循環的。使用循環計算的網絡即循環神經網絡(recurrent neural network)。
循環神經網絡有很多種不同的構造方法。含上式所定義的隱藏狀態的循環神經網絡是極為常見的一種。在時間步ttt,輸出層的輸出和多層感知機中的計算類似:
Ot=HtWhq+bq\boldsymbol{O}_t = \boldsymbol{H}_t \boldsymbol{W}_{hq} + \boldsymbol{b}_qOt?=Ht?Whq?+bq?
循環神經網絡的參數包括
- 隱藏層的權重Wxh∈Rd×h\boldsymbol{W}_{xh} \in \mathbb{R}^{d \times h}Wxh?∈Rd×h、Whh∈Rh×h\boldsymbol{W}_{hh} \in \mathbb{R}^{h \times h}Whh?∈Rh×h和偏差 bh∈R1×h\boldsymbol{b}_h \in \mathbb{R}^{1 \times h}bh?∈R1×h
- 輸出層的權重Whq∈Rh×q\boldsymbol{W}_{hq} \in \mathbb{R}^{h \times q}Whq?∈Rh×q和偏差bq∈R1×q\boldsymbol{b}_q \in \mathbb{R}^{1 \times q}bq?∈R1×q。
- 即便在不同時間步,循環神經網絡也始終使用這些模型參數。因此,循環神經網絡模型參數的數量不隨時間步的增加而增長。
下圖展示了循環神經網絡在3個相鄰時間步的計算邏輯。
- 在時間步ttt,隱藏狀態的計算可以看成是將輸入Xt\boldsymbol{X}_tXt?和前一時間步隱藏狀態Ht?1\boldsymbol{H}_{t-1}Ht?1?連結后輸入一個激活函數為?\phi?的全連接層。
- 該全連接層的輸出就是當前時間步的隱藏狀態Ht\boldsymbol{H}_tHt?
- 模型參數為Wxh\boldsymbol{W}_{xh}Wxh?與Whh\boldsymbol{W}_{hh}Whh?的連結,偏差為bh\boldsymbol{b}_hbh?。當前時間步ttt的隱藏狀態Ht\boldsymbol{H}_tHt?將參與下一個時間步t+1t+1t+1的隱藏狀態Ht+1\boldsymbol{H}_{t+1}Ht+1?的計算,并輸入到當前時間步的全連接輸出層。
隱藏狀態中XtWxh+Ht?1Whh\boldsymbol{X}_t \boldsymbol{W}_{xh} + \boldsymbol{H}_{t-1} \boldsymbol{W}_{hh}Xt?Wxh?+Ht?1?Whh?的計算等價于Xt\boldsymbol{X}_tXt?與Ht?1\boldsymbol{H}_{t-1}Ht?1?連結后的矩陣乘以Wxh\boldsymbol{W}_{xh}Wxh?與Whh\boldsymbol{W}_{hh}Whh?連結后的矩陣。
我們用一個具體的例子來驗證這一點。
- 首先,我們構造矩陣X、W_xh、H和W_hh,它們的形狀分別為(3, 1)、(1, 4)、(3, 4)和(4, 4)。
- 將X與W_xh、H與W_hh分別相乘,再把兩個乘法運算的結果相加,得到形狀為(3, 4)的矩陣。
-
將矩陣X和H按列(維度1)連結,連結后的矩陣形狀為(3, 5)。可見,連結后矩陣在維度1的長度為矩陣X和H在維度1的長度之和(1+41+41+4)。
-
然后,將矩陣W_xh和W_hh按行(維度0)連結,連結后的矩陣形狀為(5, 4)。最后將兩個連結后的矩陣相乘,得到與上面代碼輸出相同的形狀為(3, 4)的矩陣。
總結為:
XtWxh+Ht?1Whh=[xtHt?1]?[WxhWhh]\boldsymbol{X}_t \boldsymbol{W}_{xh} + \boldsymbol{H}_{t-1} \boldsymbol{W}_{hh}=\begin{bmatrix} x_t &H_{t-1}\end{bmatrix}*\begin{bmatrix} W_{xh} \\ W_{hh}\end{bmatrix}Xt?Wxh?+Ht?1?Whh?=[xt??Ht?1??]?[Wxh?Whh??]
應用:基于字符級循環神經網絡的語言模型
應用循環神經網絡來構建一個語言模型
設小批量中樣本數為1,文本序列為“想”“要”“有”“直”“升”“機”。
下圖演示了如何使用循環神經網絡基于當前和過去的字符來預測下一個字符。
在訓練時
- 對每個時間步的輸出層輸出使用softmax運算
- 然后使用交叉熵損失函數來計算它與標簽的誤差。
由于隱藏層中隱藏狀態的循環計算,時間步3的輸出O3\boldsymbol{O}_3O3?取決于文本序列“想”“要”“有”。 由于訓練數據中該序列的下一個詞為“直”,時間步3的損失將取決于該時間步基于序列“想”“要”“有”生成下一個詞的概率分布與該時間步的標簽“直”。
因為每個輸入詞是一個字符,因此這個模型被稱為字符級循環神經網絡(character-level recurrent neural network)。因為不同字符的個數遠小于不同詞的個數(對于英文尤其如此),所以字符級循環神經網絡的計算通常更加簡單。
《動手學深度學習》
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的(pytorch-深度学习)循环神经网络的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: windows10 计算文件的HASH(
- 下一篇: java dom xpath_Java: