神经网络小记-attation

在神经网络中,注意力机制通过计算输入中不同部分的权重,将关注点集中在对任务具有重要性的信息上。它可以用来选择性地关注输入中的某些部分,从而提高模型的表达能力和性能。

通过分配权重,注意力机制可以根据输入的不同部分的相关性和重要性来调整模型的处理方式。在自注意力机制中,权重是通过计算输入中每个位置与其他位置的相关性得分来得到的,然后将相关性得分进行归一化处理,得到每个位置的权重。这样,模型可以根据不同位置之间的相对重要性来聚焦于不同的信息。

自注意力

Self Attention(自注意力)是Transformer模型中的核心机制之一,它在处理序列数据时起到了重要作用。自注意力机制允许模型根据序列中不同位置的相关性来动态地计算位置间的权重,从而捕捉全局的上下文信息。

下面是Self Attention的详解,包括公式表示:

假设有一个输入序列 X = { x 1 , x 2 , . . . , x n } X = \{x_1, x_2, ..., x_n\} X={x1,x2,...,xn},其中 x i x_i xi 表示序列中的第 i i i 个元素, n n n 是序列的长度。Self Attention 的计算过程可以分为三个步骤:计算查询(Query)、键(Key)和值(Value),然后根据它们计算权重和加权聚合。

  1. 查询(Query) Q Q Q:通过对输入序列应用线性变换来计算查询向量 Q Q Q Q = X W Q Q = XW_Q Q=XWQ
    其中 W Q W_Q WQ 是查询的权重矩阵。

  2. 键(Key) K K K:通过对输入序列应用另一个线性变换来计算键向量 K K K K = X W K K = XW_K K=XWK
    其中 W K W_K WK 是键的权重矩阵。

  3. 值(Value) V V V:通过对输入序列应用第三个线性变换来计算值向量 V V V V = X W V V = XW_V V=XWV
    其中 W V W_V WV 是值的权重矩阵。

通过计算查询、键和值,我们可以得到三个矩阵 Q , K , V Q, K, V Q,K,V,它们的维度都是 n × d n \times d n×d,其中 d d d 是每个查询/键/值向量的维度。

接下来,通过计算查询与键的相似度(通常使用点积或其他方法),可以得到注意力权重 A A A A = softmax ( Q K T d ) A = \text{softmax}\left(\frac{QK^T}{\sqrt{d}}\right) A=softmax(d QKT)
其中 Q K T QK^T QKT 是查询与键的内积,除以 d \sqrt{d} d 是为了缩放注意力权重,使得梯度更稳定。

最后,通过将注意力权重与值进行加权聚合,得到自注意力的输出 Y Y Y Y = A V Y = AV Y=AV

这样,对于序列中的每个元素 x i x_i xi,都会根据整个序列的上下文信息进行加权处理,从而获取到更全局的表示。

需要注意的是,上述公式是Self Attention的基本形式,Transformer模型在此基础上进一步引入了多头注意力机制、残差连接和归一化等技术,以提升模型的表达能力和性能。

自注意力机制在Transformer模型中起到了关键作用,使得模型能够处理长距离依赖关系,同时也具有并行计算的优势。这使得Transformer在自然语言处理、计算机视觉等领域取得了显著的成果。

自注意力机制-举例

假设有一个输入序列为: X = { x 1 , x 2 , x 3 , x 4 } X = \{x_1, x_2, x_3, x_4\} X={x1,x2,x3,x4},其中 x i x_i xi 表示序列中的第 i i i 个元素。我们将使用一个简化的自注意力机制来计算每个元素的上下文表示。

首先,我们将输入序列通过线性变换得到查询(Query)、键(Key)和值(Value)的向量表示。假设每个向量的维度为2。

查询(Query) Q Q Q
Q = X W Q = [ x 1 x 2 x 3 x 4 ] [ w 11 Q w 12 Q w 21 Q w 22 Q ] Q = XW_Q = \left[ \begin{array}{cc} x_1 & x_2 & x_3 & x_4 \end{array} \right] \left[ \begin{array}{cc} w_{11}^Q & w_{12}^Q \\ w_{21}^Q & w_{22}^Q \end{array} \right] Q=XWQ=[x1x2x3x4][w11Qw21Qw12Qw22Q]

