2.transformer笔记

transformer发展

注意力机制的关键组成部分

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
在这里插入图片描述

transformer由序列对齐变成self attention

在这里插入图片描述

self attention

Self-attention,也称为自注意力机制,是一种用于处理序列数据的注意力机制。它最初是在自然语言处理领域中引入的,特别是在机器翻译任务中,被提出作为Transformer模型的核心组件。

自注意力机制的基本思想:

在传统的注意力机制中,注意力权重是通过计算查询(query)和键(key)之间的关联来获得的。而自注意力机制引入了一种机制,允许每个位置(或词)都能够关注到序列中的其他位置,而不仅仅是与它相邻的位置。

在自注意力机制中,有三个关键的元素:查询(Q)、键(K)、值(V)。

  1. 查询(Q): 用于计算与序列中其他位置的关联程度。
  2. 键(K): 用于表示序列中的位置,它与查询一起被用来计算关联程度。
  3. 值(V): 序列中的位置的表示,用于计算加权和。

在自注意力机制中,每个位置的查询、键、值都是通过线性变换(通常是独立的全连接层)得到的。关联程度通过查询与键的点积得到,然后经过一些归一化处理,最终用于加权求和,得到最终的表示。

自注意力机制的计算过程:

给定一组输入序列 ({x_1, x_2, …, x_n}),对于每个位置 (i),计算自注意力表示 (y_i) 的过程如下:

  1. 计算查询
    q i = W q ⋅ x i q_i = W_q \cdot x_i qi=Wqxi

    k i = W k ⋅ x i k_i = W_k \cdot x_i ki=Wkxi

    v i = W v ⋅ x i v_i = W_v \cdot x_i vi=Wvxi

  2. 计算注意力分数(unnormalized):
    score i j = q i ⋅ k j \text{score}_{ij} = q_i \cdot k_j scoreij=qikj

  3. 将注意力分数进行缩放,一般使用缩放因子
    1 d k \frac{1}{\sqrt{d_k}} dk 1
    (其中 (d_k) 是键的维度)。

  4. 对注意力分数进行 softmax 归一化,得到注意力权重:
    attention i j = exp ⁡ ( score i j ) ∑ j ′ exp ⁡ ( score i j ′ ) \text{attention}_{ij} = \frac{\exp(\text{score}_{ij})}{\sum_{j'} \exp(\text{score}_{ij'})} attentionij=jexp(scoreij)exp(scoreij)

  5. 使用注意力权重对值进行加权求和:
    y i = ∑ j attention i j ⋅ v j y_i = \sum_j \text{attention}_{ij} \cdot v_j yi=jattentionijvj

这样,通过自注意力机制,每个位置都能够同时关注到整个序列中的其他位置,而不是只依赖于固定的局部上下文。

自注意力的应用:

  1. Transformer模型: 自注意力机制是Transformer模型的核心组件,被成功应用于机器翻译、文本生成等任务。
  2. BERT(Bidirectional Encoder Representations from Transformers): BERT模型使用了双向的自注意力机制,取得了在自然语言处理任务中的显著成果。
  3. 语音处理: 自注意力机制也被用于处理语音领域,提取语音信号中的重要信息。

自注意力机制的优势在于能够建模长距离依赖关系,捕捉序列中各个位置之间的复杂关联。

自注意力机制(Self-Attention Mechanism)和注意力机制(Attention Mechanism)有一定的关联,但它们的主要区别在于应用的上下文和对象。

  1. 自注意力机制(Self-Attention Mechanism):

    • 上下文: 主要用于处理同一个序列内的元素之间的关系。
    • 对象: 该机制关注序列内部不同位置之间的依赖关系。每个元素都会计算与序列中其他位置的关注程度,从而捕捉序列内的长距离依赖关系。
    • 用途: 在Transformer等模型中,自注意力机制被用于捕捉序列内部的语义关系,尤其适用于自然语言处理任务。
  2. 注意力机制(Attention Mechanism):

    • 上下文: 可以应用于处理序列之间的关系,不仅限于同一个序列。
    • 对象: 该机制可以关注两个不同序列(通常是查询序列和键序列)之间的关联,用于将一个序列的信息集中放在另一个序列的相关部分。
    • 用途: 在机器翻译等任务中,注意力机制被用于将源语言序列的信息对齐到目标语言序列,从而实现更好的序列到序列的建模。

总的来说,自注意力机制是注意力机制的一种特殊情况,着重于处理同一序列内的元素关系。而一般的注意力机制可以用于处理序列间的关系,使其更灵活地适应不同的上下文。在Transformer模型中,自注意力机制是多头注意力机制的一个组成部分,用于捕捉不同位置之间的关系。

transformer架构

语义理解

在这里插入图片描述

Scaled Dot-Product Attention

