Transformer架构详解

1. 架构概述

Transformer是一种基于自注意力机制的神经网络架构,由Vaswani等人在2017年的论文《Attention Is All You Need》中首次提出。它彻底改变了自然语言处理领域,逐步取代了传统的RNN和CNN架构。

主要特点

  • 完全基于注意力机制:摒弃了传统的循环和卷积结构
  • 并行计算能力强:克服了RNN的顺序计算限制
  • 长距离依赖捕捉能力:通过自注意力机制有效捕捉任意距离的依赖关系
  • 模块化设计:编码器-解码器结构清晰,易于扩展

2. 核心组件详解

2.1 编码器(Encoder)

结构组成

  1. 输入嵌入层(Input Embedding)

    • 将输入的token转换为稠密向量表示
    • 通常维度为512(d_model)或更大
    • 包含可学习的参数矩阵
  2. 位置编码(Positional Encoding)

    • 解决Transformer缺少位置信息的问题
    • 使用正弦和余弦函数的固定模式:
      PE(pos,2i) = sin(pos/10000^(2i/d_model))
      PE(pos,2i+1) = cos(pos/10000^(2i/d_model))
    • 与输入嵌入相加而非拼接
  3. 编码器层堆叠(Encoder Layers)

    • 通常6层或更多(原始论文使用6层)
    • 每层包含两个子层:
      • 多头自注意力机制(Multi-Head Self-Attention)
      • 前馈神经网络(Feed Forward Network)
    • 每个子层都有残差连接和层归一化

自注意力机制细节

  • 计算过程

    Attention(Q,K,V) = softmax(QK^T/√d_k)V
    • Q(Query), K(Key), V(Value)来自同一输入
    • √d_k缩放防止点积过大导致梯度消失
  • 多头注意力

    • 将Q,K,V投影到h个不同子空间(h通常为8)
    • 并行计算h个注意力头
    • 拼接所有头的结果并通过线性变换

2.2 解码器(Decoder)

结构组成

  1. 输出嵌入层(Output Embedding)

    • 与编码器嵌入层类似但独立
    • 通常共享编码器嵌入层的权重(可选)
  2. 位置编码

    • 与编码器使用相同的实现方式
  3. 解码器层堆叠(Decoder Layers)

    • 通常6层(与编码器层数相同)
    • 每层包含三个子层:
      • 掩码多头自注意力(Masked Multi-Head Self-Attention)
      • 编码器-解码器注意力(Encoder-Decoder Attention)
      • 前馈神经网络
    • 每个子层都有残差连接和层归一化

关键机制

  • 掩码自注意力

    • 防止解码器"偷看"未来信息
    • 通过添加负无穷掩码(-∞)实现
    • 确保位置i只能关注位置≤i的token
  • 编码器-解码器注意力

    • Q来自解码器前一层的输出
    • K,V来自编码器的最终输出
    • 允许解码器关注输入序列的相关部分

2.3 词表与分词器(Tokenizer)

主流分词方法

  1. Byte Pair Encoding (BPE)

    • 通过合并频繁出现的字节对逐步构建词表
    • 平衡词表大小与token序列长度
    • 被GPT系列模型采用
  2. WordPiece

    • 类似BPE但基于概率合并
    • 被BERT等模型采用
  3. SentencePiece

    • 直接从原始文本训练
    • 支持Unicode字符级处理
    • 不依赖预处理分词

词表设计考量

  • 大小通常在30k-100k之间
  • 包含特殊token([CLS],[SEP],[MASK]等)
  • 处理未知token的方式(如[UNK]或字节级回退)

2.4 位置编码的演进

  1. 原始正弦编码

    • 固定模式,无需学习
    • 理论上可外推到任意长度
  2. 可学习位置编码

    • 将位置视为可学习的嵌入
    • 被BERT等模型采用
    • 但受限于训练时见过的最大长度
  3. 相对位置编码

    • 关注token之间的相对距离而非绝对位置
    • 多种变体(T5, Transformer-XL等)
    • 更好的长度外推能力
  4. 旋转位置编码(RoPE)

    • 通过旋转矩阵注入位置信息
    • 被LLaMA等最新模型采用
    • 保持相对位置关系的线性特性

3. 训练机制

3.1 优化目标

  1. 语言建模目标

    • 自回归模型(GPT风格):最大化下一个token的似然
    • 自编码模型(BERT风格):预测被掩码的token
  2. 损失函数

    • 交叉熵损失(Cross-Entropy Loss)
    • 可选项:标签平滑(Label Smoothing)

3.2 优化策略

  1. Adam优化器变种

    • 原始Transformer使用Adam(β1=0.9, β2=0.98, ε=1e-9)
    • 现代变种:AdamW(解耦权重衰减)
  2. 学习率调度

    • 预热学习率(Warmup):
      lrate = d_model^-0.5 * min(step_num^-0.5, step_num*warmup_steps^-1.5)
    • 余弦衰减
    • 线性衰减
  3. 正则化技术

    • Dropout(原始论文使用0.1)
    • 权重衰减(通常0.01)
    • 梯度裁剪(通常1.0)

