《轉》循環神經網絡(RNN, Recurrent Neural Networks)學習筆記:基礎理論

轉自 http://blog.csdn.net/xingzhedai/article/details/53144126算法

更多參考:http://blog.csdn.net/mafeiyu80/article/details/51446558網絡

http://blog.csdn.net/caimouse/article/details/70225998併發

http://kubicode.me/2017/05/15/Deep%20Learning/Understanding-about-RNN/app

RNN(Recurrent Neuron Network)是一種對序列數據建模的神經網絡。繼Bengio提出基於神經網絡的機率語言模型並得到成功以後,Mikolov於2010年提出利用RNN建模語言模型,2012年Sundermeyer提出RNN的改進版本--LSTM。近兩年,RNN開始在天然語言處理、圖像識別、語音識別等領域迅速獲得大量應用。因項目須要,近期重點學習研究了這幾類學習模型,DNN、RNN、LSTM等,後面會陸續把學習總結記錄併發布出來,首先爲了本身加深印象,其次若是能對他人提供些許幫助就更好了。機器學習

  循環神經網絡(Recurrent Neural Networks,RNNs)已經在衆多天然語言處理(Natural Language Processing, NLP)中取得了巨大成功以及普遍應用,所以搜rnn能搜到大把資料,因此本文就僅從本身理解的角度簡單介紹RNNs的原理以及如何實現,後面會專門再發一篇blog結合實際源碼進行分析學習: 
函數

1. RNN的基本原理及推導學習

2. RNN神牛簡介this

 

1. RNN的基本原理及推導google

        (1)什麼是RNNs人工智能

  RNNs的目的使用來處理序列數據。在傳統的神經網絡模型中,是從輸入層到隱含層再到輸出層,層與層之間是全鏈接的,每層之間的節點是無鏈接的。可是這種普通的神經網絡對於不少問題卻無能無力。例如,你要預測句子的下一個單詞是什麼,通常須要用到前面的單詞,由於一個句子中先後單詞並非獨立的。RNNs之因此稱爲循環神經網路,即一個序列當前的輸出與前面的輸出也有關。具體的表現形式爲網絡會對前面的信息進行記憶並應用於當前輸出的計算中,即隱藏層之間的節點再也不無鏈接而是有鏈接的,而且隱藏層的輸入不只包括輸入層的輸出還包括上一時刻隱藏層的輸出。理論上,RNNs可以對任何長度的序列數據進行處理。可是在實踐中,爲了下降複雜性每每假設當前的狀態只與前面的幾個狀態相關,下圖即是一個典型的RNNs:

有別於傳統的機器學習模型中隱層單元彼此間是徹底對等的,RNN中間的隱層從左向右是有時序的(阿拉伯人看是從右向左有時序,哈哈),所以隱層單元之間是要講究先來後到的。再來一張局部特寫照片:

        (2)RNNs是怎麼工做的

       RNNs包含輸入單元(Input units),輸入集標記爲{x0 ,x1 ,...,xt ,xt+1 ,...} ,用向量表示爲X(t),而輸出單元(Output units)的輸出集則被標記爲{y0 ,y1 ,...,yt ,yt+1 .,..} ,表示成向量形式爲Y(t)。RNNs還包含隱藏單元(Hidden units),咱們將其輸出集標記爲{ s0,s1 ,...,st ,st+1 ,...} ,表示成向量形式爲S(t),這些隱藏單元完成了最爲主要的工做。你會發現,在圖中:有一條單向流動的信息流是從輸入單元到達隱藏單元的,與此同時另外一條單向流動的信息流從隱藏單元到達輸出單元。在某些狀況下,RNNs會打破後者的限制,引導信息從輸出單元返回隱藏單元,這些被稱爲「Back Projections」,而且隱藏層的輸入還包括上一隱藏層的狀態,即隱藏層內的節點能夠自連也能夠互連。 
  上圖將循環神經網絡進行展開成一個全神經網絡。例如,對一個包含5個單詞的語句,那麼展開的網絡即是一個五層的神經網絡,每一層表明一個單詞。對於該網絡的計算過程以下:
       step1: x(t)表示第t時刻(t=1,2,3... )的輸入,好比,x1爲當前輸入句子中第二個詞的Vow(vector-of-word)向量; PS:使用計算機對天然語言進行處理,便須要將天然語言處理成爲機器可以識別的符號,加上在機器學習過程當中,須要將其進行數值化。而詞是天然語言理解與處理的基礎,所以須要對詞進行數值化,詞向量(Word Representation,Word embeding)[1]即是一種可行又有效的方法。何爲詞向量,即便用一個指定長度的實數向量v來表示一個詞。有一種種最簡單的表示方法,就是使用One-hot vector表示單詞,即根據單詞的數量|V|生成一個|V| * 1的向量,當某一位爲一的時候其餘位都爲零,而後這個向量就表明一個單詞。因此,訓練以前要先創建詞典(工做量也不小),因而出現了 一種更加有效的詞向量模式,該模式是經過神經網或者深度學習對詞進行訓練,輸出一個指定維度的向量,該向量即是輸入詞的表達。如word2vec(一樣是神牛Mikolov在google時的成果)。
       step2:  s(t)爲隱藏層的第t時刻的狀態,它是網絡的記憶單元。s(t)根據當前輸入層的輸出與上一步隱藏層的狀態進行計算。s(t) =f(U*x(t) +W*s(t−1)),其中f()通常是非線性的激活函數,如tanh或ReLU或Sigmoid,在計算s(0)時,即第一個單詞的隱藏層狀態,須要用到s(−1),在實現中通常置爲0向量便可;
       step3:o(t)是t時刻的輸出,即下個單詞的向量表示,o(t) =softmax(V*s(t)). 
