雙向 LSTM

本文結構:

  • 為什么用雙向 LSTM
  • 什么是雙向 LSTM
  • 例子

為什么用雙向 LSTM?

單向的 RNN,是根據前面的信息推出后面的,但有時候只看前面的詞是不夠的,
例如,

我今天不舒服,我打算____一天。

只根據‘不舒服‘,可能推出我打算‘去醫院‘,‘睡覺‘,‘請假‘等等,但如果加上后面的‘一天‘,能選擇的范圍就變小了,‘去醫院‘這種就不能選了,而‘請假‘‘休息‘之類的被選擇概率就會更大。


什么是雙向 LSTM?

雙向卷積神經網絡的隱藏層要保存兩個值, A 參與正向計算, A' 參與反向計算。
最終的輸出值 y 取決于 A 和 A':

即正向計算時,隱藏層的 s_t 與 s_t-1 有關;反向計算時,隱藏層的 s_t 與 s_t+1 有關:

在某些任務中,雙向的 lstm 要比單向的 lstm 的表現要好:


例子

下面是一個 keras 實現的 雙向LSTM 應用的小例子,任務是對序列進行分類,
例如如下 10 個隨機數:

0.63144003 0.29414551 0.91587952 0.95189228 0.32195638 0.60742236 0.83895793 0.18023048 0.84762691 0.29165514

累加值超過設定好的閾值時可標記為 1,否則為 0,例如閾值為 2.5,則上述輸入的結果為:

0 0 0 1 1 1 1 1 1 1

和單向 LSTM 的區別是用到 Bidirectional:
model.add(Bidirectional(LSTM(20, return_sequences=True), input_shape=(n_timesteps, 1)))

from random import random
from numpy import array
from numpy import cumsum
from keras.models import Sequential
from keras.layers import LSTM
from keras.layers import Dense
from keras.layers import TimeDistributed
from keras.layers import Bidirectional

# create a sequence classification instance
def get_sequence(n_timesteps):
    # create a sequence of random numbers in [0,1]
    X = array([random() for _ in range(n_timesteps)])
    # calculate cut-off value to change class values
    limit = n_timesteps/4.0
    # determine the class outcome for each item in cumulative sequence
    y = array([0 if x < limit else 1 for x in cumsum(X)])
    # reshape input and output data to be suitable for LSTMs
    X = X.reshape(1, n_timesteps, 1)
    y = y.reshape(1, n_timesteps, 1)
    return X, y

# define problem properties
n_timesteps = 10

# define LSTM
model = Sequential()
model.add(Bidirectional(LSTM(20, return_sequences=True), input_shape=(n_timesteps, 1)))
model.add(TimeDistributed(Dense(1, activation='sigmoid')))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['acc'])

# train LSTM
for epoch in range(1000):
    # generate new random sequence
    X,y = get_sequence(n_timesteps)
    # fit model for one epoch on this sequence
    model.fit(X, y, epochs=1, batch_size=1, verbose=2)
    
# evaluate LSTM
X,y = get_sequence(n_timesteps)
yhat = model.predict_classes(X, verbose=0)
for i in range(n_timesteps):
    print('Expected:', y[0, i], 'Predicted', yhat[0, i])


學習資料:
https://zybuluo.com/hanbingtao/note/541458
https://maxwell.ict.griffith.edu.au/spl/publications/papers/ieeesp97_schuster.pdf
http://machinelearningmastery.com/develop-bidirectional-lstm-sequence-classification-python-keras/


推薦閱讀 歷史技術博文鏈接匯總
http://www.lxweimin.com/p/28f02bb59fe5
也許可以找到你想要的:
[入門問題][TensorFlow][深度學習][強化學習][神經網絡][機器學習][自然語言處理][聊天機器人]

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容