机器学习深度学习——序列模型(NLP启动!)

👨‍🎓作者简介:一位即将上大四,正专攻机器学习的保研er
🌌上期文章:机器学习&&深度学习——卷积神经网络(LeNet)
📚订阅专栏:机器学习&&深度学习
希望文章对你们有所帮助

现在多多少少是打下了一点基础了,因为我的本科毕业论文是NLP方向的,所以现在需要赶忙打好NLP模型所需要的知识,然后实现一些NLP方向的科研项目,用于我的9月份预推免。就剩一个月就要开始预推免了,大家一起加油!

序列模型

  • 引入
  • 统计工具
    • 自回归模型
    • 马尔可夫模型
    • 因果关系
  • 训练
  • 预测
  • 总结

引入

对于一部电影,随着时间的推移,人们对电影的看法会发生很大的变化。也就是说,因为时间上的连续性,一些事情的发生也是会互相影响的,如果这些序列重排就会失去意义。有几个例子:
1、音乐、语音、文本和视频都是连续的。
2、地震具有很强的相关性,即大地震发生后,很可能会有几次小余震。
3、人类之间的互动也是连续的,比如微博上互相打口水仗。
4、预测明天的股价要比过去的股价更困难(先见之明比时候诸葛亮要更难)。

统计工具

我们可以通过下式来进行预测:
x t 符合 P ( x t ∣ x t − 1 , . . . , x 1 ) x_t符合P(x_t|x_{t-1},...,x_1) xt符合P(xtxt1,...,x1)
其中,x是非独立同分布的,因为时间上具有连续性,导致不同时间上的预测可能也会有相关性

自回归模型

从上面的式子可以看出,数据的数量随着t而变化:输入数据的数量这个数字将会随着我们遇到的数据量的增加而增加。因此我们需要使得这个计算更加简单,有两种策略:
1、自回归模型
假设显示情况下,相当长的序列
x t − 1 , . . . , x 1 x_{t-1},...,x_1 xt1,...,x1
可能不是必要的,我们只需要满足某个长度τ的时间跨度,即使用观测序列
x t − 1 , . . . , x t − τ x_{t-1},...,x_{t-τ} xt1,...,xtτ
这样的好处是参数的数量总是不变的,至少在t>τ的时候是这样的,既然都是固定长度,那么我们就可以训练之前讲过的几乎所有模型了(线性模型,或者多层感知机等等)。这种模型被称为自回归模型,因此总是队自己执行回归。
2、潜变量自回归模型
如下图所示:
在这里插入图片描述
该图体现出,我们需要保留和更新对过去观测的总结:
h t h_t ht
并且同时更新预测
x t ^ \hat{x_t} xt^
这就产生了基于
x t ^ = P ( x t ∣ h t ) \hat{x_t}=P(x_t|h_t) xt^=P(xtht)
的估计,以及公式
h t = g ( h t − 1 , x t − 1 ) h_t=g(h_{t-1},x_{t-1}) ht=g(ht1,xt1)
更新的模型。
而由于h从未被观测到,所以这类模型也叫作潜变量自回归模型
而整个序列的估计值都将通过以下方式获得:
P ( x 1 , . . . , x T ) = ∏ t = 1 T P ( x t ∣ x t − 1 , . . . , x 1 ) P(x1,...,x_T)=\prod_{t=1}^TP(x_t|x_{t-1},...,x_1) P(x1,...,xT)=t=1TP(xtxt1,...,x1)

马尔可夫模型

我们之前在估计的时候,选择的是在当前时序的前τ个数,只要和当前时序之前的所有数计算得来的结果近似,就说序列满足马尔可夫条件。特别是当τ=1时,得到一个一阶马尔可夫模型:
P ( x ) = P ( x 1 , . . . , x T ) = ∏ t = 1 T P ( x t ∣ x t − 1 ) 当 P ( x 1 ∣ x 0 ) = P ( x 1 ) P(x)=P(x_1,...,x_T)=\prod_{t=1}^TP(x_t|x_{t-1})当P(x_1|x_0)=P(x_1) P(x)=P(x1,...,xT)=t=1TP(xtxt1)P(x1x0)=P(x1)

因果关系

原则上,将P(x)倒序展开也没啥问题,可以基于条件概率公式写成:
P ( x 1 , . . . , x T ) = ∏ t = T 1 P ( x t ∣ x t + 1 , . . . , x T ) P(x_1,...,x_T)=\prod_{t=T}^1P(x_t|x_{t+1},...,x_T) P(x1,...,xT)=t=T1P(xtxt+1,...,xT)
但是在物理上这并不好实现,毕竟理论上一般没有根据未来的事情推测过去的事情。

训练

首先生成一些数据,使用正弦函数和一些可加性噪声来生成序列数据。(现在开始用notebook了)