須要注意的是:能夠認爲隱藏層狀態s(t)是網絡的記憶單元,包含了前面全部步的隱藏層狀態。而輸出層的輸出o(t)只與當前步的s(t)有關,在實踐中,爲了下降網絡的複雜度,每每s(t)只包含前面若干步而不是全部步的隱藏層狀態;在傳統神經網絡中,每個網絡層的參數是不共享的。而在RNNs中,每輸入一步,每一層各自都共享參數U,V,W U,V,W。其反應者RNNs中的每一步都在作相同的事,只是輸入不一樣,所以大大地下降了網絡中須要學習的參數。

       (3)再講一遍RNN是怎麼工做的(詳細推導)(這部分摘自神牛的ppt,感受是各版本中最容易理解的,仍是一手的信息最有價值)

  • Input layer w and output layer y have the same dimensionality as the vocabulary (10K - 200K);
  • Hidden layer s is orders of magnitude smaller (50 - 1000 neurons);
  • U is the matrix of weights between input and hidden layer, V is thematrix of weights between hidden and output layer
  • Without the recurrent weightsW, this model would be a bigram neuralnetwork language model。

上圖裏左上角的輸入信號,在下面推導中用x(t)來表示,以避免弄混。

        隱層的輸出爲s(t), s(t) = f (U*w(t) + W*s(t-1))                                                         (1)

        輸出層的輸出爲y(t), y(t) = g (V*s(t))                                                                       (2)

其中,f(z) and g(z) are sigmoid and softmax activation,

                                    

訓練的過程採用隨機梯度降低(SGD),U、V、W每輸入一個詞就更新一次,更新採用反向傳播算法,偏差(這裏稱爲交叉熵)的公式爲式(4):

                                            

where d(t) is a target vector that represents the word w(t + 1)(encoded as 1-of-V vector)

係數矩陣V的更新:

                             

輸出層梯度偏差向隱層的傳播爲:

                              

where the error vector is obtained using function dh() that isapplied element-wise:

                             注:這裏的x不是輸入信號

係數矩陣U的更新,注意,這裏的w(t)應爲輸入信號x(t):

                      

RNN還能夠繼續展開成上面的遞歸結構,相應地,隱層的偏差傳播函數也能夠寫成遞歸形式以下:

                             

權係數W的更新寫成遞歸形式:

                                                

2.  RNN神牛簡介(另附他在 SIGIR 2016 大會中神經信息檢索研討會(Neu-IR Workshop)上的演講解說)

        學習RNN,不得不先提一下Tomas Mikolov,他是RNN建模語言模型的提出者(不是RNN的創造者),這位老兄應該是先在google作天然語言處理的研究, 做爲Google Brain 團隊的一員,參與了 word2vec 項目的開發,2014年又去了facebook人工智能實驗室擔任研究科學家,他的 Facebook 我的頁面上寫到他的長期研究目標是「開發可以使用天然語言進行學習和與人類交流的智能機器」,有興趣的同窗能夠在fb上加他爲好友一塊兒聊聊:-)

他在 SIGIR 2016 大會中神經信息檢索研討會(Neu-IR Workshop)上的演講解說http://chuansong.me/n/464503442191

相關文章
相關標籤/搜索