Attention in RNN

本文介绍了一种在神经机器翻译中采用的Attention机制,该机制通过允许模型关注输入序列的不同部分来提高翻译质量。不同于传统的RNNEncoder-Decoder模型,Attention模型在解码过程中使用所有特征向量的加权和,权重由模型动态计算,从而能够更有效地处理长句子翻译任务。

https://zhuanlan.zhihu.com/p/42724582

在传统的RNN Encoder-Decoder模型中,在编码的过程中,将 t-1 时的状态 h_{<t-1>} 和 t时刻的数据 x_{<t>} 输入到 t 时刻的RNN单元中,得到 t 时刻的状态 h_{<t>} ,经过 T 个时间片后,得到长度等于隐节点数量的特征向量 \mathbf{c} 。在解码的过程中,将特征向量 \mathbf{c} 和上个时间片预测的输出 y_{<t'-1>} 输入到RNN的单元中,得到该时刻的输出 y_{<t'>},经过 T' 个时间片后得到输出结果。但在一些应用中,比如句子长度特别长的机器翻译场景中,传统的RNN Encoder-Decoder表现非常不理想。一个重要的原因是 t' 时刻的输出可能更关心输入序列的某些部分是什么内容而和其它部分是什么关系并不大。例如在机器翻译中,当前时间片的输出可能仅更注重原句子的某几个单词而不是整个句子。

这篇论文率先提出了Attention的思想,通过Attention机制,模型可以同时学习原句子和目标句子的对齐关系和翻译关系。在编码过程中,将原句子编码成一组特征向量的一个集合,在翻译时,每个时间片会在该集合自行选择特征向量的一个子集用于产生输出结果。

详解

在这篇论文中,作者也是使用的RNN Encoder-Decoder结构。不同于传统的方式,在编码过程中,作者使用的是双向RNN(bi-RNN),每个RNN单元使用的是GRU。在解码过程中,使用的是基于Attention的GRU结构。算法结构如图1:

图1:Attention in RNN

Encoder

双向RNN含有正向和反向两个方向,对于含有 T 个时间片的源句子 X^T = \{x_1, x_2, ..., x_T\},正向的输入数据是 x_1 \rightarrow x_1 \rightarrow ... \rightarrow x_T ,第 t 个时间片的隐节点 \vec{h}_t 表示为

\vec{h}_{<t>} = f(\vec{h}_{<t-1>}, x_{<t>})\tag{1}

反向数据的输入序列是 x_T \rightarrow x_{T-1} \rightarrow ... \rightarrow x_1 ,第 t 个时间片的隐节点 \vec{h}'_t 表示为

\vec{h}'_{<t>} = f(\vec{h}'_{<t+1>}, x_{<t>})\tag{2}

其中 f 使用的是GRU的单元,详见上一篇论文的讲解。则第 t 个时间片的特征 h_{<t>} 是前向和后向两个特征向量拼接到一起。

