PyTorch深度学习中的注意力机制与Transformer架构详解

PyTorch深度学习中的注意力机制与Transformer架构详解

NYU-DLSP20 NYU Deep Learning Spring 2020 NYU-DLSP20 项目地址: https://gitcode.com/gh_mirrors/pyt/pytorch-Deep-Learning

注意力机制基础概念

在深度学习领域,注意力机制已成为处理序列数据的革命性技术。与传统RNN和CNN不同,注意力机制能够直接建模输入元素之间的全局依赖关系,而无需考虑它们在序列中的距离。

注意力机制的类型

注意力机制主要分为两大类:

  1. 自注意力(Self-Attention):处理单个序列内部元素间的关系
  2. 交叉注意力(Cross-Attention):处理两个不同序列间元素的关系

每种类型又可以进一步分为:

  • 硬注意力(Hard Attention):选择性地聚焦于单个输入位置
  • 软注意力(Soft Attention):对所有输入位置分配不同的关注权重

自注意力机制详解

数学表达

给定一组t个n维输入向量{x₁, x₂, ..., xₜ},我们可以将其表示为矩阵X ∈ ℝⁿˣᵗ。自注意力机制通过线性组合这些输入生成隐藏表示h:

h = α₁x₁ + α₂x₂ + ... + αₜxₜ = Xa

其中a ∈ ℝᵗ是注意力权重向量,决定了每个输入对输出的贡献程度。

硬注意力与软注意力的区别

  1. 硬注意力

    • 约束条件:‖a‖₀ = 1
    • 效果:a成为one-hot向量,只选择单一输入元素
    • 特点:非连续,不可微分,通常需要强化学习技术
  2. 软注意力

    • 约束条件:‖a‖₁ = 1
    • 效果:所有αᵢ构成概率分布
    • 特点:可微分,易于端到端训练

注意力权重计算

注意力权重a通过以下方式获得:

a = softmaxᵦ(Xᵀx)

其中:

  • β是逆温度参数,控制分布的尖锐程度
  • Xᵀx计算输入间的相似度(点积)
  • softmax确保权重和为1

键值存储(Key-Value Store)范式

注意力机制可以类比于数据库查询系统:

  1. 查询(Query):相当于搜索请求
  2. 键(Keys):相当于数据库索引
  3. 值(Values):相当于实际存储的内容

查询、键、值的生成

通过可学习的权重矩阵将输入x投影到三个不同空间:

q = W_qx
k = W_kx
v = W_vx

这种设计允许模型学习最适合任务的三种表示:

  • 查询表示需要匹配的内容
  • 键表示可用于匹配的特征
  • 值表示最终要聚合的信息

Transformer架构深度解析

Transformer完全基于注意力机制构建,摒弃了传统的循环结构,实现了高度并行化。

编码器-解码器结构

  1. 编码器

    • 处理输入序列
    • 输出上下文相关的表示
    • 由多个相同层堆叠而成
  2. 解码器

    • 基于编码器输出生成目标序列
    • 包含自注意力和交叉注意力
    • 同样由多个相同层堆叠

编码器模块组成

每个编码器层包含两个主要子模块:

  1. 多头自注意力机制

    • 计算输入序列内部的依赖关系
    • 允许模型同时关注不同位置
  2. 前馈神经网络

    • 独立处理每个位置
    • 通常包含两个线性变换和ReLU激活

每个子模块都配有:

  • 残差连接:缓解梯度消失
  • 层归一化:稳定训练过程

解码器模块特点

解码器在自注意力基础上增加了:

  1. 掩码自注意力:防止当前位置关注未来信息
  2. 交叉注意力:连接编码器和解码器
    • 查询来自解码器
    • 键和值来自编码器输出

关键技术细节

位置编码

由于Transformer不包含循环或卷积结构,需要显式注入位置信息:

  • 使用正弦和余弦函数生成位置编码
  • 与词嵌入相加作为模型输入

多头注意力

将查询、键和值分割到多个"头"中:

  • 每个头学习不同的注意力模式
  • 最后将各头的输出拼接并线性变换
  • 增强模型捕捉不同关系的能力

PyTorch实现核心代码

class MultiHeadAttention(nn.Module):
    def __init__(self, d_model, num_heads, p, d_input=None):
        super().__init__()
        self.num_heads = num_heads
        self.d_model = d_model
        self.d_k = d_model // num_heads
        # 初始化Q,K,V的线性变换
        self.W_q = nn.Linear(d_xq, d_model, bias=False)
        self.W_k = nn.Linear(d_xk, d_model, bias=False)
        self.W_v = nn.Linear(d_xv, d_model, bias=False)
        # 输出变换
        self.W_h = nn.Linear(d_model, d_model)
    
    def scaled_dot_product_attention(self, Q, K, V):
        # 缩放点积注意力计算
        Q = Q / np.sqrt(self.d_k)
        scores = torch.matmul(Q, K.transpose(2,3))
        A = nn.Softmax(dim=-1)(scores)
        H = torch.matmul(A, V)
        return H, A
    
    def split_heads(self, x, batch_size):
        # 分割多头
        return x.view(batch_size, -1, self.num_heads, self.d_k).transpose(1, 2)
    
    def group_heads(self, x, batch_size):
        # 合并多头
        return x.transpose(1, 2).contiguous().view(batch_size, -1, self.num_heads * self.d_k)

这段代码展示了多头注意力的关键实现:

  1. 初始化各线性变换层
  2. 实现缩放点积注意力计算
  3. 处理多头的分割与合并
  4. 包含完整的正向传播逻辑

总结

Transformer架构通过自注意力和交叉注意力机制,彻底改变了序列建模的方式。其核心优势在于:

  1. 并行处理整个序列,极大提升训练效率
  2. 直接建模长距离依赖,不受序列长度限制
  3. 灵活的多头设计,可捕捉多种关系模式
  4. 模块化结构,易于扩展和堆叠

理解这些原理对于掌握现代深度学习模型至关重要,也为实现更复杂的NLP和CV任务奠定了基础。

NYU-DLSP20 NYU Deep Learning Spring 2020 NYU-DLSP20 项目地址: https://gitcode.com/gh_mirrors/pyt/pytorch-Deep-Learning

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

昌雅子Ethen

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

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

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

打赏作者

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

抵扣说明:

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

余额充值