天天看點

能模仿韓寒小四寫作的神奇遞歸神經網絡(附代碼)引言◆ ◆ ◆神奇的RNN,不可思議的表現◆ ◆ ◆遞歸神經網絡淺解◆ ◆ ◆不同類型的RNN◆ ◆ ◆動手實作簡單的RNN◆ ◆ ◆總結

在離人工智能越來越近的今天,研究界和工業界對神經網絡和深度學習的興趣也越來越濃,期待也越來越高。 

我們在深度學習與計算機視覺專欄中看過計算機通過卷積神經網絡學會了識别圖檔的内容——模仿人類的看,而工業界大量的應用也證明了神經網絡能讓計算機學會聽(比如百度的語音識别),于是大量的精力開始投向nlp領域,讓計算機學會寫也一定是非常有意思的事情,試想一下,如果計算機通過讀韓寒和小四的小說,就能寫出有一樣的調調的文字,這是多帶勁的一件事啊。 

你還别說,還真有這麼一類神經網絡,能夠在nlp上發揮巨大的作用,處理從語言模型(language model)到雙語翻譯,到文本生成,甚至到代碼風格模仿的問題。這就是我麼今天要介紹的rnn(遞歸神經網絡)。

rnn是一個和時間序列有關系的神經網絡,大家想想,對單張圖檔而言,像素資訊是靜止的,而對于一段話而言,裡面的詞的組成是有先後的,而且通常情況下,後續的詞和前面的詞有順序關聯。這時候,獨立層級結構的卷積神經網絡通常就很難處理這種時序關聯資訊了,而rnn卻能有效地進行處理。

rnn在處理時間序列的内容有多有效呢,咱們列一些rnn處理的例子來一起看看。

我們知道卷積神經網絡在0-9數字識别上已經能有人類的識别精确度了,但是對于一連串的數字,還是得有一些特殊的處理的。比如說,下面是讓rnn學會了從左到右讀數字門牌号。 

能模仿韓寒小四寫作的神奇遞歸神經網絡(附代碼)引言◆ ◆ ◆神奇的RNN,不可思議的表現◆ ◆ ◆遞歸神經網絡淺解◆ ◆ ◆不同類型的RNN◆ ◆ ◆動手實作簡單的RNN◆ ◆ ◆總結

我們也能讓rnn學着從右到左自己繪出門牌号圖檔: 

能模仿韓寒小四寫作的神奇遞歸神經網絡(附代碼)引言◆ ◆ ◆神奇的RNN,不可思議的表現◆ ◆ ◆遞歸神經網絡淺解◆ ◆ ◆不同類型的RNN◆ ◆ ◆動手實作簡單的RNN◆ ◆ ◆總結

rnn能模仿各種格式的檔案,比如說下面是rnn學習出來的xml檔案,和latex代數幾何檔案樣本:

能模仿韓寒小四寫作的神奇遞歸神經網絡(附代碼)引言◆ ◆ ◆神奇的RNN,不可思議的表現◆ ◆ ◆遞歸神經網絡淺解◆ ◆ ◆不同類型的RNN◆ ◆ ◆動手實作簡單的RNN◆ ◆ ◆總結
能模仿韓寒小四寫作的神奇遞歸神經網絡(附代碼)引言◆ ◆ ◆神奇的RNN,不可思議的表現◆ ◆ ◆遞歸神經網絡淺解◆ ◆ ◆不同類型的RNN◆ ◆ ◆動手實作簡單的RNN◆ ◆ ◆總結
能模仿韓寒小四寫作的神奇遞歸神經網絡(附代碼)引言◆ ◆ ◆神奇的RNN,不可思議的表現◆ ◆ ◆遞歸神經網絡淺解◆ ◆ ◆不同類型的RNN◆ ◆ ◆動手實作簡單的RNN◆ ◆ ◆總結

我們暫時不管内容正确性,這個格式編排能力,已經讓我瞠目結舌。

