动手学深度学习——序列模型

序列模型

      • 1. 统计工具
        • 1.1 自回归模型
        • 1.2 马尔可夫模型
      • 2. 训练
      • 3. 预测
      • 4. 小结

序列模型是一类机器学习模型,用于处理具有时序关系的数据。这些模型被广泛应用于自然语言处理、音频处理、时间序列分析等领域。

以下是几种常见的序列模型:

隐马尔可夫模型(Hidden Markov Models,HMMs):HMM是一种基于概率的序列模型,在许多序列建模问题中被广泛使用,如语音识别、自然语言处理和生物信息学。HMM包括一个隐藏状态序列和一个对应的观测序列。通过观测序列来推断最可能的隐藏状态序列。

循环神经网络(Recurrent Neural Networks,RNNs):RNN是一种能够处理序列数据的神经网络。它通过在网络中引入循环连接来保留先前的信息,并将其用于当前的预测。RNN在处理具有长期依赖关系的序列数据时表现出色,但在面对较长的序列时可能会出现梯度消失或梯度爆炸的问题。

长短期记忆网络(Long Short-Term Memory,LSTM):LSTM是一种改进的RNN架构,专门设计用于解决长期依赖性问题。它通过引入门控机制来控制信息的流动和保留,从而有效地捕捉到长期的依赖关系。LSTM在自然语言处理、时间序列分析等任务中被广泛使用。

双向循环神经网络(Bidirectional Recurrent Neural Networks,BiRNNs):BiRNN是一种结合了正向和反向循环神经网络的模型。它通过分别处理正向和反向的输入序列,从而充分利用前后上下文信息。BiRNN在许多序列建模任务中表现出良好的性能,如命名实体识别、句子分类等。

注意力机制模型(Attention Mechanism):注意力机制是一种增强序列模型性能的技术,它允许模型根据输入序列中的不同部分自适应地分配不同的关注权重。这种机制使得模型能够更好地集中注意力并理解与任务相关的重要特征。

1. 统计工具

1.1 自回归模型
  1. 只需要长度为 τ 的时间跨度,好处是参数总量不变。这种模型被称为自回归模型,即对自己执行回归。
  2. 保留对过去观测的总结ht,同时更新预测xt和总结ht。这种模型被称为隐变量自回归模型。
    在这里插入图片描述
1.2 马尔可夫模型

一阶马尔可夫模型
在这里插入图片描述

2. 训练

使用正弦函数和一些可加性噪声来生成序列数据, 时间步为1,2,…,1000。

# 使用正弦函数和可加噪声生成序列数据
%matplotlib inline
import torch
from torch import nn
from d2l import torch as d2l
T = 1000
time = torch.arange(1, T + 1, dtype=torch.float32)
x = torch.sin(0.01 * time) + torch.normal(0, 0.2, (T, ))
d2l.plot(time, [x], 'time', 'x', xlim=[1, 1000], figsize=(6, 3))

在这里插入图片描述
将序列转换为模型的特征—标签对

"""
将序列转换为模型的特征—标签对:1、数据样本为t-τ到t-1,少了τ个2、如果序列足够长就丢弃这几项或者用零填充序列
"""
# 仅使用前600个“特征-标签”对进行训练
tau = 4
features = torch.zeros((T - tau, tau))for i in range(tau):features[:, i] = x[i: T - tau + i]print(features)
labels = x[tau:].reshape((-1, 1))print(features.shape)
print('x的前10个元素:\n', x[:10])
print(labels.shape)
print('前10个标签:\n', labels[:10])

在这里插入图片描述

batch_size, n_train = 16, 600
train_iter = d2l.load_array((features[:n_train], labels[:n_train]),batch_size, is_train=True)
print(features[:4])
print(x[:16])

在这里插入图片描述初始化网络权重的函数

# 初始化网络权重的函数
def init_weights(m):if type(m) == nn.Linear:nn.init.xavier_normal_(m.weight)# 一个有两个全连接层的多层感知机,ReLU激活函数和平方损失
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)

在这里插入图片描述

3. 预测

# 单步预测
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))

在这里插入图片描述
k步预测:使用自己的预测(非原始数据)来进行多步预测

# k步预测:使用自己的预测(非原始数据)来进行多步预测
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))

在这里插入图片描述
点划线的预测不理想:误差的累积

# 点划线的预测不理想:误差的累积
max_steps = 64features = torch.zeros((T - tau - max_steps + 1, tau + max_steps))
# 列i(i<tau)是来自x的观测,其时间步从(i)到(i+T-tau-max_steps+1)
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))

在这里插入图片描述

4. 小结

  1. 内插法(在现有观测值之间进行估计)和外推法(对超出已知观测范围进行预测)在实践的难度上差别很大。因此在训练时要尊重其时间顺序,即最好不要基于未来的数据进行训练。
  2. 序列模型的估计需要专门的统计工具,两种较流行的选择是自回归模型和隐变量自回归模型。
  3. 对于时间是向前推进的因果模型,正向估计通常比反向估计更容易。
  4. 对于直到时间步 t 的观测序列,其在时间步 t+k 的预测输出是“k步预测”。随着我们对预测时间 k 值的增加,会造成误差的快速累积和预测质量的极速下降。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/173989.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ubuntu18.04配置Java环境与安装RCS库

一、安装包 安装包 二、JAVA环境 java无需安装&#xff0c;只需要下载解压&#xff0c;然后配置正确的路径到环境变量种即可使用。 1.创建文件JAVA mkdir JAVA 2.将安装包复制到该文件夹下&#xff0c;并解压缩 tar -zxvf tar -zxvf jdk1.8.0_191.tar.gz 3.在home路径下…

Nexus的Maven私有仓库搭建

Nexus的maven私有仓库搭建 一、了解 maven仓库设置 默认设置 其中&#xff1a; maven-central: 预定义的代理Maven Central仓库&#xff0c;它包含了大量的开源Java依赖包。maven-public: 存储库是一个组合存储库&#xff0c;它包含了maven-releases和maven-snapshots存储库…

Duplicate keys detected: ‘0‘. This may cause an update error

Duplicate keys detected: ‘0’. This may cause an update error.当遇到该节点内容更新时&#xff0c;会因为重复的key导致无法更新。 该错误&#xff0c;是因为同级节点下存在两个由0开始的key&#xff0c;当遇到该节点内容更新时&#xff0c;会因为重复的key导致无法更新。…

C/C++ #define与编译器的预处理

文章目录 预处理#define新版本特性旧版本特性#define除了定义明示常量的其他用途 #define的组成#define本身&#xff1a;预处理指令宏替换列表或替换体宏展开 参考资料 预处理 在预处理之前&#xff0c;编译器必须对该程序进行一些翻译处理。首先&#xff0c;编译器 把源代码中…

WebGl-Blender:建模 / 想象成形 / 初识 Blender

一、理解Blender 欢迎来到Blender&#xff01;Blender是一款免费开源的3D创作套件。 使用Blender&#xff0c;您可以创建3D可视化效果&#xff0c;例如建模、静态图像&#xff0c;3D动画&#xff0c;VFX&#xff08;视觉特效&#xff09;快照和视频编辑。它非常适合那些受益于…

【shardingjdbc】sharding-jdbc分库分表入门demo及原理分析

文章目录 场景配置&#xff1a;概念及原理:代码:思考: 本文中&#xff0c;demo案例涉及场景为sharding jdbc的分库情况。 通俗点说就是由原来的db0_table水平拆分为 db1 t_table &#xff0c;db2.t_table。 demo本身很简单&#xff0c;难点在于分片策略配置到底该怎么写&#x…

Elasticsearch 面试题

文章目录 Elasticsearch 读取数据您能解释一下 X-Pack for Elasticsearch 的功能和重要性吗&#xff1f;Elasticsearch 中的节点&#xff08;比如共 20 个&#xff09;&#xff0c;其中的 10 个选了 一个master&#xff0c;另外 10 个选了另一个 master&#xff0c;怎么办&…

Redis应用之二分布式锁2

一、前言 前一篇 Redis应用之二分布式锁 我们介绍了使用SETNX来实现分布式锁&#xff0c;并且还遗留了一个Bug&#xff0c;今天我们对代码进行优化&#xff0c;然后介绍一下Redisson以及数据库的乐观锁悲观锁怎么用。 二、SetNX分布式锁优化后代码 RedisService.java Inven…

模拟散列表(哈希表拉链法)

维护一个集合&#xff0c;支持如下几种操作&#xff1a; I x&#xff0c;插入一个整数 x&#xff1b;Q x&#xff0c;询问整数 x 是否在集合中出现过&#xff1b; 现在要进行 N 次操作&#xff0c;对于每个询问操作输出对应的结果。 输入格式 第一行包含整数 N&#xff0c;…

SpringBoot3+Vue3+Mysql+Element Plus完成数据库存储blob类型图片,前端渲染后端传来的base64类型图片

前言 如果你的前后端分离项目采用SpringBoot3Vue3Element Plus&#xff0c;且在没有OSS&#xff08;对象存储&#xff09;的情况下&#xff0c;使用mysql读写图片&#xff08;可能不限于图片&#xff0c;待测试&#xff09;。 耗时三天&#xff0c;在踩了无数雷后&#xff0c…

Python基础入门----使用Pipenv工具时产生的Pipfile和Pipfile.lock文件有什么区别以及有什么作用

文章目录 PipfilePipfile.lock实操示例当我们使用 Pipenv 工具进行 Python 项目的依赖管理时,会遇到两个重要的文件:Pipfile 和 Pipfile.lock。这两个文件在项目中扮演着不同但又相互补充的角色。接下来,我将详细介绍这两个文件的区别和作用,并提供一些具体的使用示例。 P…

并查集详解(附例题和模板)

一、并查集 &#xff08;1&#xff09;处理问题的类型 1.将两个集合合并 2.询问两个元素是否在一个集合当中 询问 1.fa[x]a; 2.if(fa[x]fa[y]) o(1) 在o(1)的复杂度内进行两个操作 &#xff08;2&#xff09;基本原理 基本原理&#xff1a;每个集合用一棵树来表示&#…