看完这一篇终于把 Transformer 中的注意力机制搞懂了!!建议收藏起来学!!

前言

其核心思想是使用注意力机制来处理输入序列中的每个元素与其他元素之间的关系,从而捕捉全局的依赖关系。

Transformer 中的注意力机制有几种形式,包括自注意力机制、多头自注意力机制、掩蔽自注意力机制和交叉(编码器-解码器)自注意力机制。

图片

自注意力机制

自注意力机制是 Transformer 中的关键机制,它通过计算输入序列中每个元素与其他元素的相关性,来捕捉序列中的全局依赖关系。

其基本原理是让每个输入元素(Token)与整个序列的所有其他元素进行交互,计算其对整个序列的注意力权重,并根据这些权重来生成新的表示。

计算步骤如下所示

  1. 线性变换

    首先,将输入 X 通过三个不同的线性变换,生成查询 Q、键 K 和 值 V 矩阵。

    其中, 是权重矩阵。

  2. 计算注意力权重

    通过计算查询 Q 和键 K 之间的相似度,得到的结果是一个矩阵,表示了每个位置的查询向量与其他位置键向量的相似度。

  3. 缩放

    为了避免数值过大,通常将相似度值除以 ,其中 是键向量的维度。

  4. 归一化 (Softmax)

    对相似度分数应用 Softmax 函数,将其转换为权重

  5. 加权和

    最后,将得到的权重与值矩阵 V 进行加权求和,得到每个位置的最终表示。

    这样,每个位置的输出就是一个包含了整个序列上下文信息的向量表示。

图片

自注意力的优点

  • 全局信息捕捉:通过自注意力机制,模型能够在每个位置考虑到其他位置的信息,从而能够捕捉到长期依赖关系。
  • 并行计算:与 RNN 等传统方法不同,自注意力机制不依赖于序列的顺序,因此可以进行并行化计算。
import torch
import torch.nn as nn

class SelfAttention(nn.Module):
    def __init__(self, embed_dim):
        super(SelfAttention, self).__init__()
        self.embed_dim = embed_dim
        
        # 定义可训练参数
        self.W_Q = nn.Linear(embed_dim, embed_dim)
        self.W_K = nn.Linear(embed_dim, embed_dim)
        self.W_V = nn.Linear(embed_dim, embed_dim)
    
    def forward(self, x):
        """
        :param x: 输入序列 (batch_size, seq_len, embed_dim)
        :return: 自注意力后的输出 (batch_size, seq_len, embed_dim)
        """
        Q = self.W_Q(x)  # (batch_size, seq_len, embed_dim)
        K = self.W_K(x)  # (batch_size, seq_len, embed_dim)
        V = self.W_V(x)  # (batch_size, seq_len, embed_dim)

        # 计算注意力分数
        attn_scores = torch.matmul(Q, K.transpose(-2, -1)) / torch.sqrt(torch.tensor(self.embed_dim, dtype=torch.float32))
        attn_probs = torch.softmax(attn_scores, dim=-1)  # 归一化

        # 计算加权和
        attn_output = torch.matmul(attn_probs, V)  # (batch_size, seq_len, embed_dim)
        return attn_output

# 测试
batch_size, seq_len, embed_dim = 2, 5, 8
x = torch.rand(batch_size, seq_len, embed_dim)
self_attention = SelfAttention(embed_dim)
output = self_attention(x)
print("Self-Attention Output Shape:", output.shape)

多头自注意力机制

多头自注意力机制是对自注意力机制的扩展,它通过多个注意力头学习不同的特征子空间,以增强模型的表达能力。

具体来说,它将查询、键和值的线性变换拆分成多个头(多个子空间),然后每个头可以在不同的子空间中学习不同的注意力模式。最终,将所有头的输出拼接起来并通过线性变换得到最终的输出。

图片

多头自注意力的计算过程如下。

  1. 将输入映射到多个头,每个头独立执行自注意力计算

  2. 拼接与线性变换

    将所有注意力头的输出拼接起来,并通过线性变换得到最终输出。

    其中,h 是头的数量, 是输出的线性变换矩阵。

class MultiHeadAttention(nn.Module):
    def __init__(self, embed_dim, num_heads):
        super(MultiHeadAttention, self).__init__()
        assert embed_dim % num_heads == 0, "Embedding dimension must be divisible by number of heads"
        
        self.embed_dim = embed_dim
        self.num_heads = num_heads
        self.head_dim = embed_dim // num_heads  # 每个头的维度
        
        # 线性变换矩阵
        self.W_Q = nn.Linear(embed_dim, embed_dim)
        self.W_K = nn.Linear(embed_dim, embed_dim)
        self.W_V = nn.Linear(embed_dim, embed_dim)
        self.W_O = nn.Linear(embed_dim, embed_dim)  # 最终输出变换

    def forward(self, x):
        batch_size, seq_len, embed_dim = x.shape
        
        # 计算 Q, K, V
        Q = self.W_Q(x)  # (batch_size, seq_len, embed_dim)
        K = self.W_K(x)  # (batch_size, seq_len, embed_dim)
        V = self.W_V(x)  # (batch_size, seq_len, embed_dim)

        # 变形为多头形式: (batch_size, num_heads, seq_len, head_dim)
        Q = Q.view(batch_size, seq_len, self.num_heads, self.head_dim).transpose(1, 2)
        K = K.view(batch_size, seq_len, self.num_heads, self.head_dim).transpose(1, 2)
        V = V.view(batch_size, seq_len, self.num_heads, self.head_dim).transpose(1, 2)

        # 计算注意力分数
        attn_scores = torch.matmul(Q, K.transpose(-2, -1)) / torch.sqrt(torch.tensor(self.head_dim, dtype=torch.float32))
        attn_probs = torch.softmax(attn_scores, dim=-1)

        # 计算加权和
        attn_output = torch.matmul(attn_probs, V)  # (batch_size, num_heads, seq_len, head_dim)

        # 恢复形状: 先transpose再reshape
        attn_output = attn_output.transpose(1, 2).reshape(batch_size, seq_len, embed_dim)

        # 通过最终的线性变换
        output = self.W_O(attn_output)  # (batch_size, seq_len, embed_dim)
        return output

