一、LSTM原理介紹
RNN雖然理論上也能循環處理長序列,但是由於其結構簡單,單元里面只是一個基於tanh激活函數的前饋網絡在循環,對於長序列中的哪些信息需要記憶、哪些序列需要忘記,RNN是無法處理的。序列越長,較早的信息就應該忘記,由新的信息來代替,因為上下文語境意境發生了變化,既然RNN無法處理該忘記的信息,那么RNN就不能應用倒長序列中。
而LSTM之所以能夠處理長的序列,是因為它通過刻意的設計來處理長期依賴問題,記住該記住的信息、忘記該忘記的信息是 LSTM 的默認行為,而非需要付出很大代價才能獲得的能力。LSTM主要通過三個門來進行控制:
1)遺忘門
遺忘門就是隨着語境的變化,忘記掉前面的需要忘記的信,遺忘門的輸出是一個sigmoid函數,取值范圍為0~1之間,與上一時刻的細胞狀態進行按位相乘,0代表該位的信息徹底忘掉,1代表該位的信息完全保留:
2) 輸入門
遺忘門說的是上一個細胞狀態的哪些信息需要忘記,而輸入門要看的是新的細胞狀態的信息哪些需要補充盡量,輸入門也是sigmoid函數,取值范圍為0~1之間,是與當前的細胞狀態按位相乘:
接着新舊狀態就可以合並一起了,形成最終新的細胞狀態:
3)輸出門
最終的細胞狀態加上tanh函數就是輸出,然后輸出門同上是一個sigmoid的0~1取值,作用於輸出,選擇哪些信息可以輸出:
參考連接:https://www.jianshu.com/p/9dc9f41f0b29
二、LSTM函數介紹(Keras)
keras.layers.LSTM(units, activation='tanh', recurrent_activation='hard_sigmoid', use_bias=True, kernel_initializer='glorot_uniform', recurrent_initializer='orthogonal', bias_initializer='zeros', unit_forget_bias=True, kernel_regularizer=None, recurrent_regularizer=None, bias_regularizer=None, activity_regularizer=None, kernel_constraint=None, recurrent_constraint=None, bias_constraint=None, dropout=0.0, recurrent_dropout=0.0, implementation=1, return_sequences=False, return_state=False, go_backwards=False, stateful=False, unroll=False)
參數
- units: 正整數,也叫隱藏層,表示的是每個lstm單元里面前饋神經網絡的輸出維度,每一個門的計算都有一個前饋網絡層。
- activation: 要使用的激活函數 ,如果傳入
None
,則不使用激活函數 (即 線性激活:a(x) = x
)。 - recurrent_activation: 用於循環時間步的激活函數 。默認分段線性近似 sigmoid (
hard_sigmoid
)。 如果傳入None
,則不使用激活函數 (即 線性激活:a(x) = x
)。 - use_bias: 布爾值,該層是否使用偏置向量。
- kernel_initializer:
kernel
權值矩陣的初始化器, 用於輸入的線性轉換。 - recurrent_initializer:
recurrent_kernel
權值矩陣 的初始化器,用於循環層狀態的線性轉換 。 - bias_initializer:偏置向量的初始化器 .
- unit_forget_bias: 布爾值。 如果為 True,初始化時,將忘記門的偏置加 1。 將其設置為 True 同時還會強制
bias_initializer="zeros"
。 這個建議來自 。 - kernel_regularizer: 運用到
kernel
權值矩陣的正則化函數。 - recurrent_regularizer: 運用到
recurrent_kernel
權值矩陣的正則化函數 。 - bias_regularizer: 運用到偏置向量的正則化函數 。
- activity_regularizer: 運用到層輸出(它的激活值)的正則化函數。
- kernel_constraint: 運用到
kernel
權值矩陣的約束函數。 - recurrent_constraint: 運用到
recurrent_kernel
權值矩陣的約束函數。 - bias_constraint: 運用到偏置向量的約束函數。
- dropout: 在 0 和 1 之間的浮點數。 單元的丟棄比例,用於輸入的線性轉換。
- recurrent_dropout: 在 0 和 1 之間的浮點數。 單元的丟棄比例,用於循環層狀態的線性轉換。
- implementation: 實現模式,1 或 2。 模式 1 將把它的操作結構化為更多的小的點積和加法操作, 而模式 2 將把它們分批到更少,更大的操作中。 這些模式在不同的硬件和不同的應用中具有不同的性能配置文件。
- return_sequences: 布爾值。是返回輸出序列中的最后一個輸出,還是全部序列,True的話返回全部序列,False返回最后一個輸出,默認為False。
- return_state: 布爾值。除了輸出之外是否返回最后一個狀態。
- go_backwards: 布爾值 (默認 False)。 如果為 True,則向后處理輸入序列並返回相反的序列。
- stateful: 布爾值 (默認 False)。 如果為 True,則本批次中索引 i 處的每個樣品的最后狀態,將用作下一批次中索引 i 樣品的初始狀態。
- unroll: 布爾值 (默認 False)。 如果為 True,則網絡將展開,否則將使用符號循環。 展開可以加速 RNN,但它往往會占用更多的內存。 展開只適用於短序列。