4. 架构演进与变体

4.1 经典变体

  1. BERT (2018)

    • 仅使用编码器
    • 双向自注意力
    • 掩码语言建模目标
  2. GPT (2018)

    • 仅使用解码器(带掩码)
    • 自回归语言建模
  3. T5 (2019)

    • 编码器-解码器完整结构
    • 将所有任务统一为文本到文本格式

4.2 效率优化方向

  1. 稀疏注意力

    • Longformer(2020):局部+全局注意力
    • BigBird(2020):随机+局部+全局注意力
  2. 混合架构

    • FNet(2021):用傅里叶变换替代注意力
    • Hyena(2023):结合CNN与注意力
  3. 状态空间模型

    • Mamba(2023):选择性状态空间

4.3 现代大语言模型架构

  1. GPT-3/4

    • 纯解码器架构
    • 旋转位置编码
    • 极深(96层以上)和极宽(12288维度)
  2. LLaMA

    • RMSNorm替代LayerNorm
    • SwiGLU激活函数
    • 旋转位置编码
  3. PaLM

    • 并行注意力与前馈计算
    • 共享QKV投影

5. 实践建议

5.1 超参数选择

  1. 维度关系

    • d_model(模型维度):通常512-12288
    • d_ff(前馈层维度):通常4*d_model
    • h(注意力头数):通常d_model/64
  2. 深度选择

    • 基础模型:6-12层
    • 大型模型:24-96层
    • 极深模型:100+层

5.2 训练技巧

  1. 初始化策略

    • 注意力层:Xavier/Glorot初始化
    • 残差连接:初始化为1/√N(N为层数)
  2. 精度选择

    • FP32:传统选择
    • FP16/BF16:现代标准
    • 混合精度训练:常用实践
  3. 批处理策略

    • 动态批处理
    • 梯度累积

6. 关键数学原理

6.1 注意力机制数学

  1. 缩放点积注意力

    Attention(Q,K,V) = softmax(QK^T/√d_k)V
    • Q ∈ ℝ^{n×d_k}, K ∈ ℝ^{m×d_k}, V ∈ ℝ^
    • 计算复杂度:O(nmd_k + nmd_v)
  2. 多头注意力

    MultiHead(Q,K,V) = Concat(head_1,...,head_h)W^O

    其中:

    head_i = Attention(QW_i^Q, KW_i^K, VW_i^V)

6.2 前馈网络

FFN(x) = max(0, xW_1 + b_1)W_2 + b_2
  • 通常d_ff = 4*d_model
  • 现代变体使用GELU或SwiGLU

6.3 层归一化

LayerNorm(x) = γ ⊙ (x - μ)/σ + β
  • μ,σ为均值和标准差
  • γ,β为可学习参数

7. 典型应用场景

  1. 文本生成

    • 自回归采样策略(贪心、beam search、top-k/p采样)
    • 温度控制
  2. 机器翻译

    • 编码器处理源语言
    • 解码器生成目标语言
  3. 文本分类

    • 使用[CLS]token或平均池化
    • 接分类头
  4. 问答系统

    • 编码问题与上下文
    • 预测答案起始/结束位置

项目实例

项目实例:https://github.com/toke648/SimpleLLM

一个基于Transformer架构实现的简易LLM大语言模型,完全自定义Transformer,通过大量的问答数据训练实现,支持自定义训练流程以及超参数等

从最基础的训练词表开始到构建Transformer、训练模型、推理,完全从代码上完整的大模型训练全流程

详细介绍了训练流程以及操作方法,并且持续更新

感兴趣的点个star,Ciallo~(∠・ω< )⌒★

欢迎贡献代码

相关文章

Attention Is All You Need:https://proceedings.neurips.cc/paper/2017/file/3f5ee243547dee91fbd053c1c4a845aa-Paper.pdf

Attention Is All You Need 解读:https://blog.csdn.net/chengyq116/article/details/106065576/

Attention as Energy Minimization Visualizing Energy Landscapes(大佬博客):https://mcbal.github.io/post/attention-as-energy-minimization-visualizing-energy-landscapes/

.......

(正在施工)

