PyTorch深度学习框架60天进阶学习计划 - 第23天:Transformer架构解析

发布于:2025-03-20 ⋅ 阅读:(20) ⋅ 点赞:(0)

让我继续完成机器翻译示例的代码:

PyTorch深度学习框架60天进阶学习计划:第23天 Transformer架构解析

学习目标

  • 推导自注意力机制数学公式
  • 详解位置编码的傅里叶基函数设计
  • 对比编码器-解码器结构的信息流动差异

1. Transformer架构概述

Transformer架构自2017年在论文《Attention Is All You Need》中提出以来,彻底改变了深度学习在自然语言处理领域的应用方式。不同于之前的循环神经网络(RNN)或卷积神经网络(CNN),Transformer完全基于注意力机制,抛弃了循环结构,实现了更高效的并行计算和更好的长距离依赖建模能力。

Transformer主要由以下几个关键组件构成:

  1. 多头自注意力机制(Multi-Head Self-Attention)
  2. 位置编码(Positional Encoding)
  3. 前馈神经网络(Feed-Forward Network)
  4. 残差连接(Residual Connection)和层归一化(Layer Normalization)
  5. 编码器-解码器结构(Encoder-Decoder Architecture)

今天我们将深入探讨这些组件的内部工作原理,特别是自注意力机制的数学推导、位置编码的设计原理以及编码器-解码器的信息流动差异。

2. 自注意力机制数学公式推导

2.1 自注意力机制的基本原理

自注意力机制的核心思想是计算序列中每个位置与所有位置之间的关联性,从而决定每个位置应该关注序列中的哪些其他位置。

在数学上,自注意力机制首先将输入序列X转换为三个不同的表示:查询(Query)矩阵Q、键(Key)矩阵K和值(Value)矩阵V。这三个矩阵通过对输入X进行线性变换得到:

Q = X W Q Q = XW^Q Q=XWQ
K = X W K K = XW^K K=XWK
V = X W V V = XW^V V=XWV

其中, W Q W^Q WQ W K W^K WK W V W^V WV是可学习的参数矩阵。

2.2 注意力分数计算

自注意力机制的计算公式如下:

Attention ( Q , K , V ) = softmax ( Q K T d k ) V \text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V Attention(Q,K,V)=softmax(dk QKT)V

我们来一步步分解这个公式:

  1. 首先计算Q和K的点积,得到注意力分数矩阵: Q K T QK^T QKT
  2. 为了防止梯度消失问题,将点积结果除以 d k \sqrt{d_k} dk d k d_k dk是键向量的维度)
  3. 对结果应用softmax函数,将分数转换为概率分布
  4. 用这些注意力权重对V进行加权求和

让我们详细推导这个过程:

假设输入序列长度为n,特征维度为d,则:

  • X的形状为[n, d]
  • W Q W^Q WQ, W K W^K WK, W V W^V WV的形状均为[d, d k d_k dk]
  • Q, K, V的形状均为[n, d k d_k dk]

注意力分数矩阵 Q K T QK^T QKT的形状为[n, n],表示序列中每个位置对其他所有位置的注意力权重。

应用softmax后,得到的注意力权重矩阵 A = softmax ( Q K T d k ) A = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right) A=softmax(dk QKT)的形状也是[n, n],且每一行的和为1。

最后,将注意力权重矩阵与值矩阵V相乘,得到自注意力的输出: Z = A V Z = AV Z=AV,形状为[n, d k d_k dk]。

2.3 多头注意力机制

为了增强模型的表达能力,Transformer使用了多头注意力机制,即并行地计算h个不同的自注意力,然后将结果拼接起来:

MultiHead ( Q , K , V ) = Concat ( head 1 , head 2 , . . . , head h ) W O \text{MultiHead}(Q, K, V) = \text{Concat}(\text{head}_1, \text{head}_2, ..., \text{head}_h)W^O MultiHead(Q,K,V)=Concat(head1,head2,...,headh)WO

其中, head i = Attention ( Q W i Q , K W i K , V W i V ) \text{head}_i = \text{Attention}(QW_i^Q, KW_i^K, VW_i^V) headi=Attention(QWiQ,KWiK,VWiV) W O W^O WO是输出投影矩阵。

多头注意力使模型能够同时关注不同子空间的信息,捕捉更丰富的特征。

3. 位置编码的傅里叶基函数设计

3.1 位置编码的必要性

由于自注意力机制本身不含有位置信息(即使交换输入序列中的元素顺序,注意力的计算结果不会改变),因此Transformer需要额外的位置编码来注入序列中的位置信息。

3.2 傅里叶基函数位置编码

Transformer使用的是基于正弦和余弦函数的位置编码,这实际上是傅里叶基函数的离散表示。对于位置pos和维度i,位置编码PE的计算公式如下:

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)

其中,d是模型的维度,i的范围是[0, d/2)。

这种位置编码的设计有几个重要特性:

  1. 唯一性:每个位置都有唯一的编码,因此模型可以区分不同位置的token
  2. 固定相对距离:对于任意固定的相对距离k, P E p o s + k PE_{pos+k} PEpos+k P E p o s PE_{pos} PEpos之间的关系是固定的,这使得模型可以学习相对位置关系
  3. 可扩展性:位置编码可以扩展到训练时未见过的序列长度
  4. 平滑性:位置编码在位置空间中是平滑变化的,便于模型泛化

3.3 位置编码的数学理解