%matplotlib inline
import torch
from torch import nn
from d2l import torch as d2lT = 1000  # 总共产生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))

在这里插入图片描述
接下来,将该序列转换为特征-标签对,这里我们使用前600个“特征-标签”对进行训练:

tau = 4
features = torch.zeros((T - tau, tau))
for i in range(tau):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)

运行结果:

epoch 1, loss: 0.061968
epoch 2, loss: 0.054118
epoch 3, loss: 0.051940
epoch 4, loss: 0.050062
epoch 5, loss: 0.050939

预测

训练损失看起来不大,那我们可以开始进行单步预测(也就是检查模型预测下一个时间步的能力):

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))

结果:
在这里插入图片描述
单步预测的效果不错,即便预测的时间步超过了600+4(n_train+tau),结果看起来也还是可以的,但是如果我们继续向前迈进,那么接下来的预测值就要基于之前的预测值和原本值或者完全基于之前的预测值,即:
x ^ 605 = f ( x 601 , x 602 , x 603 , x 604 ) x ^ 606 = f ( x 602 , x 603 , x 604 , x ^ 605 ) x ^ 607 = f ( x 603 , x 604 , x ^ 605 , x ^ 606 ) x ^ 608 = f ( x 604 , x ^ 605 , x ^ 605 , x ^ 607 ) x ^ 609 = f ( x ^ 605 , x ^ 606 , x ^ 607 , x ^ 608 ) \hat{x}_{605}=f(x_{601},x_{602},x_{603},x_{604})\\ \hat{x}_{606}=f(x_{602},x_{603},x_{604},\hat{x}_{605})\\ \hat{x}_{607}=f(x_{603},x_{604},\hat{x}_{605},\hat{x}_{606})\\ \hat{x}_{608}=f(x_{604},\hat{x}_{605},\hat{x}_{605},\hat{x}_{607})\\ \hat{x}_{609}=f(\hat{x}_{605},\hat{x}_{606},\hat{x}_{607},\hat{x}_{608}) x^605=f(x601,x602,x603,x604)x^606=f(x602,x603,x604,x^605)x^607=f(x603,x604,x^605,x^606)x^608=f(x604,x^605,x^605,x^607)x^609=f(x^605,x^606,x^607,x^608)
因此我们必须使用我们自己的预测(而不是原始数据)来进行多步预测:

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))

结果:
在这里插入图片描述
预测不理想的原因是:预测误差不断累加。这种现象就像是24小时天气预报,超过24小时以后,精度会迅速下降。

总结

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

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

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

相关文章

Android 网络协议与网络编程

一、TCP/IP协议 Transmission Control Protocol/Internet Protocol的简写,中译名为传输控制协议/因特网互联 协议,是Internet最基本的协议、Internet国际互联网络的基础,由网络层的IP协议和传输层的TCP 协议组成。协议采用了4层的层级结构。…

Debian安装和使用Elasticsearch 8.9

命令行通过 .deb 包安装 Elasticsearch 创建一个新用户 adduser elastic --> rust # 添加sudo权限 # https://phoenixnap.com/kb/how-to-create-sudo-user-on-ubuntu usermod -aG sudo elastic groups elastic下载Elasticsearch v8.9.0 Debian 包 https://www.elastic.co/…

【PCB专题】Allegro中如何自动查找并删除不使用的规则

在Allegro软件使用中,我们经常是从上一个版本修改而来的。那么就会遇到有些多余规则没有使用的情况,怎么能够知道哪些规则没有使用并删除呢? 如下所示在Electrical中的All Constraints下存在SDIO规则和WIFI_SDIO规则。这两个规则是重复的,只是名称不同而已。 在规则的使…

python调用pytorch的clip模型时报错

使用python调用pytorch中的clip模型时报错:AttributeError: partially initialized module ‘clip’ has no attribute ‘load’ (most likely due to a circular import) 目录 现象解决方案一、查看项目中是否有为clip名的文件二、查看clip是否安装成功 现象 clip…

防火墙第二次作业

一、什么是防火墙? 百度给出个一个定义:防火墙技术是通过有机结合各类用于安全管理与筛选的软件和硬件设备,帮助计算机网络于其内、外网之间构建一道相对隔绝的保护屏障,以保护用户资料与信息安全性的一种技术。 通俗的来讲&#…

TestDataLake在提升测试效能方面的实践

目录 1.背景 2.预期目标 3.系统设计和实现 3.1系统功能组成 3.2 数据智能生成 3.3 接口遍历测试 4.应用效果和收益 5.后续规划 1.背景 随着软件开发的迅速发展,测试数据管理变得越来越复杂。手动创建测试数据需要耗费大量时间和精力,同时容易出…

【Docker】docker镜像+nginx部署vue项目:

