手机网站智能管理系统,网站如何做app,做网站所用的技术,wordpress静态链接第一章#xff1a;人工智能之不同数据类型及其特点梳理 第二章#xff1a;自然语言处理(NLP)#xff1a;文本向量化从文字到数字的原理 第三章#xff1a;循环神经网络RNN#xff1a;理解 RNN的工作机制与应用场景(附代码) 第四章#xff1a;循环神经网络RNN、LSTM以及GR…第一章人工智能之不同数据类型及其特点梳理 第二章自然语言处理(NLP)文本向量化从文字到数字的原理 第三章循环神经网络RNN理解 RNN的工作机制与应用场景(附代码) 第四章循环神经网络RNN、LSTM以及GRU 对比(附代码) 第五章理解Seq2Seq的工作机制与应用场景中英互译(附代码) 第六章深度学习架构Seq2Seq-添加并理解注意力机制(一) 第七章深度学习架构Seq2Seq-添加并理解注意力机制(二)
本文主要是分析Seq2Seq 架构本身具有的缺点并分析针对长序列输入时导致信息丢失这一问题造成这个问题的原因以及针对这一问题通过引入注意力机制如何来解决这一问题。
一、Seq2Seq简介
Seq2SeqSequence to Sequence模型是一种深度学习架构主要用于处理输入和输出均为可变长度序列的任务如机器翻译、文本摘要和语音识别等。其核心结构包含两部分编码器Encoder和 解码器Decoder如下图所示输入是英文单词 ‘like’ 翻译成中文 ‘喜欢’
编码器Encoder通常由RNN、LSTM或GRU等循环神经网络构成负责将输入序列逐步编码为一个固定长度的上下文向量Context Vector该向量综合了输入序列的整体语义信息。解码器Decoder同样基于循环神经网络接收编码器生成的上下文向量作为初始输入逐步生成输出序列的每个元素。训练时常用“教师强制”Teacher Forcing方法即将前一步的真实输出作为当前步的输入以提高稳定性。 Seq2Seq模型的特点在于处理变长序列时无需严格对齐输入与输出的长度例如将中文句子翻译为英文时输出长度可灵活变化。
二、普通 Seq2Seq 的局限性
普通 Seq2Seq 模型将输入序列压缩为 单一的上下文向量Encoder 的最后一个隐藏状态就是上图中的Context Vector存在以下问题
信息瓶颈长序列输入时单一向量难以保留所有细节即整个输入序列被压缩成一个固定大小的向量上下文向量可能导致信息丢失。长距离依赖丢失解码器无法灵活关注输入序列的不同部分。速度慢训练速度较慢且难以并行化。
在Seq2Seq模型中编码器将整个输入序列压缩成一个固定大小的向量即上下文向量或语义向量然后解码器使用这个向量来生成输出序列。这种做法存在几个潜在的问题尤其是当处理较长的输入序列时可能会导致信息丢失。
输入序列太长为什么会导致信息丢失 固定维度限制无论输入序列有多长上下文向量的维度都是固定的。这意味着如果输入序列非常长编码器需要将大量信息压缩到一个有限维度的空间里。这就像试图将一本书的内容压缩进一句话中一样不可避免地会丢失一些细节和细微差别。 信息覆盖问题对于某些复杂的任务如长文本翻译或对话系统源序列可能包含多个主题、观点或重要细节。由于上下文向量的容量有限编码器可能无法有效地表示所有这些信息从而导致关键信息被忽略或覆盖。
举例说明
假设我们有一个中文句子“我喜欢吃鱼特别是新鲜的鲑鱼它富含Omega-3脂肪酸对心脏健康有益”我们要将其翻译成英文。 没有注意力机制的情况编码器尝试将这句话的所有信息压缩成一个固定大小的向量。然而这句话包含了多个部分的信息——个人偏好喜欢、食物类型鱼、具体种类鲑鱼、营养成分Omega-3脂肪酸以及健康益处对心脏健康有益。如果输入序列过长或者信息过于复杂那么单一的上下文向量很可能无法承载这么多不同的信息点。结果在解码阶段解码器可能难以准确地再现原句的所有细节可能会遗漏一些重要的内容例如忘记提及“Omega-3脂肪酸”或是“对心脏健康有益”。 有注意力机制的情况在这种情况下每当解码器准备生成下一个单词时它不仅依赖于前一时刻的状态还能够通过注意力机制直接访问输入序列的不同部分。这样即使输入序列很长解码器也能够根据当前生成的内容需求选择性地关注最相关的信息。比如在生成关于鲑鱼营养价值的部分时它可以特别关注与“Omega-3脂肪酸”相关的输入部分而在提到饮食喜好时则可以更侧重于“我喜欢吃鱼”这部分的信息。因此注意力机制大大提高了模型处理长距离依赖关系的能力并且减少了信息丢失的可能性。
固定大小的上下文向量在处理长或复杂序列时面临信息丢失的风险因为它们不能完全捕捉并保留原始输入序列中的全部信息。引入注意力机制是解决这一问题的有效方法之一。
三、注意力机制的核心思想
注意力机制 允许解码器在每个时间步动态关注输入序列的 相关部分而非依赖单一向量。其核心流程如下
编码器输出 所有时间步的隐藏状态而非仅最后一步。解码时计算解码器当前状态与所有编码器状态的 相似度生成注意力权重。根据权重 加权求和编码器状态生成动态上下文向量。将动态上下文向量与解码器输入结合预测当前输出。
四、实现步骤
4.1 编码器处理输入序列
输入序列 X ( x 1 , x 2 , … , x T ) \mathbf{X} (x_1, x_2, \dots, x_T) X(x1,x2,…,xT)编码器输出所有时间步的隐藏状态 { h 1 , h 2 , … , h T } \{h_1, h_2, \dots, h_T\} {h1,h2,…,hT}
4.2 计算注意力权重
在解码器的第 t t t 步 解码器当前隐藏状态 s t − 1 s_{t-1} st−1上一步的隐藏状态 编码器所有隐藏状态 { h 1 , h 2 , … , h T } \{h_1, h_2, \dots, h_T\} {h1,h2,…,hT} 计算相似度注意力分数 e t i score ( s t − 1 , h i ) e_{ti} \text{score}(s_{t-1}, h_i) etiscore(st−1,hi) 常用相似度计算方式 点积Dot Product e t i s t − 1 ⊤ h i e_{ti} s_{t-1}^\top h_i etist−1⊤hi加性Additive e t i v ⊤ tanh ( W s s t − 1 W h h i ) e_{ti} \mathbf{v}^\top \tanh(\mathbf{W}_s s_{t-1} \mathbf{W}_h h_i) etiv⊤tanh(Wsst−1Whhi) 归一化为权重 α t i exp ( e t i ) ∑ j 1 T exp ( e t j ) \alpha_{ti} \frac{\exp(e_{ti})}{\sum_{j1}^T \exp(e_{tj})} αti∑j1Texp(etj)exp(eti)
4.3 生成动态上下文向量 c t ∑ i 1 T α t i h i \mathbf{c}_t \sum_{i1}^T \alpha_{ti} h_i ct∑i1Tαtihi
4.4 结合上下文向量生成输出
拼接解码器状态与上下文向量 s ~ t tanh ( W c [ s t − 1 ; c t ] b c ) \tilde{s}_t \tanh(\mathbf{W}_c [s_{t-1}; \mathbf{c}_t] \mathbf{b}_c) s~ttanh(Wc[st−1;ct]bc)预测输出概率分布 p ( y t ∣ y t , X ) Softmax ( W o s ~ t b o ) p(y_t | y_{t}, \mathbf{X}) \text{Softmax}(\mathbf{W}_o \tilde{s}_t \mathbf{b}_o) p(yt∣yt,X)Softmax(Wos~tbo)
4.5 数学公式总结
对于解码器的第 t t t 步 Attention Weights: α t i Softmax ( score ( s t − 1 , h i ) ) Context Vector: c t ∑ i 1 T α t i h i Decoder Output: p ( y t ∣ y t , X ) Softmax ( W o ⋅ tanh ( W c [ s t − 1 ; c t ] b c ) ) \begin{aligned} \text{Attention Weights:} \quad \alpha_{ti} \text{Softmax}(\text{score}(s_{t-1}, h_i)) \\ \text{Context Vector:} \quad \mathbf{c}_t \sum_{i1}^T \alpha_{ti} h_i \\ \text{Decoder Output:} \quad p(y_t | y_{t}, \mathbf{X}) \text{Softmax}(W_o \cdot \tanh(W_c [s_{t-1}; \mathbf{c}_t] b_c)) \end{aligned} Attention Weights:Context Vector:Decoder Output:αtiSoftmax(score(st−1,hi))cti1∑Tαtihip(yt∣yt,X)Softmax(Wo⋅tanh(Wc[st−1;ct]bc)) 4.6 理解点积Dot Product
点积Dot Product也被称为内积Inner Product是向量之间的一种二元运算在数学、物理学以及工程学中有着广泛的应用。 对于两个维数相同的向量 a [ a 1 , a 2 , . . . , a n ] \mathbf{a} [a_1, a_2, ..., a_n] a[a1,a2,...,an] 和 b [ b 1 , b 2 , . . . , b n ] \mathbf{b} [b_1, b_2, ..., b_n] b[b1,b2,...,bn] 它们的点积定义为 a ⋅ b ∑ i 1 n a i b i a 1 b 1 a 2 b 2 . . . a n b n \mathbf{a} \cdot \mathbf{b} \sum_{i1}^{n} a_i b_i a_1b_1 a_2b_2 ... a_nb_n a⋅b∑i1naibia1b1a2b2...anbn
即两个向量的点积等于对应元素相乘后的和。
几何解释
点积还有一个重要的几何意义即两个向量的点积等于它们的模长乘积与它们之间夹角余弦值的乘积 a ⋅ b ∣ a ∣ ∣ b ∣ cos θ \mathbf{a} \cdot \mathbf{b} |\mathbf{a}| |\mathbf{b}| \cos{\theta} a⋅b∣a∣∣b∣cosθ
这里 ∣ a ∣ |\mathbf{a}| ∣a∣ 和 ∣ b ∣ |\mathbf{b}| ∣b∣ 分别表示向量 a \mathbf{a} a 和 b \mathbf{b} b 的长度或称为模而 θ \theta θ 是两向量之间的夹角。通过这个公式我们可以看出点积可以用来计算两个向量之间的角度或者判断它们是否正交如果点积为零则两向量垂直。
在机器学习和深度学习领域点积常用于衡量向量间的相似度。例如在注意力机制中它被用来计算查询向量与键向量之间的匹配程度。
4.7 理解加性Additive
在深度学习和自然语言处理的上下文中“加性”Additive通常指的是“加性注意力机制”这是一种用于序列到序列Seq2Seq模型中的注意力计算方法。与点积注意力Dot-Product Attention不同加性注意力使用了一个小型的前馈神经网络来计算输入序列中每个位置的注意力分数。
加性注意力机制的工作原理
其主要思想是通过一个小型的两层前馈神经网络来计算注意力权重这个过程可以分解为以下几个步骤 输入准备对于解码器中的每一个时间步 t t t我们考虑编码器的所有隐藏状态 { h 1 , h 2 , . . . , h n } \{h_1, h_2, ..., h_n\} {h1,h2,...,hn} 和当前解码器的隐藏状态 s t − 1 s_{t-1} st−1。 能量计算将编码器的每个隐藏状态 h i h_i hi 和解码器隐藏状态 s t − 1 s_{t-1} st−1 作为输入传递给一个小的前馈神经网络。这个网络通常包含一层或多层并使用tanh作为激活函数。具体来说计算能量值 e t i e_{ti} eti 的公式如下 e t i v T tanh ( W [ h i ; s t − 1 ] ) e_{ti} v^T \tanh(W[h_i; s_{t-1}]) etivTtanh(W[hi;st−1]) 其中 W W W 是权重矩阵 v v v 是输出向量 [ h i ; s t − 1 ] [h_i; s_{t-1}] [hi;st−1] 表示向量拼接操作。 注意力权重计算对上述得到的能量值进行Softmax变换以确保所有注意力权重之和为1。即 α t i exp ( e t i ) ∑ j exp ( e t j ) \alpha_{ti} \frac{\exp(e_{ti})}{\sum_j \exp(e_{tj})} αti∑jexp(etj)exp(eti) 上下文向量生成根据计算出的注意力权重对编码器的所有隐藏状态进行加权求和得到上下文向量 c t c_t ct c t ∑ i α t i h i c_t \sum_i \alpha_{ti} h_i ct∑iαtihi 结合上下文向量与解码器状态最后上下文向量 c t c_t ct 被用来辅助解码器预测下一个词通常会与当前解码器的状态结合起来。
加性注意力 vs 点积注意力
复杂度加性注意力通常比点积注意力更复杂因为它需要额外的参数和非线性变换如tanh激活函数。然而它也提供了更大的灵活性来捕捉输入之间的复杂关系。适用场景点积注意力在高维度空间中更加高效因为它的计算可以直接利用矩阵乘法加速而加性注意力可能更适合于那些需要更多非线性处理的任务或数据集。
下一篇《深度学习架构Seq2Seq-添加并理解注意力机制(二)》使用中文翻译成英文的案例“我喜欢吃鱼” 翻译为 “I like eating fish” 的简单例子通过具体的数字模拟模型推理过程来辅助解释上面这一套公式。