灰灰深刻淺出講解循環神經網絡(RNN)

我來錢廟復知世依,似我心苦難歸久,相須萊共遊來愁報遠。近王只內蓉者征衣同處,規廷去豈無知草木飄。web

你可能覺得上面的詩句是某個大詩人所做,事實上上面全部的內容都是循環神經網絡寫的,是否是感受很神奇呢?其實這裏面的原理很是簡單,只須要對循環神經網絡有個清楚的理解,那麼就可以實現上面的效果,在讀完本篇文章以後,但願你們都可以學會如何使用循環神經網絡來創做文本。算法

本次講解RNN我會從如下四個方面來說解:網絡

  1. 語言模型
  2. 基本RNN
  3. 雙向RNN
  4. RNN訓練 svg

    話很少說,開講了。函數

一、語言模型

咱們能夠和電腦玩一個遊戲,咱們寫出一個句子前面的一些詞,而後,讓電腦幫咱們寫下接下來的一個詞。好比下面這句:學習

我昨天上學遲到了,老師批評了__atom

咱們給電腦展現了這句話前面這些詞,而後,讓電腦寫下接下來的一個詞。在這個例子中,接下來的這個詞最有多是『我』,而不太多是『小明』,甚至是『吃飯』。spa

語言模型就是這樣的東西:給定一個一句話前面的部分,預測接下來最有可能的一個詞是什麼。3d

正式定義:敲黑板!!!xml

語言模型是對一種語言的特徵進行建模,它有不少不少用處。好比在語音轉文本(STT)的應用中,聲學模型輸出的結果,每每是若干個可能的候選詞,這時候就須要語言模型來從這些候選詞中選擇一個最可能的。固然,它一樣也能夠用在圖像到文本的識別中(OCR)。

使用RNN以前,語言模型主要是採用N-Gram。N能夠是一個天然數,好比2或者3。它的含義是:「假設一個詞出現的機率只與前面N個詞相關」。咱們以2-Gram爲例。首先,對前面的一句話進行切詞:

我 昨天 上學 遲到 了 ,老師 批評 了 __

若是用2-Gram進行建模,那麼電腦在預測的時候,只會看到前面的『了』,而後,電腦會在語料庫中,搜索『了』後面最可能的一個詞。無論最後電腦選的是否是『我』,咱們都知道這個模型是不靠譜的,由於『了』前面說了那麼一大堆其實是沒有用到的。若是是3-Gram模型呢,會搜索『批評了』後面最可能的詞,感受上比2-Gram靠譜了很多,但仍是遠遠不夠的。由於這句話最關鍵的信息『我』,遠在9個詞以前!

如今咱們可能會想,能夠提高繼續提高N的值呀,好比4-Gram、5-Gram…….。實際上,這個想法是沒有實用性的。由於咱們想處理任意長度的句子,N設爲多少都不合適;另外,模型的大小和N的關係是指數級的,4-Gram模型就會佔用海量的存儲空間。因此,該輪到RNN出場了,RNN理論上能夠往前看(日後看)任意多個詞。

二、基本RNN

首先介紹一下什麼是RNN,這裏咱們從一個最簡單的RNN結構來進行深刻理解。
單個RNN結構
不知道童鞋們可以理解這個圖嗎,反正我剛開始學習的時候是懵逼的,每一個結點到底表明的是一個值的輸入,仍是說一層的向量結點集合,隱藏層又如何能夠鏈接到本身等等這些疑惑~

咱們如今這樣來理解,先不看有W的那個帶箭頭的圈,它就變成了最普通的全鏈接神經網絡。x是一個向量,它表示輸入層的值這裏面沒有畫出來表示神經元節點的圓圈);s是一個向量,它表示隱藏層的值(這裏隱藏層面畫了一個節點,你也能夠想象這一層實際上是多個節點,節點數與向量s的維度相同);

U是輸入層到隱藏層的權重矩陣,o也是一個向量,它表示輸出層的值;V是隱藏層到輸出層的權重矩陣

那麼,如今咱們來看看W是什麼。循環神經網絡的隱藏層的值s不只僅取決於當前此次的輸入x,還取決於上一次隱藏層的值s。權重矩陣 W就是隱藏層上一次的值做爲這一次的輸入的權重。

這裏有個對應該抽象圖的具體圖:

具體圖

從上面這個圖就可以很清楚的看到,上一時刻的隱藏層是如何影響當前時刻的隱藏層的

若是咱們把上面的圖展開,循環神經網絡也能夠畫成下面這個樣子:

展開圖

如今看上去就比較清楚了,這個網絡在t時刻接收到輸入 xt 以後,隱藏層的值是 st ,輸出值是 ot 。關鍵一點是, st 的值不只僅取決於 xt ,還取決於 st1 。咱們能夠用下面的公式來表示循環神經網絡的計算方法:

Ot=g(Vst) (式1)
St=f(Uxt+Wst1) (式2)

式1是輸出層的計算公式,輸出層是一個全鏈接層,也就是它的每一個節點都和隱藏層的每一個節點相連。V是輸出層的權重矩陣,g是激活函數。式2是隱藏層的計算公式,它是循環層。U是輸入x的權重矩陣,W是上一次的值做爲這一次的輸入的權重矩陣,f是激活函數。

