一、循環(huán)神經(jīng)網(wǎng)絡(luò)簡介
循環(huán)神經(jīng)網(wǎng)絡(luò),英文全稱:Recurrent Neural Network,或簡單記為RNN。需要注意的是,遞歸神經(jīng)網(wǎng)絡(luò)(Recursive Neural Network)的簡寫也是RNN,但通常RNN指循環(huán)神經(jīng)網(wǎng)絡(luò)。循環(huán)神經(jīng)網(wǎng)絡(luò)是一類用于處理序列數(shù)據(jù)的神經(jīng)網(wǎng)絡(luò)。它與其他神經(jīng)網(wǎng)絡(luò)的不同是,RNN可以更好的去處理序列的信息,即認(rèn)準(zhǔn)了前后的輸入之間存在關(guān)系。在NLP中,去理解一整句話,孤立的理解組成這句話的詞顯然是不夠的,我們需要整體的處理由這些詞連接起來的整個(gè)序列。
如:(1) 我餓了,我要去食堂___。(2) 我飯卡丟了,我要去食堂___。很顯然,第一句話是想表明去食堂就餐,而第二句則很有可能因?yàn)閯偝赃^飯,發(fā)現(xiàn)飯卡不見了,去食堂尋找飯卡。而在此之前,我們常用的語言模型是N-Gram,無論何種語境,可能去食堂大概率匹配的是“吃飯”而不在乎之前的信息。RNN就解決了N-Gram的缺陷,它在理論上可以往前(后)看任意多個(gè)詞。
此文是我在學(xué)習(xí)RNN中所做的筆記,參考資料在文末提及。
二、循環(huán)神經(jīng)網(wǎng)絡(luò)分類
a.簡單的MLP神經(jīng)網(wǎng)絡(luò)
簡單的MLP三層網(wǎng)絡(luò)模型,x、o為向量,分別表示輸入層、輸出層的值;U、V為矩陣,U是輸入層到隱藏層的權(quán)重矩陣,V是隱藏層到輸出層的權(quán)重矩陣。
b.循環(huán)神經(jīng)網(wǎng)絡(luò)
與簡單的MLP神經(jīng)網(wǎng)絡(luò)不容的是,循環(huán)神經(jīng)網(wǎng)絡(luò)的隱藏層的值s不僅取決于當(dāng)前的這次輸入x,還取決于上一次隱藏層的值s。權(quán)重就在W就是隱藏層上一次的值作為這一次輸入的輸入的權(quán)重。將上圖展開:
由上圖可知以下公式,其中V是輸出層權(quán)重矩陣,g是激活函數(shù);U是輸入x的權(quán)重矩陣,W是上一次的值st-1作為這一次的輸入的權(quán)重矩陣,f是激活函數(shù)。
反復(fù)帶入,即可得到:
可見,循環(huán)神經(jīng)網(wǎng)絡(luò)的輸出值ot受之前的輸出值xt、xt-1、xt-2所影響。
c. 雙向循環(huán)神經(jīng)網(wǎng)絡(luò)
雙向循環(huán)神經(jīng)網(wǎng)絡(luò)的計(jì)算方法:
從上面三個(gè)公式可以看出: 正向計(jì)算時(shí),隱藏層的值與st 和 st-1有關(guān),而反向計(jì)算時(shí),隱藏層的值與s't和s't+1有關(guān);最終的輸出取決于正向與反向計(jì)算的加和。
d、深度循環(huán)神經(jīng)網(wǎng)絡(luò)
此前介紹的循環(huán)神經(jīng)網(wǎng)絡(luò)只有一個(gè)輸入層、一個(gè)循環(huán)層和一個(gè)輸出層。與全連接神經(jīng)網(wǎng)絡(luò)以及卷積神經(jīng)網(wǎng)絡(luò)一樣,可以把它推廣到任意多個(gè)隱藏層的情況,得到深層循環(huán)神經(jīng)網(wǎng)絡(luò)。深度循環(huán)神經(jīng)網(wǎng)絡(luò)包含多個(gè)隱藏層(上圖為了表示清楚,只列舉了2層),并且也繼承了雙向循環(huán)神經(jīng)網(wǎng)絡(luò)的特點(diǎn)。由之前的公式類推,我們可以得到深度循環(huán)神經(jīng)網(wǎng)絡(luò)的計(jì)算方式:
深層神經(jīng)網(wǎng)絡(luò)有3個(gè)方案:第一種叫做 Deep Input-to-Hidden Function,它在循環(huán)層之前加入多個(gè)普通的全連接層,將輸入向量進(jìn)行多層映射之后再送入循環(huán)層進(jìn)行處理。第二種方案是 Deep Hidden-to-Hidden Transition,它使用多個(gè)循環(huán)層,這和前饋神經(jīng)網(wǎng)絡(luò)類似,唯一不同的是計(jì)算隱含層輸出的時(shí)候需要利用本隱含層上一時(shí)刻的值。第三種方案是 Deep Hidden-to-Output Function,它在循環(huán)層到輸出層之間加入多個(gè)全連接層,這與第一種情況類似。上面公式展示的應(yīng)為第二種情況。
由于循環(huán)層一般用 tanh 作為激活函數(shù),層次過多之后會(huì)導(dǎo)致梯度消失問題。后面會(huì)提及。
三、網(wǎng)絡(luò)的訓(xùn)練及BPTT
循環(huán)神經(jīng)網(wǎng)絡(luò)的輸入是序列數(shù)據(jù),每個(gè)訓(xùn)練樣本是一個(gè)時(shí)間序列,包含多個(gè)相同維度的向量。網(wǎng)絡(luò)的參數(shù)如何通過訓(xùn)練確定?這里就要使用解決循環(huán)神經(jīng)網(wǎng)絡(luò)訓(xùn)練問題的 Back Propagation Through Time 算法,簡稱BPTT。
循環(huán)神經(jīng)網(wǎng)絡(luò)的每個(gè)訓(xùn)練樣本是一個(gè)時(shí)間序列,同一個(gè)訓(xùn)練樣本前后時(shí)刻的輸入值之間有關(guān)聯(lián),每個(gè)樣本的序列長度可能不相同。訓(xùn)練時(shí)先對這個(gè)序列中的每個(gè)時(shí)刻的輸入值進(jìn)行正向傳播,再通過反向傳播計(jì)算出參數(shù)的梯度值并更新參數(shù)。
它包含三個(gè)步驟:(1)正向計(jì)算每個(gè)神經(jīng)元的輸出值;(2)反向計(jì)算每個(gè)神經(jīng)元的誤差項(xiàng)δj,它是誤差函數(shù)E對神經(jīng)元 j 的加權(quán)輸入netj的偏導(dǎo)數(shù);(3)計(jì)算每個(gè)權(quán)重的梯度;(4)用隨機(jī)梯度下降算法更新權(quán)重。具體的算法推導(dǎo)我會(huì)在之后的筆記整理中總結(jié)。
四、梯度爆炸、梯度消失
循環(huán)神經(jīng)網(wǎng)絡(luò)在進(jìn)行反向傳播時(shí)也面臨梯度消失或者梯度爆炸問題,這種問題表現(xiàn)在時(shí)間軸上。如果輸入序列的長度很長,人們很難進(jìn)行有效的參數(shù)更新。通常來說梯度爆炸更容易處理一些。因?yàn)樘荻缺〞r(shí),我們的程序會(huì)收到NaN的錯(cuò)誤。我們也可以設(shè)置一個(gè)梯度閾值,當(dāng)梯度超過這個(gè)閾值的時(shí)候可以直接截取。
梯度消失更難檢測,而且也更難處理一些。總的來說,我們有三種方法應(yīng)對梯度消失問題:
(1)合理的初始化權(quán)重值。初始化權(quán)重,使每個(gè)神經(jīng)元盡可能不要取極大或極小值,以多開梯度消失的區(qū)域。
(2) 使用 ReLu 代替 sigmoid 和 tanh 作為激活函數(shù)。
(3) 使用其他結(jié)構(gòu)的RNNs,比如長短時(shí)記憶網(wǎng)絡(luò)(LTSM)和 門控循環(huán)單元 (GRU),這是最流行的做法。
五、練手項(xiàng)目
可以參考github上比較出名的char_RNN的代碼來提高自己的興趣。該項(xiàng)目就是通過訓(xùn)練語料來自己寫詩、歌、文。
下圖是我的訓(xùn)練結(jié)果:
(1) 一首詩,這首通過RNN訓(xùn)練寫出的詩還是不錯(cuò)的?!扒铩迸c“春”是對應(yīng)的,描繪的是詩人在秋日,欣賞的山中風(fēng)景。不禁感嘆,自己的青春已去,自己也已經(jīng)白首,吟唱著這首詩(編不下去了…)。
(2) 通過自己找的《三體》全集,來訓(xùn)練出的小說片段??梢钥吹?,只能模仿句式,不能有準(zhǔn)確表達(dá),所以邏輯不通的,但是形式是很像劉慈欣的寫法了。
-
神經(jīng)網(wǎng)絡(luò)
+關(guān)注
關(guān)注
42文章
4772瀏覽量
100809
原文標(biāo)題:中國成功研制出世界首個(gè)多自由度固態(tài)量子存儲(chǔ)器
文章出處:【微信號(hào):eetop-1,微信公眾號(hào):EETOP】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評(píng)論請先 登錄
相關(guān)推薦
評(píng)論