摘要
Sequence Models and Long-Short Term Memory Networks
===================================================
序列模型和LSTM网络
我们已经看到了各种前馈网络,也就是说,网络根本没有维护任何状态。这可能不是我们想要的行为。序列模型是NLP的核心:它们是在你的输入之间存在某种依赖关系的模型。序列模型的经典例子是词性标注的隐马尔可夫模型。另一个例子是条件随机场。
递归神经网络是一种保持某种状态的网络。例如,它的输出可以用作下一个输入的一部分,这样当网络通过序列时,信息就可以沿着序列传播。在LSTM的情况下,对于序列中的每个元素,都有一个对应的*hidden state*:,它原则上可以包含序列中较早的任意点的信息。我们可以使用隐藏状态来预测语言模型中的单词、词性标记和其他许多东西。
LSTM's in Pytorch
在开始示例之前,请注意一些事情。Pytorch的LSTM期望它的所有输入都是三维张量。这些张量的轴的语义很重要。第一个轴是序列本身、第二个索引mini-batch和第三个索引输入的元素。我们还没有讨论过mini-batching,所以让我们忽略它,假设在第二个轴上总是只有一个维度。如果我们想让序列模型遍历" the cow jump "这句话,我们的输入应该是这样的
记住还有一个尺寸为1的第二维,此外,你可以一次处理一个序列,在这种情况下,第一个轴的大小也是1。
让我们看一个简单的例子。
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
torch.manual_seed(1)
######################################################################
lstm = nn.LSTM(3, 3) # 输入维度为3, 输出得维度也为3
inputs = [torch.randn(1, 3) for _ in range(5)] # make a sequence of length 5
print(inputs)
>>>[tensor([[-0.5525, 0.6355, -0.3968]]), tensor([[-0.6571, -1.6428, 0.9803]]), tensor([[-0.0421, -0.8206, 0.3133]]), tensor([[-1.1352, 0.3773, -0.2824]]), tensor([[-2.5667, -1.4303, 0.5009]])]
# initialize the hidden state.
hidden = (torch.randn(1, 1, 3),
torch.randn(1, 1, 3))
for i in inputs:
# 一步一个元素地遍历序列。
# 在每一步之后