愛折騰的程式猿gg們,當然會把握住一切可學習的資源,于是乎,他們把github上linux的源碼拉下來了,然後喂給遞歸神經網絡學習,兩三天後…我們發現它能自己生成如下的代碼塊了

能模仿韓寒小四寫作的神奇遞歸神經網絡(附代碼)引言◆ ◆ ◆神奇的RNN,不可思議的表現◆ ◆ ◆遞歸神經網絡淺解◆ ◆ ◆不同類型的RNN◆ ◆ ◆動手實作簡單的RNN◆ ◆ ◆總結

且不說代碼内容是否有意義,這标準的c代碼風格,看完已有吓尿的趨勢。

哦,對,剛才我們提了rnn對文字的處理能力。我們來看看,andrej karpathy自己做了一個實驗,把所有莎士比亞的作品串起來組成一個單一的(4.4mb)檔案。訓練了一個512個隐藏節點的3層rnn網絡。訓練網絡幾小時後,得到了如下樣本結果:

能模仿韓寒小四寫作的神奇遞歸神經網絡(附代碼)引言◆ ◆ ◆神奇的RNN,不可思議的表現◆ ◆ ◆遞歸神經網絡淺解◆ ◆ ◆不同類型的RNN◆ ◆ ◆動手實作簡單的RNN◆ ◆ ◆總結
能模仿韓寒小四寫作的神奇遞歸神經網絡(附代碼)引言◆ ◆ ◆神奇的RNN,不可思議的表現◆ ◆ ◆遞歸神經網絡淺解◆ ◆ ◆不同類型的RNN◆ ◆ ◆動手實作簡單的RNN◆ ◆ ◆總結

小四的文字我是看不懂的,不過rnn生成的這些文字,卻讓我也隐約感受到了一些“45度角仰望天空,眼淚才不會掉下來”的氣息,當然,這幾段已是輸出結果中比較好的内容,也有一些通暢程度一般的,但足以證明遞歸神經網絡在nlp上有不可思議的學習能力。

剛才被遞歸神經網絡驚呆的小夥伴們,咱們把目光先從小四那裡收回來。看看這神奇的遞歸神經網絡到底是何許神物,背後的原理又是什麼樣的。

傳統的神經網絡(包括cnn)中我們假定所有輸入和輸出都是互相獨立的。很遺憾,對于許多任務而言,這一個假設是不成立的。如果你想預測下一個單詞或一個句子,你就需要知道前面的詞。遞歸神經網絡之是以被稱作遞歸,就是因為每個元素都執行相同的任務序列,但輸出依賴之前的計算結果。我們換一種方法說明一下rnn:大家可以想象rnn模型是有“記憶”的,“記憶”中存儲着之前已經計算的資訊。理論上說rnn可以記得并使用任意長度的序列中的資訊,不過實際應用中,我們通常隻回溯幾個步驟(後面詳細讨論)。我們先一起來看一個典型的rnn的圖例: 

能模仿韓寒小四寫作的神奇遞歸神經網絡(附代碼)引言◆ ◆ ◆神奇的RNN,不可思議的表現◆ ◆ ◆遞歸神經網絡淺解◆ ◆ ◆不同類型的RNN◆ ◆ ◆動手實作簡單的RNN◆ ◆ ◆總結

上圖顯示了将rnn展開成一個完整的網絡的過程。之是以我們用展開這個字眼,因為遞歸神經網絡每一層(或者我們叫做每個時間點t)到下一層(下一個時間點),其變換的過程(權重w)是一緻的。舉個例子說,如果我們關注的序列是包含5個單詞的句子,遞歸神經網絡将會依據先後順序展開成五個神經網絡,每個單詞為一層。rnn是根據下面的步驟來疊代和做計算的:

假定$x_t$是時間$t$處的輸入,比如$x_1$可以是句子中第二個單詞one-hot編碼後的詞向量。

$o_t$是第t步的輸出。舉個例子說,如果我們要預測在之前的詞序列下,下一個詞是什麼,那我們可能拿到的是整個詞表中,每個詞的機率(通過softmax得到的),即$o_t = \mathrm{softmax}(vs_t)$

