什么是 LSTM
Understanding LSTM Networks 和 人人都能看懂的LSTM 这两篇文章介绍了 LSTM 的原理。本文的着重点在于 LSTM 的输入输出维度以及 torch.nn.LSTM 的使用。
LSTM 的输入输出
首先来看这张图
input 序列的长度为
L
L
L ,包括
x
1
,
x
2
,
.
.
.
,
x
n
−
1
,
x
n
(
n
=
L
)
x_1, x_2, ..., x_{n-1}, x_n(n=L)
x1,x2,...,xn−1,xn(n=L) ,每个输入
x
n
x_n
xn 的维度数 input_size 为
H
i
n
H_{in}
Hin 。所以,输入为
L
×
H
i
n
L \times H_{in}
L×Hin 的矩阵。
每个隐藏单元
h
n
(
w
)
h_n^{(w)}
hn(w) (每个蓝框)的尺寸 hidden_size 为
H
c
e
l
l
H_{cell}
Hcell ,而每个输入
x
n
x_n
xn 顶上的蓝框数量称作 num_layers ,即层数
D
D
D 。最后一层的隐藏单元即为输出,大小为
L
×
H
c
e
l
l
L \times H_{cell}
L×Hcell 。
nn.LSTM
下面为 Pytorch 官方例子
rnn = nn.LSTM(10, 20, 2) # 构建模型,(input_size, hidden_size, num_layers)->(H_in, H_cell, D)
input = torch.randn(5, 3, 10) # 生成数据,(L, batch_size, H_in)
h0 = torch.randn(2, 3, 20) # 初始隐藏单元,(num_layers, batch_size, hidden_size)->(D, batch_size, H_cell)
c0 = torch.randn(2, 3, 20) # 一般用不到
output, (hn, cn) = rnn(input, (h0, c0))
# output.shape = (5, 3, 20)->(L, batch_size, H_cell)
#hn.shape = h0.shape
# cn.shape = c0.shape