天天看點

【RNN詳解】SimpleRNN,LSTM,bi-LSTM的原理及Tensorflow實作1.摘要2.SimpleRNN3.LSTM4.LSTM改進—bi_LSTM5.總結

目錄

  • 1.摘要
  • 2.SimpleRNN
    • 2.1.原理介紹
    • 2.2.代碼實作
  • 3.LSTM
    • 3.1.原理介紹
    • 3.2.代碼實作
  • 4.LSTM改進—bi_LSTM
  • 5.總結
        • 感覺不錯的話,記得點贊收藏啊。

1.摘要

RNN是一種特殊的神經網絡結構,它是根據“人的認知是基于過往的經驗和記憶”這一觀點提出的,它與DNN,CNN不同的是:它不僅考慮前一時刻的輸入,而且賦予了網絡對前面内容的一種“記憶”功能,對于處理序列資料比較友好。RNN之是以稱為循環神經網路,即一個序列目前的輸出與前面的輸出也有關。具體的表現形式為網絡會對前面的資訊進行記憶并應用于目前輸出的計算中,即隐藏層之間的節點不再無連接配接而是有連接配接的,并且隐藏層的輸入不僅包括輸入層的輸出還包括上一時刻隐藏層的輸出。本篇将分别介紹SimpleRNN,LSTM,bi-LSTM。

2.SimpleRNN

2.1.原理介紹

在介紹之前,我們先來認識下最簡單的SimpleRNN,如下圖,我們先看左邊X-U-S-V-O這條路線,這就好比一個全連接配接神經網絡,X為輸入資料,U為輸入層到隐藏層的權重矩陣,S為隐藏層,V為隐藏層到輸出層O的權重矩陣。如果加上W,隐藏層S的值不僅僅取決于輸入層X,還取決于上次隐藏層的值與權重矩陣W相乘的值,相信大家都可以了解。按時間先展開,如右側所示。

【RNN詳解】SimpleRNN,LSTM,bi-LSTM的原理及Tensorflow實作1.摘要2.SimpleRNN3.LSTM4.LSTM改進—bi_LSTM5.總結

我們可以用如下公式來表示上圖的關系:

【RNN詳解】SimpleRNN,LSTM,bi-LSTM的原理及Tensorflow實作1.摘要2.SimpleRNN3.LSTM4.LSTM改進—bi_LSTM5.總結

2.2.代碼實作

接下來,我們使用keras中的SimpleRNN模型對IMDB資料集進行訓練,代碼如下:

from tensorflow.keras.datasets import imdb
from tensorflow.keras.preprocessing import sequence
# 作為特征的單詞個數
max_features = 10000 
# 在maxlen個單詞後截斷文本
maxlen = 500 
batch_size = 32
print('Loading data...')
(input_train, y_train), (input_test, y_test) = imdb.load_data(num_words=max_features)
print(len(input_train), 'train sequences')
print(len(input_test), 'test sequences')
print('Pad sequences (samples x time)')
input_train = sequence.pad_sequences(input_train, maxlen=maxlen)
input_test = sequence.pad_sequences(input_test, maxlen=maxlen)
print('input_train shape:', input_train.shape)
print('input_test shape:', input_test.shape)
           
【RNN詳解】SimpleRNN,LSTM,bi-LSTM的原理及Tensorflow實作1.摘要2.SimpleRNN3.LSTM4.LSTM改進—bi_LSTM5.總結
from tensorflow.keras.layers import Dense,Embedding,SimpleRNN
from tensorflow.keras.models import Sequential
# 搭模組化型
model = Sequential() 
model.add(Embedding(max_features, 32)) 
model.add(SimpleRNN(32)) 
model.add(Dense(1, activation='sigmoid'))
model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['acc'])
history = model.fit(input_train, y_train,
                    epochs=5, 
                    batch_size=128,
                    validation_split=0.2)
           