Transformer中的注意力机制使用的是Scaled Dot-Product Attention。对于输入序列中的每个位置,通过计算与其他位置的关联度,得到一个加权的表示。这个计算通过将查询(Query)、键(Key)、值(Value)进行点积,然后除以一个缩放因子来实现。最终的注意力权重用于加权求和得到当前位置的表示。

注意力机制使得Transformer能够在不同位置上关注不同的信息,从而更好地捕捉序列中的长距离依赖关系。这也是Transformer相较于传统循环神经网络的一大优势。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Multi-Head Attention

多头注意力(Multi-Head Attention)是Transformer模型中的一种扩展形式,它通过使用多组注意力机制来提高模型的表达能力。每个注意力头都会学习捕捉输入序列中不同的关系,然后将这些关系进行组合。

在多头注意力中,首先将输入通过线性映射分为多个子空间(头)。然后,在每个子空间内进行独立的注意力计算,得到多个注意力头的输出。最后,将这些头的输出进行拼接,并通过另一个线性映射得到最终的多头注意力输出。

这个过程的好处在于,每个注意力头可以专注于捕捉输入序列中的不同特征,从而提高模型对复杂关系的建模能力。通过使用多头注意力,Transformer能够并行地学习多个关系,更全面地理解输入序列。

在这里插入图片描述

feed forward

在Transformer模型中,Feed Forward层是多头自注意力层之后的一个前馈神经网络(FFN),用于对模型的表示进行非线性映射和处理。每个位置的表示经过Feed Forward层后会得到新的表示,从而使模型更好地捕捉输入序列中的特征。

Feed Forward层包括两个步骤:线性映射和激活函数。具体来说,给定输入 (X),Feed Forward层的计算过程如下:

  1. 线性映射:将输入 (X) 通过一个线性变换,得到中间表示 (X_{\text{FFN}})。
    X FFN = X W 1 + b 1   X_{\text{FFN}} = XW_1 + b_1\ XFFN=XW1+b1 
    其中,(W_1) 是权重矩阵,(b_1) 是偏置向量。

  2. 激活函数:对中间表示应用激活函数(通常是ReLU)。
    X FFN ′ = ReLU ( X FFN ) X_{\text{FFN}}' = \text{ReLU}(X_{\text{FFN}}) XFFN=ReLU(XFFN)

  3. 再次线性映射:将激活后的表示再次通过线性变换,得到最终输出。
    Output = X FFN ′ W 2 + b 2 \text{Output} = X_{\text{FFN}}'W_2 + b_2 Output=XFFNW2+b2
    其中,(W_2) 是权重矩阵,(b_2) 是偏置向量。

Feed Forward层的作用是引入非线性变换,增加模型的表达能力。通过两个线性映射之间的非线性激活函数,模型能够学习到更复杂的特征映射,有助于提高对输入序列的建模能力。 Feed Forward层是Transformer模型中每个位置都会应用的关键组件之一。

add and norm

在Transformer模型中,"Add and Norm"是指两个连续的操作:残差连接(Add)和层标准化(Norm)。这两个操作是Transformer中每个子层后的标准步骤,无论是在编码器还是解码器中。下面详细解释这两个操作:

残差连接(Add)

残差连接,也称为残差连接或者跳跃连接(Skip Connection),是深度学习中的一种技术,它允许模型的某一层直接访问前面层的激活。在Transformer模型的每个子层后,输入直接加到子层的输出上。数学上,如果我们有一个子层的函数 ( \text{SubLayer}(\cdot) ) 和输入 ( x ),那么残差连接的输出 ( y ) 为:

y = x + SubLayer ( x ) y = x + \text{SubLayer}(x) y=x+SubLayer(x)
这个操作的主要目的是帮助缓解深层网络中的梯度消失问题,因为它允许梯度在训练过程中直接流过网络,未经修改地传递到更浅的层次。

层标准化(Norm)

层标准化是对网络中的激活进行规范化的过程,以确保网络在每层的激活分布大致相同。层标准化是在残差连接之后进行的,它通常针对每个输入样本独立计算。对于每个特征,层标准化会计算该特征在一个样本中的均值和方差,并使用这些值来规范化输出,使其均值为0,方差为1。然后,使用可学习的参数对规范化的数据进行缩放和偏移,数学上表示为:

LayerNorm ( x ) = γ ( x − μ σ ) + β \text{LayerNorm}(x) = \gamma \left( \frac{x - \mu}{\sigma} \right) + \beta LayerNorm(x)=γ(σxμ)+β
其中,( x ) 是来自残差连接的输入,( \mu ) 和 ( \sigma ) 分别是 ( x ) 的均值和标准差,( \gamma ) 和 ( \beta ) 是模型学习的缩放和偏移参数。