h_{<t>} = [\vec{h}_t; \vec{h}'_t]^T\tag{3}

1.2 Decoder

 

在解码的过程中,传统的RNN Encoder-Decoder的方式将整个句子的特征向量作为输入

s_{<t>} = f(s_{<t-1>}, y_{<t-1>}, c)\tag{4}

 

Attention模型是使用所有特征向量的加权和,通过对特征向量的权值的学习,我们可以使用对当前时间片最重要的特征向量的子集 c_i ,即

s_{<t>} = f(s_{<t-1>}, y_{<t-1>}, c_i)\tag{5}

其中 c_i 是 h_{<t>} 的加权和

c_i = \sum^{T}_{t=1} \alpha_{it}h_t\tag{6}

\alpha_{it} = \frac{exp(e_{it})}{\sum_{k=1}^Texp(e_{ik})}\tag{7}

e_{it} = a(s_{<i-1>}, h_t)\tag{8}

其中 e_{it} 是输出序列第 i 个时间片的对齐模型,表示的是该时刻和输入数据每个时间片的相关程度。使用前一时刻的状态 s_{<i-1>} 和第 t 个输入数据 h_t 计算得到,在作者的实验中, a 是使用的反正切 tanh 激活函数。

1.3 实验数据可视化

下图是通过可视化四组平行语料的 \alpha 值得到的图, \alpha 值越大,表示两个数据相关性越强,图中的颜色越浅。

图2:Attention模型的可视化

参考文献

[1] Bahdanau D, Cho K, Bengio Y. Neural machine translation by jointly learning to align and translate[J]. arXiv preprint arXiv:1409.0473, 2014.

<think>好的,用户想了解关于RNNAttention机制的详细信息。首先,我需要回顾RNN的基本结构和它的局限性。根据引用[1]和[2],RNN在处理序列数据时存在长距离依赖问题,尤其是当序列较长时,梯度消失或爆炸的问题会导致模型难以捕捉早期信息的影响。接下来,用户提到的Attention机制,引用[4]解释了其灵感来源于人类的注意力,能动态分配权重到不同输入部分。 我需要结合引用[3]中的代码示例,说明Attention如何与RNN结合,比如在机器翻译任务中,Attention如何帮助模型在生成每个词时关注源序列的相关部分。同时,引用[4]提到传统的encoder-decoder框架在处理长文本时,中间语义固定,导致信息丢失,而Attention通过动态调整权重解决了这个问题。 还需要比较加入Attention前后的区别,例如模型性能的提升和应用场景的变化。可能还需要提到不同的Attention变体,如全局和局部Attention,以及自注意力机制。最后,根据用户提供的引用,确保引用标识正确,例如在解释局限性时引用[1],在变体时引用[2],在代码示例时引用[3],在框架和问题解决时引用[4]。 要确保回答结构清晰,分点阐述,并生成相关问题。同时,注意使用中文和正确的LaTeX格式,如变量用$...$,独立公式用$$...$$。检查是否有遗漏的引用或信息,确保回答准确且符合用户需求。</think>### RNNAttention机制详解 #### 一、RNN的基本结构与局限 循环神经网络(RNN)是一种处理序列数据的神经网络结构,其核心公式为: $$h_t = \sigma(W_h h_{t-1} + W_x x_t + b)$$ 其中$h_t$为当前时刻的隐藏状态,$x_t$为输入,$\sigma$为激活函数。RNN通过循环结构保留了历史信息,但存在以下问题: 1. **长距离依赖失效**:当序列过长时,梯度消失/爆炸问题导致早期输入的影响难以传递到后期[^1]。 2. **固定长度编码瓶颈**:Encoder-Decoder框架中,所有输入信息被压缩为固定长度的中间向量$C$,导致长文本细节丢失[^4]。 #### 二、Attention机制的原理 1. **核心思想**:动态分配权重,让模型在处理每个输出时关注输入序列的不同部分。例如生成第$i$个单词时,计算输入序列各位置的注意力权重$\alpha_{ij}$: $$e_{ij} = a(s_{i-1}, h_j)$$ $$\alpha_{ij} = \frac{\exp(e_{ij})}{\sum_{k=1}^m \exp(e_{ik})}$$ 其中$a()$是注意力评分函数,$s_{i-1}$为Decoder的上一步隐藏状态,$h_j$为Encoder的第$j$步输出。 2. **上下文向量生成**: $$c_i = \sum_{j=1}^m \alpha_{ij}h_j$$ 每个输出位置$i$都有独立的上下文向量$c_i$,而非固定向量$C$。 #### 三、AttentionRNN的结合 以机器翻译为例(引用代码中的语音处理类似): 1. **Encoder阶段**:使用双向RNN处理输入序列,得到每个位置的隐藏状态$\{h_1,h_2,...,h_m\}$ 2. **Decoder阶段**: - 计算当前Decoder状态$s_i$与所有Encoder状态$h_j$的注意力权重 - 生成上下文向量$c_i$并参与预测输出$y_i$ ```python # 伪代码示例(基于引用[3]) class AttentionRNN(nn.Module): def __init__(self): self.rnn = nn.LSTM(input_size, hidden_size) self.attention = nn.Linear(2*hidden_size, 1) def forward(self, x): encoder_out, _ = self.rnn(x) # 编码 for t in range(output_length): decoder_state = ... # 解码器当前状态 attn_weights = softmax([score(decoder_state, h_j) for h_j in encoder_out]) context = sum(attn_weights * encoder_out) # 上下文向量 output = predict(context, decoder_state) ``` #### 四、Attention的优势 1. **提升长序列处理能力**:在英法翻译任务中,BLEU值可提升5-10分 2. **可解释性增强**:通过可视化注意力权重,可观察模型关注点(如翻译动词时关注源句的谓语部分) 3. **支持异构对齐**:在语音识别中,允许输出文本与输入语音帧的非单调对齐[^3] #### 五、经典变体与发展 1. **全局vs局部Attention**:前者考虑所有输入位置,后者聚焦滑动窗口(计算效率更高) 2. **自注意力(Self-Attention)**:允许序列内部不同位置的关联计算,为Transformer的前身 3. **多头注意力**:并行计算多组注意力,捕获不同类型的依赖关系
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值