【RNN詳解】SimpleRNN,LSTM,bi-LSTM的原理及Tensorflow實作1.摘要2.SimpleRNN3.LSTM4.LSTM改進—bi_LSTM5.總結

3.LSTM

3.1.原理介紹

接下來,來講RNN裡面的算法之星LSTM,是一種改進後的循環神經網絡,可以解決simpleRNN無法處理長距離的依賴問題以及梯度爆炸的問題,目前比較流行。相比于原始的RNN的隐層(hidden state), LSTM增加了一個記憶細胞(如下圖),具有選擇性記憶功能,可以選擇記憶重要資訊,過濾掉噪音資訊,減輕記憶負擔。

【RNN詳解】SimpleRNN,LSTM,bi-LSTM的原理及Tensorflow實作1.摘要2.SimpleRNN3.LSTM4.LSTM改進—bi_LSTM5.總結

LSTM模型解讀:

(1)遺忘門

【RNN詳解】SimpleRNN,LSTM,bi-LSTM的原理及Tensorflow實作1.摘要2.SimpleRNN3.LSTM4.LSTM改進—bi_LSTM5.總結

遺忘門的輸入為Xt和h(t-1),輸出是ft,激活函數為sigmoid函數,激活函數使ft的輸出範圍為0-1之間,當值為0時,後續與C(t-1)相乘時,結果為0,即“遺忘”,是以叫做遺忘門,結果還是十分簡單的。

(2)更新門

【RNN詳解】SimpleRNN,LSTM,bi-LSTM的原理及Tensorflow實作1.摘要2.SimpleRNN3.LSTM4.LSTM改進—bi_LSTM5.總結