針對上面的步驟,咱們再細提幾個點:

我們就可以直接把隐狀态$s_t$想作神經網絡的“記憶體”,$s_t$捕捉和保留了之前時間點上的一些資訊。輸出$o_t$是由目前時間點t上的“所有記憶資訊”來計算得到的。實際工程應用中,通常我們會做一些處理,因為實際上$s_t$并不能捕捉和保留之前的所有時間點的資訊。

不像普通的深度神經網絡,每一層和每一層之間都會有不同的權重參數,一個rnn神經網絡共享同一組參數$(u, v, w)$(如圖中所示),每一步都一樣。這實際上表示我們在每一步到下一步都是做的同樣的操作,隻是輸入不同。這樣的一個好處是,極大地減小了需要訓練和預估的參數量。

上面的圖表在每一步都有輸出/output,但是根據任務不同,有時候并沒有必要在每一步都有輸出。比如說我們對句子的情感做判定的時候,我們其實隻關心最後的情感判定結果,而不是中間每個詞的結果。rnn最主要的特征是隐狀态,因為它是“記憶體”,保留了之前的絕大多數資訊。

剛才我們提到的rnn隻是最原始版本的rnn,而近幾年随着研究者的深入,提出了一系列新的rnn網絡類型。比如:

雙向rnn的思想和原始版rnn有一些許不同,隻要是它考慮到目前的輸出不止和之前的序列元素有關系,還和之後的序列元素也是有關系的。舉個例子來說,如果我們現在要去填一句話中空缺的詞,那我們直覺就會覺得這個空缺的位置填什麼詞其實和前後的内容都有關系,對吧。雙向rnn其實也非常簡單,我們直覺了解一下,其實就可以把它們看做2個rnn疊加。輸出的結果這個 時候就是基于2個rnn的隐狀态計算得到的。 

能模仿韓寒小四寫作的神奇遞歸神經網絡(附代碼)引言◆ ◆ ◆神奇的RNN,不可思議的表現◆ ◆ ◆遞歸神經網絡淺解◆ ◆ ◆不同類型的RNN◆ ◆ ◆動手實作簡單的RNN◆ ◆ ◆總結

深層雙向rnn和雙向rnn比較類似,差別隻是每一步/每個時間點我們設定多層結構。實際應用的時候,這種方式可以讓我們的神經網絡有更大的容量(但這也意味着我們需要更多的訓練資料) 

能模仿韓寒小四寫作的神奇遞歸神經網絡(附代碼)引言◆ ◆ ◆神奇的RNN,不可思議的表現◆ ◆ ◆遞歸神經網絡淺解◆ ◆ ◆不同類型的RNN◆ ◆ ◆動手實作簡單的RNN◆ ◆ ◆總結

lstm(long short term memory)可能是目前最流行,你見到各種paper提到最多的rnn神經網絡了。lstm和基線rnn并沒有特别大的結構不同,但是它們用了不同的函數來計算隐狀态。lstm的“記憶”我們叫做細胞/cells,你可以直接把它們想做黑盒,這個黑盒的輸入為前狀态$h_{t-1}$和目前輸入$x_t$。這些“細胞”會決定哪些之前的資訊和狀态需要保留/記住,而哪些要被抹去。實際的應用中發現,這種方式可以有效地儲存很長時間之前的關聯資訊。關于lstm的細節,我們會在之後的博文裡再和大家繼續提到。

