深度學習_RNN迴圈神經網路,序列模型
RNN(Recurrent Neural Network 迴圈神經網路)
迴圈神經網路的基本概念和地位:
RNN 是一類用於處理序列資料的神經網路 。那麼什麼是 序列資料 ? 時間序列資料是指在不同的時間點上收集到的資料,這類資料反映了某一事物。現象等隨著時間的編號狀態或者程度。當然,在文字方面,不如文字序列,總是說,後面的資料跟之前的資料是有關聯的!
為什麼要用RNN?大家都或多或少的瞭解到人工神經網路和卷積神經,他們的前提是假設是:元素之間是相互獨立,輸入和輸出也是相互獨立,那麼迴圈卷積往往滿足序列資料的要求,就應運而生了! 本質就是:像人一樣擁有記憶的能力!
RNN的結構及變體:
(這裡引入感謝作者:光的文明 連結:https://www.jianshu.com/p/87aa03352eb9 來源:簡書)
從基礎的神經網路中知道,神經網路包含 輸入層、隱層、輸出層 ,通過啟用函式控制輸出,層與層之間通過權值連線。啟用函式是事先確定好的,那麼神經網路模型通過訓練“學“到的東西就蘊含在“權值“中。
基礎的神經網路只在層與層之間建立了權連線,RNN最大的不同之處就是在層之間的神經元之間也建立的權連線。如圖:

標準的RNN結構圖,圖中每個箭頭代表做一次變換,也就是說箭頭連線帶有權值。左側是摺疊起來的樣子,右側是展開的樣子,左側中h旁邊的箭頭代表此結構中的“迴圈“體現在隱層。
在標準的RNN結構中,隱層的神經元之間也是帶有權值的。也就是說,隨著序列的不斷推進,前面的隱層將會影響後面的隱層。圖中O代表輸出,y代表樣本給出的確定值,L代表損失函式,我們可以看到,“損失“也是隨著序列的推薦而不斷積累的。
除上述特點之外,標準RNN的還有以下特點:
1、權值共享,圖中的W全是相同的,U和V也一樣。
2、每一個輸入值都只與它本身的那條路線建立權連線,不會和別的神經元連線。
一個典型的RNN網路包含一個輸入x,一個輸出h和一個神經網路單元A。和普通的神經網路不同的是,RNN網路的神經網路單元A不僅僅與輸入和輸出存在聯絡,其與自身也存在一個迴路。這種網路結構就揭示了RNN的實質:上一個時刻的網路狀態資訊將會作用於下一個時刻的網路狀態。如果上圖的網路結構仍不夠清晰,RNN網路還能夠以時間序列展開成如下形式:

RNN展開圖
等號右邊是RNN的展開形式。由於RNN一般用來處理序列資訊,因此下文說明時都以時間序列來舉例,解釋。等號右邊的等價RNN網路中最初始的輸入是x0,輸出是h0,這代表著0時刻RNN網路的輸入為x0,輸出為h0,網路神經元在0時刻的狀態儲存在A中。當下一個時刻1到來時,此時網路神經元的狀態不僅僅由1時刻的輸入x1決定,也由0時刻的神經元狀態決定。以後的情況都以此類推,直到時間序列的末尾t時刻。
上面的過程可以用一個簡單的例子來論證:假設現在有一句話“I want to play basketball”,由於自然語言本身就是一個時間序列,較早的語言會與較後的語言存在某種聯絡,例如剛才的句子中“play”這個動詞意味著後面一定會有一個名詞,而這個名詞具體是什麼可能需要更遙遠的語境來決定,因此一句話也可以作為RNN的輸入。回到剛才的那句話,這句話中的5個單詞是以時序出現的,我們現在將這五個單詞編碼後依次輸入到RNN中。首先是單詞“I”,它作為時序上第一個出現的單詞被用作x0輸入,擁有一個h0輸出,並且改變了初始神經元A的狀態。單詞“want”作為時序上第二個出現的單詞作為x1輸入,這時RNN的輸出和神經元狀態將不僅僅由x1決定,也將由上一時刻的神經元狀態或者說上一時刻的輸入x0決定。之後的情況以此類推,直到上述句子輸入到最後一個單詞“basketball”。
接下來我們需要關注RNN的神經元結構:

RNN內部結構圖
上圖依然是一個RNN神經網路的時序展開模型,中間t時刻的網路模型揭示了RNN的結構。可以看到,原始的RNN網路的內部結構非常簡單。神經元A在t時刻的狀態僅僅是t-1時刻神經元狀態與t時刻網路輸入的雙曲正切函式的值,這個值不僅僅作為該時刻網路的輸出,也作為該時刻網路的狀態被傳入到下一個時刻的網路狀態中,這個過程叫做RNN的正向傳播(forward propagation)。注:雙曲正切函式的解析式如下:

雙曲正切函式的求導如下:

雙曲正切函式的影象如下所示:

雙曲正切函式
這裡就帶來一個問題:為什麼RNN網路的啟用函式要選用雙曲正切而不是sigmod呢?(RNN的啟用函式除了雙曲正切,RELU函式也用的非常多)原因在於RNN網路在求解時涉及時間序列上的大量求導運算,使用sigmod函式容易出現梯度消失,且sigmod的導數形式較為複雜。事實上,即使使用雙曲正切函式,傳統的RNN網路依然存在梯度消失問題,無法“記憶”長時間序列上的資訊,這個bug直到LSTM上引入了單元狀態後才算較好地解決。
這裡呢,大家是不是對於迴圈神經網路有了基本概念,給讀者朋友推薦TensorFlow基礎相關程式碼,裡面包含 RNN的相關程式碼 ,經典的“hello”迴圈處理等機器學習和深度學習的程式碼!連線:http://github.com/hunkim/DeepLearningZeroToAll/blob/master/lab-12-1-hello-rnn.py
另外RNN迴圈神經網路的相關PPT:https://pan.baidu.com/s/1AhT6LRSMMXNAbJ4JocZ7Kg
歡迎各位大神交流,交流QQ群:688933850