【动手学深度学习】--序列模型

文章目录

  • 序列模型
    • 1.序列数据
    • 2.统计工具
    • 3.自回归模型
      • 3.1马尔科夫假设
      • 3.2潜变量模型
    • 4.训练
    • 5.预测

序列模型

学习视频:序列模型【动手学深度学习v2】
官方笔记:序列模型

1.序列数据

想象一下有人正在看网飞(Netflix,一个国外的视频网站)上的电影。 一名忠实的用户会对每一部电影都给出评价, 毕竟一部好电影需要更多的支持和认可。 然而事实证明,事情并不那么简单。 随着时间的推移,人们对电影的看法会发生很大的变化。 事实上,心理学家甚至对这些现象起了名字:

  • 锚定(anchoring)效应:基于其他人的意见做出评价。 例如,奥斯卡颁奖后,受到关注的电影的评分会上升,尽管它还是原来那部电影。 这种影响将持续几个月,直到人们忘记了这部电影曾经获得的奖项。结果表明,这种效应会使评分提高半个百分点以上
  • 享乐适应(hedonic adaption):人们迅速接受并且适应一种更好或者更坏的情况 作为新的常态。 例如,在看了很多好电影之后,人们会强烈期望下部电影会更好。 因此,在许多精彩的电影被看过之后,即使是一部普通的也可能被认为是糟糕的。
  • 季节性(seasonality):少有观众喜欢在八月看圣诞老人的电影。
  • 有时,电影会由于导演或演员在制作中的不当行为变得不受欢迎。
  • 有些电影因为其极度糟糕只能成为小众电影。Plan9from Outer SpaceTroll2就因为这个原因而臭名昭著的。

简而言之,电影评分决不是固定不变的。 因此,使用时间动力学可以得到更准确的电影推荐,当然,序列数据不仅仅是关于电影评分的。 下面给出了更多的场景。

  • 在使用程序时,许多用户都有很强的特定习惯。 例如,在学生放学后社交媒体应用更受欢迎。在市场开放时股市交易软件更常用。
  • 预测明天的股价要比过去的股价更困难,尽管两者都只是估计一个数字。 毕竟,先见之明比事后诸葛亮难得多。 在统计学中,前者(对超出已知观测范围进行预测)称为外推法(extrapolation), 而后者(在现有观测值之间进行估计)称为内插法(interpolation)。
  • 在本质上,音乐、语音、文本和视频都是连续的。 如果它们的序列被我们重排,那么就会失去原有的意义。 比如,一个文本标题“狗咬人”远没有“人咬狗”那么令人惊讶,尽管组成两句话的字完全相同。
  • 地震具有很强的相关性,即大地震发生后,很可能会有几次小余震, 这些余震的强度比非大地震后的余震要大得多。 事实上,地震是时空相关的,即余震通常发生在很短的时间跨度和很近的距离内。
  • 人类之间的互动也是连续的,这可以从微博上的争吵和辩论中看出。

2.统计工具

【动手学深度学习】--序列模型_第1张图片

对p(x)进行展开

【动手学深度学习】--序列模型_第2张图片

3.自回归模型

【动手学深度学习】--序列模型_第3张图片

【动手学深度学习】--序列模型_第4张图片

【动手学深度学习】--序列模型_第5张图片

3.1马尔科夫假设

【动手学深度学习】--序列模型_第6张图片

【动手学深度学习】--序列模型_第7张图片

3.2潜变量模型

RNN属于潜变量模型

【动手学深度学习】--序列模型_第8张图片

总结:

  • 时序模型中,当前数据跟之前观察到的数据相关
  • 自回归模型使用自身过去数据预测未来
  • 马尔科夫模型假设当前只跟最近少数数据相关,从而简化模型
  • 潜变量模型使用潜变量来概括历史信息

4.训练

在了解了上述统计工具后,让我们在实践中尝试一下! 首先,我们生成一些数据:使用正弦函数和一些可加性噪声来生成序列数据, 时间步为1,2,…1000

【动手学深度学习】--序列模型_第9张图片

【动手学深度学习】--序列模型_第10张图片

