(轉)LSTM神經網絡介紹


原文鏈接:http://www.atyun.com/16821.html

擴展閱讀: https://machinelearningmastery.com/time-series-prediction-lstm-recurrent-neural-networks-python-keras/  is a really good tutorial of time series forecasting using LSTM。

 

長短期記憶網絡,通常稱為“LSTM”(Long Short Term Memory network,由Schmidhuber和Hochreiterfa提出)。LSTM已經被廣泛用於語音識別,語言建模,情感分析和文本預測。在深入研究LSTM之前,我們首先應該了解LSTM的要求,它可以用實際使用遞歸神經網絡(RNN)的缺點來解釋。所以,我們要從RNN講起。

遞歸神經網絡(RNN)

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

例如,電影中如果有某人在籃球場上的場景。我們將在未來的框架中即興創造籃球運動:一個跑或者跳的人的形象可能被貼上“打籃球”的標簽,而一個坐着看的人的形象可能被打上“觀眾”的標簽

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

一個經典的RNN

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

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

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

為什么RNN在這里不起作用

在RNN訓練期間,信息不斷地循環往復,神經網絡模型權重的更新非常大。因為在更新過程中累積了錯誤梯度,會導致網絡不穩定。極端情況下,權重的值可能變得大到溢出並導致NaN值。爆炸通過擁有大於1的值的網絡層反復累積梯度導致指數增長產生,如果值小於1就會出現消失。

長短期記憶網絡

RNN的上述缺點促使科學家開發了一種新的RNN模型變體,名為長短期記憶網絡(Long Short Term Memory)。由於LSTM使用門來控制記憶過程,它可以解決這個問題。

下面讓我們了解一下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更為先進。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM