讓小編自言自語一會
關於RNN多麼有用,小編就不需要多嘴了,相信每天刷AI技術群、AI公眾號的看官都知道「雲知聲將LSTM的深度學習技術應用到了雲知聲語音識別、語音合成、語義理解中」「百度採用LSTM+CTC 漢語普通話識別率高達97%」等等新聞。RNN由於其序列建模的突出優點,在處理序列數據(如文本、語音)的任務中表現出卓越的性能。
什麼?你居然說你沒聽說過這兩個新聞?
那你真的得多多關注一些相關資訊啦!!
!!
不過話說回來,其實我也是剛剛百度上搜出來的這兩則新聞。
小編不僅僅是知識的搬運工
1.RNN原理
大家好,今天給大家介紹一位新朋友,它叫RNN,它的英文全稱,是recurrent neural network,中文名稱叫 循環神經網絡。不過要提醒大家注意的是,它還有一個遠房親戚,也經常自稱為RNN,它的全名是Recursive neural network,中文學名叫 遞歸神經網絡。大家注意分辨千萬別把這兩個搞混了,會鬧笑話的。
對於遞歸神經網絡感興趣的同學,可以到它的發明者、史丹福大學年輕有為的Richard Sochar博士授課的CS22D課程中查看,傳送連結:斯坦福CS22D課程
大家知道,機器學習和深度學習領域各種名詞特別多,名詞縮寫也很多,由此很容易鬧出血案。例如
某同學去參加面試,面試官說「說一下你對topic model LDA的理解」,該同學聽完以後心中嘀咕「LDA不是線性判別分析嗎,線性判別分析和topic model哪有半毛錢關係?」。(沒聽懂的同學,請自覺反省,本公眾號以前也介紹過LDA(Latent Dirichlet Allocation))
1.1 RNN為序列數據而生
詞序其實是很重要的。
例如下面兩句英文:
一句說的是白細胞殺死了感染病毒,一句說的是感染病毒殺死了白細胞。意思完全不同,但是如果不考慮詞序,例如採用詞袋(BOW)模型,這兩句話會被認為是同一句話。
什麼?你說不知道詞袋模型什麼鬼?百度一下吧,so easy!
閒扯一下,近日某狗搜索發起一個討論:
大致說的是「百度要推行帳號實名制了,你還會繼續用百度嗎」,本意是想藉此繼續抹黑百度,把用戶騙到自己的搜索平臺上,結果偷雞不成蝕把米。群眾的眼睛是雪亮的!來看看點讚數最多的一條評論:
偏題了。。咳咳。我們繼續舉慄子。
中文中,這樣的例子也很多。「怎麼樣投資白銀」vs「白銀投資怎麼樣」;「北京到上海的機票」vs「上海到北京的機票」。
設計RNNs的目的,就是處理序列數據。
在傳統的神經網絡模型中,是從輸入層到隱含層再到輸出層,層與層之間是全連接的,每層之間的節點是無連接的。但是這種普通的神經網絡對於很多問題卻無能無力。例如,你要預測句子的下一個單詞是什麼,一般需要用到前面的單詞,因為一個句子中前後單詞並不是獨立的。RNNs之所以稱為循環神經網路,即一個序列當前的輸出與前面的輸出也有關。具體的表現形式為網絡會對前面的信息進行記憶並應用於當前輸出的計算中,即隱藏層之間的節點不再無連接而是有連接的,並且隱藏層的輸入不僅包括輸入層的輸出還包括上一時刻隱藏層的輸出。理論上,RNNs能夠對任何長度的序列數據進行處理。
RNN was born in 1980s!
1.2 圖靈機(Turing machine)
圖靈機Turing machine可以看作等價於任何有限邏輯數學過程的終極強大邏輯機器。圖靈機又稱確定型圖靈機,是英國數學家艾倫·圖靈於1936年提出的一種抽象計算模型,其更抽象的意義為一種數學邏輯機。
turing-complete的定義:
A Turing Complete system means a system in which a program can be written that will find an answer (although with no guarantees regarding runtime or memory). So, if somebody says "my new thing is Turing Complete" that means in principle (although often not in practice) it could be used to solve any computation problem.
神經圖靈機(Neural Turing Machine)
1.3 RNN的價值
我們知道,一個三層的前饋神經網絡可以學到任何的函數,而RNN則是「turing-complete」的,它可以逼近任何算法。
RNN can approximate any algorithm. A recurrent neural network RNN is Turing complete and so can compute anything that can be computed.
RNN具有強大的計算和建模能力,因而只要合理建模,它就可以模擬任何計算過程。RNN具有記憶能力。給RNN同樣的輸入,得到的輸出可能是不一樣的。當然我們知道CNN不是這樣的。
2 RNN的基本結構
RNNs包含輸入單元(Input units),輸入集標記為{x0,x1,...,xt,xt+1,...},而輸出單元(Output units)的輸出集則被標記為{y0,y1,...,yt,yt+1.,..}。RNNs還包含隱藏單元(Hidden units),我們將其輸出集標記為{h0,h1,...,ht,ht+1,...},這些隱藏單元完成了最為主要的工作。
各個變量的含義:
展開以後形式:
一個RNN的小例子:
把RNN做深(deep)
字符級別RNN
char-rnn的代碼
Torch版本
https://github.com/karpathy/char-rnn
Tensorflow版本
https://github.com/sherjilozair/char-rnn-tensorflow
3 RNN的高級形式
3.1 雙向RNN (Bidirectional RNN )
RNN既然能繼承歷史信息,是不是也能吸收點未來的信息呢?因為在序列信號分析中,如果我能預知未來,對識別一定也是有所幫助的。因此就有了雙向RNN、雙向LSTM,同時利用歷史和未來的信息。
雙向RNN
值得一提的是,但由於RNN 建模中的遺忘性,最後一個 state 中包含的信息是有損的,且序列越靠前的信息損失可能越嚴重。一種比較可行的解決方法是同時訓練兩個RNN,一個正向學習,一個反向學習,將正向的和反向的最後一個state 對應向量 concate 後得到的向量作為最終產物。
對於正向RNN最後一個向量中記錄的信息量從前往後依次增強,反向的最後一個state記錄的信息從後往前依次增強,兩者組合正好記錄了比較完整的信息
3.2 LSTM(Long Short-term Memory)
名字很有意思,又長又短的記憶?其實不是,注意「Short-term」中間有一個「—」連接。代表LSTM本質上還是短期記憶(short-term memory),只是它是比較長一點的short-term memory。
由於LSTM有四個參數做輸入,LSTM需要的參數量是一般的神經網絡模型的4倍。
臺灣大學李宏毅講的LSTM的小例子,非常清晰。
https://www.youtube.com/watch?v=xCGidAeyS4M
LSTM在1997年由「Hochreiter & Schmidhuber」提出,目前已經成為RNN中的標準形式。
3.3 GRU(Gated Recurrent Unit)
LSTM的一個稍微簡化一點的版本。只有兩個gate,據說效果和LSTM差不多,但是參數少了1/3,不容易過擬合。
如果發現LSTM訓練出來的模型過擬合比較嚴重,可以試試GRU
LSTM vs GRU
4 RNN的訓練
4.1 普通的RNN(simple RNN)不好訓練
相較於CNN,RNN訓練過程較不穩定,訓練難度和計算量都大得多。當然,RNN用GPU加速效果會比較明顯。
RNN不好訓練的原因
weight被高頻地使用,0.99的1000次方和1.01的1000次方有本質的區別。導致RNN的誤差面(error surface)常常要麼是很平坦要麼是很陡峭(The error surface is either very flat or very steep)。
4.2 LSTM,讓RNN的訓練更簡單
1997年,LSTM的提出就是為了解決RNN的梯度彌散的問題(gradient vanish)。那麼LSTM比普通的RNN好在哪呢?LSTM為什麼能夠解決gradient vanish的問題?
LSTM如何避免梯度消失:
雖然LSTM並沒有解決梯度爆炸的問題,但是梯度膨脹(gradient explosion)不是個嚴重的問題,一般靠裁剪後的優化算法即可解決,比如gradient clipping(如果梯度的範數大於某個給定值,將梯度同比收縮)。
經驗:
訓練LSTM要保證forget gate多數情況下 都是開啟的;
97年最開始提出LSTM就是為了解決梯度彌散的問題,最開始LSTM是沒有forget gate的,forget gate是後來才加上的。
本文總結只有一句話:「終於講完了!」。說了這麼多,你的眼睛估計也花了吧。神經網絡博大精深,本系列文章未完待續。
卷積神經網絡淺析
卷積神經網絡CNN 在自然語言處理中的應用
基於CNN的文本分類(Paper介紹和代碼解析)
為什麼Tensorflow在訓練神經網絡時,需要讓交叉熵最小
史丹福大學課程CS224D下載《Deep Learning for Natural Language Processing》
Tensorflow源碼講解視頻下載
客官,請關注我,常來翻我的牌子。