# 测试
num_heads = 4
multihead_attention = MultiHeadAttention(embed_dim, num_heads)
output = multihead_attention(x)
print("Multi-Head Attention Output Shape:", output.shape)

掩蔽自注意力机制

掩蔽自注意力机制出现在 Transformer 模型的解码器部分,它作用是防止模型在预测当前位置的词时,看到未来位置的信息,从而保持自回归的生成顺序。

在掩蔽自注意力中,掩蔽操作会将注意力得分矩阵中的未来信息掩盖,通常是将其设置为负无穷大()。这样,通过应用 Softmax 时,这些位置的权重会变为零,从而避免了信息泄漏。

数学公式为

其中 M 是一个掩蔽矩阵

如果如果

这意味着计算出来的所有掩蔽位置的注意力得分为零,不会对最终结果产生影响。

图片

交叉自注意力机制(Cross-Attention)

交叉(编码器-解码器)自注意力机制用于 Transformer 解码器部分,它允许解码器在生成输出时关注编码器的输出。这个机制使得解码器能够利用编码器产生的上下文信息来生成目标序列。

交叉自注意力的计算过程类似于自注意力,只是它使用了来自编码器的输出作为值(Value)和键(Key),而查询(Query)来自解码器的当前输入。

交叉注意力计算的公式如下:

其中,查询向量 Q 来自解码器的输入,而键向量 K 和值向量 V 来自编码器的输出。

交叉注意力的核心思想是解码器在生成每个词时,不仅依赖于自己已经生成的部分(自注意力),还会关注编码器输出的表示。

图片

最后的最后

感谢你们的阅读和喜欢,作为一位在一线互联网行业奋斗多年的老兵,我深知在这个瞬息万变的技术领域中,持续学习和进步的重要性。

为了帮助更多热爱技术、渴望成长的朋友,我特别整理了一份涵盖大模型领域的宝贵资料集。

这些资料不仅是我多年积累的心血结晶,也是我在行业一线实战经验的总结。

这些学习资料不仅深入浅出,而且非常实用,让大家系统而高效地掌握AI大模型的各个知识点。如果你愿意花时间沉下心来学习,相信它们一定能为你提供实质性的帮助。

这份完整版的大模型 AI 学习资料已经上传优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费

大模型知识脑图

为了成为更好的 AI大模型 开发者,这里为大家提供了总的路线图。它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
在这里插入图片描述

经典书籍阅读

阅读AI大模型经典书籍可以帮助读者提高技术水平,开拓视野,掌握核心技术,提高解决问题的能力,同时也可以借鉴他人的经验。对于想要深入学习AI大模型开发的读者来说,阅读经典书籍是非常有必要的。

在这里插入图片描述

实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

在这里插入图片描述

面试资料

我们学习AI大模型必然是想找到高薪的工作,下面这些面试题都是总结当前最新、最热、最高频的面试题,并且每道题都有详细的答案,面试前刷完这套面试题资料,小小offer,不在话下

在这里插入图片描述

640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

在这里插入图片描述

这份完整版的大模型 AI 学习资料已经上传优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费

回答: Transformer是一种神经网络架构,它在自然语言处理任务中发挥着重要的作用。它的作用是通过自注意力机制来捕捉句子中的关联信息,从而实现对整个句子的理解和表示。\[1\]相比传统的循环神经网络和卷积神经网络,Transformer具有更强大的建模能力和更好的并行计算性能。它可以处理长文本序列,并且能够更好地捕捉句子中的语义和上下文信息。Transformer的应用非常广泛,例如在机器翻译、文本分类、命名实体识别等自然语言处理任务中,Transformer都取得了很好的效果。\[2\]此外,Transformer还引入了位置编码器来处理词汇的位置信息,以弥补位置信息的缺失,从而更好地建模句子的结构和语义。\[3\]总之,Transformer的作用是通过自注意力机制和位置编码器来实现对句子的全局理解和表示,从而提高自然语言处理任务的性能。 #### 引用[.reference_title] - *1* *2* [Transformer是什么?看完这篇你就醍醐灌顶](https://blog.youkuaiyun.com/fs1341825137/article/details/120247499)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Transformer](https://blog.youkuaiyun.com/weixin_42587745/article/details/119377924)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值