Transformer架构介绍+从零搭建预训练模型项目的更多相关文章

  1. 从零搭建一个SpringCloud项目之Feign搭建

    从零搭建一个SpringCloud项目之Feign搭建 工程简述 目的:实现trade服务通过feign调用user服务的功能.因为trade服务会用到user里的一些类和接口,所以抽出了其他服务需要 ...

  2. 从零搭建一个IdentityServer——项目搭建

    本篇文章是基于ASP.NET CORE 5.0以及IdentityServer4的IdentityServer搭建,为什么要从零搭建呢?IdentityServer4本身就有很多模板可以直接生成一个可 ...

  3. 从零搭建react hooks项目(github有源代码)

    前言 首先这是一个react17的项目,包含项目中常用的路由.状态管理.less及全局变量配置.UI等等一系列的功能,开箱即用,是为了以后启动项目方便,特地做的基础框架,在这里分享出来. 这里写一下背 ...

  4. 从零搭建vue3.0项目架构(附带代码、步骤详解)

    前言: GitHub上我开源了vue-cli.vue-cli3两个库,文章末尾会附上GitHub仓库地址.这次把2.0的重新写了一遍,优化了一下.然后按照2.0的功能和代码,按照vue3.0的语法,完 ...

  5. Ionic01 简单介绍、环境搭建、创建项目、项目结构、创建组件、创建页面、子页面跳转

    1 Ionic 基本介绍 Ionic 是一款基于 Angular.Cordova 的强大的 HTML5 移动应用开发框架 , 可以快速创建一个跨平台的移动应用.可以快速开发移动 App.移动端 WEB ...

  6. 使用Vue脚手架(vue-cli)从零搭建一个vue项目(包含vue项目结构展示)

    注:在搭建项目之前,请先安装一些全局的工具(如:node,vue-cli等) node安装:去node官网(https://nodejs.org/en/)下载并安装node即可,安装node以后就可以 ...

  7. 从零搭建一个SpringCloud项目之Config(五)

    配置中心 一.配置中心服务端 新建项目study-config-server 引入依赖 <dependency> <groupId>org.springframework.cl ...

  8. 从零搭建一个SpringCloud项目之Zuul(四)

    整合Zuul 为什么要使用Zuul? 易于监控 易于认证 减少客户端与各个微服务之间的交互次数 引入依赖 <dependency> <groupId>org.springfra ...

  9. 从零搭建一个IdentityServer——目录(更新中...)

    从零搭建一个IdentityServer--项目搭建 从零搭建一个IdentityServer--集成Asp.net core Identity 从零搭建一个IdentityServer--初识Ope ...

  10. 从零搭建Pytorch模型教程(三)搭建Transformer网络

    ​ 前言 本文介绍了Transformer的基本流程,分块的两种实现方式,Position Emebdding的几种实现方式,Encoder的实现方式,最后分类的两种方式,以及最重要的数据格式的介绍. ...

随机推荐

  1. tf.keras.layers.Attention: Dot-product attention layer, a.k.a. Luong-style attention.

    tf.keras.layers.Attention( View source on GitHub ) Dot-product attention layer, a.k.a. Luong-style a ...

  2. POLIR-Society-Organization-Politics-Self- Identity:Qualities + Habits:To-Be List + Behaviors:To-Do List + Prioritize: ProblemsResolving

    POLIR-Society-Organization-Political Habits:To-Be List Behaviors:To-Do List when it comes to habits, ...

  3. SciTech-BigDataAIML-LLM-Transformer Series- transformer-explainer

    transformer-explainer: https://github.com/poloclub/transformer-explainer

  4. SciTech-BigDataAIML-Adam动量自适应的梯度快速收敛

    http://faculty.bicmr.pku.edu.cn/~wenzw/optbook/pages/stograd/Adam.html 版权声明 此页面为<最优化:建模.算法与理论> ...

  5. 06Java基础之方法

    什么是方法 Java方法是语句的集合,他们在一起执行一个功能. 方法是解决一类问题的步骤的有序组合 方法包含于类或者对象中 方法在程序中被创建,在其他地方被吸引 设计方法的原则:方法的本意是功能块,就 ...

  6. Web前端入门第 82 问:JavaScript cookie 有大小限制吗?溢出会怎样?

    面试时候经常会被问及 Cookie 大小限制,但一直没尝试写一些 demo 测试下溢出极限值会怎样~~ 本文就来看看各种极限情况! 英文 测试代码: (() => { const maxSize ...

  7. Windows下MySQL5.7免安装版配置

    一.软件下载 mysql5.7 64位下载地址:https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.19-winx64.zip 二.操作步骤 ...

  8. Adobe2024全家桶大更新, 包含Win/Mac M1 M2 ,安装教程分享

    按照以往的惯例每年的10月份下旬将会迎来Adobe一年一度的软件大更新,大家期待已久的 Adobe 2024 全家桶终于来了,这次可以说是不痛不痒的大更新,喜欢尝鲜的小伙伴赶紧安排上! Adobe 2 ...

  9. CH3 初识 TensorFlow

    了解引入的需要神经网络解决的问题 学习用神经网络的基本结构.表达方式和编程实现 学习训练神经网络的基本方法 三好学生成绩问题 总分 = 德育分 * 60% + 智育分 * 60% + 体育分 * 60 ...

  10. 如何正确使用SetThreadExecutionState来阻止Windows进入睡眠

    最近产品有个需求,需要在升级的时候阻止Windows系统进入自动睡眠.需求到手后,小搜了一下,搜到SetThreadExecutionState这个函数,相关的博客挺多,官方文档也挺清晰,想必应该是手 ...