键(Key) K K K
K = X W K = [ x 1 x 2 x 3 x 4 ] [ w 11 K w 12 K w 21 K w 22 K ] K = XW_K = \left[ \begin{array}{cc} x_1 & x_2 & x_3 & x_4 \end{array} \right] \left[ \begin{array}{cc} w_{11}^K & w_{12}^K \\ w_{21}^K & w_{22}^K \end{array} \right] K=XWK=[x1x2x3x4][w11Kw21Kw12Kw22K]

值(Value) V V V
V = X W V = [ x 1 x 2 x 3 x 4 ] [ w 11 V w 12 V w 21 V w 22 V ] V = XW_V = \left[ \begin{array}{cc} x_1 & x_2 & x_3 & x_4 \end{array} \right] \left[ \begin{array}{cc} w_{11}^V & w_{12}^V \\ w_{21}^V & w_{22}^V \end{array} \right] V=XWV=[x1x2x3x4][w11Vw21Vw12Vw22V]

接下来,我们计算查询与键的相似度,并进行归一化得到注意力权重 A A A。假设我们使用点积作为相似度度量:

A = softmax ( Q K T d ) A = \text{softmax}\left(\frac{QK^T}{\sqrt{d}}\right) A=softmax(d QKT)

其中, d d d 是查询和键的向量维度。

然后,我们将注意力权重 A A A 与值 V V V 进行加权聚合得到自注意力的输出 Y Y Y

Y = A V Y = AV Y=AV

最终,我们得到每个元素的上下文表示,即输出序列 Y = { y 1 , y 2 , y 3 , y 4 } Y = \{y_1, y_2, y_3, y_4\} Y={y1,y2,y3,y4}

通过自注意力,每个元素都能够根据整个序列的上下文信息进行加权聚合,从而获得更全局的表示。这种方式使得模型能够处理长距离依赖关系,对于序列任务(如机器翻译、语言建模等)非常有效。

多头注意力机制

多头注意力机制是Transformer模型中的核心组件之一,用于学习多个不同的关注方式并提取输入序列的多个粒度的特征。以下是多头注意力机制的原理和公式详解:

假设输入序列为 X = { x 1 , x 2 , . . . , x n } X = \{x_1, x_2, ..., x_n\} X={x1,x2,...,xn},其中 x i x_i xi 表示第 i i i 个输入元素。多头注意力机制主要包含以下几个步骤:

  1. 线性变换:通过线性变换将输入序列 X X X 分别映射到查询(Query)、键(Key)和值(Value)空间。这可以通过独立的线性变换来实现。假设线性变换的权重矩阵为 W Q W_Q WQ W K W_K WK W V W_V WV,则查询向量 Q Q Q、键向量 K K K 和值向量 V V V 可以通过如下计算获得:

    Q = X ⋅ W Q Q = X \cdot W_Q Q=XWQ

    K = X ⋅ W K K = X \cdot W_K K=XWK

    V = X ⋅ W V V = X \cdot W_V V=XWV

  2. 注意力权重计算:对于每个注意力头,计算查询向量 Q Q Q 与键向量 K K K 之间的相似度,并将其归一化得到注意力权重。通常采用点积注意力(Dot Product Attention)来计算相似度。对于第 i i i 个注意力头,相似度计算可以表示为:

    A t t e n t i o n i = Softmax ( Q i ⋅ K i T d k ) {Attention}_i = \text{Softmax}\left(\frac{Q_i \cdot K_i^T}{\sqrt{d_k}}\right) Attentioni=Softmax(dk QiKiT)

    其中 Q i Q_i Qi 表示第 i i i 个注意力头的查询向量, K i K_i Ki 表示第 i i i 个注意力头的键向量, d k d_k dk 表示查询/键向量的维度。

  3. 加权求和:使用注意力权重对值向量 V V V 进行加权求和,得到每个注意力头的输出。对于第 i i i 个注意力头的输出,可以表示为:

    O u t p u t i = Attention i ⋅ V i {Output}_i = \text{Attention}_i \cdot V_i Outputi=AttentioniVi

    其中 Attention i \text{Attention}_i Attentioni 表示第 i i i 个注意力头的注意力权重, V i V_i Vi 表示第 i i i 个注意力头的值向量。

  4. 多头合并:将多个注意力头的输出进行合并,得到多头注意力的最终输出。通常通过将多个注意力头的输出连接在一起,并进行线性变换来实现。假设线性变换的权重矩阵为 W O W_O WO,则多头注意力的最终输出可以表示为:

    M u l t i h e a d O u t p u t = Concat ( Output 1 , Output 2 , . . . , Output h ) ⋅ W O {MultiheadOutput} = \text{Concat}(\text{Output}_1, \text{Output}_2, ..., \text{Output}_h) \cdot W_O MultiheadOutput=Concat(Output1,Output2,...,Outputh)WO

    其中 Output 1 , Output 2 , . . . , Output h \text{Output}_1, \text{Output}_2, ..., \text{Output}_h Output1,Output2,...,Outputh 表示每个注意力头的输出, h h h 表示注意力头的数量。

总结来说,多头注意力机制通过对输入序列进行线性变换并计算注意力权重,然后将注意力权重与值向量进行加权求和,最后将多个注意力头的输出进行合并得到最终的多头注意力输出。这样可以使得模型能够学习多种不同的关注方式,并提取输入序列的多个粒度的特征,从而提高模型的表达能力和灵活性。

其他的注意力机制

除了自注意力机制(Self-Attention),还有其他常见的注意力机制,它们在不同的任务和场景中发挥着重要作用。以下是一些常见的注意力机制:

  1. 多头注意力(Multi-head Attention):多头注意力机制是一种扩展的注意力机制,通过使用多个独立的注意力头来捕捉不同的关注模式。每个头都计算一组注意力权重,并将它们的结果进行拼接或加权求和。多头注意力允许模型在不同层次和角度上关注不同的信息,增强了模型的表达能力。

  2. 带位置编码的注意力(Positional Encoding):带位置编码的注意力机制用于处理序列数据,并引入了位置信息以捕捉序列中元素的顺序信息。通过将位置编码添加到输入表示中,注意力机制可以更好地处理序列中元素的顺序依赖关系,如在Transformer模型中使用的位置编码。

  3. 双线性注意力(Bilinear Attention):双线性注意力机制是一种基于双线性函数的注意力模型,用于计算两个向量之间的关联度。它在计算注意力权重时使用双线性函数来建模输入的交互关系。双线性注意力适用于计算两个向量之间的复杂关系,例如图像与文本之间的关联。

  4. 局部注意力(Local Attention):局部注意力机制用于在较长的序列中只关注局部子区域,而不是全局范围。它通过引入一个窗口或局部区域来限制计算注意力的范围,从而减少计算开销。局部注意力适用于处理长序列,如机器翻译中的较长句子。

  5. 点积注意力(Dot Product Attention):点积注意力是一种简单而常用的注意力机制。在点积注意力中,给定一个查询向量(Q)和一组键向量(K),注意力权重是通过计算查询向量和键向量之间的点积得分来得到的。然后,通过对得分进行softmax归一化,可以得到标准化的注意力权重。最后,将注意力权重与值向量(V)进行加权聚合,得到最终的注意力输出。点积注意力的计算效率较高,但可能在数据维度较高时产生梯度消失或梯度爆炸问题。

  6. 加性注意力(Additive Attention):加性注意力通过引入额外的可学习参数来计算注意力权重。在加性注意力中,查询向量(Q)和键向量(K)通过线性变换和激活函数得到一个中间表示,然后将中间表示与权重矩阵相乘,得到注意力得分。通过softmax归一化,可以得到标准化的注意力权重。最后,将注意力权重与值向量(V)进行加权聚合,得到最终的注意力输出。加性注意力相对于点积注意力具有更大的灵活性,但计算代价更高。

  7. 缩放点积注意力(Scaled Dot Product Attention):为了缓解点积注意力中的梯度消失或梯度爆炸问题,缩放点积注意力引入了缩放因子。在缩放点积注意力中,将点积得分除以一个缩放因子,通常为查询向量的维度的平方根。这样可以平衡得分的数值范围,并减小梯度的大小。然后,通过softmax归一化,可以得到标准化的注意力权重。最后,将注意力权重与值向量(V)进行加权聚合,得到最终的注意力输出。缩放点积注意力是Transformer模型中常用的注意力机制。

这些注意力机制在不同的任务和模型中具有不同的应用。选择适当的注意力机制取决于任务的特点和要解决的问题。在实践中,可以根据需求选择适合的注意力机制,并将其集成到模型中以改善模型的表达能力和性能。

Transformer和自注意力(Self-Attention)

Transformer是一种基于注意力机制的神经网络模型,广泛应用于序列到序列的任务,如机器翻译、语音识别等。它摒弃了传统的递归结构(如循环神经网络),引入了自注意力机制来捕捉序列中的长距离依赖关系。

自注意力机制是Transformer模型的核心部分,它通过计算序列中每个位置与其他位置的相关性得分,为每个位置分配一个权重,用于聚合其他位置的信息。相比于传统的注意力机制,自注意力不仅可以关注其他位置的信息,还能够考虑到每个位置与其他位置之间的相对重要性。

在Transformer中,自注意力层由三个线性变换组成:查询(Query)、键(Key)和值(Value)。通过计算查询与键之间的点积得分,再通过Softmax函数进行归一化,可以得到与每个查询位置相关的权重向量。然后,将权重向量与值进行加权求和,得到每个查询位置的输出结果。

通过多头自注意力机制,Transformer模型能够学习多种不同的关注方式,并提取输入序列中的多个粒度的特征。在编码器中,自注意力层可以将输入序列中的每个位置与其他位置进行关联,并获取全局的上下文信息。在解码器中,除了自注意力,还引入了另一个注意力机制,用于将输入序列和输出序列之间的信息进行关联,实现翻译或生成的任务。

总结来说,Transformer是一种基于自注意力机制的神经网络模型,通过引入自注意力机制,它能够同时考虑到序列中所有位置的信息,从而更好地捕捉长距离依赖关系。自注意力机制是Transformer模型中用于计算位置之间相关性的核心部分。

示例代码

import torch
import torch.nn as nn

class Attention(nn.Module):
    def __init__(self, input_size):
        super(Attention, self).__init__()
        self.W = nn.Linear(input_size, 1)

    def forward(self, x):
        weights = self.W(x)  # 计算权重
        attention_scores = torch.softmax(weights, dim=1)  # 对权重进行softmax归一化
        weighted_input = x * attention_scores  # 加权输入
        output = torch.sum(weighted_input, dim=1)  # 对加权输入进行求和
        return output, attention_scores

# 测试示例
input_size = 64
batch_size = 32
sequence_length = 10

input_data = torch.randn(batch_size, sequence_length, input_size)

attention = Attention(input_size)
output, attention_scores = attention(input_data)

print("Output shape:", output.shape)
print("Attention scores shape:", attention_scores.shape)

上述代码实现了一个简单的注意力机制类 Attention。它接受一个输入向量 x,并输出加权后的输出向量和注意力权重。

Attention 类的 __init__ 方法中,我们定义了一个全连接层 self.W,用于将输入向量映射到一个标量值。在 forward 方法中,我们首先通过全连接层计算出权重 weights,然后对权重进行 softmax 归一化,得到注意力权重 attention_scores。接下来,我们将输入向量 x 与注意力权重相乘,得到加权的输入向量 weighted_input。最后,我们对加权输入向量进行求和,得到最终的输出向量 output

在示例中,我们随机生成了一个输入张量 input_data,它的大小为 (batch_size, sequence_length, input_size)。我们使用 Attention 类对输入进行处理,得到输出向量 output 和注意力权重 attention_scores。打印输出的形状可以看到,输出向量的形状为 (batch_size, input_size),注意力权重的形状为 (batch_size, sequence_length)

bert 与gpt的区别与联系

