上一篇文章中我们提到,CRNN模型中用于预测特征序列上下文的模块为双向LSTM模块,本篇中就来针对该模块的结构和实现做一些理解。

Bidirectional LSTM模块结构如下图所示:

LSTM学习笔记-LMLPHP

在Pytorch中,已经集成了LSTM模块,定义如下:

CLASStorch.nn.LSTM(self, input_size, hidden_size, num_layers=1, bias=True, batch_first=False, dropout=0.0, bidirectional=False, proj_size=0, device=None, dtype=None)

 参数说明:

  • input_size:输入的feature数;
  • hidden_size:隐藏状态h的的feature数;
  • num_layers:递归层的数量。如果num_layers=2,意味着将两个LSTM堆叠在一起,第二个LSTM模块的输入为第一个LSTM的输出,由第二个LSTM输出最终结果。
  • bias:偏置,默认为True,若设为False,则不使用b_ih和b_hh(这两个参数会在下文说明)
  • batch_first:为True时,输入和输出形状为(batch, seq, feature),否则为(seq, batch, feature)。
  • dropout:默认为0。若为非零值,则在每个LSTM层的输出上引入dropout层,dropout概率为设置的dropout值。
  • bidirectional:默认为False。若为True,则为双向LSTM,在CRNN网络中,我们将该参数设置为True。 
  • proj_size:默认为0。若设置为非零值,意味着使用映射大小的size,关于proj_size,pytorch文档中有如下说明:

LSTM学习笔记-LMLPHP

对于输入序列中的每个元素,每一层需要进行如下计算:

LSTM学习笔记-LMLPHP

其中,

  • xt​为t时刻的输入;
  • ht是t时刻的隐藏状态,ht-1为t-1时刻的隐藏状态;
  • ct为t时刻的元组状态(cell state);
  • it、ft、gt和ot分别为input gate、forget gate、cell gate、和output gate;
  • σ为sigmoid 函数;
  • ⊙为Hadamard乘积(矩阵点乘)。

对于多层LSTM,输入为上一层的隐含状态,Pytorch文档中对此有较详细的说明:

LSTM学习笔记-LMLPHP

关于可学习模型参数的说明:

  • weight_ih_l[k]:第k层的input-hidden权重参数(W_ii|W_if|W_ig|W_io),k=0时,形状为(4*hidden_size, input_size) ;k>0时,,若proj_size为0,则权重参数形状为(4*hidden_size, num_directions * hidden_size),若proj_size>0,则权重参数形状为(4*hidden_size, num_directions * proj_size)。
  • weight_hh_l[k]:第k层的hidden-hidden权重参数(W_hi|W_hf|W_hg|W_ho)。若proj_size=0,权重形状:(4*hidden_size, hidden_size);若proj_size>0,则权重形状为(4*hidden_size, proj_size)。
  • bias_ih_l[k]:第k层的input-hidden偏置(b_hi|b_hf|b_hg|b_ho),形状为(4*hidden_size)。
  • bias_hh_l[k]:第k层的hidden-hidden偏置(b_hi|b_hf|b_hg|b_ho),形状为(4*hidden_size)。
  • weight_hr_l[k]:第k层的projection权重,形状为(proj_size, hidden_size),该参数只有在proj_size>0的时候存在。
  • weight_ih_l[k]_reverse:weight_ih_l[k]的反向权重,只在bidirectional=True的时候存在。
  • weight_hh_l[k]_reverse:weight_hh_l[k]的反向权重,只在bidirectional=True的时候存在。
  • bias_ih_l[k]_reverse:bias_ih_l[k]的反向权重,只在bidirectional=True的时候存在。
  • bias_hh_l[k]_reverse:bias_hh_l[k]的反向权重,只在bidirectional=True的时候存在。
  • weight_hr_l[k]_reverse:weight_hr_l[k]的反向权重,只在bidirectional=True的时候存在。

参考资料:LSTM — PyTorch 2.1 documentation

01-21 11:15