文章目录 一、文档:二、打包vue项目:三、配置nginx:四、配置Dockerfile:五、构建镜像:六、运行容器:七、最终效果: 一、文档: 【1】菜鸟教程:https://www.runoob.com/do…

【云原生】深入掌握k8s中Pod和生命周期

个人主页:征服bug-CSDN博客 kubernetes专栏:kubernetes_征服bug的博客-CSDN博客 目录 1 什么是 Pod 2 Pod 基本操作 3 Pod 运行多个容器 4 Pod 的 Labels(标签) 5 Pod 的生命周期 1 什么是 Pod 摘取官网: Pod | Kubernetes 1.1 简介 Pod 是可以在 …

linux Ubuntu 更新镜像源、安装sudo、nvtop、tmux

1.更换镜像源 vi ~/.pip/pip.conf在打开的文件中输入: pip.conf [global] index-url https://pypi.tuna.tsinghua.edu.cn/simple按下:wq保存并退出。 2.安装nvtop 如果输入指令apt install nvtop报错: E: Unable to locate package nvtop 需要更新一下apt&a…

mysql8配置binlog日志skip-log-bin,开启、关闭binlog,清理binlog日志文件

1.概要说明 binlog 就是binary log,二进制日志文件,这个文件记录了MySQL所有的DML操作。通过binlog日志我们可以做数据恢复,增量备份,主主复制和主从复制等等。对于开发者可能对binlog并不怎么关注,但是对于运维或者架…

【2023】XXL-Job 具体通过docker 配置安装容器,再通过springboot执行注册实现完整流程

【2023】XXL-Job 具体通过docker 配置安装容器,再通过springboot执行注册实现 一、概述二、安装1、拉取镜像2、创建数据库3、创建容器并运行3、查看容器和日志4、打开网页 127.0.0.1:9051/xxl-job-admin/ 三、实现注册测试1、创建一个SpringBoot项目、添加依赖。2、…

【C语言进阶】数据的存储----整型篇

​ 🍁 博客主页:江池俊的博客 💫收录专栏:C语言—探索高效编程的基石 💻 其他专栏:数据结构探索 ​💡代码仓库:江池俊的代码仓库 🎪 社区:GeekHub 🍁 如果觉得…

nuxt脚手架创建项目

在初始化时遇到一个依赖找不到的问题,记录一下,如有遇到同样问题的小伙伴,希望能给你们一点指引。 从安装脚手架开始,首先 一:安装nuxt脚手架 1. C盘全局安装: npm i -g create-nuxt-app 安装后可creat…

机器学习深度学习——卷积神经网络(LeNet)

👨‍🎓作者简介:一位即将上大四,正专攻机器学习的保研er 🌌上期文章:机器学习&&深度学习——池化层 📚订阅专栏:机器学习&&深度学习 希望文章对你们有所帮助 卷积神…

Pandaer的iPhone手机壳

哇塞,Pandaer的设计太棒了!手机壳的花样多到让我眼花缭乱,好多系列设计都很有意思,让人有集齐的冲动。我最近入手了几个iPhone的手机壳,它有亮色和透明的款式,亮色的壳内部也是亮的,因为手机壳全…

Pytorch Tutorial【Chapter 2. Autograd】

Pytorch Tutorial 文章目录 Pytorch TutorialChapter 2. Autograd1. Review Matrix Calculus1.1 Definition向量对向量求导1.2 Definition标量对向量求导1.3 Definition标量对矩阵求导 2.关于autograd的说明3. grad的计算3.1 Manual手动计算3.2 backward()自动计算 Reference C…

Java学习笔记

JVM JVM是java虚拟机,由于不同的客户端(如手机、笔记本、台式)有不同的芯片,同一段代码会被翻译成不同的机器指令,所以在没有JVM的时候,对于这些不同的客户端,需要编写不同的代码,就…

uniapp微信小程序 401时重复弹出登录弹框问题

APP.vue 登陆成功后,保存登陆信息 if (res.code 200) {uni.setStorageSync(loginResult, res)uni.setStorageSync(token, res.token);uni.setStorageSync(login,false);uni.navigateTo({url: "/pages/learning/learning"}) }退出登录 toLogout: func…

C高级--day4(wc指令、case...in、while循环、for循环、select..in、break、continue、shell中的函数)

#!/bin/bash function fun() {uidid -u $namegidid -g $nameecho $uid $gid } read name retfun $name echo $ret

Detector定位算法在FPGA中的实现——section1 原理推导

关于算法在FPGA中的实现,本次利用业余的时间推出一个系列章节,专门记录从算法的推导、Matlab的实现、FPGA的移植开发与仿真做一次完整的FPGA算法开发,在此做一下相关的记录和总结,做到温故知新。 这里以Detector在Global Coordina…