(转)LSTM神经网络介绍
原文鏈接:http://www.atyun.com/16821.html
擴(kuò)展閱讀:https://machinelearningmastery.com/time-series-prediction-lstm-recurrent-neural-networks-python-keras/ is a really good tutorial of time series forecasting using LSTM。
長短期記憶網(wǎng)絡(luò),通常稱為“LSTM”(Long Short Term Memory network,由Schmidhuber和Hochreiterfa提出)。LSTM已經(jīng)被廣泛用于語音識別,語言建模,情感分析和文本預(yù)測。在深入研究LSTM之前,我們首先應(yīng)該了解LSTM的要求,它可以用實(shí)際使用遞歸神經(jīng)網(wǎng)絡(luò)(RNN)的缺點(diǎn)來解釋。所以,我們要從RNN講起。
遞歸神經(jīng)網(wǎng)絡(luò)(RNN)
對于人類來說,當(dāng)我們看電影時,我們在理解任何事件時不會每次都要從頭開始思考。我們依靠電影中最近的經(jīng)歷并向他們學(xué)習(xí)。但是,傳統(tǒng)的神經(jīng)網(wǎng)絡(luò)無法從之前的事件中學(xué)習(xí),因?yàn)樾畔⒉粫囊粋€時間步傳遞到另一個時間步。而RNN從前一步學(xué)習(xí)信息。
例如,電影中如果有某人在籃球場上的場景。我們將在未來的框架中即興創(chuàng)造籃球運(yùn)動:一個跑或者跳的人的形象可能被貼上“打籃球”的標(biāo)簽,而一個坐著看的人的形象可能被打上“觀眾”的標(biāo)簽。
一個經(jīng)典的RNN
一個典型的RNN如上圖所示 – 其中X(t)代表輸入,h(t)是輸出,而A代表從循環(huán)中的前一步獲得信息的神經(jīng)網(wǎng)絡(luò)。一個單元的輸出進(jìn)入下一個單元并且傳遞信息。
但是,有時我們并不需要我們的網(wǎng)絡(luò)僅僅通過過去的信息來學(xué)習(xí)。假設(shè)我們想要預(yù)測文中的空白字“大衛(wèi),一個36歲,住在舊金山的老男人。他有一個女性朋友瑪麗亞。瑪麗亞在紐約一家著名的餐廳當(dāng)廚師,最近他在學(xué)校的校友會上碰面。瑪麗亞告訴他,她總是對_________充滿熱情。”在這里,我們希望我們的網(wǎng)絡(luò)從依賴“廚師”中學(xué)習(xí)以預(yù)測空白詞為“烹飪”。我們想要預(yù)測的東西和我們想要它去得到預(yù)測的位置之間的間隙,被稱為長期依賴。我們假設(shè),任何大于三個單詞的東西都屬于長期依賴。可惜,RNN在這種情況下無法發(fā)揮作用。
為什么RNN在這里不起作用
在RNN訓(xùn)練期間,信息不斷地循環(huán)往復(fù),神經(jīng)網(wǎng)絡(luò)模型權(quán)重的更新非常大。因?yàn)樵诟逻^程中累積了錯誤梯度,會導(dǎo)致網(wǎng)絡(luò)不穩(wěn)定。極端情況下,權(quán)重的值可能變得大到溢出并導(dǎo)致NaN值。爆炸通過擁有大于1的值的網(wǎng)絡(luò)層反復(fù)累積梯度導(dǎo)致指數(shù)增長產(chǎn)生,如果值小于1就會出現(xiàn)消失。
長短期記憶網(wǎng)絡(luò)
RNN的上述缺點(diǎn)促使科學(xué)家開發(fā)了一種新的RNN模型變體,名為長短期記憶網(wǎng)絡(luò)(Long Short Term Memory)。由于LSTM使用門來控制記憶過程,它可以解決這個問題。
下面讓我們了解一下LSTM的架構(gòu),并將其與RNN的架構(gòu)進(jìn)行比較:
一個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?
為了克服梯度消失問題,我們需要一個二階導(dǎo)數(shù)在趨近零點(diǎn)之前能維持很長距離的函數(shù)。tanh是具有這種屬性的合適的函數(shù)。
為什么要使用Sigmoid?
由于Sigmoid函數(shù)可以輸出0或1,它可以用來決定忘記或記住信息。
信息通過很多這樣的LSTM單元。圖中標(biāo)記的LSTM單元有三個主要部分:
LSTM有一個特殊的架構(gòu),它可以讓它忘記不必要的信息。Sigmoid層取得輸入X(t)和h(t-1),并決定從舊輸出中刪除哪些部分(通過輸出0實(shí)現(xiàn))。在我們的例子中,當(dāng)輸入是“他有一個女性朋友瑪麗亞”時,“大衛(wèi)”的性別可以被遺忘,因?yàn)橹黝}已經(jīng)變成了瑪麗亞。這個門被稱為遺忘門f(t)。這個門的輸出是f(t)* c(t-1)。
下一步是決定并存儲記憶單元新輸入X(t)的信息。Sigmoid層決定應(yīng)該更新或忽略哪些新信息。tanh層根據(jù)新的輸入創(chuàng)建所有可能的值的向量。將它們相乘以更新這個新的記憶單元。然后將這個新的記憶添加到舊記憶c(t-1)中,以給出c(t)。在我們的例子中,對于新的輸入,他有一個女性朋友瑪麗亞,瑪麗亞的性別將被更新。當(dāng)輸入的信息是,“瑪麗亞在紐約一家著名的餐館當(dāng)廚師,最近他們在學(xué)校的校友會上碰面。”時,像“著名”、“校友會”這樣的詞可以忽略,像“廚師”、“餐廳”和“紐約”這樣的詞將被更新。
最后,我們需要決定我們要輸出的內(nèi)容。Sigmoid層決定我們要輸出的記憶單元的哪些部分。然后,我們把記憶單元通過tanh生成所有可能的值乘以Sigmoid門的輸出,以便我們只輸出我們決定的部分。在我們的例子中,我們想要預(yù)測空白的單詞,我們的模型知道它是一個與它記憶中的“廚師”相關(guān)的名詞,它可以很容易的回答為“烹飪”。我們的模型沒有從直接依賴中學(xué)習(xí)這個答案,而是從長期依賴中學(xué)習(xí)它。
我們剛剛看到經(jīng)典RNN和LSTM的架構(gòu)存在很大差異。在LSTM中,我們的模型學(xué)習(xí)要在長期記憶中存儲哪些信息以及要忽略哪些信息。
使用LSTM快速實(shí)現(xiàn)情感分析
在這里,我使用基于keras的LSTM對Yelp開放數(shù)據(jù)集的評論數(shù)據(jù)進(jìn)行情感分析。
下面是我的數(shù)據(jù)集。
數(shù)據(jù)集
我使用Tokenizer對文本進(jìn)行了矢量化處理,并在限制tokenizer僅使用最常見的2500個單詞后將其轉(zhuǎn)換為整數(shù)序列。我使用pad_sequences將序列轉(zhuǎn)換為二維numpy數(shù)組。
view source
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-9s]','',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) |
然后,我構(gòu)建自己的LSTM網(wǎng)絡(luò)。幾個超參數(shù)如下:
embed_dim:嵌入層將輸入序列編碼為維度為embed_dim的密集向量序列。
lstm_out:LSTM將矢量序列轉(zhuǎn)換為大小為lstm_out的單個矢量,其中包含有關(guān)整個序列的信息。
其他超參數(shù),如dropout,batch_size與CNN中類似。
我使用softmax作為激活函數(shù)。
view source
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()) |
現(xiàn)在,我將我的模型放在訓(xùn)練集上,并檢查驗(yàn)證集的準(zhǔn)確性。
view source
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神經(jīng)網(wǎng)絡(luò)介紹,附情感分析應(yīng)用" width="588" height="62"></p> |
在一個包含所有業(yè)務(wù)的小數(shù)據(jù)集上運(yùn)行時,我在僅僅迭代一次就獲得了86%的驗(yàn)證精度。
未來的改進(jìn)方向:
我們可以篩選餐館等特定業(yè)務(wù),然后使用LSTM進(jìn)行情感分析。
我們可以使用具有更大的數(shù)據(jù)集進(jìn)行更多次的迭代來提高準(zhǔn)確性。
可以使用更多隱藏的密集層來提高準(zhǔn)確性。也可以調(diào)整其他超參數(shù)。
結(jié)論
當(dāng)我們希望我們的模型從長期依賴中學(xué)習(xí)時,LSTM要強(qiáng)于其他模型。LSTM遺忘,記憶和更新信息的能力使其比經(jīng)典的RNN更為先進(jìn)。
總結(jié)
以上是生活随笔為你收集整理的(转)LSTM神经网络介绍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 狗头大作战如何获得虎虎狗头
- 下一篇: 男士如何穿衣打扮(如何通过穿衣打扮)