LSTM是一种递归神经网络(RNN),用于处理序列数据。它具有比标准RNN更好的长期依赖性能力,这是通过使用称为“门控”机制的方法来实现的。
LSTM由四个主要部分组成:遗忘门(forget gate)、输入门(input gate)、单元状态(cell state)和输出门(output gate)。
在时间步 t t t处,假设输入为 x t x_t xt,前一时刻的隐藏状态为 h t − 1 h_{t-1} ht−1,单元状态为 c t − 1 c_{t-1} ct−1, LSTM的计算如下:
首先,计算遗忘门 f t f_t ft,控制前一时刻单元状态的遗忘程度:
f t = σ ( W f x t + U f h t − 1 + b f ) f_t = \sigma(W_f x_t + U_f h_{t-1} + b_f) ft=σ(Wfxt+Ufht−1+bf)
其中, W f W_f Wf是输入 x t x_t xt的权重矩阵, U f U_f Uf是前一时刻隐藏状态 h t − 1 h_{t-1} ht−1的权重矩阵, b f b_f bf是偏置向量, σ \sigma σ是sigmoid函数。
然后,计算输入门 i t i_t it,控制新信息的输入程度:
i t = σ ( W i x t + U i h t − 1 + b i ) i_t = \sigma(W_i x_t + U_i h_{t-1} + b_i) it=σ(Wixt+Uiht−1+bi)
其中, W i W_i Wi是输入 x t x_t xt的权重矩阵, U i U_i Ui是前一时刻隐藏状态 h t − 1 h_{t-1} ht−1的权重矩阵, b i b_i bi是偏置向量, σ \sigma σ是sigmoid函数。
接下来,计算新单元状态 c t ~ \tilde{c_t} ct~,用于更新当前单元状态:
c t ~ = tanh ( W c x t + U c h t − 1 + b c ) \tilde{c_t} = \tanh(W_c x_t + U_c h_{t-1} + b_c) ct~=tanh(Wcxt+Ucht−1+bc)
其中, W c W_c Wc是输入 x t x_t xt的权重矩阵, U c U_c Uc是前一时刻隐藏状态 h t − 1 h_{t-1} ht−1的权重矩阵, b c b_c bc是偏置向量, tanh \tanh tanh是双曲正切函数。
最后,计算当前时刻的单元状态 c t c_t ct,并更新隐藏状态 h t h_t ht:
c t = f t ⊙ c t − 1 + i t ⊙ c t ~ c_t = f_t \odot c_{t-1} + i_t \odot \tilde{c_t} ct=ft⊙ct−1+it⊙ct~
h t = o t ⊙ tanh ( c t ) h_t = o_t \odot \tanh(c_t) ht=ot⊙tanh(ct)
其中, ⊙ \odot ⊙表示逐元素乘积, o t o_t ot是输出门,用于控制输出程度:
o t = σ ( W o x t + U o h t − 1 + b o ) o_t = \sigma(W_o x_t + U_o h_{t-1} + b_o) ot=σ(Woxt+Uoht−1+bo)
其中, W o W_o Wo是输入 x t x_t xt的权重矩阵, U o U_o Uo是前一时刻隐藏状态 h t − 1 h_{t-1} ht−1的权重矩阵, b o b_o bo是偏置向量, σ \sigma σ是sigmoid函数。
LSTM通过门控机制控制信息的输入、输出和遗忘,从而有效地处理序列数据中的长期依赖关系。
在以上LSTM公式中,各变量的维度大小如下:
- x t x_t xt:输入序列的维度为 ( b a t c h _ s i z e , i n p u t _ s i z e ) (batch\_size, input\_size) (batch_size,input_size),其中 b a t c h _ s i z e batch\_size batch_size 表示输入的样本数, i n p u t _ s i z e input\_size input_size 表示输入的每个特征的维度大小。
- h t − 1 h_{t-1} ht−1:隐藏状态的维度为 ( b a t c h _ s i z e , h i d d e n _ s i z e ) (batch\_size, hidden\_size) (batch_size,hidden_size),其中 h i d d e n _ s i z e hidden\_size hidden_size 表示隐藏状态的维度大小。
- c t − 1 c_{t-1} ct−1:单元状态的维度为 ( b a t c h _ s i z e , h i d d e n _ s i z e ) (batch\_size, hidden\_size) (batch_size,hidden_size),与隐藏状态的维度相同。
- W f W_f Wf:输入到遗忘门的权重矩阵的维度为 ( h i d d e n _ s i z e , i n p u t _ s i z e ) (hidden\_size, input\_size) (hidden_size,input_size)。
- U f U_f Uf:隐藏状态到遗忘门的权重矩阵的维度为 ( h i d d e n _ s i z e , h i d d e n _ s i z e ) (hidden\_size, hidden\_size) (hidden_size,hidden_size)。
- b f b_f bf:遗忘门的偏置向量的维度为 ( h i d d e n _ s i z e , ) (hidden\_size,) (hidden_size,)。
- f t f_t ft:遗忘门的输出的维度为 ( b a t c h _ s i z e , h i d d e n _ s i z e ) (batch\_size, hidden\_size) (batch_size,hidden_size),与隐藏状态的维度相同。
- W i W_i Wi:输入到输入门的权重矩阵的维度为 ( h i d d e n _ s i z e , i n p u t _ s i z e ) (hidden\_size, input\_size) (hidden_size,input_size)。
- U i U_i Ui:隐藏状态到输入门的权重矩阵的维度为 ( h i d d e n _ s i z e , h i d d e n _ s i z e ) (hidden\_size, hidden\_size) (hidden_size,hidden_size)。
- b i b_i bi:输入门的偏置向量的维度为 ( h i d d e n _ s i z e , ) (hidden\_size,) (hidden_size,)。
- i t i_t it:输入门的输出的维度为 ( b a t c h _ s i z e , h i d d e n _ s i z e ) (batch\_size, hidden\_size) (batch_size,hidden_size),与隐藏状态的维度相同。
- c t ~ \tilde{c_t} ct~:新单元状态的维度为 ( b a t c h _ s i z e , h i d d e n _ s i z e ) (batch\_size, hidden\_size) (batch_size,hidden_size),与隐藏状态的维度相同。
- W c W_c Wc:输入到新单元状态的权重矩阵的维度为 ( h i d d e n _ s i z e , i n p u t _ s i z e ) (hidden\_size, input\_size) (hidden_size,input_size)。
- U c U_c Uc:隐藏状态到新单元状态的权重矩阵的维度为 ( h i d d e n _ s i z e , h i d d e n _ s i z e ) (hidden\_size, hidden\_size) (hidden_size,hidden_size)。
- b c b_c bc:新单元状态的偏置向量的维度为 ( h i d d e n _ s i z e , ) (hidden\_size,) (hidden_size,)。
- c t c_t ct:当前单元状态的维度为 ( b a t c h _ s i z e , h i d d e n _ s i z e ) (batch\_size, hidden\_size) (batch_size,hidden_size),与隐藏状态的维度相同。
- o t o_t ot:输出门的输出的维度为 ( b a t c h _ s i z e , h i d d e n _ s i z e ) (batch\_size, hidden\_size) (batch_size,hidden_size),与隐藏状态的维度相同。
- W o W_o Wo:输入到输出门的权重矩阵的维度为 ( h i d d e n _ s i z e , i n p u t _ s i z e ) (hidden\_size, input\_size) (hidden_size,input_size)。
- U o U_o Uo:隐藏状态到输出门的权重矩阵的维度为 ( h i d d e n _ s i z e , h i d d e n _ s i z e ) (hidden\_size, hidden\_size) (hidden_size,hidden_size)。
- b o b_o bo:输出门的偏置向量的维度为 ( h i d d e n _ s i z e , ) (hidden\_size,) (hidden_size,)。
- h t h_t ht:当前隐藏状态的维度为 ( b a t c h _ s i z e , h i d d e n _ s i z e ) (batch\_size, hidden\_size) (batch_size,hidden_size),与单元状态的维度相同。