語言模型是nlp中最常見和通用的一個概念。它能幫助我們判定一個短語串或者一句話出現的機率(在給定一個語料集後)。這在各種打分機制中非常非常有用,比如翻譯系統中翻譯結果的標明,比如語音識别中文字串的標明。關于語言模型具體的内容可以參見我們之前的博文從樸素貝葉斯到n-gram語言模型(http://blog.csdn.net/han_xiaoyang/article/details/50646667)。

我們這裡的目标就是要用rnn建構語言模型,即輸出短語串/一句話的機率 

$$\begin{aligned} p(w_1,...,w_m) = \prod_{i=1}^{m} p(w_i \mid w_1,..., w_{i-1}) \end{aligned}$$

上式中,$w_i$依賴于前序的$i-1$個詞,理論上說,rnn能夠捕捉和記憶下所有的前序的資訊和依賴關系,但實際上的情況會稍微複雜一些,時間/序列越長,需要記住的資訊越多,但是損失的資訊也可能越多。

我們需要一些文本語料去讓rnn學習,所幸的是,并不像有監督學習中,每個樣本都需要标注一個結果,這裡隻要句子或者短語串就可以。是以我們從reddit(類似百度貼吧)中抓了15000條長評論下來。我們希望rnn能學到這些評論者的評論風格(就像神奇的帝吧),并能模仿他們生成一些話。但是我們都知道,機器學習問題,效果的上限其實取決于你的資料,是以我們都需要對資料先做一些預處理。

最初的語料文本需要一些簡單的處理才能交給機器學習算法學習,比如句子最常見的處理是分詞,對于英語而言,有純天然的空格分隔開,對中文而言,我們需要自己去做斷句和分詞。比如英文的句子 “he left!”可以分詞成3部分: “he”, “left”, “!”。這裡使用python的nltk包做分詞處理。

其實絕大多數詞在我們的文本中就隻會出現一兩次,而這些極度不常出現的詞語,其實去掉就行了,對最後的結果反倒有幫助。太多的詞語,一方面讓模型的訓練變得很慢,同時因為它們隻出現一兩次,是以我們從語料中也學不出太多和它們相關的知識。是以我們有很簡單的處理方法來處理它們。

比如說,我們就限定我們的語料庫是8000詞的,這8000詞以外的詞語我們都用unknown_token這個特殊字元來标注。比如單詞“nonlinearities”不在我們的8000詞彙集中,那“nonlineraties are important in neural networks”這句話就要被我們處理成“unknown_token are important in neural networks”了。我們完全可以把unknown_token視作一個新的詞彙,而對于它的預測也和其他詞完全一樣。

分詞後,一句話變成一個詞/短語 串,我們再做一些特殊的處理,比如把sentence_start和sentence_end添加到詞/短語 串首位當做特殊的開始于結束标志。這樣句子第一個詞的預測可以看做出現sentence_start後,出現第一個詞的機率。

對于詞向量的編碼,我們打算用最簡單的詞序列編碼。解釋一下,大概是這樣。一句簡單的“i left home”的輸入x可能被譯作[0, 179, 341, 416], 其中0對應句子起始符sentence_start,而i在詞表中的下标為179,而輸出y會被譯作[179, 341, 416, 1]。這個可了解吧,因為我們在做的事情,是由前面的詞語,推斷後面的詞語。

代碼大概是下面這個樣子:

能模仿韓寒小四寫作的神奇遞歸神經網絡(附代碼)引言◆ ◆ ◆神奇的RNN,不可思議的表現◆ ◆ ◆遞歸神經網絡淺解◆ ◆ ◆不同類型的RNN◆ ◆ ◆動手實作簡單的RNN◆ ◆ ◆總結

下面是一個實際的句子在這8000詞彙的語料庫中,映射成的x和y, 

x: 

sentence_start what are n’t you understanding about this ? ! 

[0, 51, 27, 16, 10, 856, 53, 25, 34, 69]

y: 

what are n’t you understanding about this ? ! sentence_end 

[51, 27, 16, 10, 856, 53, 25, 34, 69, 1]

我們還記得rnn的結構是下面這樣的: 

能模仿韓寒小四寫作的神奇遞歸神經網絡(附代碼)引言◆ ◆ ◆神奇的RNN,不可思議的表現◆ ◆ ◆遞歸神經網絡淺解◆ ◆ ◆不同類型的RNN◆ ◆ ◆動手實作簡單的RNN◆ ◆ ◆總結

我們先來做一些資料設定和建構。 

假設輸入x為詞序列(就像前面提到的一樣),其中每個$x_t$都是一個獨立的詞。但是需要多說一句的是,因為我們這裡要做矩陣運算,而詞和詞之間其實是沒有數值大小差異的(雖然understanding編碼為856,what為51,但是不代表understanding和what間有大小關系),是以我們這裡還需要做一個簡單的處理,即根據詞表大小(8000)對詞做一個one-hot編碼。也就是說,每個詞都是一個8000*1的向量,其中隻有一個位置(這個詞對應的位置)為1,其餘位置的值都是0。 輸出的$o$也是類似的表示形式,每一個$o_t$都是一個詞表大小長度的向量,每個元素代表預測這個位置的詞是下一個詞的機率。

然後我們複習一下之前說到的rnn前向計算公式:

\begin{aligned} s_t &= \tanh(ux_t + ws_{t-1}) \\ o_t &= \mathrm{softmax}(vs_t) \end{aligned}

咳咳,咱們是嚴謹派,再确認下各種輸入輸出的次元好了。我們假設詞表大小c = 8000,而隐狀态向量次元h = 100。這裡需要提一下的是,我們之前也說到了,這個隐狀态有點類似人類的“記憶體”,之前的資料資訊都存儲在這裡,其實把它的次元設高一些可以存儲更多的内容,但随之而來的是更大的計算量,是以這是一個需要權衡的問題。是以我們有下面一些設定:

$$\begin{aligned} x_t & \in \mathbb{r}^{8000} \\ o_t & \in \mathbb{r}^{8000} \\ s_t & \in \mathbb{r}^{100} \\ u & \in \mathbb{r}^{100 \times 8000} \\ v & \in \mathbb{r}^{8000 \times 100} \\ w & \in \mathbb{r}^{100 \times 100} \\ \end{aligned}$$

對了,其中u,v和w是rnn神經網絡的參數,也就是我們要通過對語料學習而得到的參數。是以,總的說下來,我們需要$2hc + h^2$個參數,在我們現在的場景下,c=8000,h=100,是以我們大概有1610000個參數需要預估。同時,參數的大小,其實也給我一些提示,比如可能需要多少計算資源,大家可以做到提前心裡有個數。我們這裡大部分計算其實還好,因為one-hot編碼後的矩陣,和其他矩陣相乘,其實可以看做挑選出其中的一列(行),最大的計算量在$vs_t$處。這也就是說,如果計算資源有限,咱們最好把詞表的規模限制一下,不要太大。

初始化參數 

我們定義一個類,叫做rnnnumpy,初始化u,v和w還是有一些講究的,我們不能直接把它們都初始化為0,這樣在計算過程中會出現“對稱化”問題。初始化的不同對于最後的訓練結果是有不同的影響的,在這個問題上有很多的paper做了相關的研究,其實參數初始值的標明和咱們標明的激勵函數是有關系的,比如我們這裡選$\tanh$,而相關的論文推薦我們使用$\left[-\frac{1}{\sqrt{n}}, \frac{1}{\sqrt{n}}\right]$之間的随機數作為初始值,其中n是和前一層的連接配接數。額,看起來有點複雜哈,不過别擔心,通常說來,你隻要初始化參數為很小的随機數,神經網絡就能正常訓練。

以下是對應的python代碼,其中word_dim是詞表大小,hidden_dim是隐層大小,bptt_truncate大家先不用管,我們一會兒會介紹到。

能模仿韓寒小四寫作的神奇遞歸神經網絡(附代碼)引言◆ ◆ ◆神奇的RNN,不可思議的表現◆ ◆ ◆遞歸神經網絡淺解◆ ◆ ◆不同類型的RNN◆ ◆ ◆動手實作簡單的RNN◆ ◆ ◆總結

前向計算 

這個和卷積神經網絡的前向運算完全一樣,就是一個根據權重計算下一層/下一個時間點的輸出、隐狀态的過程。簡單的實作如下:

能模仿韓寒小四寫作的神奇遞歸神經網絡(附代碼)引言◆ ◆ ◆神奇的RNN,不可思議的表現◆ ◆ ◆遞歸神經網絡淺解◆ ◆ ◆不同類型的RNN◆ ◆ ◆動手實作簡單的RNN◆ ◆ ◆總結

從上面的代碼我們也可以看到,我們不僅計算了輸出o,同時我們也計算了隐狀态s。我們之後得用它們去計算梯度,再重複一下哈,這裡的每個$o_t$都是一個機率向量,表示每個詞輸出的機率。對了,其實在我們的場景下,我們隻想知道下一個詞是什麼,對它的機率不那麼關心,那就取最大機率那個詞就行了,恩,我們定義了一個函數predict來實作這個功能:

能模仿韓寒小四寫作的神奇遞歸神經網絡(附代碼)引言◆ ◆ ◆神奇的RNN,不可思議的表現◆ ◆ ◆遞歸神經網絡淺解◆ ◆ ◆不同類型的RNN◆ ◆ ◆動手實作簡單的RNN◆ ◆ ◆總結

來來來,試跑一下:

能模仿韓寒小四寫作的神奇遞歸神經網絡(附代碼)引言◆ ◆ ◆神奇的RNN,不可思議的表現◆ ◆ ◆遞歸神經網絡淺解◆ ◆ ◆不同類型的RNN◆ ◆ ◆動手實作簡單的RNN◆ ◆ ◆總結

對于句子(這裡長度為45)中的每個詞, 我們的模型得到了8000個機率(對應詞表中的詞)。額,我們這裡隻是驗證一下前向運算是否能正常進行,但是參數u,v,w是随機取的,未訓練,是以得到的結果其實是随機的。 

然後驗證下predict函數:

能模仿韓寒小四寫作的神奇遞歸神經網絡(附代碼)引言◆ ◆ ◆神奇的RNN,不可思議的表現◆ ◆ ◆遞歸神經網絡淺解◆ ◆ ◆不同類型的RNN◆ ◆ ◆動手實作簡單的RNN◆ ◆ ◆總結

計算損失函數 

$$\begin{aligned} l(y,o) = - \frac{1}{n} \sum_{n \in n} y_{n} \log o_{n} \end{aligned}$$

公式看起來略吓人,但其實它做的事情就是把每個樣本的損失加一加,然後輸出,我們定義了一個calculate_loss函數:

能模仿韓寒小四寫作的神奇遞歸神經網絡(附代碼)引言◆ ◆ ◆神奇的RNN,不可思議的表現◆ ◆ ◆遞歸神經網絡淺解◆ ◆ ◆不同類型的RNN◆ ◆ ◆動手實作簡單的RNN◆ ◆ ◆總結

用随機梯度下降和時間反向傳播訓練rnn 

現在損失函數也有咯,我們要做的事情就是最小化這個損失函數,以讓我們的預測結果和真實的結果最接近咯。最常用的優化算法叫做sgd(随機梯度下降),大家可以了解成我們要從一座山上下山,于是我們每到一個位置,都環顧一下四周,看看最陡(下山最快)的方向是什麼,然後順着它走走,“随機”的意思是我們其實不用全部的樣本去計算這個方向,而是用部分樣本(有時候是一個)來計算。 

計算這個方向就是我們計算梯度的過程,從數學上來說,其實就是在給定損失函數$l$之後,偏導向量的方向,這裡因為有u,v,w三個參數,是以其實我們是要求$\frac{\partial l}{\partial u}, \frac{\partial l}{\partial v}, \frac{\partial l}{\partial w}$。 

細緻的内容我們之後會再提到,這裡呢,簡單地告訴大家,我們需要一個反向傳播(時間軸上的)來用求導鍊式法則計算梯度。代碼如下:

能模仿韓寒小四寫作的神奇遞歸神經網絡(附代碼)引言◆ ◆ ◆神奇的RNN,不可思議的表現◆ ◆ ◆遞歸神經網絡淺解◆ ◆ ◆不同類型的RNN◆ ◆ ◆動手實作簡單的RNN◆ ◆ ◆總結

恩,然後我們需要根據梯度來疊代和更新參數,也就是要順着坡度方向下山咯。

能模仿韓寒小四寫作的神奇遞歸神經網絡(附代碼)引言◆ ◆ ◆神奇的RNN,不可思議的表現◆ ◆ ◆遞歸神經網絡淺解◆ ◆ ◆不同類型的RNN◆ ◆ ◆動手實作簡單的RNN◆ ◆ ◆總結

那個,那個,我們得試驗一下,是不是這玩意确實能讓我們下山。恩,也就是邁着步子的過程,你得看看,我們的海拔是不是每次都降了一些。我們這個地方也來檢查一下:

能模仿韓寒小四寫作的神奇遞歸神經網絡(附代碼)引言◆ ◆ ◆神奇的RNN,不可思議的表現◆ ◆ ◆遞歸神經網絡淺解◆ ◆ ◆不同類型的RNN◆ ◆ ◆動手實作簡單的RNN◆ ◆ ◆總結

恩,還湊合,看樣子确實在帶着我們邁向成功,o(∩_∩)o~ 

恩,上面就是一個完整的簡易rnn實作,至少,是可用的。

不過尴尬的是。。。同學們有木有發現,在cpu上,這樣的每一輪疊代,都要花費160ms左右的時間。這蛋碎的速度,加上rnn巨大的訓練輪數,要把小四的作品都學完,咳咳,估計人家下幾本書都出了。于是隻好祭出大殺器——gpu,配合某python深度學習庫theano來加速了:

能模仿韓寒小四寫作的神奇遞歸神經網絡(附代碼)引言◆ ◆ ◆神奇的RNN,不可思議的表現◆ ◆ ◆遞歸神經網絡淺解◆ ◆ ◆不同類型的RNN◆ ◆ ◆動手實作簡單的RNN◆ ◆ ◆總結

這就是用開源庫的好處,純手撸的n行代碼,在這裡調了幾個函數就done了…恩,感謝開源精神…

産出文本 

有模型之後,我們就可以試着去生成機率最高的文本了。

能模仿韓寒小四寫作的神奇遞歸神經網絡(附代碼)引言◆ ◆ ◆神奇的RNN,不可思議的表現◆ ◆ ◆遞歸神經網絡淺解◆ ◆ ◆不同類型的RNN◆ ◆ ◆動手實作簡單的RNN◆ ◆ ◆總結

然後你就發現,上面的模型能模仿reddit中的評論,去生成一些句子了。比如:

anyway, to the city scene you’re an idiot teenager.

what ? ! ! ! ! ignore!

screw fitness, you’re saying: https

thanks for the advice to keep my thoughts around girls :)

