深入学习Transformer(二)

  • 一、BPE分词器
    • [1.1 学词表vs用词表](#1.1 学词表vs用词表)
    • [1.2 具体流程详解](#1.2 具体流程详解)
      • [1.2.1 训练流程伪代码](#1.2.1 训练流程伪代码)
      • [1.2.2 具体流程](#1.2.2 具体流程)
  • 二、三种注意力机制详解
    • [2.1 注意力机制计算整体流程](#2.1 注意力机制计算整体流程)
    • [2.2 三种Attention的Mask视图](#2.2 三种Attention的Mask视图)
    • [2.3 Mask的具体数值计算及原理分析](#2.3 Mask的具体数值计算及原理分析)
    • [2.4 Mask最终计算公式卡](#2.4 Mask最终计算公式卡)
  • 三、Decoder编码器解析
    • [3.1 Decoder是怎么生成下一个单词的](#3.1 Decoder是怎么生成下一个单词的)
    • [3.2 贪心算法](#3.2 贪心算法)
    • [3.3 Beam Search](#3.3 Beam Search)
    • [3.4 Label Smoothing--让模型不要太过自信](#3.4 Label Smoothing--让模型不要太过自信)
  • [四、拓展:Encoder and Decoder Based Models](#四、拓展:Encoder and Decoder Based Models)
    • [4.1 Build LLMs with Decoder Only](#4.1 Build LLMs with Decoder Only)
    • [4.2 BERT](#4.2 BERT)
  • [五、Advanced Topics](#五、Advanced Topics)
    • [5.1 Absolute Position Embedding一 存在的问题](#5.1 Absolute Position Embedding一 存在的问题)
    • [5.2 旋转位置编码](#5.2 旋转位置编码)
    • [5.3 Attention的问题](#5.3 Attention的问题)
    • [5.4 Attention的改进--Flash Attention](#5.4 Attention的改进--Flash Attention)

一、BPE分词器

先进行整体流程概览

  • 左侧:从原始文本出发,展示 BPE 先把词拆成字符/byte 级片段。
  • 中间:突出核心算法:统计相邻片段频率,反复合并最高频 pair,形成 subword。
  • 右侧:把 BPE 词表和 Embedding 矩阵连接起来,说明 token id 如何查表得到向量。
  • 底部:对比词级分词、字符级分词和 BPE 子词分词,强调 BPE 的优势是词表可控、无 OOV、序列长度适中。

1.1 学词表vs用词表

左侧阶段 1:用大规模语料离线训练 tokenizer,统计相邻 pair,反复合并最高频片段。

中间输出 :训练完成后得到 Vocabulary + Merge Rules,也就是词表和有序合并规则。

右侧阶段 2:用冻结词表对任意新文本 tokenize,得到 token IDs,再查 Embedding。

底部重点 :词表 V 一旦确定,就会影响 Embedding 矩阵 V × d,也影响输出端 Softmax 的词汇维度。

1.2 具体流程详解

1.2.1 训练流程伪代码

左侧:展示初始化阶段,语料先被拆成字符/byte 序列,初始词表由最小符号组成。

中间:用伪代码形式表达 BPE 核心循环:统计 pair 频率 → 选择最高频 pair → 加入词表 → 改写语料。

右侧 :用 fastest / newest / widest 示例说明 -est 如何通过频率合并自然形成。

底部 :串联完整链路:语料字符序列 → k 次贪心合并 → 冻结词表和 merge rules → tokenize 新文本 → Embedding → Transformer。

左侧伪代码 :突出 BYTE-PAIR ENCODING(C, k) → V 的函数形式,明确输入是语料 C 和合并次数 k

核心循环 :每轮选择最高频相邻对 (t_L, t_R),生成 t_NEW,扩充词表并改写语料。

右侧示例 :用 fastest / newest / widest 演示两轮合并后如何自然得到 est

底部实践点 :强调真实 BPE 不只保存 Vocab,还要保存有序 merge rules,后续 tokenize 新文本时按规则顺序贪心切分。

1.2.2 具体流程

顶部流水线 :展示 原始语料 → 按空格分词 → 加词尾符号 _ → 拆成字符 的第 0 步流程。

中部重点 :解释为什么要加 _:保留词边界、可逆还原、防止跨词合并、区分 est_est

右侧示例 :用三轮合并说明 est_ 如何形成,强调词尾信息会被合并进 token。

底部串联 :把第 0 步接回前面的 BPE 训练流程:预处理后再进入 k 次合并,最终得到 Vocab + merge rules

左上:展示原始语料,共 18 个词 token,并统计出 5 个词型及频数。

右上 :把语料折叠成 词型 + 频数 + 词尾符 _,说明 BPE 实际按频数加权统计。

左下 :给出初始词表 V,由语料中去重字符加词尾符 _ 构成,共 11 个基符号。

右下 :预演第 1 轮 pair 频率,突出 (e,r)(r,_) 并列最高,说明 er / er_ 这类后缀 token 会由频率自然合并出来。

左侧 :把原始语料整理成正式的 词型 + 频数 + 词尾符 _ 表,合计 18 个 token。

右侧 :给出初始词表 V = {_, d, e, i, l, n, o, r, s, t, w},共 11 个基符号。

中下部 :预演第 1 轮 pair 计数,突出 (e,r)(r,_) 并列最高频。

右下提示 :标出 wider_ 的下划线勘误,并说明下一步会进入 for i=1..k 合并循环。

上半部分 :展示合并前状态,词表中已有 erer_,说明前两轮合并已经完成。

中间部分 :把本轮决策形式化为 (t_L,t_R)=(n,e) → t_NEW=ne,并执行 V ← V ∪ {ne}

下半部分 :展示合并后语料同步改写,newer_ / new_ 变成 ne w er_ / ne w_,词表从 13 增至 14。

右侧预告 :下一轮最高频将是 (ne,w)=8,会继续合并出 new,体现 BPE 自下而上的逐层拼装过程。

左上 :用压缩表格展示第 4--8 轮合并:newlolownewer_low_ 依次进入词表。

右上 :用三条链说明 BPE 的层级拼装机制:er → er_ → newer_ne → newlo → low → low_

左下:展示 8 轮后的语料状态,高频词已经整词化,低频词仍保持细粒度拆分。

右下:强调有序 merge rules 就是最终分词器,推理时可按规则贪心套用到未见词。

二、三种注意力机制详解

左侧 Encoder :标出 A/B 两处 Encoder Self-Attention,说明 Q/K/V 都来自编码器,无 Mask,负责源句上下文化。

右侧 Decoder:展示 Masked Self-Attention、Encoder-Decoder Attention、FFN 三个子层,并标注自回归回灌。

中间虚线桥 :突出 Encoder 输出作为 K/V 送入 Decoder 的 Cross-Attention,这是两个栈之间的关键连接。

顶部输出头 :把 Linear + Softmax 和 BPE 词表 |V| 联系起来,说明输入 token 与输出词表共享同一套 Vocabulary。

2.1 注意力机制计算整体流程

左上 :说明输入矩阵 X 如何分别乘 W^Q / W^K / W^V 得到 Q / K / V

中间 :突出核心公式 Z = softmax((QKᵀ + Mask) / √d_k) V,并标出各矩阵维度。

右上 :用 I like this booklen × len 热力矩阵解释"谁看谁"。

底部 :强调 QKᵀ 是所有 token 两两比较,所以复杂度是 O(N²)

2.2 三种Attention的Mask视图

左侧 Encoder Self-Attentionn×n 全 ✓ 矩阵,表示每个 token 都能看全句。

中间 Decoder Masked Self-Attention:下三角 ✓、上三角 ✗,表示只能看自己和过去,不能看未来。

右侧 Cross-Attentionm×n 矩形全 ✓,表示 Decoder 的每个目标 token 都能查询 Encoder 的全部源 token。

底部总结表 :统一对比三种注意力的 Q 来源、K/V 来源、Mask 形状和作用。

2.3 Mask的具体数值计算及原理分析

重点:为什么要选择负无穷&Padding Mask

顶部公式 :把 Mask 写进注意力计算:Z = softmax(QKᵀ/√d_k + M) · V

左侧矩阵 :展示三种 M:Encoder 全 0、Decoder 下三角 0/上三角 -∞、Cross-Attn 矩形全 0。

中间推导 :用 softmax 展开式说明 -∞ 会让对应权重变成 0。

右侧工程补充 :加入 padding mask,说明 <PAD> 作为 Key 时也要被屏蔽,并可与结构 mask 叠加。

2.4 Mask最终计算公式卡

顶部统一公式 :用 Z = Softmax(QKᵀ/√d_k + M) · V 收束三种注意力。

三张公式卡:分别对应 Encoder Self-Attn、Decoder Masked Self-Attn、Encoder-Decoder Cross-Attn。

右侧判断法 :只看两个问题:Q/K/V 是否同源,以及 M 是全 0、下三角还是矩形。

底部闭环 :把 BPE token + PE → Q/K/V → Attention + M → Z → Linear + Softmax → 下一个 token 串成完整流程。

三、Decoder编码器解析

3.1 Decoder是怎么生成下一个单词的

3.2 贪心算法

中心流程 :Decoder 对当前输入序列输出多个词表概率分布,每个分布通过 argmax 选出下一个 token。

回灌机制 :被圈出的 y₂ 表示上一轮输出已经变成当前输入,y₄ 会继续追加到输入序列。

错位预测 :图中明确标出 输入 y₁,y₂,y₃ → 输出 y₂,y₃,y₄,即位置 t 预测 t+1

策略对比:右下角补充 Greedy、Beam Search、Sampling、Top-k/Top-p 的差异,突出 Greedy 快但容易局部最优。

核心设定beam size k=3,每条存活序列扩展 Top-3,全局排序后只保留 3 条。

中心搜索树 :展示从 I 出发,第一步保留 am / Like / hate,第二步扩展成 9 条候选。

打分方式 :用累积 log 概率排序,例如 am + a = -0.7 + -0.1 = -0.8

剪枝机制 :框住保留的前三条,划掉其余路径;说明 Beam Search 比 Greedy 更稳,但剪枝不可逆、成本随 增长。

3.4 Label Smoothing--让模型不要太过自信

核心设定beam size k=3,每条存活序列扩展 Top-3,全局排序后只保留 3 条。

中心搜索树 :展示从 I 出发,第一步保留 am / Like / hate,第二步扩展成 9 条候选。

打分方式 :用累积 log 概率排序,例如 am + a = -0.7 + -0.1 = -0.8

剪枝机制 :框住保留的前三条,划掉其余路径;说明 Beam Search 比 Greedy 更稳,但剪枝不可逆、成本随 增长。

四、拓展:Encoder and Decoder Based Models

4.1 Build LLMs with Decoder Only

左侧用 GPT-1 案例串起三点:语料、任务、结果。

中间把 Encoder 打叉,并标出 Cross-Attention 随之作废。

右侧保留 Decoder-only 主干:Masked Self-Attention → FFN → Linear + Softmax

底部总结核心:单一堆栈、自回归目标、最容易扩展到大模型。

4.2 BERT

底部展示 BERT 的输入:随机把约 15% tokens 替换成 [MASK]

中间 BERT Encoder 使用双向 Self-Attention,被遮住的位置可以看左右上下文。

顶部只取 [MASK] 位置的输出向量,经 FFNN + Softmax 预测原词。

右下角对比 GPT 和 BERT:GPT 擅长生成,BERT 擅长理解。

BERT更适合做完形填空,不适合做预测

五、Advanced Topics

5.1 Absolute Position Embedding一 存在的问题

左侧表格展示位置 m=0~8sincos 两个维度上的离散采样值。

右侧曲线展示同一组数的连续波形,黄色点对应表格中 m=8 的数值。

公式说明:偶数维用 sin,奇数维用 cos,维度越高波长越长。

底部总结作用:给不识顺序的 Attention 注入位置信息,同时数值稳定、可外推。

左侧表格把每个位置 m 写成二维向量 [sin(m), cos(m)]

右侧单位圆把这些二维数画成箭头,m=0 指向 12 点钟方向。

相邻位置之间相当于固定旋转 1 弧度,位置差可以理解成角度差。

这页补充了上一页波形视角:上一页看"数值如何振荡",本页看"位置之间的几何关系"。

5.2 旋转位置编码

左侧展示 RoPE 的高维矩阵形式:一个大的分块对角旋转矩阵

右侧展示 q 向量被两两分组:(q0,q1)(q2,q3)、...... 每组独立旋转。

中间公式说明:q_m = R_m qk_n = R_n k,最终内积只保留相对位置 n-m

底部强调工程实现:实际不用真的乘大矩阵,而是拆偶数/奇数维做向量化旋转。

5.3 Attention的问题

中央用三层金字塔展示 GPU SRAM / GPU HBM / CPU DRAM 的速度与容量差异。

红圈突出 19 TB/s1.5 TB/s,并标出 ×13 的带宽差距。

右上对比传统 Attention:保存 N×N 中间矩阵,反复在 HBM 和 SRAM 间读写。

右下展示 Flash Attention:通过 Tiling + Online Softmax 减少 HBM 访问,仍保持 Exact Attention

总结下来就是1:计算问题2:数据传输问题

5.4 Attention的改进--Flash Attention

相关推荐
人邮异步社区1 小时前
如何系统地学习 C++ 语言?
开发语言·c++·学习
知识分享小能手1 小时前
概理论与数理统计学习教程,从入门到精通,在数理统计中应用R软件(21)
开发语言·学习·r语言
浔溺2 小时前
al+大数据每日学习笔记28
笔记·学习
xian_wwq10 小时前
【学习笔记】-深度认知系列-第2讲-大模型到底是什么?——拆解“参数、训练、推理”
笔记·学习·深度认知
richard_first10 小时前
Transformer 与大语言模型:第9章 LayerNorm 归一化层
人工智能·深度学习·机器学习·transformer
lzhdim11 小时前
12、JavaScript常见的内存泄露问题 - JavaScript学习系列文章
开发语言·前端·javascript·学习·ecmascript
那年窗外下的雪.13 小时前
AIDC 学习日志|第 15 天|EVPN 多归属故障收敛与撤销机制
网络·学习·php
M78佐菲13 小时前
Linux学习笔记:进程
linux·笔记·学习·算法
我命由我1234515 小时前
人脸识别 - 勒克斯(光线照射到物体表面上的明亮程度)
android·java·学习·java-ee·人脸识别·学习方法·android runtime