從上面的公式咱們能夠看出,循環層和全鏈接層的區別就是循環層多了一個權重矩陣 W。

若是反覆把式2帶入到式1,咱們將獲得:
Ot=g(Vst)
=Vf(Uxt+Wst1)
=Vf(Uxt+Wf(Uxt1+Wst2))
=Vf(Uxt+Wf(Uxt1+Wf(Uxt2+Wst3)))
=Vf(Uxt+Wf(Uxt1+Wf(Uxt2+Wf(Uxt3+...))))

從上面能夠看出,循環神經網絡的輸出值 ot ,是受前面歷次輸入值 xt xt1 xt2 xt3 …影響的,這就是爲何循環神經網絡能夠往前看任意多個輸入值的緣由。

三、雙向RNN

對於語言模型來講,不少時候光看前面的詞是不夠的,好比下面這句話:

個人手機壞了,我打算 ____一部新手機。

能夠想象,若是咱們只看橫線前面的詞,手機壞了,那麼我是打算修一修?換一部新的?仍是大哭一場?這些都是沒法肯定的。但若是咱們也看到了橫線後面的詞是『一部新手機』,那麼,橫線上的詞填『買』的機率就大得多了。

在上一小節中的基本循環神經網絡是沒法對此進行建模的,所以,咱們須要雙向循環神經網絡,以下圖所示:

雙向RNN
當遇到這種從將來穿越回來的場景時,不免處於懵逼的狀態。不過咱們仍是能夠用屢試不爽的老辦法:先分析一個特殊場景,而後再總結通常規律。咱們先考慮上圖中 y2 的計算。

從上圖能夠看出,雙向卷積神經網絡的隱藏層要保存兩個值,一個A參與正向計算,另外一個值A’參與反向計算。最終的輸出值 y2 取決於 A2 A2 。其計算方法爲:
y2=g(VA2+VA2)
A2 A2 則分別計算:
A2=f(WA1+Ux2)
A2=f(WA3+Ux2)
如今,咱們已經能夠看出通常的規律:正向計算時,隱藏層的值 st st1 有關;反向計算時,隱藏層的值 st st+1 有關;最終的輸出取決於正向和反向計算的加和。如今,咱們仿照式1和式2寫出雙向循環神經網絡的計算方法:
ot=g(Vst+Vst)
st=f(Uxt+Wst1)
st=f(Uxt+Wst+1)
從上面三個公式咱們能夠看到,正向計算和反向計算不共享權重,也就是說 U U W W V V 都是不一樣的權重矩陣。

至此雙向RNN就告一段落了。回過頭來看前面講的東西,能夠發現,無論是基礎RNN也好,雙向RNN也好,都是隻有一個隱藏層。那咱們固然能夠堆疊兩個以上的隱藏層啊,這樣就獲得了深度循環神經網絡。因爲本文只是帶領你們入門,更深層的東西先不說,後續會另開博客講解。若是觀衆老爺有興趣的,能夠研究下這篇:零基礎入門深度學習(5) - 循環神經網絡

四、RNN的訓練

通常而言,RNN的輸入和輸出存在着多種關係,好比1對多,多對多等等,不一樣的輸入輸出關係對應着不一樣的應用,網上也有不少這方面的文章能夠去看看,這裏咱們要講的RNN在訓練網絡的時候是相同長度的多對多的類型,也就是輸入一個序列,輸出一個相同的長度的序列。

具體的網絡結構就是下面這個樣子
實例
輸入一句話做爲輸入序列,這句話中的每一個字符都按照順序進入RNN,每一個字符傳入RNN以後都可以獲得一個輸出,而這個輸出就是這個字符在這句話中緊跟其後的一個字符,能夠經過上面的圖示清晰地看到這一點。這裏要注意的是,一個序列最後一個輸入對應的輸出能夠有多種選擇,上面的圖示是將這個序列的最開始的字符做爲其輸出,固然也能夠將最後一個輸入做爲輸出,以上面的例子說明就是’光’的輸出就是’光’自己。

生成文本過程

在預測的時候須要給網絡一段初始的序列進行預熱,預熱的過程並不須要實際的輸出結果,只是爲了生成具備記憶的隱藏狀態,而後將隱藏狀態保留,傳入以後的網絡,不斷地更新句子,直到達到要求的輸出長度,具體能夠看下面的圖示
圖示
生成文本的過程就是每一個字不斷輸入網絡,而後將輸出做爲下一次的輸出,不斷循環遞歸,由於其會不限循環下去,因此能夠設置一個長度讓其中止。

訓練過程就是這樣,固然,具體的訓練過程也是有不少數學推導,有興趣的大佬請移步:數學 · RNN,感謝知乎答主:射命丸咲。

RNN的種類其實不少,原諒我不能一一列舉,在此僅以此文做爲拋磚引玉。更多詳細的內容後續會一一更新,請大佬多多交流指點。最後感謝hanbingtao大神,其零基礎入門深度學習系列文章給了編者很大的啓發,在此致以深深的謝意!另系列文章連接附在下方。贈人玫瑰,手有餘香。
零基礎入門深度學習(1) - 感知器
零基礎入門深度學習(2) - 線性單元和梯度降低
零基礎入門深度學習(3) - 神經網絡和反向傳播算法
零基礎入門深度學習(4) - 卷積神經網絡
零基礎入門深度學習(5) - 循環神經網絡