🐬序列模型
2021-12-1
| 2023-8-7
0  |  阅读时长 0 分钟
type
status
date
slug
summary
tags
category
icon
password
Property

 
对于图像数据,有专门的卷积神经网络架构来为这类特殊的数据结构建模。 如果拥有一张图像,需要有效地利用其像素位置, 假若对图像中的像素位置进行重排,就会对图像中内容的推断造成极大的困难。
我们之前默认数据都来自于某种分布, 并且所有样本都是独立同分布的。 然而,大多数的数据并非如此。 例如,文章中的单词是按顺序写的,如果顺序被随机地重排,就很难理解文章原始的意思。 同样,视频中的图像帧、对话中的音频信号以及网站上的浏览行为都是有顺序的。 因此,针对此类数据而设计特定模型,可能效果会更好。
另一个问题来自这样一个事实: 我们不仅仅可以接收一个序列作为输入,而是还可能期望继续猜测这个序列的后续。 例如,一个任务可以是继续预测2,4,6,8,10,…。 这在时间序列分析中是相当常见的,可以用来预测股市的波动、 患者的体温曲线或者赛车所需的加速度。 同理,需要能够处理这些数据的特定模型。
如果说卷积神经网络可以有效地处理空间信息, 那么循环神经网络则可以更好地处理序列信息。 循环神经网络通过引入状态变量存储过去的信息和当前的输入,从而可以确定当前的输出。
 
以股票价格(富时100指数)为例:
                                                                 近30年的富时100指数
近30年的富时100指数
表示价格:在时间步(time step) 时观察到的价格
对于本文中的序列通常是离散的,并在整数或其子集上变化。 假设一个交易员想在日的股市中表现良好,于是通过以下途径预测
 

自回归模型

为了实现这个预测,交易员可以使用回归模型。仅有一个主要问题:输入本身因而异, 数量会随着遇到的数据量的增加而增加, 因此需要一个近似方法来使这个计算变得容易处理。
  • 第一种策略
    • 假设现实情况下相当长的序列可能是不必要的, 因此只需要满足某个长度为的时间跨度, 即使用观测序列。 当下获得的最直接的好处就是参数的数量总是不变的, 至少在时如此,这就使我们能够训练一个深度网络。 这种模型被称为自回归模型(autoregressive models),是对自己执行回归。
  • 第二种策略
    • 保留一些对过去观测的总结, 并且同时更新预测和总结。 这就产生了基于估计 , 以及公式更新的模型。由于从未被观测到,这类模型也被称为 隐变量自回归模型(latent autoregressive models)
                                隐变量自回归模型
隐变量自回归模型
这两种情况都有一个显而易见的问题:如何生成训练数据?
一个经典方法是使用历史观测来预测下一个未来观测。 显然,我们并不指望时间会停滞不前。 然而,一个常见的假设是虽然特定值可能会改变, 但是序列本身的动力学不会改变。 这样的假设是合理的,因为新的动力学一定受新的数据影响, 而我们不可能用目前所掌握的数据来预测新的动力学。 统计学家称不变的动力学为静止的。 因此,整个序列的估计值都将通过以下的方式获得:
如果处理的是离散的对象(如单词), 而不是连续的数字,则上述的考虑仍然有效。 唯一的差别是,对于离散的对象, 需要使用分类器而不是回归模型来估计
 

马尔可夫模型

在自回归模型的近似法中,使用而不是来估计。只要这种是近似精确的,就说序列满足马尔可夫条件(Markov condition)。 特别是,如果 ,得到一个 一阶马尔可夫模型(first-order Markov model)由下式给出:
当假设仅是离散值时,这样的模型特别棒, 因为在这种情况下,使用动态规划可以沿着马尔可夫链精确地计算结果。 例如,可以高效地计算
利用这一事实,只需要考虑过去观察中的一个非常短的历史:

因果关系

原则上,将倒序展开也没什么问题。 毕竟,基于条件概率公式,可以写出:
事实上,如果基于一个马尔可夫模型, 我们还可以得到一个反向的条件概率分布。 然而,在许多情况下,数据存在一个自然的方向,即在时间上是前进的。 很明显,未来的事件不能影响过去。 因此,如果改变,可能会影响未来发生的事情,但不能反过来。 也就是说改变,基于过去事件得到的分布不会改变。 因此,解释应该比解释 更容易。 例如,在某些情况下,对于某些可加性噪声, 显然可以找到, 而反之则不行。 这是个好消息,因为这个前进方向通常也是我们感兴趣的方向。
 

训练

使用正弦函数和一些可加性噪声来生成序列数据,时间步为
notion image
接下来,将这个序列转换为模型的“特征-标签”(feature-label)对。 基于嵌入维度,将数据映射为数据对。这比提供的数据样本少了个, 因为没有足够的历史记录来描述前个数据样本。 一个简单的解决办法是:如果拥有足够长的序列就丢弃这几项; 另一个方法是用零填充序列。 在这里仅使用前600个“特征-标签”对进行训练。
使用一个相当简单的架构训练模型: 一个拥有两个全连接层的多层感知机,ReLU激活函数和平方损失
训练模型
 

预测

检查模型预测下一个时间步的能力, 也就是单步预测(one-step-ahead prediction)
notion image
单步预测效果不错。 即使这些预测的时间步超过了600+4(n_train + tau), 其结果看起来仍然是可信的。 然而有一个小问题:如果数据观察序列的时间步只到604, 需要一步一步地向前迈进:
 
通常,对于直到 的观测序列,其在时间步 处的预测输出称为 步预测。 由于我们的观察已经到了 ,它的 步预测是。 换句话说,必须使用我们自己的预测(而不是原始数据)来进行多步预测。
notion image
绿线的预测显然并不理想。 经过几个预测步骤之后,预测的结果很快就会衰减到一个常数。 为什么这个算法效果这么差呢?事实是由于错误的累积: 假设在步骤1之后,积累了一些错误。 于是,步骤2的输入被扰动了, 结果积累的误差是依照次序的, 其中 为某个常数,后面的预测误差依此类推。 因此误差可能会相当快地偏离真实的观测结果。 例如,未来24小时的天气预报往往相当准确, 但超过这一点,精度就会迅速下降。
基于 ,通过对整个序列预测的计算,更仔细地看一下k步预测的困难
notion image
  • PyTorch
  • 样式迁移文本预处理
    目录