原文連接:http://www.atyun.com/16821.htmlhtml
擴展閱讀: https://machinelearningmastery.com/time-series-prediction-lstm-recurrent-neural-networks-python-keras/ is a really good tutorial of time series forecasting using LSTM。python
長短時間記憶網絡,一般稱爲「LSTM」(Long Short Term Memory network,由Schmidhuber和Hochreiterfa提出)。LSTM已經被普遍用於語音識別,語言建模,情感分析和文本預測。在深刻研究LSTM以前,咱們首先應該瞭解LSTM的要求,它能夠用實際使用遞歸神經網絡(RNN)的缺點來解釋。因此,咱們要從RNN講起。數組
對於人類來講,當咱們看電影時,咱們在理解任何事件時不會每次都要從頭開始思考。咱們依靠電影中最近的經歷並向他們學習。可是,傳統的神經網絡沒法從以前的事件中學習,由於信息不會從一個時間步傳遞到另外一個時間步。而RNN從前一步學習信息。網絡
例如,電影中若是有某人在籃球場上的場景。咱們將在將來的框架中即興創造籃球運動:一個跑或者跳的人的形象可能被貼上「打籃球」的標籤,而一個坐着看的人的形象可能被打上「觀衆」的標籤。架構
一個經典的RNNapp
一個典型的RNN如上圖所示 – 其中X(t)表明輸入,h(t)是輸出,而A表明從循環中的前一步得到信息的神經網絡。一個單元的輸出進入下一個單元而且傳遞信息。框架
可是,有時咱們並不須要咱們的網絡僅僅經過過去的信息來學習。假設咱們想要預測文中的空白字「大衛,一個36歲,住在舊金山的老男人。他有一個女性朋友瑪麗亞。瑪麗亞在紐約一家著名的餐廳當廚師,最近他在學校的校友會上碰面。瑪麗亞告訴他,她老是對_________充滿熱情。」在這裏,咱們但願咱們的網絡從依賴「廚師」中學習以預測空白詞爲「烹飪」。咱們想要預測的東西和咱們想要它去獲得預測的位置之間的間隙,被稱爲長期依賴。咱們假設,任何大於三個單詞的東西都屬於長期依賴。惋惜,RNN在這種狀況下沒法發揮做用。less
在RNN訓練期間,信息不斷地循環往復,神經網絡模型權重的更新很是大。由於在更新過程當中累積了錯誤梯度,會致使網絡不穩定。極端狀況下,權重的值可能變得大到溢出並致使NaN值。爆炸經過擁有大於1的值的網絡層反覆累積梯度致使指數增加產生,若是值小於1就會出現消失。dom
RNN的上述缺點促使科學家開發了一種新的RNN模型變體,名爲長短時間記憶網絡(Long Short Term Memory)。因爲LSTM使用門來控制記憶過程,它能夠解決這個問題。ide
下面讓咱們瞭解一下LSTM的架構,並將其與RNN的架構進行比較:
一個LSTM單位
這裏使用的符號具備如下含義:
a)X:縮放的信息
b)+:添加的信息
c)σ:Sigmoid層
d)tanh:tanh層
e)h(t-1):上一個LSTM單元的輸出
f)c(t-1):上一個LSTM單元的記憶
g)X(t):輸入
h)c(t):最新的記憶
i)h(t):輸出
爲了克服梯度消失問題,咱們須要一個二階導數在趨近零點以前能維持很長距離的函數。tanh是具備這種屬性的合適的函數。
因爲Sigmoid函數能夠輸出0或1,它能夠用來決定忘記或記住信息。
信息經過不少這樣的LSTM單元。圖中標記的LSTM單元有三個主要部分:
咱們剛剛看到經典RNN和LSTM的架構存在很大差別。在LSTM中,咱們的模型學習要在長期記憶中存儲哪些信息以及要忽略哪些信息。
在這裏,我使用基於keras的LSTM對Yelp開放數據集的評論數據進行情感分析。
下面是個人數據集。
數據集
我使用Tokenizer對文本進行了矢量化處理,並在限制tokenizer僅使用最多見的2500個單詞後將其轉換爲整數序列。我使用pad_sequences將序列轉換爲二維numpy數組。
01 |
#I have considered a rating above 3 as positive and less than or equal to 3 as negative. |
02 |
data[ 'sentiment' ] = [ 'pos' if (x> 3 ) else 'neg' for x in data[ 'stars' ]] |
03 |
data[ 'text' ] = data[ 'text' ]. apply (( lambda x: re.sub( '[^a-zA-z0-9\s]' ,'',x))) |
04 |
for idx,row in data.iterrows(): |
05 |
row[ 0 ] = row[ 0 ].replace( 'rt' , ' ' ) |
06 |
data[ 'text' ] = [x.encode( 'ascii' ) for x in data[ 'text' ]] |
07 |
08 |
tokenizer = Tokenizer(nb_words = 2500 , lower = True ,split = ' ' ) |
09 |
tokenizer.fit_on_texts(data[ 'text' ].values) |
10 |
#print(tokenizer.word_index) # To see the dicstionary |
11 |
X = tokenizer.texts_to_sequences(data[ 'text' ].values) |
12 |
X = pad_sequences(X) |
而後,我構建本身的LSTM網絡。幾個超參數以下:
其餘超參數,如dropout,batch_size與CNN中相似。
我使用softmax做爲激活函數。
01 |
embed_dim = 128 |
02 |
lstm_out = 200 |
03 |
batch_size = 32 |
04 |
05 |
model = Sequential() |
06 |
model.add(Embedding( 2500 , embed_dim,input_length = X.shape[ 1 ], dropout = 0.2 )) |
07 |
model.add(LSTM(lstm_out, dropout_U = 0.2 , dropout_W = 0.2 )) |
08 |
model.add(Dense( 2 ,activation = 'softmax' )) |
09 |
model. compile (loss = 'categorical_crossentropy' , optimizer = 'adam' ,metrics = [ 'accuracy' ]) |
10 |
print (model.summary()) |
如今,我將個人模型放在訓練集上,並檢查驗證集的準確性。
1 |
Y = pd.get_dummies(data[ 'sentiment' ]).values |
2 |
X_train, X_valid, Y_train, Y_valid = train_test_split(X,Y, test_size = 0.20 , random_state = 36 ) |
3 |
4 |
#Here we train the Network. |
5 |
6 |
model.fit(X_train, Y_train, batch_size = batch_size, nb_epoch = 1 , verbose = 5 )<p style = "text-align: center;" ><img src = "http://imgcdn.atyun.com/2018/02/1-XfPXSNqVb3vc5_jTRl-Q3w.png" alt = "LSTM神經網絡介紹,附情感分析應用" width = "588" height = "62" >< / p> |
在一個包含全部業務的小數據集上運行時,我在僅僅迭代一次就得到了86%的驗證精度。
當咱們但願咱們的模型從長期依賴中學習時,LSTM要強於其餘模型。LSTM遺忘,記憶和更新信息的能力使其比經典的RNN更爲先進。