tau = 4
features = torch.zeros((T - tau,tau))
for i in range(tau):
    '''
    features[:,0]=x[0:996]
    features[:,1]=x[1:997]
    features[:,2]=x[2:998]
    features[:,3]=x[3:999]
    '''
    features[:,i] = x[i:T - tau + i]
labels = x[tau:].reshape((-1,1))

batch_size,n_train = 16,600
# 只有前n_train个样本用于训练
train_iter = d2l.load_array((features[:n_train],labels[:n_train]),
                            batch_size,is_train=True)

在这里,我们使用一个相当简单的架构训练模型: 一个拥有两个全连接层的多层感知机,ReLU激活函数和平方损失。

# 初始化网络权重的函数
def init_weights(m):
    if type(m) == nn.Linear:
        nn.init.xavier_uniform_(m.weight)

# 一个简单的多层感知机
def get_net():
    net = nn.Sequential(nn.Linear(4, 10),
                        nn.ReLU(),
                        nn.Linear(10, 1))
    net.apply(init_weights)
    return net

# 平方损失。注意:MSELoss计算平方误差时不带系数1/2
loss = nn.MSELoss(reduction='none')

准备训练模型

def train(net, train_iter, loss, epochs, lr):
    trainer = torch.optim.Adam(net.parameters(), lr)
    for epoch in range(epochs):
        for X, y in train_iter:
            trainer.zero_grad()
            l = loss(net(X), y)
            l.sum().backward()
            trainer.step()
        print(f'epoch {epoch + 1}, '
              f'loss: {d2l.evaluate_loss(net, train_iter, loss):f}')

net = get_net()
train(net, train_iter, loss, 5, 0.01)

【动手学深度学习】--序列模型_第11张图片

5.预测

由于训练损失很小,因此我们期望模型能有很好的工作效果。 让我们看看这在实践中意味着什么。 首先是检查模型预测下一个时间步的能力, 也就是单步预测(one-step-ahead prediction)。

onestep_preds = net(features)
d2l.plot([time, time[tau:]],
         [x.detach().numpy(), onestep_preds.detach().numpy()], 'time',
         'x', legend=['data', '1-step preds'], xlim=[1, 1000],
         figsize=(6, 3))

【动手学深度学习】--序列模型_第12张图片

【动手学深度学习】--序列模型_第13张图片

multistep_preds = torch.zeros(T)
multistep_preds[: n_train + tau] = x[: n_train + tau]
for i in range(n_train + tau, T):
    multistep_preds[i] = net(
        multistep_preds[i - tau:i].reshape((1, -1)))

d2l.plot([time, time[tau:], time[n_train + tau:]],
         [x.detach().numpy(), onestep_preds.detach().numpy(),
          multistep_preds[n_train + tau:].detach().numpy()], 'time',
         'x', legend=['data', '1-step preds', 'multistep preds'],
         xlim=[1, 1000], figsize=(6, 3))

【动手学深度学习】--序列模型_第14张图片

【动手学深度学习】--序列模型_第15张图片

max_steps = 64

features = torch.zeros((T - tau - max_steps + 1, tau + max_steps))
# 列i(i
for i in range(tau):
    features[:, i] = x[i: i + T - tau - max_steps + 1]

# 列i(i>=tau)是来自(i-tau+1)步的预测,其时间步从(i)到(i+T-tau-max_steps+1)
for i in range(tau, tau + max_steps):
    features[:, i] = net(features[:, i - tau:i]).reshape(-1)

steps = (1, 4, 16, 64)
d2l.plot([time[tau + i - 1: T - max_steps + i] for i in steps],
         [features[:, (tau + i - 1)].detach().numpy() for i in steps], 'time', 'x',
         legend=[f'{i}-step preds' for i in steps], xlim=[5, 1000],
         figsize=(6, 3))

【动手学深度学习】--序列模型_第16张图片

以上例子清楚地说明了当我们试图预测更远的未来时,预测的质量是如何变化的。 虽然“4步预测”看起来仍然不错,但超过这个跨度的任何预测几乎都是无用的。

你可能感兴趣的:(深度学习,深度学习,人工智能)