【时间序列】DA-RNN: 基于双阶段注意力机制的循环神经网络

作者:奥卡姆剃刀

个人博客:https://blog.csdn.net/yilulvxing

论文地址:https://arxiv.org/abs/1704.02971

Github代码地址:https://github.com/LeronQ/DA-RNN

论文题目为《基于双阶段注意力机制的循环神经网络》,文章本质上还是基于Seq2Seq的模型,结合了注意力机制实现的时间序列的预测方法,文章的一大亮点是:不仅在解码器的输入阶段引入注意力机制,还在编码器阶段引入注意力机制,编码器的阶段的注意力机制实现了特征选取和把握时序依赖关系的作用。

分为两个阶段:

  1. 第一阶段:使用注意力机制从而能够自适应提取每个时刻的特征,这是本文的最大亮点

  2. 第二阶段:使用注意力机制选取与之相关的encoder hidden states

1:模型架构图

算法实现流程:

  • 编码器阶段,也就是输入阶段,利用Attention机制,即原始:

利用Attention机制,结合隐层信息,会对每一维特征赋予一定的权重,转变为: 。从而实现自适应提取每个时刻的各个维度特征,使用更新后的 作为编码器的输入,这也是本篇文章最大的亮点!

  • 解码器阶段,也就是输出阶段,与传统Attention实现功能相同,使用另一个注意力机制选取与之相关的encoder hidden states

2:输入阶段的Attention

第一阶段输入阶段的编码器Attention机制实现过程如下:

文章中定义 为encoder在时刻 t 的hidden state, 其中 m是hidden state的大小。

第一阶段,使用当前时刻的输入: 以及上一个时刻编码器的hidden state : 来计算当前时刻编码器的hidden state : , 其中m是编码器的size。更新公式可写为:

其中 是一个非线性激活函数,我们可以使用通常的循环神经网络vanilla RNN或LSTM以及GRU作为 ,在该文章中,使用的是LSTM来捕获长依赖关系。

这里,为了自适应地选取相关feature(即给每一个特征赋予一定的权重), 作者在此处引入了注意力机制。简单来说,即对每个时刻的输入 为其中的每个影响因子赋予一定的注意力权重(attention weight) ,即:

衡量了时刻 t 的第 k 个 feature的重要性。更新后的$\tilde{\boldsymbol{x}}_{t$ 计算方式为:

那么 如何计算得到?

文章中给出的方法:根据上一个时刻编码器的hidden state 和cell state 计算得到:, 其中 是hidden state与cell state 的连接(concatenation)。

该式即把第 k 个driving series(文章中的driving series就是特征的含义)与前一个时刻的hidden state 和cell state 线性组合, 再用 tanh激活得到。

计算得到

后,再用softmax函数进行归一化:

然后更新

更新方式为:

作为下一个阶段temporal Attention的输入。

input attention机制,使得编码器能够关注其中输入特征中重要的特征,而不是对所有特征一视同仁,这也是所有attention的本质作用。

3:temporal attention的解码器

第二阶段temporal  Attention机制实现过程如下:

为了区别起见,参考罗未萌的建议,与论文中公式略有不同的是,将解码器中的时间序列下标标注为 以与编码器中的下标 区分。

第二阶段的解码器注意力机制设计类似于传统的seq2seq中的Attention机制,也就是第二阶段temporal attention的机制其实就是传统Attention的机制。

传统Attention解决的问题是:传统的seq2seq模型中, 编码器输出的context vector基于最后时刻的hidden state或对所有 hidden state取平均。这样输出的context vector对所有时刻 t 均相同,没有体现出差异化,就像人一样没有将注意力集中到关键部分,无法起到只选取相关时刻编码器hidden state的功能。

解决问题的思路是在不同时刻采用不同的context vector。类似于 seq2seq, 最简单的办法是对所有时刻的 取加权平均, 即:

其中 是基于前一个时刻解码器的hidden state

和cell state

计算得到:

根据文章中的模型流程,可以看到解码器的输入是上一个时刻的目标序列 和hidden state 以及context vector 共同组成

即:

然后 类似于编码器的最后一个公式, 这里的激活函数 还是选择LSTM。

4:预测部分

文章回顾了非线性自回归(Nonlinear autoregressive exogenous, NARX)模型的最终目标,需要建立当前输入与所有时刻的输人以及之前时刻的输出之间的关系,即:

通过之前编码器解码器模型的训练,已经得到了解码器的hidden state 和context vector,

最后再使用一个全连接层对 做回归 即

这样可以得到最终的预测

5:总结

文章是将input Attention 和temporal Attention 分开讲述的,模型架构图是放在一起的,刚开始读完论文些不太理解的地方:

如input attention 中的f1是使用LSTM,接着 又作为temporal Attention 中LSTM的输入,接着解码层,又使用LSTM来进行预测,这样的话,不就是共有3个LSTM进行训练吗?

在深入阅读以及查看源代码后,发现之前理解出现偏差,其实总共只有2个阶段LSTM,分别对应input attention阶段用来提取自适应特征的attention模块中的LSTM,解码阶段的LSTM。我重新模型架构图整理了下,并进行箭头标注,表示对应的位置。

左边 input attention一大块计算得到的 ,实际上只是temporal attention中的一个时刻的输入, 我们从input attention 的与temporal attention中的 对应的位置可以观察到。

也就是说,坐标的input attention 实际上只是temporal attention将某一个时刻剥离出来的计算过程细节而已。单看右边的temporal attention,实际上就是一个Seq2Seq的attention的实现,并没有不同,作者将temporal attention的输入 单独剥离出来,强调其计算过程,也就是input attention的实现机制,目的就是说明文章的亮点:在输入阶段也实现基于attention的自适应特征的提取。

RNN注意力机制是一种在序列数据处理中广泛使用的机制,它允许模型在生成输出时对输入序列的不同部分分配不同的注意力权重。在PyTorch中,可以使用torch.nn.MultiheadAttention模块来实现RNN注意力机制。 为了使用RNN注意力机制,首先需要导入相应的包,如math、torch和torch.nn等。其次,需要定义注意力评分函数,该函数用于计算注意力权重。常见的注意力评分函数包括点积注意力、加性注意力和缩放点积注意力等,可以根据具体需求选择合适的评分函数。 在使用RNN注意力机制时,可以参考官方的PyTorch教程,其中提供了用于处理批量输入和实现稍微不同的注意力机制的示例代码。此外,PyTorch官方文档中关于torch.nn.MultiheadAttention的说明也提供了使用该模块的详细介绍和示例代码。 总结来说,使用PyTorch实现RNN注意力机制需要导入相应的包,并根据需要选择合适的注意力评分函数。可以参考官方教程和文档中的示例代码进行具体实现。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [各种注意力机制的PyTorch实现](https://blog.csdn.net/raelum/article/details/126347454)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [PyTorch-Batch-Attention-Seq2seq:批处理RNN编码器和注意力解码器的PyTorch实现](https://download.csdn.net/download/weixin_42102220/15015081)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值