# pytorch LSTM 中 output 和 hidden 关系

# 1.LSTM 模型简介

图 1
能点进来的相信大家也都清楚 LSTM 是个什么东西,我在这里就不加赘述了。具体介绍模型结构的也有不少。 如何简单的理解 LSTM—— 其实没有那么复杂 人人都能看懂的 LSTM

# 2.pytorch 中的 LSTM

这里附上一张 pytorch 官方文档的截图,h_n 和 c_n 我都理解分别是上图中横向箭头中的下方箭头和上方的箭头,那 output 是干什么用的?在学习 seq2seq 时用的比较多基本上都是把 encoder 端的 h_n 和 c_n 输入的 decoder 端,output 没怎么用过(听研究 NER 的同学说,它们用 output 不用 h_n 和 c_n)。
图 2
简单翻译一下就是 output 是每个时间 t,LSTM 最后一层的输出特征 h_t。

# 3. 关于 h 和 output 之间的关系进行实验

output, (hn,cn) = self.lstm(packed_embedding)
print('output', output.size())
print('hn', hn.size())
# 输出
output   torch.Size([17, 1, 200])
h   torch.Size([2, 1, 100])

这时我想到一个问题既然 output 是所有的 h_n,那最后一维 output 是不是就是 h_n?但是这里因为我们用的是双向 LSTM 所以 output 的第三维是 200,而 h_n 是 100,但是 h_n 的第一维是 2 (2【双向】*1【一层】)。

那是不是 output [-1,0,:10] 就是 h_n [0,0,:10]?这里取前 10 维进行观察

print('output  ', output[-1, 0, :10])
print("h_n", h_n[0, 0, :10])

图 3
在实验一下,反向 h_n 第一维取 - 1,output 取第三维取后 100 维。

print('output', output[-1, 0, 100:110])
print("h_n", h_n[-1, 0, :10])

图 4
好像出了点问题,但是突然想到反向的话反向的最后一个 t 实际上是正向的第一个 t,于是修改代码。

print('output', output[0, 0, 100:110])
print("h_n", h_n[-1, 0, :10])

图 5
嗯~这下就没啥问题了。