人工智能之核心技术 深度学习 第五章 Transformer模型

人工智能之核心技术 深度学习

第五章 Transformer模型


文章目录

  • [人工智能之核心技术 深度学习](#人工智能之核心技术 深度学习)
  • [前言:Transformer 模型 ------ 现代深度学习核心架构](#前言:Transformer 模型 —— 现代深度学习核心架构)
    • [一、Transformer 核心机制](#一、Transformer 核心机制)
      • [1.1 为什么需要 Transformer?](#1.1 为什么需要 Transformer?)
      • [1.2 自注意力机制(Self-Attention)](#1.2 自注意力机制(Self-Attention))
        • 核心思想:
        • [数学实现(Scaled Dot-Product Attention):](#数学实现(Scaled Dot-Product Attention):)
      • [1.3 多头注意力(Multi-Head Attention)](#1.3 多头注意力(Multi-Head Attention))
      • [1.4 位置编码(Positional Encoding)](#1.4 位置编码(Positional Encoding))
      • [1.5 编码器-解码器结构](#1.5 编码器-解码器结构)
    • 二、预训练模型与范式
      • [2.1 预训练-微调范式(Pretrain-Finetune)](#2.1 预训练-微调范式(Pretrain-Finetune))
      • [2.2 BERT(Bidirectional Encoder Representations from Transformers)](#2.2 BERT(Bidirectional Encoder Representations from Transformers))
      • [2.3 GPT(Generative Pre-trained Transformer)](#2.3 GPT(Generative Pre-trained Transformer))
      • [2.4 优化模型](#2.4 优化模型)
    • [三、Transformer 应用](#三、Transformer 应用)
      • [3.1 自然语言处理(NLP)](#3.1 自然语言处理(NLP))
      • [3.2 计算机视觉:Vision Transformer (ViT)](#3.2 计算机视觉:Vision Transformer (ViT))
    • [四、配套代码实现(从零构建简化 Transformer)](#四、配套代码实现(从零构建简化 Transformer))
    • 五、总结与演进路线
  • 资料关注

前言:Transformer 模型 ------ 现代深度学习核心架构

自 2017 年 Google 提出 Transformer 以来,它彻底重塑了自然语言处理(NLP)乃至整个深度学习领域。凭借其强大的并行化能力长距离依赖建模能力,Transformer 不仅取代了 RNN/CNN 成为 NLP 主流架构,还成功跨界到计算机视觉、语音、生物信息学等领域。

本章将带你深入理解 Transformer 的核心机制、代表性预训练模型及其广泛应用。


一、Transformer 核心机制

1.1 为什么需要 Transformer?

RNN/LSTM 虽能建模序列,但存在致命缺陷:

  • 无法并行计算:必须按时间步顺序处理 → 训练慢
  • 长距离依赖衰减:即使有门控,超长序列仍难捕捉

CNN 虽可并行,但感受野有限,需堆叠多层才能覆盖全局。

Transformer 的突破
完全基于注意力机制 ,抛弃循环和卷积,实现全局依赖建模 + 完全并行化


1.2 自注意力机制(Self-Attention)

核心思想:

"每个词都应该关注句子中所有其他词,以确定自己的含义。"

例如:

" 送给了。"

  • "他" 需关注 "送" 和 "她" 才知是施事者
  • "她" 需关注 "送" 和 "他" 才知是受事者
数学实现(Scaled Dot-Product Attention):

对输入序列 X ∈ R n × d X \in \mathbb{R}^{n \times d} X∈Rn×d(n 个词,d 维向量):

  1. 线性变换生成 Q, K, V

    Q = X W Q , K = X W K , V = X W V Q = XW_Q,\quad K = XW_K,\quad V = XW_V Q=XWQ,K=XWK,V=XWV

    • Q Q Q(Query):当前词的"查询向量"
    • K K K(Key):其他词的"键向量"
    • V V V(Value):其他词的"值向量"
  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

    • Q K T QK^T QKT:衡量词与词的相关性
    • d k \sqrt{d_k} dk :缩放因子,防止 softmax 梯度消失
  3. 输出:加权和的上下文表示

Input Sequence
Linear W_Q
Linear W_K
Linear W_V
Q
K
V
Q·K^T / √d
Softmax
Weighted Sum
Output

💡 优势

  • 任意两词直接交互(路径长度=1)
  • 完全并行(矩阵运算)
  • 可解释性强(可视化注意力权重)

1.3 多头注意力(Multi-Head Attention)

单头注意力可能只关注一种关系(如语法主谓)。多头机制让模型同时学习多种子空间表示。

  • 将 Q , K , V Q, K, V Q,K,V 投影到 h h h 个子空间(如 h=8)
  • 每个头独立计算注意力
  • 拼接结果并线性变换:

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

效果:相当于集成多个注意力专家,提升模型表达能力。


1.4 位置编码(Positional Encoding)

RNN 天然有序,但 Transformer 并行处理 → 丢失时序信息

解决方案:显式添加位置编码到词向量中。

常用 正弦位置编码(无需学习):

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

  • p o s pos pos:词在序列中的位置
  • i i i:维度索引

🔁 特点:可泛化到比训练时更长的序列!


1.5 编码器-解码器结构

原始 Transformer 用于机器翻译,包含:

(1)编码器(Encoder)
  • 6 个相同层堆叠
  • 每层含:
    • 多头自注意力
    • 前馈神经网络(FFN)
    • 残差连接 + LayerNorm
(2)解码器(Decoder)
  • 6 个相同层堆叠
  • 每层含:
    • 掩码多头自注意力(防止看到未来词)
    • 编码器-解码器注意力(关注源句)
    • FFN + 残差 + LayerNorm

Decoder
Encoder
Input Embed + PE
Multi-Head Self-Attn
Add & Norm
FFN
Add & Norm
... ×6
Target Embed + PE
Masked Multi-Head Self-Attn
Add & Norm
Multi-Head Attn (with Encoder Output)
Add & Norm
FFN
Add & Norm
... ×6
Linear + Softmax

⚠️ 注意:BERT 只用编码器,GPT 只用解码器!


二、预训练模型与范式

2.1 预训练-微调范式(Pretrain-Finetune)

  1. 预训练(Pretraining)

    • 在大规模无标签语料上训练(如 Wikipedia + BookCorpus)
    • 学习通用语言表示
  2. 微调(Finetuning)

    • 在特定下游任务(如情感分析)的小数据集上继续训练
    • 通常只需加一个简单分类头

优势:小数据也能取得 SOTA 效果!


2.2 BERT(Bidirectional Encoder Representations from Transformers)

  • 架构:12/24 层 Transformer 编码器

  • 预训练任务

    1. Masked Language Model (MLM) :随机遮盖 15% 词,预测原词 → 双向上下文
    2. Next Sentence Prediction (NSP):判断两句话是否连续
  • 适用任务:理解类(问答、分类、NER)

python 复制代码
# Hugging Face 使用示例
from transformers import BertTokenizer, BertModel

tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertModel.from_pretrained('bert-base-uncased')

inputs = tokenizer("Hello, how are you?", return_tensors="pt")
outputs = model(**inputs)
last_hidden_states = outputs.last_hidden_state  # [1, seq_len, 768]

2.3 GPT(Generative Pre-trained Transformer)

  • 架构:多层 Transformer 解码器(无编码器-解码器注意力)
  • 预训练任务自回归语言建模
    P(w_t \| w_1, ..., w_{t-1})
  • 特点 :只能看到左侧上下文 → 天然适合文本生成

📈 GPT-3(175B 参数)、GPT-4 推动大模型时代


2.4 优化模型

模型 改进点 目标
RoBERTa 移除 NSP,更大 batch,动态 masking 提升 BERT 性能
DistilBERT 知识蒸馏,保留 97% 性能,速度×2 模型压缩
ALBERT 参数共享 + 因式分解 embedding 减少参数量
T5 统一所有 NLP 任务为"文本到文本" 通用框架

三、Transformer 应用

3.1 自然语言处理(NLP)

任务 模型选择 说明
文本分类 BERT / DistilBERT 加分类头微调
问答系统 BERT / RoBERTa 预测答案起止位置
机器翻译 Transformer (原始) / mBART 编码器-解码器架构
命名实体识别(NER) BERT + CRF 序列标注
文本生成 GPT-2/3/4, LLaMA 自回归生成

3.2 计算机视觉:Vision Transformer (ViT)

Dosovitskiy et al. (2020) 提出:图像也能用 Transformer!

核心思想:
  1. 将图像切分为固定大小 patch(如 16×16)
  2. 每个 patch 展平 + 线性嵌入 → 视为"词"
  3. 添加位置编码 → 输入标准 Transformer 编码器

224x224 Image
Split into 14x14 patches\n(16x16 each)
Flatten each patch → 768-dim
Add Positional Encoding
Transformer Encoder
Class Token Output
MLP Head → Prediction

效果:在大数据集(如 ImageNet-21k)上超越 CNN!


四、配套代码实现(从零构建简化 Transformer)

python 复制代码
import torch
import torch.nn as nn
import math

class PositionalEncoding(nn.Module):
    def __init__(self, d_model, max_len=5000):
        super().__init__()
        pe = torch.zeros(max_len, d_model)
        position = torch.arange(0, max_len, dtype=torch.float).unsqueeze(1)
        div_term = torch.exp(torch.arange(0, d_model, 2).float() * (-math.log(10000.0) / d_model))
        pe[:, 0::2] = torch.sin(position * div_term)
        pe[:, 1::2] = torch.cos(position * div_term)
        self.register_buffer('pe', pe)

    def forward(self, x):
        # x: [batch, seq_len, d_model]
        x = x + self.pe[:x.size(1), :]
        return x

class MultiHeadAttention(nn.Module):
    def __init__(self, d_model, num_heads):
        super().__init__()
        assert d_model % num_heads == 0
        self.d_k = d_model // num_heads
        self.num_heads = num_heads
        self.q_linear = nn.Linear(d_model, d_model)
        self.k_linear = nn.Linear(d_model, d_model)
        self.v_linear = nn.Linear(d_model, d_model)
        self.out = nn.Linear(d_model, d_model)

    def forward(self, q, k, v, mask=None):
        bs = q.size(0)
        # Linear projections
        q = self.q_linear(q).view(bs, -1, self.num_heads, self.d_k).transpose(1, 2)
        k = self.k_linear(k).view(bs, -1, self.num_heads, self.d_k).transpose(1, 2)
        v = self.v_linear(v).view(bs, -1, self.num_heads, self.d_k).transpose(1, 2)

        # Scaled dot-product attention
        scores = torch.matmul(q, k.transpose(-2, -1)) / math.sqrt(self.d_k)
        if mask is not None:
            scores = scores.masked_fill(mask == 0, -1e9)
        attn = torch.softmax(scores, dim=-1)
        out = torch.matmul(attn, v)
        out = out.transpose(1, 2).contiguous().view(bs, -1, self.num_heads * self.d_k)
        return self.out(out)

class TransformerEncoderLayer(nn.Module):
    def __init__(self, d_model, num_heads, d_ff=2048, dropout=0.1):
        super().__init__()
        self.self_attn = MultiHeadAttention(d_model, num_heads)
        self.norm1 = nn.LayerNorm(d_model)
        self.norm2 = nn.LayerNorm(d_model)
        self.ff = nn.Sequential(
            nn.Linear(d_model, d_ff),
            nn.ReLU(),
            nn.Dropout(dropout),
            nn.Linear(d_ff, d_model)
        )
        self.dropout = nn.Dropout(dropout)

    def forward(self, x, mask=None):
        # Self-attention + residual
        attn_out = self.self_attn(x, x, x, mask)
        x = self.norm1(x + self.dropout(attn_out))
        # Feed-forward + residual
        ff_out = self.ff(x)
        x = self.norm2(x + self.dropout(ff_out))
        return x

# 使用示例
encoder_layer = TransformerEncoderLayer(d_model=512, num_heads=8)
x = torch.randn(32, 20, 512)  # batch=32, seq_len=20, d_model=512
pos_enc = PositionalEncoding(512)
x = pos_enc(x)
output = encoder_layer(x)
print(output.shape)  # torch.Size([32, 20, 512])

五、总结与演进路线

并行差、长程弱
RNN/LSTM
Transformer 2017
BERT 2018

(理解)
GPT 2018

(生成)
RoBERTa/DistilBERT
GPT-2/3/4
ViT 2020

(视觉)
DETR

(目标检测)
SpeechFormer

(语音)

现代实践建议

  • NLP 理解任务 → BERT / RoBERTa
  • NLP 生成任务 → GPT / LLaMA
  • 视觉任务 → ViT / Swin Transformer
  • 快速部署 → DistilBERT / TinyBERT

资料关注

公众号:咚咚王

gitee:https://gitee.com/wy18585051844/ai_learning

《Python编程:从入门到实践》

《利用Python进行数据分析》

《算法导论中文第三版》

《概率论与数理统计(第四版) (盛骤) 》

《程序员的数学》

《线性代数应该这样学第3版》

《微积分和数学分析引论》

《(西瓜书)周志华-机器学习》

《TensorFlow机器学习实战指南》

《Sklearn与TensorFlow机器学习实用指南》

《模式识别(第四版)》

《深度学习 deep learning》伊恩·古德费洛著 花书

《Python深度学习第二版(中文版)【纯文本】 (登封大数据 (Francois Choliet)) (Z-Library)》

《深入浅出神经网络与深度学习+(迈克尔·尼尔森(Michael+Nielsen)》

《自然语言处理综论 第2版》

《Natural-Language-Processing-with-PyTorch》

《计算机视觉-算法与应用(中文版)》

《Learning OpenCV 4》

《AIGC:智能创作时代》杜雨+&+张孜铭

《AIGC原理与实践:零基础学大语言模型、扩散模型和多模态模型》

《从零构建大语言模型(中文版)》

《实战AI大模型》

《AI 3.0》

相关推荐
zuozewei2 小时前
7D-AI系列:AI大模型应用性能核心指标:TTFT 与 TPOT 详解
人工智能
WZGL12302 小时前
银发经济新浪潮:适老化设计如何催生“青春化”市场
人工智能
逄逄不是胖胖2 小时前
《动手学深度学习》-57长短期记忆网络LSTM
人工智能·深度学习·lstm
LASDAaaa12312 小时前
基于DETR的花卉种类识别与分类系统详解
人工智能·数据挖掘
数琨创享TQMS质量数智化2 小时前
国有大型交通运输设备制造集团QMS质量管理平台案例
大数据·人工智能·物联网
yhdata2 小时前
绿色能源新动力:硫酸亚铁助力锂电池产业,年复合增长率攀升至14.8%
大数据·人工智能
围炉聊科技2 小时前
从机械扫描到逻辑阅读:DeepSeek-OCR 2的技术革新
人工智能·ocr
范桂飓2 小时前
Transformer 大模型架构深度解析(5)GPT 与 LLM 大语言模型技术解析
人工智能·gpt·语言模型·transformer
charlie1145141912 小时前
机器学习概论:一门教计算机如何“不确定地正确”的学问
人工智能·笔记·机器学习·工程实践