(轉)LSTM神經網絡介紹

原文連接: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)

對於人類來講,當咱們看電影時,咱們在理解任何事件時不會每次都要從頭開始思考。咱們依靠電影中最近的經歷並向他們學習。可是,傳統的神經網絡沒法從以前的事件中學習,由於信息不會從一個時間步傳遞到另外一個時間步。而RNN從前一步學習信息。網絡

例如,電影中若是有某人在籃球場上的場景。咱們將在將來的框架中即興創造籃球運動:一個跑或者跳的人的形象可能被貼上「打籃球」的標籤,而一個坐着看的人的形象可能被打上「觀衆」的標籤架構

LSTM神經網絡介紹,附情感分析應用

一個經典的RNNapp

LSTM神經網絡介紹,附情感分析應用

一個典型的RNN如上圖所示 – 其中X(t)表明輸入,h(t)是輸出,而A表明從循環中的前一步得到信息的神經網絡。一個單元的輸出進入下一個單元而且傳遞信息。框架

可是,有時咱們並不須要咱們的網絡僅僅經過過去的信息來學習。假設咱們想要預測文中的空白字「大衛,一個36歲,住在舊金山的老男人。他有一個女性朋友瑪麗亞。瑪麗亞在紐約一家著名的餐廳當廚師,最近他在學校的校友會上碰面。瑪麗亞告訴他,她老是對_________充滿熱情。」在這裏,咱們但願咱們的網絡從依賴「廚師」中學習以預測空白詞爲「烹飪」。咱們想要預測的東西和咱們想要它去獲得預測的位置之間的間隙,被稱爲長期依賴。咱們假設,任何大於三個單詞的東西都屬於長期依賴。惋惜,RNN在這種狀況下沒法發揮做用。less

爲何RNN在這裏不起做用

在RNN訓練期間,信息不斷地循環往復,神經網絡模型權重的更新很是大。由於在更新過程當中累積了錯誤梯度,會致使網絡不穩定。極端狀況下,權重的值可能變得大到溢出並致使NaN值。爆炸經過擁有大於1的值的網絡層反覆累積梯度致使指數增加產生,若是值小於1就會出現消失。dom

長短時間記憶網絡

RNN的上述缺點促使科學家開發了一種新的RNN模型變體,名爲長短時間記憶網絡(Long Short Term Memory)。因爲LSTM使用門來控制記憶過程,它能夠解決這個問題。ide

下面讓咱們瞭解一下LSTM的架構,並將其與RNN的架構進行比較:

LSTM神經網絡介紹,附情感分析應用

一個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?

爲了克服梯度消失問題,咱們須要一個二階導數在趨近零點以前能維持很長距離的函數。tanh是具備這種屬性的合適的函數。

爲何要使用Sigmoid?

因爲Sigmoid函數能夠輸出0或1,它能夠用來決定忘記或記住信息。

信息經過不少這樣的LSTM單元。圖中標記的LSTM單元有三個主要部分:

  1. LSTM有一個特殊的架構,它可讓它忘記沒必要要的信息。Sigmoid層取得輸入X(t)和h(t-1),並決定從舊輸出中刪除哪些部分(經過輸出0實現)。在咱們的例子中,當輸入是「他有一個女性朋友瑪麗亞」時,「大衛」的性別能夠被遺忘,由於主題已經變成了瑪麗亞。這個門被稱爲遺忘門f(t)。這個門的輸出是f(t)* c(t-1)。
  2. 下一步是決定並存儲記憶單元新輸入X(t)的信息。Sigmoid層決定應該更新或忽略哪些新信息。tanh層根據新的輸入建立全部可能的值的向量。將它們相乘以更新這個新的記憶單元。而後將這個新的記憶添加到舊記憶c(t-1)中,以給出c(t)。在咱們的例子中,對於新的輸入,他有一個女性朋友瑪麗亞,瑪麗亞的性別將被更新。當輸入的信息是,「瑪麗亞在紐約一家著名的餐館當廚師,最近他們在學校的校友會上碰面。」時,像「著名」、「校友會」這樣的詞能夠忽略,像「廚師」、「餐廳」和「紐約」這樣的詞將被更新。
  3. 最後,咱們須要決定咱們要輸出的內容。Sigmoid層決定咱們要輸出的記憶單元的哪些部分。而後,咱們把記憶單元經過tanh生成全部可能的值乘以Sigmoid門的輸出,以便咱們只輸出咱們決定的部分。在咱們的例子中,咱們想要預測空白的單詞,咱們的模型知道它是一個與它記憶中的「廚師」相關的名詞,它能夠很容易的回答爲「烹飪」。咱們的模型沒有從直接依賴中學習這個答案,而是從長期依賴中學習它。

咱們剛剛看到經典RNN和LSTM的架構存在很大差別。在LSTM中,咱們的模型學習要在長期記憶中存儲哪些信息以及要忽略哪些信息。

使用LSTM快速實現情感分析

在這裏,我使用基於keras的LSTM對Yelp開放數據集的評論數據進行情感分析。

下面是個人數據集。

LSTM神經網絡介紹,附情感分析應用

數據集

我使用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網絡。幾個超參數以下:

  1. embed_dim:嵌入層將輸入序列編碼爲維度爲embed_dim的密集向量序列。
  2. lstm_out:LSTM將矢量序列轉換爲大小爲lstm_out的單個矢量,其中包含有關整個序列的信息。

其餘超參數,如dropout,batch_size與CNN中相似。

我使用softmax做爲激活函數。

LSTM神經網絡介紹,附情感分析應用

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())

LSTM神經網絡介紹,附情感分析應用

如今,我將個人模型放在訓練集上,並檢查驗證集的準確性。

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>

LSTM神經網絡介紹,附情感分析應用

在一個包含全部業務的小數據集上運行時,我在僅僅迭代一次就得到了86%的驗證精度。

將來的改進方向:

  1. 咱們能夠篩選餐館等特定業務,而後使用LSTM進行情感分析。
  2. 咱們可使用具備更大的數據集進行更屢次的迭代來提升準確性。
  3. 可使用更多隱藏的密集層來提升準確性。也能夠調整其餘超參數。

結論

當咱們但願咱們的模型從長期依賴中學習時,LSTM要強於其餘模型。LSTM遺忘,記憶和更新信息的能力使其比經典的RNN更爲先進。

相關文章
相關標籤/搜索