一、Encoder-Decoder
Encoder - Decoder(编码器 - 解码器)架构是深度学习中一种重要的模型结构,广泛应用于自然语言处理、计算机视觉等领域。
【原理】
该架构的核心思想是将输入数据编码成一个固定长度的中间表示(上下文向量),然后通过解码器将这个中间表示解码成所需的输出。这一过程可以理解为对输入信息进行抽象和转换,再从抽象表示中生成目标输出。
【结构】
编码器(Encoder):编码器负责处理输入序列,将输入数据映射到一个低维的特征空间,生成一个固定长度的向量,这个向量包含了输入序列的语义信息。常见的编码器可以由循环神经网络(RNN)、长短期记忆网络(LSTM)、门控循环单元(GRU)等模型构建。
- 输入:原始序列
- 输出:固定长度的上下文向量
解码器(Decoder):解码器接收编码器输出的编码向量,根据这个向量逐步生成输出序列。在生成过程中,解码器通常会结合之前生成的部分输出和编码向量的信息,不断预测下一个输出元素。解码器的结构与编码器类似,也可以使用各种神经网络模型。
- 输入:上下文向量、之前生成的输出序列
- 输出:目标输出序列
原始序列(x1, x2...x3)→编码器→上下文向量C
解码器输出序列(y1, y2...y3),yi = F(C, y1, y2...yi-1)
该架构有很多种变体,不同变体的输入输出可能会有所不同。

【工作流程】
1. 编码阶段
编码器会按照顺序处理输入的向量序列。在处理过程中,编码器会逐步提取输入序列中的信息,并将其整合到一个隐藏状态中。随着对输入序列的不断处理,隐藏状态会不断更新,最终得到一个固定长度的向量,这个向量就是编码器的输出,也称为编码向量或上下文向量。
2.解码阶段
解码器会根据上下文向量和之前生成的输出元素,逐步生成目标输出序列。在每个时间步,解码器会接收当前的输入(包括上下文向量和上一个时间步的输出),并输出一个概率分布,表示下一个可能的输出元素的概率。然后,根据这个概率分布选择一个元素作为当前时间步的输出。这个过程会不断重复,直到满足某个终止条件(如生成了特定的结束符号或达到了最大序列长度)。
一些可视化内容见:Visualizing A Neural Machine Translation Model (Mechanics of Seq2seq Models With Attention)
【优缺点】
优点:
- 灵活性:适用于处理各种序列到序列的任务,输入和输出序列的长度可以不同。
- 可扩展性:编码器和解码器可以使用不同的神经网络模型,方便根据具体任务进行调整和优化。
缺点:
- 信息瓶颈:编码器将输入序列压缩为一个固定长度的向量,可能会导致信息丢失,特别是对于长输入序列。
【seq2seq】
seq2seq是专门针对序列到序列转换任务设计的模型,它采用了 Encoder - Decoder 架构的思想。比如在机器翻译任务里,要把源语言句子转换为目标语言句子,Seq2Seq 模型就会使用编码器对源语言句子进行编码,然后用解码器将编码信息转换为目标语言句子。简单来说就是,Encoder - Decoder是一种通用的模型架构思想,而seq2seq是采用该架构的模型
二、注意力机制
该部分内容参考了张俊林博士的博文:深度学习中的注意力模型(2017版)
【提出背景】
Encoder - Decoder 架构最大的缺点是可能存在信息丢失和长序列处理能力有限的问题。
- 信息丢失:在将输入序列编码为一个固定长度的向量时,可能会丢失一些细节信息,尤其是对于长序列输入。因为编码器需要将整个输入序列的信息压缩到一个向量中,这就限制了能够保留的信息量。
- 长序列处理能力有限:随着输入序列长度的增加,编码器难以有效地捕捉长距离依赖关系。这是因为在处理长序列时,早期的信息在经过多层编码后可能会变得模糊或难以被解码器准确利用。
为了解决这些问题,研究人员提出了一些改进方法,如引入注意力机制(Attention Mechanism),它可以让模型在解码时动态地关注输入序列的不同部分,从而更好地利用输入信息,减少信息丢失,提高对长序列的处理能力。
注意力机制(Attention Mechanism)是深度学习领域中一项关键技术,它借鉴了人类视觉注意力的原理,能让模型在处理复杂数据时聚焦于关键部分。
人类在处理信息时,会依据需求将注意力集中在重要部分,忽略其他次要信息。注意力机制正是模拟这一过程,使模型在处理数据时能够动态地分配注意力权重,重点关注与当前任务紧密相关的信息,从而更高效地利用输入数据。
无注意力机制的encoder-decoder框架输出为:
y1=f1(C)
y2=f1(C, y1)
y3=f1(C, y2)
...
引入注意力机制后的输出为:
y1=f1(C1)
y2=f1(C2, y1)
y3=f1(C3, y2)
...

