超平实版Pytorch LSTM模块输入输出以及参数详解

本篇文章包含什么?

本篇文章侧重于Pytorch实践过程中对LSTM的使用,主要讲解torch.nn.LSTM输入和输出的内容,不包含LSTM的原理和细节。

LSTM作用在什么上?

LSTM是作用在**一整个序列(sequence)**上的。也就是说,我们输入的是一整个串S,LSTM层会对里面的每一个小单位(element)x进行LSTM操作。
(注意:此处我们以大写S表示整个串,小写x表示串中的某个单位。以一个句子为例,整个句子是S,每一个单词是一个x。)

在每一个单词x上会发生什么?

你可以这样理解,每一个单词都会进入一个LSTM小箱子,经过运算之后得到的东西会作为信息运输到下一个小箱子里。

每一个LSTM小箱子输入的是什么,输出的是什么?

每一个小箱子输入的东西共3样,有两个来源:
来源1:从上一个小箱子来的
(1)上一个小箱子输出的“隐状态”hidden state ht-1
(2) 上一个小箱子输出的“记忆单元”cell state ct-1
本文侧重于实践,不包含原理细节,因此在此你只需要记住,每一个小箱子的输入是ht-1和ct-1即可。
来源2:(3)当前单词xt

每一个小箱子输出的,根据我们上面说的(1)和(2),那当然就是这一层的ht和ct了。

所以我们一开始要往模型里传入的input是什么?

在上一个问题中,只有(3)是我们手上有的,即每一个单词x,所以我们一开始传入的东西是整个句子S。在pytorch中,整个句子S就被叫做"input".

input(句子)的形状是?

形状是(seq_len, batch, input_size)
seq_len就是一个句子的长度
batch是当前批的大小(即一批有几个句子)
input_size则是每一个单词x的feature数(即单词embedding的维度了)

h0和c0我们不用传入吗?

我们提到(1)和(2)是从上一个小箱子里来的。那么如果我们遇到的是第一个小箱子,没有上一个小箱子给我们送h0和c0怎么办呢?
这两个参数其实是可传可不传的,如果你想给h0和c0初始值,那你就传一下。形状都是(num_layers * num_directions, batch, hidden_size),
其中num_layers*num_directions是在说模型有几层,你叠多少层LSTM就是num_layers, 如果你两个方向都进行一遍LSTM层数就又多了一倍(num_directions=2),相应地你的h0和c0也会变多了。

如果你不传入h0和c0,默认它们的初始化都是0.

整个LSTM给我们输出什么?

输出的东西和我们输入的结构其实很相似:
输入的是三样:input, (h_0, c_0)
输出的也是三样:output, (h_n, c_n)
在这里我如果告诉你n=句子S的总长,你其实很容易就能知道h_n, c_n是什么,其实就是最后的小箱子输出的h和c了。

而output,形状是
(seq_len, batch, num_directions * hidden_size)
它包含的其实是每一个小箱子吐出的ht,所以整个长度和我们输入的句长是一样的,都是seq_len

构建LSTM层的时候怎么做?

刚才我们说的其实是具体往LSTM输入input、得到output的操作(即forward的过程)。在这之前,我们要先在我们的神经网络模型的__init__当中构建一下LSTM层:

self.lstm = nn.LSTM(input_size, hidden_size, num_layers)

这里input_size就是每一个小x的feature数(embedding长度)
hidden_size是你希望每一个LSTM小箱子吐出的每一个小ht的长度

刚才我们讲的从一个小箱子到另一个小箱子都是从左到右的,
箱子->箱子->箱子->箱子->箱子->
↑      ↑    ↑    ↑  ↑
x1     x2     x3     x4     x5

而num_layers则是指你LSTM再在上面再叠几层,比如如果你num_layers=2:
箱子->箱子->箱子->箱子->箱子->
↑      ↑    ↑    ↑  ↑
箱子->箱子->箱子->箱子->箱子->
↑      ↑    ↑    ↑  ↑
x1     x2     x3     x4     x5

另外再提两个参数:
1.如果你希望你的input output的形状是batch放在最前面的,比如input形状是(batch, seq_len, input_size)而不是之前我们说的(seq_len, batch, input_size),那就设置batch_first=True.

2.如果你想构建双向LSTM,就设置bidirectional=True

forward的时候怎么做?

我们既然已经构建好LSTM层了,那么传入input得到output也就很简单了:

output, (hn, cn) = self.lstm(input_seq)

我觉得batch_size这个参数一直看起来很碍事,怎么办?

你不要理它。你只要理解了上面的内容,batch_size>1的时候只不过是多了几句句子,对每一句话做的操作其实还是同样的操作!

Reference

Pytorch官方Documentation: https://pytorch.org/docs/stable/nn.html?highlight=lstm#torch.nn.LSTM

  • 18
    点赞
  • 66
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值