从傅里叶分析的角度看,这种位置编码相当于用不同频率的正弦波对位置进行编码。低频波捕捉全局位置信息,高频波捕捉局部位置信息。

每个维度对应一个特定频率的正弦/余弦波,频率从高到低依次降低,构成了一组完备的傅里叶基。这种设计使得模型能够学习到位置之间的各种复杂关系,包括绝对位置和相对位置。

3.4 位置编码的可视化

我们通过代码实现了位置编码并进行可视化,通过热力图可以直观地看到位置编码的模式,以及不同位置之间的相对关系。特别地,在位置编码的热力图中,我们可以观察到明显的周期性模式,这反映了傅里叶基函数的性质。

4. 自注意力机制的PyTorch实现

为了更深入地理解自注意力机制,我们实现了完整的单头自注意力和多头自注意力层。这些实现清晰地展示了自注意力的计算过程,包括线性变换、注意力分数计算、掩码应用和输出计算等步骤。

在多头注意力实现中,我们展示了如何将输入分割为多个头,分别计算注意力,然后再合并结果。这种设计允许模型同时从不同的表示子空间学习信息,增强了模型的表达能力。

5. 编码器-解码器结构的信息流动差异

Transformer的整体架构由编码器和解码器两部分组成,它们在信息处理方式上有明显的差异。下面,我们详细分析这两种结构的信息流动方式。

5.1 编码器结构

编码器由N个相同的层堆叠而成,每层包含两个子层:

  1. 多头自注意力机制
  2. 前馈神经网络

每个子层都使用残差连接和层归一化:

LayerNorm ( x + Sublayer ( x ) ) \text{LayerNorm}(x + \text{Sublayer}(x)) LayerNorm(x+Sublayer(x))

在编码器中,自注意力层允许每个位置关注序列中的所有位置,因此是全局信息流动

5.2 解码器结构

解码器也由N个相同的层堆叠而成,但每层包含三个子层:

  1. 掩码多头自注意力机制
  2. 多头交叉注意力机制
  3. 前馈神经网络

同样,每个子层都使用残差连接和层归一化。

在解码器中,信息流动有两个关键差异:

  1. 掩码自注意力:解码器中的第一个自注意力层使用掩码来防止当前位置关注未来位置,这确保了自回归特性,即预测时只能利用已经生成的输出。

  2. 交叉注意力:解码器的第二个注意力层是交叉注意力,它允许解码器关注编码器的输出。查询(Q)来自解码器的上一层,而键(K)和值(V)来自编码器的输出。

5.3 信息流动对比

下表对比了编码器和解码器的信息流动差异:

特性 编码器 解码器
注意力类型 自注意力 掩码自注意力 + 交叉注意力
信息流向 全局双向 局部单向(自注意力) + 跨模块(交叉注意力)
输入可见性 可见完整输入 仅可见已生成的输出 + 编码器信息
并行性 完全并行 训练时并行,推理时顺序生成
应用场景 双向特征提取 自回归生成

6. Transformer架构的应用实例:机器翻译

为了展示Transformer架构的实际应用,我们实现了一个简化版的机器翻译系统。这个系统包括:

  1. 数据处理:将文本转换为模型可处理的形式
  2. Transformer模型:包含编码器和解码器
  3. 训练过程:使用交叉熵损失和Adam优化器
  4. 翻译生成:使用贪婪解码生成翻译
  5. 注意力可视化:展示翻译过程中的注意力流动

通过这个实例,我们可以更直观地理解Transformer在序列到序列任务中的工作原理,特别是编码器-解码器之间的信息交互过程。

7. 总结与思考

通过对Transformer架构的深入解析,我们可以得出以下关键点:

  1. 自注意力机制是Transformer的核心,它允许模型有效捕捉序列中的长距离依赖。
  2. 位置编码通过傅里叶基函数巧妙地将位置信息注入模型,解决了自注意力无法感知位置的问题。
  3. 编码器-解码器结构的不同信息流动方式使Transformer既能进行双向特征提取,又能实现自回归生成。

Transformer的成功之处在于它的设计既简洁又强大,不仅解决了RNN难以并行化和难以捕捉长距离依赖的问题,也避免了CNN局部感受野的限制。这种设计理念已经影响了近年来深度学习领域的众多模型,如BERT、GPT、T5等,并在自然语言处理、计算机视觉和多模态学习等领域取得了显著成功。

学习任务

  1. 尝试修改位置编码的公式,观察不同参数对模型性能的影响。
  2. 实现带有相对位置编码的Transformer变体。
  3. 探索注意力掩码的不同设计,如稀疏注意力。
  4. 尝试将Transformer应用到时间序列预测、图像分类等任务中。

参考资料

  1. Vaswani, A., et al. (2017). Attention Is All You Need.
  2. The Illustrated Transformer by Jay Alammar
  3. PyTorch官方文档:nn.TransformerEncoder和nn.TransformerDecoder
  4. The Annotated Transformer by Harvard NLP

通过本次学习,我们深入理解了Transformer架构的核心组件和工作原理,特别是自注意力机制的数学推导、位置编码的设计原理以及编码器-解码器的信息流动差异。这些知识将为我们后续学习和应用先进的自然语言处理和计算机视觉模型奠定基础。


清华大学全五版的《DeepSeek教程》完整的文档需要的朋友,关注我私信:deepseek 即可获得。

怎么样今天的内容还满意吗?再次感谢朋友们的观看,关注GZH:凡人的AI工具箱,回复666,送您价值199的AI大礼包。最后,祝您早日实现财务自由,还请给个赞,谢谢!