所以注意力机制的核心在于求每个时间步的上下文向量C
以机器翻译为例
将“Who are you”翻译为“你是谁”
如果按照传统的框架,在解码器输出“你”时,源序列中的三个元素“Who”,“are”,“you”对该时间步的输出影响程度是一样的,但是我们希望模型可以在此时更多地关注“you”,更少地关注另外两个元素。源序列对解码器输出的影响是通过上下文向量C来体现的:
y1=f1(C1)
C1=g(0.2*f2("Who"), 0.2*f2("are"), 0.6*f2("you"))
其中,f2函数代表Encoder对输入英文单词的某种变换函数,g代表Encoder根据单词的中间表示合成整个句子中间语义表示的变换函数,一般的做法中,g函数就是对构成元素加权求和。
这样就可以让模型在输出第一个元素时更关注"you"。概率代表了该时间步注意力模型分配给源序列中各元素的注意力大小。
那么又有了新的问题,即如何某一时间步源序列中不同元素的概率呢?也就是说,在生成第一个元素时,怎么让模型知道应该更关注"you"呢?怎么计算此时三个元素的概率分布呢?
对于采用RNN的Decoder来说,在时间步i,如果要生成yi,我们是可以知道解码器在生成yi之前的时间步i-1时的隐状态Hi-1的,我们可以用Hi-1与编码器中源序列每个元素对应的隐状态hj进行对比,即通过函数F(hj,Hi-1)来获得输出yi和源序列中每个元素对应的对齐可能性,这个F函数在不同论文里可能会采取不同的方法,然后函数F的输出经过Softmax进行归一化就得到了符合概率分布取值区间的注意力分配概率分布数值。
【工作流程】
1.编码源序列
首先,使用编码器对源语言句子进行编码。编码器将源语言句子中的每个单词转换为一个连续的向量表示,并将整个句子的信息编码为一个隐藏状态序列 {h1, h2 ...hn},其中 n 是源语言句子的长度,hi表示第 i 个位置的隐藏状态,它包含了从句子开头到当前位置的信息。
2.初始化解码器
解码器从一个初始状态开始,准备生成目标语言句子。在生成目标语言的每个单词时,解码器会根据当前的状态和之前生成的单词来预测下一个单词。
3.计算注意力权重
在解码器的每个时间步 t,计算注意力权重。将解码器当前的隐藏状态 Ht作为查询向量 q,将编码器的隐藏状态序列 {h1,h2,⋯,hn} 作为键向量key和值向量value(假设键向量和值向量相同)。
通过一个注意力函数计算注意力得分。常见的方法是使用一个前馈神经网络(FFN)或点积操作来计算解码器隐藏状态与编码器每个隐藏状态之间的相似度。
然后,将注意力得分通过 softmax 函数进行归一化,得到注意力权重。
4.生成上下文向量
根据计算得到的注意力权重,对编码器的隐藏状态进行加权求和(或其他方法),生成上下文向量 Ct。
5.结合上下文向量进行解码
将上下文向量 Ct 与解码器当前的隐藏状态 Ht 进行融合,通常是将它们拼接在一起形成一个新的向量 (Ht; Ct),然后将其输入到解码器的下一个时间步的计算中。解码器根据融合后的向量来预测目标语言的下一个单词的概率分布。
论文中用到的表示方法更多的是query、key和value。其中:
- query:用于发起查询操作的向量,它代表了当前需要关注的信息或者当前处理步骤的上下文。在解码器的每一个时间步,都会生成一个query向量,以此来探寻输入序列里与之相关的部分。query向量的主要作用是与key向量进行相似度计算,从而明确在输入序列里哪些部分和当前任务更为相关。
- key:与输入序列中的每个元素相对应的向量。编码器会把输入序列中的每个元素转化为key向量,这些向量包含了输入元素的特征信息。key向量用于和query向量进行相似度比较,计算出的相似度得分反映了输入序列中各个元素与当前query的相关程度。
- value:同样和输入序列中的每个元素对应,它包含了用于生成输出的重要信息。在很多情况下,value向量和key向量是相同的,不过在某些复杂的注意力机制里,它们也可以是不同的。value向量会依据和query的相似度得分进行加权求和,从而生成上下文向量,该向量包含了输入序列中与当前query最相关的信息。