通过这种方式,"Add and Norm"帮助模型在训练期间保持稳定,有助于训练更深、更复杂的模型。在Transformer中,这种结构设计被证明非常有效,现在已经被广泛应用于许多深度学习架构中。

Positional Encoding

在Transformer模型中,由于它不包含序列中元素的先后顺序信息,为了将位置信息引入模型,使用了位置编码(Positional Encoding)。

位置编码是一种在输入嵌入向量中添加位置信息的方法,使模型能够感知到输入序列中元素的位置关系。Transformer中使用了一种特殊的位置编码,即采用正弦和余弦函数的组合。

位置编码的计算公式如下:

P E ( p o s , 2 i ) = sin ⁡ ( p o s 1000 0 2 i / d ) PE_{(pos,2i)} = \sin\left(\frac{pos}{10000^{2i/d}}\right) PE(pos,2i)=sin(100002i/dpos)

P E ( p o s , 2 i + 1 ) = cos ⁡ ( p o s 1000 0 2 i / d ) PE_{(pos,2i+1)} = \cos\left(\frac{pos}{10000^{2i/d}}\right) PE(pos,2i+1)=cos(100002i/dpos)

其中:

  • (pos) 是位置信息,表示在序列中的位置。
  • (i) 是维度,表示嵌入向量的每个维度。
  • (d) 是嵌入向量的维度。

这样,对于每个位置 (pos) 和每个维度 (i),都能得到一个唯一的位置编码值。将这个位置编码与输入嵌入向量相加,即可得到带有位置信息的新向量。这样,模型在学习时能够区分不同位置的元素,更好地捕捉序列中的关系。

位置编码的引入是为了弥补Transformer模型无法直接处理序列中元素的顺序关系的缺陷,从而提高模型在处理序列数据时的性能。

masked

在Transformer模型中,为了在自注意力机制中处理变长序列,引入了掩码(Masking)的概念。掩码用于在序列中将某些位置的信息隐藏,以防止在自注意力计算中使用到未来的信息。

在自注意力机制中,每个位置的输出是由所有位置的输入加权求和得到的。而为了避免一个位置使用到未来的信息,需要在计算时对这些未来位置进行掩码,将其权重设为负无穷大,从而使其在softmax计算时趋近于零。

对于输入序列长度为 (T),在位置 (t) 处的掩码被定义为一个 (T \times T) 的矩阵,其中:

mask i j = { 0 if  i ≤ j  (不进行掩码) − ∞ if  i > j  (进行掩码) \text{mask}_{ij} = \begin{cases} 0 & \text{if } i \leq j \text{ (不进行掩码)} \\ -\infty & \text{if } i > j \text{ (进行掩码)} \end{cases} maskij={0if ij (不进行掩码)if i>j (进行掩码)
这样,当进行softmax计算时,那些需要被掩码的位置的权重会趋近于零,使得模型不会利用未来的信息。

在自注意力机制中,为了实现这种掩码,通常在softmax前对输入添加一个掩码矩阵,将需要掩码的位置对应的元素设置为负无穷大。这样,在计算softmax时,这些位置的权重就会趋近于零,达到掩码的效果。

通俗的语言解释一下

在自注意力机制中,我们希望模型能够在处理一个序列时关注到序列中的每个位置,但我们又不希望模型在某个位置的预测中使用到该位置后面的信息。举个例子,如果我们在翻译一个句子,我们不希望模型在翻译某个单词时使用到该单词后面的单词,因为在实际翻译时我们是逐词逐句翻译的,没有未来信息可用。

那么,为了达到这个目的,我们引入了一个“掩码”的概念。这个掩码告诉模型在计算每个位置的重要性时,不要考虑该位置后面的信息。掩码的作用就像是一个遮挡板,遮住了后面的信息,让模型只能看到当前位置以及它之前的信息。

这样,模型在学习时就会更注重每个位置之前的上下文,而不会利用未来的信息。这种方法确保了模型的预测是逐步生成的,更符合实际应用场景。

抽象结构

transformer仍然是一个encoder decoder的结构,相较于传统的循环神经网络(RNN)和长短时记忆网络(LSTM),Transformer引入了一种新颖的架构,摒弃了序列数据的顺序性假设,使用自注意力机制来处理序列信息。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

整体网络结构

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在这里插入图片描述

在这里插入图片描述

可视化multi-head attention

在这里插入图片描述

为什么transformer很重要

1.attention is all you need:
第一个完全依赖自注意力来计算其输入和输出表示的转导模型,而不使用序列对齐的 RNN 或卷积
2.GPU友好的并行计算:
这些层高度可并行化,从而降低计算成本
3.句子级表示:
置编码相结合,Transformer 可以通过考虑标记的相对位置来捕获远程依赖关系。

  • 24
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

(initial)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值