引言
這篇RNN教程翻譯是翻譯自WILDML上的RNN系列教程. 譯者是一位在當?shù)剌^為牛逼的深度學(xué)習(xí)大神, 凡事多做不裝逼, 如果有不當之處歡迎大家指正, 希望此教程能給入門者一些思路和想法.
PART-1 循環(huán)神經(jīng)網(wǎng)絡(luò)教程之RNNs介紹
RNNs也就是Recurrent Neural Network現(xiàn)如今已經(jīng)應(yīng)用很廣了,很多領(lǐng)域在RNN上取得了可喜的成果, 比如語音識別, 自然語言處理等方面. 但是盡管這種技術(shù)在科學(xué)領(lǐng)域得到了廣泛運用, 然而我卻發(fā)現(xiàn)少有資料或者資源教授這方面的內(nèi)容, 并且沒有人告訴我們怎么去實現(xiàn)它. 因此我寫下了本教程, 本教程將分為以下四個部分:
- 循環(huán)神經(jīng)網(wǎng)絡(luò)教程之RNNs介紹
- 用Python和Theano實現(xiàn)RNN
- 理解時間反向傳播算法(BPTT)以及認識梯度消失問題
- 實現(xiàn)一個GRU或者LSTM(譯者: GRU就是Gated Recurrent Unit)
在進入本教程之前, 我假設(shè)你已經(jīng)對神經(jīng)網(wǎng)絡(luò)有一些了解.
什么是RNNs?
RNN背后的深刻思想就是充分利用序列的信息, 舉個例子, 我現(xiàn)在要解決一個問題, 就是我每周都有一個計劃, 我周一上午會去一趟健身房, 周二去約一個朋友聊天, 周三參加一個技術(shù)分享會, 周四宅在辦公室研究技術(shù), 周五去上音樂課. 那我每周都是如此的話, 假如我要讓機器來預(yù)測我周三會去干什么, 如果用神經(jīng)網(wǎng)絡(luò)或者之前的CNN等來做, 你會發(fā)現(xiàn)它無法預(yù)測, 因為這是一個基于時間序列的問題. 而RNN就是基于這個發(fā)明的. 話太多容易讓你產(chǎn)生疑惑, 好吧, 從最簡單的情況你可以這樣理解, 好了, 現(xiàn)在有一個大概的印象了嗎? 非常好, 接下來將會稍微復(fù)雜一點. 我放一張圖

好的,就是這張圖, 你看到了什么? 對就是RNN的結(jié)構(gòu). 你可以這樣理解, 如果說NN是基于空間的多層之間的鏈接, 那么RNN就是基于時間的多層之間的鏈接. 從圖中你看到了嗎? xt表示的是t時刻, 那么xt-1 表示前一個時刻, 這都是輸入的數(shù)據(jù), 在格式上就是NN中的輸入向量, 但是你發(fā)現(xiàn)了嗎, 前一個時刻從隱藏層輸出的值會作用到t時刻, 這說明什么呢? 對! 我們用RNN實現(xiàn)了對歷史的學(xué)習(xí)! 令人振奮的是, 這種學(xué)習(xí)是NN所不能的, RNN可以從歷史的序列中發(fā)現(xiàn)規(guī)律, 并把這種規(guī)律保存在網(wǎng)絡(luò)中! 你可以把RNN當做是NN在時間上的無限延伸, 設(shè)想一下, 假如時間序列足夠長, 那么我們需要足夠大的RNN來儲存這些歷史的信息.
RNN可以用來做什么?
RNN在自然語言處理中取得了相當大的成功, 其中你可以料想, 假如我們把大量的文本輸入到RNN中, 那么RNN就可以學(xué)習(xí)一個模型, 根據(jù)輸入預(yù)測出下一個字將會是什么, 這有什么用呢? 簡單的應(yīng)用就是語法檢查, 因為根據(jù)它的輸出可以判斷一段話是不是正常人說的話.
機器翻譯
機器翻譯就是把英文翻譯為中文, 或者德文, 人們發(fā)現(xiàn)用RNN來做機器翻譯簡直再合適不過了, 看看下面的示意圖語音識別
RNN的另一個巨大應(yīng)用就是語音識別了, 語音識別就是從語音序列中識別出要表達的信息, 這個你說話的上下文很重要, 因此也是序列信息, 而RNN就擅長做這個, 事實證明效果確實很好.
產(chǎn)生圖像描述
RNN和CNN一起確實可以做幾件酷炫到?jīng)]有朋友的事情, 比如下面這個, 機器識別圖片中的物體并生成文字描述
訓(xùn)練RNNs
那么問題來了, RNN這么屌這么牛逼, 怎么訓(xùn)練它呢? 他的輸入輸出是什么樣的呢? 我相信看到這里你顯然還沒有明白, 不要著急, 要想深入理解RNN你還需要繼續(xù)看下去, 我現(xiàn)在還只是簡單的介紹, 后面還有一堆推理在后面. 剛才說到訓(xùn)練RNN, 實際上訓(xùn)練RNN和普通的神經(jīng)網(wǎng)絡(luò)確實沒有什么區(qū)別, 不過又有一些變種, 在反向傳播算法中, 我們通過正向先計算出所有的激活值a和輸出值z, 來計算誤差, 從而進一步梯度, 最后用梯度下降算法得到最終的權(quán)值和激活值, 在RNN中, 它的梯度已經(jīng)不僅僅是用誤差能計算的了, 也就是說誤差不僅僅是當前時間的誤差, 還與上一個時間有關(guān), 舉個例子, 我們要計算t=4時候的梯度, 那么我們要沿著時間線往回計算3個, 然后累加起來就是第四個時間的梯度, 也也叫作基于時間的反向傳播算法.
RNN的變體
這么多年來, 科學(xué)家們已經(jīng)發(fā)明了無數(shù)種RNN的變體, 下面介紹一些比較有名的變體
- 雙向RNNs 是一種當前時刻不僅僅取決于以前時刻同時還取決于未來時刻的RNN變體, 這個就比較吊了, 舉個例子, 比如我的一段文本不僅僅和前面有關(guān)系, 還和后面有一定的關(guān)系,那么這個用雙向RNN就很容易了, 這個網(wǎng)絡(luò)的英文名字叫做Bidirectional RNNs
- LSTM RNNs 是近幾年比較火的一種RNN變體, 實際上也是運用最為廣泛的一種形式, 它克服了我后面會降到的梯度衰減問題, 這個問題在NN中也同樣存在, LSTM本身也有變體, 至少不下十幾種形式, 但是本質(zhì)都差不多
總結(jié)
說了這么多, 其實并沒有說到重點, 包括很多人想知道RNN公式怎么推導(dǎo)的, 輸入數(shù)據(jù)是怎么樣的等等, 這些我下面會接著講述, 歡迎大家指正.