三、自注意力机制
该部分参考了以下内容:
Woo Tzins博士的博文:注意力机制综述(图解完整版附代码)
好喜欢吃红柚子的博文:注意力机制(Attention)、自注意力机制(Self Attention)和多头注意力(Multi-head Self Attention)机制详解
markconca的博客的博文:一文搞定自注意力机制(Self-Attention)
【提出背景】
经典的Attention存在着一些问题:
- 依赖顺序信息:传统注意力机制通常基于循环神经网络(RNN)或卷积神经网络(CNN)来实现。基于 RNN 的注意力机制在处理长序列时,会受到梯度消失或爆炸的影响,难以捕捉长距离的依赖关系;而基于 CNN 的注意力机制则依赖于卷积核的大小和步长来捕捉局部信息,对于长序列中的全局信息把握能力有限。
- 计算效率低:传统注意力机制在计算每个位置的注意力权重时,需要依次遍历整个序列,计算复杂度较高,尤其是在处理长序列时,计算量会显著增加,导致训练和推理速度较慢。
- 并行能力差:RNN 结构本身是顺序处理的,难以进行并行计算,这限制了模型的训练速度和可扩展性。虽然 CNN 可以在一定程度上进行并行计算,但对于长序列的处理,其并行能力也不如人意。
由此提出了self-attention
self-attention有以下优势:
- 高效捕捉长距离依赖:自注意力机制可以直接计算序列中任意两个位置之间的相关性,能够有效地捕捉长序列中的长距离依赖关系,而不受序列长度的限制。它通过计算每个位置与其他所有位置的注意力权重,来动态地确定每个位置的重要性,从而更好地理解文本的全局语义。
- 并行计算能力强:自注意力机制的计算过程可以并行化,大大提高了模型的训练和推理速度。它可以通过矩阵运算一次性计算出所有位置的注意力权重,而不需要像传统注意力机制那样依次遍历序列,因此可以充分利用现代硬件设备(如 GPU)的并行计算能力,加快模型的训练过程。
- 自动学习语义表示:自注意力机制能够自动学习到文本中的语义结构和语法关系。它可以根据输入序列中的上下文信息,自适应地调整每个位置的表示,使得模型能够更好地理解文本的语义,对于不同的任务和数据集,都能够学习到合适的特征表示,提高模型的泛化能力。
【概念】
在传统的注意力机制里,以机器翻译为例,我们的操作对象实际上是两个序列,即source和target,如source是中文序列,target是英文序列。而自注意力机制是一种将单个序列的不同位置关联起来以计算同一序列的表示的注意机制,是在一个序列的内部元素之间发生的注意力机制。
自注意力机制的基本思想是,在处理序列数据时,每个元素都可以与序列中的其他元素建立关联,而不仅仅是依赖于相邻位置的元素。它通过计算元素之间的相对重要性来自适应地捕捉元素之间的长程依赖关系。
具体而言,对于序列中的每个元素,自注意力机制计算其与其他元素之间的相似度,并将这些相似度归一化为注意力权重。然后,通过将每个元素与对应的注意力权重进行加权求和,可以得到自注意力机制的输出。
【工作流程】
self-attention的原理和传统的attention基本相同,区别就在于self-attention的query、key、value向量全部来自source序列。
仍然以"Who are you"为例
首先对三个单词进行embedding得到三个向量x1, x2, x3;
每个x经过线性变换都会得到相应的q, k ,v,如对x1,q1=Wq*x1, k1=Wq*x2, v1=Wq*x3,其中Wq、Wq、Wv参数矩阵就是我们要学习的;
然后将q1与k1, k2, k3进行匹配计算(计算方式并不唯一),再对结果进行softmax,得到α11,α12,α13;
将得到的α11,α12,α13与v1, v2, v3进行操作得到c1,c1=α11*v1+α12*v2+α13*v3,c1就是"Who"这个单词新的词向量,包含着这个单词与"Who are you"这句话里每一个单词的相似程度和关联信息。
【缺点】
- 计算复杂度高:注意力机制在计算注意力权重时,需要对序列中的每个位置与其他所有位置进行相似度计算,其时间复杂度和空间复杂度都是输入序列长度的二次方O(n^2),其中n是序列长度。
- 未考虑位置信息:自注意力机制在计算注意力权重时,主要是基于输入序列中元素之间的内容相关性,而没有直接考虑元素在序列中的位置信息。这意味着它可能无法区分具有相同内容但位置不同的元素。
- 缺乏局部信息的归纳:自注意力机制主要关注全局信息,通过计算序列中任意两个位置之间的相关性来生成表示。然而,它在一定程度上可能会忽略局部的、相邻位置之间的信息归纳和特征提取。
- 难以处理超长序列:尽管自注意力机制理论上可以处理长序列数据,但由于其计算复杂度的限制,当序列长度过长时,模型的性能可能会受到影响。
- 可解释性相对较差:自注意力机制通过复杂的计算得到注意力权重,这些权重的含义和作用相对较难解释。
四、多头注意力机制
多头注意力机制(Multi - Head Attention)是为了进一步提升自注意力机制的性能和表现力而提出的,是自注意力机制的变体。
在实际生活中,人眼观察物体一眼往往难以捕捉到物体的全部特征,机器也是同理,可能需要多次注意力才能够捕捉到全部特征。例如对一段文字,可能包含情感维度、时间维度、逻辑维度等很多维度的特征,为了能从不同的维度抓住输入信息的重点,就需要执行多次注意力。
简单来说就是多组自注意力机制并行运行,最后把结果拼接起来。
多头注意力机制的目的是为了从多个维度捕捉提取更多的特征,从多个“头”得到不同的Self-Attention Score,提高模型表现。
在单头自注意力机制中,我们会得到一组Q, K, V矩阵,在这一组矩阵中进行注意力操作,得到一个Z。
而在多头注意力机制中,我们会有多组Q, K, V矩阵,每组都会有一个Z,截止到这里所有的操作都与单头注意力机制相同。然后将多个Z进行拼接得到最终的Z。
【工作流程】


7730

被折叠的 条评论
为什么被折叠?