yep, please disappear with the terrible generation.

居然連标點和有些标點組成的表情都模仿出來了,還是灰常神奇的,當然,基線版的rnn也産出了非常非常多的不順暢句子,這個和我們的語料量,以及中間隐狀态的次元有關系。但另外一點是,這種方式的rnn,“記憶體”并不是最合适的,比如最近很火的lstm和gru都能更好地處理曆史資訊的記憶和遺忘過程。這個我們會在之後的部落格裡面提到。

以上就是這篇rnn簡介的所有内容,rnn确實是一個非常神奇的神經網絡,而在對時間序列資訊(比如nlp自然語言處理)上也有着獨到的優勢。更多的rnn與nlp處理的知識(比如lstm)我們在之後的部落格裡會提到,現在的rnn能基于大量的語料學習寫一些簡單的句子,相信有一天,計算機也能寫出大段的優美詩歌,賞心悅目的文字,長篇情節跌宕起伏的小說。

參考文獻:

1、recurrent neural networks tutorial, part 1 – introduction to rnns 

2、recurrent neural networks tutorial, part 2 – implementing a rnn with python, numpy and theano 

3、the unreasonable effectiveness of recurrent neural networks 

4、char-rnn-chinese

原文釋出時間為:2016-04-27

本文來自雲栖社群合作夥伴“大資料文摘”,了解相關資訊可以關注“bigdatadigest”微信公衆号