BERT(Bidirectional Encoder Representations from Transformers)和GPT(Generative Pre-trained Transformer)都是基于Transformer架构的预训练模型,但它们在一些方面有着显著的区别和不同的应用场景。

区别:

  1. 任务类型:

    • BERT是一种双向的预训练模型,主要用于下游任务的fine-tuning,如文本分类、命名实体识别、问答等。
    • GPT是一种单向的预训练模型,主要用于生成型任务,如文本生成、对话生成等。
  2. 预训练目标:

    • BERT使用Masked Language Model(MLM)作为预训练目标,即在输入句子中随机遮挡一些词,让模型预测这些遮挡词的正确词汇。
    • GPT使用Autoregressive Language Model作为预训练目标,即根据已经生成的文本,预测下一个词汇。
  3. 数据准备:

    • BERT的输入是一对句子(例如,句子对分类任务),需要将句子分为两个segment,并加入特殊的token([CLS]和[SEP])。
    • GPT的输入是单个文本序列,不需要segment。
  4. 模型结构:

    • BERT使用Transformer的encoder部分,主要关注文本的双向表示。
    • GPT使用Transformer的decoder部分,主要关注文本的自回归生成。

联系:
BERT和GPT都使用了Transformer架构,并且都是基于无监督预训练的方式,通过在大规模数据上进行预训练,学习到了丰富的语言知识。它们的预训练模型可以用于下游任务的fine-tuning或生成任务。

另外,BERT和GPT的成功证明了预训练模型在自然语言处理任务中的重要性,它们为NLP领域带来了巨大的进步和突破,也推动了更多基于Transformer的预训练模型的发展,如XLNet、RoBERTa等。

attention的时间复杂度

假设我们有一个Transformer模型,输入是一个长度为n的序列,每个输入向量的维度是d。

  1. 原始的Self-Attention计算(未优化):

    • 输入序列的长度n为100,每个输入向量的维度d为512。
    • 计算注意力权重所需的时间复杂度为O(n * d^2) = O(100 * 512^2) = O(2,621,440,000)。
  2. 使用批处理优化:

    • 假设我们将输入序列划分为大小为32的批次(batch size为32)。
    • 批处理优化后,注意力权重的计算可以并行进行,每个批次内的计算仍然是O(n * d^2),但是批次间的计算可以并行进行,从而减少计算时间。
    • 优化后的时间复杂度仍然是O(n * d^2),但计算效率得到提升。
  3. 使用低秩注意力优化:

    • 在Transformer的一些变种中,可以使用低秩注意力机制来降低注意力计算的复杂度。
    • 假设我们使用低秩注意力,将注意力矩阵分解为两个低秩矩阵的乘积,其中每个低秩矩阵的维度为k(k远小于d)。
    • 注意力权重的计算复杂度变为O(n * k * d),其中k比d小得多。
    • 通过使用低秩注意力,可以显著降低注意力机制的计算复杂度,提高模型的计算效率。

在Self-Attention中,输入序列的长度为n,每个输入向量的维度为d。Self-Attention的计算涉及到计算注意力权重,其中每个注意力权重都对应着一个输入向量与其他输入向量之间的关系。具体来说,对于每个输入向量,我们需要计算其与其他所有输入向量之间的相似度,并通过一系列的操作得到最终的注意力权重。

在原始的Self-Attention计算中,对于每个输入向量,我们需要计算其与其他n-1个输入向量的相似度,所以需要进行n-1次计算。每次计算涉及到两个向量的点积,其时间复杂度为O(d^2),因为两个向量都是d维的。因此,对于一个输入向量,计算其与其他所有输入向量之间的相似度的时间复杂度为O(n * d^2)。

由于一共有n个输入向量,所以计算所有输入向量之间的相似度的时间复杂度为O(n * n * d2),简化为O(n2 * d^2)。这表示原始的Self-Attention计算在输入序列较长(n较大)或向量维度较高(d较大)的情况下,计算复杂度会呈指数级增长。

为了优化这一计算复杂度,可以采取批处理优化、低秩注意力等方法,从而在处理较大规模的输入序列或模型时能够更高效地计算注意力权重,提高模型的训练和推理速度。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值