虽然看了一些很好的blog了解了LSTM的内部机制,但对框架中的lstm输入输出和各个参数还是没有一个清晰的认识,今天打算彻底把理论和实现联系起来,再分析一下pytorch中的LSTM实现。
先说理论部分。一个非常有名的blog把原理讲得很清楚,推荐参考。总之就是这些公式:
简单来说就是,LSTM一共有三个门,输入门,遗忘门,输出门, i , f , o i,f,o i,f,o分别为三个门的程度参数, g g g是对输入的常规RNN操作。公式里可以看到LSTM的输出有两个,细胞状态 c ′ c' c′和隐状态 h ′ h' h′, c ′ c' c′是经输入、遗忘门的产物,也就是当前cell本身的内容,经过输出门得到 h ′ h' h′,就是想输出什么内容给下一单元。
那么实际应用时,我们并不关心细胞本身的状态,而是要拿到它呈现出的状态 h ′ h' h′作为最终输出。以pytorch中的LSTM为例:
torch.nn.LSTM(*args, **kwargs)
官方API:
https://pytorch.org/docs/stable/nn.html?highlight=lstm#torch.nn.LSTM
- 参数
– input_size
– hidden_size
– num_layers
– bias
– batch_first
– dropout
– bidirectional
- 输入
– input (seq_len, batch, input_size)
– h_0 (num_layers * num_directions, batch, hidden_size)
– c_0 (num_layers * num_directions, batch, hidden_size)
- 输出
– output (seq_len, batch, num_directions * hidden_size)
– h_n (num_layers * num_directions, batch, hidden_size)
– c_n (num_layers * num_directions, batch, hidden_size)
用起来很简单,当作黑箱时只要设置参数让它输出我们想要的shape就行了,但这些参数好像很难和前面公式里的那些联系起来,不便于理解和灵活使用。
先看一张很好的图(LSTM神经网络输入输出究竟是怎样的? - Scofield的回答 - 知乎):
这张图是以MLP的形式展示LSTM的传播方式(不用管左边的符号,输出和隐状态其实是一样的),方便理解hidden_size这个参数。其