更新門輸入也是h(t-1)和Xt,輸出分别為it(和遺忘門一樣)和C`t(更新的資訊),對應的激活函數為sigmoid和tanh,sigmoid輸出結果為(0,1),tanh輸出結果為(-1,1)。

【RNN詳解】SimpleRNN,LSTM,bi-LSTM的原理及Tensorflow實作1.摘要2.SimpleRNN3.LSTM4.LSTM改進—bi_LSTM5.總結

如上圖所示,C(t-1)和ft相乘,it和C’t相乘,前者代表對過去資訊選擇性的保留,後者代表更新的資訊的添加,最後将兩部分合并起來,就是新的狀态Ct了。

(3)輸出門層

【RNN詳解】SimpleRNN,LSTM,bi-LSTM的原理及Tensorflow實作1.摘要2.SimpleRNN3.LSTM4.LSTM改進—bi_LSTM5.總結

這就是LSTM模型的輸出了,Ot是h(t-1)和Xt輸入後經sigmoid後的結果,Ct通過tanh縮放後與Ot相乘,就是輸出了。

3.2.代碼實作

說了半天原理,接下來使用keras中的LSTM模型對IMDB資料集進行訓練,代碼如下:

from tensorflow.keras.datasets import imdb
from tensorflow.keras.preprocessing import sequence
# 作為特征的單詞個數
max_features = 10000 
# 在maxlen個單詞後截斷文本
maxlen = 500 
batch_size = 32
print('Loading data...')
(input_train, y_train), (input_test, y_test) = imdb.load_data(num_words=max_features)
print(len(input_train), 'train sequences')
print(len(input_test), 'test sequences')
print('Pad sequences (samples x time)')
input_train = sequence.pad_sequences(input_train, maxlen=maxlen)
input_test = sequence.pad_sequences(input_test, maxlen=maxlen)
print('input_train shape:', input_train.shape)
print('input_test shape:', input_test.shape)
           
【RNN詳解】SimpleRNN,LSTM,bi-LSTM的原理及Tensorflow實作1.摘要2.SimpleRNN3.LSTM4.LSTM改進—bi_LSTM5.總結
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, Activation,Flatten
from tensorflow.keras.layers import Embedding
from tensorflow.keras.layers import LSTM
# 搭模組化型
model = Sequential()
model.add(Embedding(max_features, 32))
# 加LSTM
model.add(LSTM(32))
model.add(Dense(units=256,activation='relu' ))
model.add(Dropout(0.2))
model.add(Dense(units=1,activation='sigmoid' ))
model.compile(loss='binary_crossentropy', optimizer='adam',metrics=['accuracy'])

train_history =model.fit(input_train, y_train,batch_size=128, 
                         epochs=5,validation_split=0.2)
           
【RNN詳解】SimpleRNN,LSTM,bi-LSTM的原理及Tensorflow實作1.摘要2.SimpleRNN3.LSTM4.LSTM改進—bi_LSTM5.總結

由以上結果,可以看出LSTM的準确率高于SimpleRNN。

4.LSTM改進—bi_LSTM

在單向的循環神經網絡中,模型實際上隻使用到了“上文”的資訊,而沒有考慮到“下文”的資訊。在實際場景中,預測可能需要使用到整個輸入序列的資訊。是以,目前業内主流使用的都是雙向的循環神經網絡。顧名思義,雙向循環神經網絡結合了序列起點移動的一個循環神經網絡和令一個從序列末尾向序列起點移動的循環神經網絡。而作為循環神經網絡的一種拓展,LSTM 自然也可以結合一個逆向的序列,組成雙向長短時記憶網絡(Bi-directional Long Short-Term Memory, Bi-LSTM)。Bi-LSTM 目前在自然語言處理領域的應用場景很多,并且都取得了不錯的效果。具體原理不在多述,直接上代碼看效果。

代碼實作:

from tensorflow.keras.datasets import imdb
from tensorflow.keras.preprocessing import sequence
# 作為特征的單詞個數
max_features = 10000 
# 在maxlen個單詞後截斷文本
maxlen = 500 
batch_size = 32
print('Loading data...')
(input_train, y_train), (input_test, y_test) = imdb.load_data(num_words=max_features)
print(len(input_train), 'train sequences')
print(len(input_test), 'test sequences')
print('Pad sequences (samples x time)')
input_train = sequence.pad_sequences(input_train, maxlen=maxlen)
input_test = sequence.pad_sequences(input_test, maxlen=maxlen)
print('input_train shape:', input_train.shape)
print('input_test shape:', input_test.shape)
           
【RNN詳解】SimpleRNN,LSTM,bi-LSTM的原理及Tensorflow實作1.摘要2.SimpleRNN3.LSTM4.LSTM改進—bi_LSTM5.總結
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, Activation,Flatten
from tensorflow.keras.layers import Embedding
from tensorflow.keras.layers import Bidirectional,LSTM

model = Sequential()
model.add(Embedding(max_features, 32))
model.add(Bidirectional(LSTM(32)))
model.add(Dense(units=256,activation='relu' ))
model.add(Dropout(0.2))
model.add(Dense(1, activation='sigmoid'))

# 嘗試使用不同的優化器和不同的優化器配置
model.compile('adam', 'binary_crossentropy', metrics=['accuracy']) 
model.fit(input_train, y_train,batch_size=128,
          epochs=5,validation_split=0.2)
           
【RNN詳解】SimpleRNN,LSTM,bi-LSTM的原理及Tensorflow實作1.摘要2.SimpleRNN3.LSTM4.LSTM改進—bi_LSTM5.總結

5.總結

本篇主要講解了RNN循環神經網絡,首先講了最簡單的SimpleRNN,講解了其實作原理,并用其實作了IMDB影評情感分析,接下來,通過SimpleRNN引出了LSTM,分析了二者之間的差別,以及LSTM網絡結構上的創新,最後介紹了可以雙向傳播的bi-LSTM,具有更好的記憶功能,其在實際應用中使用廣泛。希望對讀者的學習有一定的幫助。

感覺不錯的話,記得點贊收藏啊。

上一篇: LSTM的使用
下一篇: EM algorithm

繼續閱讀