跳到主要内容

reading-notes — cong-ling-gou-jian-da-mo-xing(边读边记)

体检抽查结论:2.3 / 7.2 / 9.3 三章人眼读过,行文连贯、代码解析与结果解析成对、无整段丢失。特征:所有代码清单本身是 epub 里的图片,没进文本;但「以下代码将展示…→代码解析→代码运行结果→结果解析」的讲解散文完整,可以写。出处引用时注意:代码本体引不了,只能引解析段。

导航/前置材料

  • 01-fm 内容简介:出版方宣传口径,12 章总览。
  • 02-fm 前言:全书结构(1 Transformer 基础;2-4 GPT/BERT/ViT;5-10 优化与微调;11-12 实战),著者落款 2025 年 1 月。
  • 03-fm 引言(5.1k 字符,是正文,要读):①大模型发展史(规则→统计 HMM/CRF→RNN/LSTM/GRU→2017 Transformer(Attention Is All You Need,Google)→预训练 BERT/GPT/T5→超大规模 GPT-4/PaLM 多模态);②开发环境配置(GPU≥16GB 显存、CUDA、PyTorch cu118、transformers/datasets 等)。注意书里硬伤:「GPT-4通过1750亿参数」(text/03-fm.txt:91)——1750 亿是 GPT-3 的数,GPT-4 参数量未公开,拆解里要点破。
    • 引用点:引言:16(大模型定义)、:52(2017 Transformer)、:55(:55-61 三条突破:并行、长依赖、模块化)、:64(缩放点积注意力 QKV)、:73(BERT MLM+NSP)、:76(GPT 单向自回归)、:78(T5 文本到文本)、:91(GPT-4 1750亿——拿来说错的)、:112(显存至少 16GB)。

第1章 Transformer模型基础(04-11)

  • 1.1 Seq2Seq(05):编码器把输入序列编码成固定长度上下文向量,解码器逐步生成输出。编码器/解码器传统用 RNN/LSTM/GRU(:36-37)。图1-1/1-2:输入"ABC"→输出"WXYZ"。实现用 LSTM 端到端,Train Loss 2.3021→2.2781 五个 epoch(:78-91)。教师强制 Teacher Forcing(:112):训练时解码器用真实目标序列而非自己的预测当下一步输入。
  • 1.2 分词与嵌入层(06):分词器把句子拆成词/子词标记→词汇表索引→嵌入层转稠密向量。书里怪说法:「常见的分词器有Casual Tokenizer(因果分词器)、Casual 3D CNN分词器等」(:37)、「常见的嵌入层多为旋转嵌入层」(:52)——术语可疑,拆解中照实引用并标注这是书的原文说法,与通行术语不符。 代码:Tokenizer 清洗分词建词表 text_to_sequence;TextEmbedding 8 维向量;the quick brown fox 例。
  • 1.3 自注意力与多头(07):QKV 生成、点积、除缩放因子、softmax 权重、加权 V。多头=分成多个头子空间各自注意力再拼接线性变换。输出形状 [batch, seq, embed] 与输入一致。
  • 1.4 残差连接与层归一化(08):残差=输入直接加输出,捷径缓解梯度消失;ResidualBlock 两卷积+批归一化,维度不匹配用下采样。层归一化:对特征维标准化+可学习缩放偏置,比批归一化适合序列任务/小批量。
  • 1.5 位置编码(09):自注意力对顺序无先验→正弦余弦生成固定位置编码矩阵,与词嵌入相加;register_buffer 不参与训练;随机打乱词序的对比实验验证位置编码作用。图1-9 HelloWorld 自注意力求解。
  • 1.6 小结 / 1.7 思考题(12 问,拿 QKV/缩放因子/多头/残差/LN/PE 概念反复问)。

第2章 GPT模型文本生成(12-17)

  • 2.1(13):层堆叠=多层(自注意力+前馈+残差+LN);前馈=两个全连接+ReLU。GPT-2 用单向(自回归)注意力:单向掩码让每个位置只能看自己和之前的词,防止泄露未来(:118,:136)。输出形状 [2,10,128]。
  • 2.2(14):自回归生成循环:prompt→编码→算每个词概率→选概率最高词→接回上下文→重复,直到长度上限或终止符。Greedy vs Beam(:96-176):Greedy 每步取最高概率,快但局部最优易复读;Beam 保留束宽个候选路径最后选整体最优,质量更高但更贵。水果篮比喻(挑当下最甜 vs 多方案对比)。生成序列例:[1,345,876,238,1095,358,302] vs Beam [1,345,876,1102,923,145,798]。
  • 2.3(15,已抽查):BLEU(n-gram 重合度,精确性)、ROUGE(召回/覆盖度,摘要任务,rouge1/2/L 各给 P/R/F1)、困惑度(交叉熵损失取指数,越低越连贯;拟合度≠可读性,要与其他指标合用)。例:完全一致 BLEU=1.0;近似文本 BLEU 0.85。微调+StepLR(每 10 epoch 衰减 0.1 倍)让困惑度 98.23→25.68。四个注意点:困惑度局限、学习率适中(过高梯度爆炸/过低不收敛)、防过拟合(低学习率/权重衰减/数据增强)、数据质量影响困惑度。
  • 2.4/2.5 小结+12 思考题。

第3章 BERT(18-23)

  • 3.1(19):BERT=Transformer 编码器堆叠,双向注意力(每个词同时看前后)。MLM 自监督预训练:随机遮掩→预测原词。百科全书/专家逐层解读比喻(:106-133)。create_masked_data:词替换成 [MASK] 或随机词;标签 -100 表示不计算损失的位置(:205-207,交叉熵 ignore_index)。输出 30522 词表维度。
  • 3.2(20):MLM 实现细节:按概率遮掩(保留部分原词/随机替换)。「常用的MLM为一种时变的掩码模型」(:25)——怪说法,图3-4。 应用例:新闻标题填空,BertForMaskedLM 预测 [MASK] 位置的词(argmax),输出 "products"。
  • 3.3(21):微调分类:BertForSequenceClassification+线性分类层;数据 4:1 分训练/验证;3 epoch 准确率 0.667→0.900(验证 0.750→0.850)。
  • 3.4/3.5 小结+12 思考题(AdamW 为何适合 BERT、model.train()/eval()、CrossEntropyLoss 输入格式等)。

第4章 ViT(24-29)

  • 4.1(25):图像切不重叠 Patch→展平→线性映射成嵌入;用卷积实现分块(核大小=步幅=patch_size);cls_token 全局分类标识;位置编码保留子块顺序。224×224 输入,10 类输出。
  • 4.2(26):基础结构=分块嵌入+CLS+位置编码;自注意力算块间关系;多头从多投影空间提特征。DETR 提了两嘴(目标识别)。书里说「ViT本质上也是基于编码器—解码器架构的」(:122)——不严谨:原始 ViT 只有编码器;Swin 模块图说是编解码结构。拆解要点破。
  • 4.3(27):训练评估 CIFAR-10,5 epoch Val Acc 0.4873→0.6543。
  • 4.4(28):注意力量化分析:每层注意力权重均值/方差统计,看各层关注模式。注意力本质回顾:切小块→每块 QKV→相似度→权重分布→放大关键块;多头=不同角度(颜色/边缘/纹理)。
  • 4.5 缺失:文件从 4.4 直接跳 4.6 思考题,原书 4.5(应为小结)未被提取或原书就没有。报告里注明。

第5章 高阶微调(30-35)

  • 5.1 Adapter(31):每层 Transformer 后插瓶颈结构小模块(down_project 压缩→up_project 扩展),残差连接保留原特征;只训 Adapter 参数,原模型冻结。插件式比喻;大楼装修比喻。3 epoch Acc 0.5→1.0。
  • 5.2 LoRA(32):低秩分解:把大权重矩阵的更新拆成两个小矩阵(down_proj 降维→up_proj 升维),只微调小矩阵。拼图比喻(调整几块而非重拼整幅)。原矩阵不动→可保留原模型表现。注意书里 LoRA 实现是「加在特征上」,与主流「加在注意力权重上」实现不同(书 5.5 思考题(2)才说嵌入注意力层)。
  • 5.3(33):Prompt Tuning=模型权重全冻结,只优化输入前的可训练提示嵌入(nn.Parameter);P-Tuning=嵌入参数化的提示序列,不直接改文本输入。两者可组合(双重提示);长文本(~500 字)情感分类验证。表5-1 微调方法汇总。
  • 三种方法输出几乎一样(0.6932→0.4715)——书里四组实验输出雷同,拆解要点一句「演示性输出」。
  • 5.4/5.5 小结+12 思考题(秩的选择、expand 维度、torch.cat 拼接、只更新指定参数等)。

第6章 数据处理与增强(36-41)

  • 6.1(37):预处理:去空格/转小写/去 HTML 标签/去数字/去特殊字符/多余空格合并;中文版:正则 [^\u4e00-\u9fa5a-zA-Z0-9\s] 保留汉字,全角空格转半角。清洗:HTML、特殊字符、中文标点(zhon.hanzi.punctuation)、停用词(无实义的常用词表)、重复词去重。
  • 6.2(38):数据增强四种:同义词替换(WordNet synsets 查同义词随机换)、随机插入(随机位置插入某词的同义词)、随机删除(按概率 p 删词,至少留一个)、随机交换(随机两位置互换)。增强输出示例里中文例句被 WordNet 英文同义词处理得有点乱(「数据增加增强技术」「能力泛化」)——书自己的例子就暴露了机械增强的噪声问题,可点一句。
  • 6.3(39):BPE 分词:从字符级词表开始,统计最高频相邻字对→合并→迭代,解决稀有词(OOV)。分词结果示例(中文字对合并)。嵌入生成:Word2Vec(vector_size=100, window=5)/GloVe/BERT 上下文嵌入;PCA 降到 2 维可视化。综合案例:莎士比亚 1000 字片段跑全流程(书中不给运行结果,让读者自跑——:188-189)。
  • 6.4/6.5 小结+12 思考题。

第7章 性能优化(42-47)

  • 7.1(43):混合精度=FP16 半精度+FP32 全精度结合;FP16 省显存加速,关键步骤(梯度累积/参数更新)保 FP32 稳定;torch.cuda.amp:autocast() 管精度、GradScaler 梯度缩放防数值下溢(FP16 数值范围小,小梯度会变成 0),scaler.update() 动态调。CIFAR-10+ResNet-18。
  • 7.2(44,已抽查):数据并行 DP=每个 GPU 放完整模型,切数据批次,梯度汇总回主 GPU更新(nn.DataParallel;适合数据多、模型装得下单卡);模型并行 MP=模型分层切到多个 GPU,数据顺序流过(手动 .to('cuda:0'/'cuda:1');适合单卡装不下的大模型,代价是 GPU 间传数据)。餐厅比喻:分菜 vs 分工合作。DDP(init_process_group/world_size/DistributedSampler/自动梯度同步)比 DP 更高效(思考题里点出 DP vs DDP 差异)。
  • 7.3(45):梯度累积=小批次算完梯度不更新,攒够 N 步(例 4 步)再统一更新一次;损失要除以累积步数保持数值平衡;(i+1)%accumulation_steps==0 触发更新。「攒够再出手」购物比喻。IMDB+LSTM 情感分类案例。
  • 7.4/7.5 小结+12 思考题。

第8章 对比学习与对抗训练(48-54)

  • 8.1(49):对比学习=无标签,构建正负样本对(同一输入的两个增强视角=正;不同输入=负),让正样本对在嵌入空间拉近、负样本对拉远。对比损失:正样本对距离平方 + relu(负样本对距离−margin)平方(F.pairwise_distance 算欧氏距离;余弦相似度范围 −1..1)。例:正对平均距离 0.8741 vs 负对 1.5612。
  • SimCLR 四部件:数据增强(同图两次随机增强→两个视图)、编码器、投影头、NT-Xent 损失(temperature=0.5)。书里这一节给的是可运行代码(部分是文本形式)。
  • 8.2(50):自监督预训练→下游微调:冻结(或部分解冻)预训练编码器,接分类头,只优化分类头参数(optim.Adam(classifier.fc.parameters()))。分类 5 epoch 64%→74%;聚类 t-SNE 可视化。
  • 8.3(51):GAN:生成器从随机噪声造假样本,判别器二分类真/假,交替训练(先固定 G 训 D,再固定 D 训 G);损失=BCE。示例:16×16「彩色斑点图」。
  • 8.4(52):对抗训练=在输入嵌入上加微小扰动(epsilon=1e-3)造对抗样本,正常+对抗样本一起算损失,提升鲁棒性;BERT 文本分类,扰动前后预测都保持 Positive。
  • 8.5/8.6 小结+12 思考题。

第9章 优化器与学习率调度(55-61)

  • 9.1(56):AdamW=Adam+解耦权重衰减;书比喻:「有记忆力的助手」「忘记系数」「陡坡慢行平路快行」。回归实验收敛到 weight≈1.98/bias≈3.07(目标 2/3)。LAMB=按每层参数模长调更新步长,适合超大 batch 的分布式训练;马拉松教练比喻。Adam 不看层参数模长→大批量下不稳。回归收敛 weight≈2.92/bias≈1.85(目标 3/2)。
  • 9.2(57):梯度累积再次出现(与 7.3 重复!书自己讲了两遍);搬运工比喻;accumulation_steps=4,批量 16→模拟 64。太大→更新慢,=1→不稳。
  • 9.3(58,已抽查):线性衰减(0.1→0.01,20 epoch,每 epoch 约 −0.0045;书里「等比下降」是用词错误,线性是等差)+ 余弦退火(CosineAnnealingLR T_max=50,降-升周期,帮助跳出局部最优)。
  • 9.4(59):Warmup=训练初期从小学习率逐步升到目标值(前 100 batch 从 0.0001 升到 0.01 再保持;参数随机时一上来大学习率会「跑偏」)。循环学习率 CLR:三角/Triangular2(每周期振幅减半)模式,CyclicLR base_lr=0.001 max_lr=0.01 step_size_up=5。五种调度器清单:StepLR(step_size/gamma)、ExponentialLR(每 epoch 乘 gamma)、ReduceLROnPlateau(mode/factor/patience 看验证指标不动才降)、CosineAnnealingLR(T_max)、CosineAnnealingWarmRestarts(T_0/T_mult 周期倍增)。表9-1。
  • 9.5/9.6 小结+12 思考题。

第10章 蒸馏与剪枝(62-67;10.1-10.3 在 63/64/65-fm)

  • 10.1(63):知识蒸馏=大教师软标签指导小学生;蒸馏损失=交叉熵(硬标签)+KL散度(教师软标签)加权;温度 T 除在 logits 上再 softmax,kl_div 乘 T²(64-fm:129-141 处 temperature=2.0)。BERT→DistilBERT 文本分类例。
  • 10.2(64):效率数字(书的演示值):BERT-base 110M 参数/训练 65.32s/推理 8.75s/准确率 0.8852 vs DistilBERT 66M/32.54s/4.26s/0.8735(IMDB);RoBERTa-large 355.36M/125.45s/15.23s/0.9165(SST-2) vs DistilRoBERTa 82.88M/48.31s/7.85s/0.9017。蒸馏版验证准确率最高 89.21% 的说法与表格 0.8735 并存(书内数字不一致,引用时小心)
  • 10.3(65):剪枝两种:权重(非结构化)剪枝=把不重要的单个权重置零(l1_unstructured,50%:参数 101770→50918,推理 0.0235→0.0198s;稀疏但形状不变,通用硬件难加速);结构化剪枝=整通道/卷积核移除(ln_structured n=2 dim=0,20% 通道),适合硬件加速。MNIST 部署案例:98.23%→权重剪枝 97.45%→结构化 96.83%,模型 0.87MB。BERT 注意力头剪枝+层剪枝:92.45%→91.60%,304.87MB
  • 10.4/10.5 小结+14 思考题(本章思考题比别章多 2 个)。

第11章 训练实战(68-75;11.1-11.5 在 69-73-fm)

  • 11.1(69):大规模文本:清洗(正则)→去重(set)→切分(按句/固定长)→标注(规则映射);BERTTokenizer=WordPiece 子词;GPT2Tokenizer=BPE,带特殊符号;attention_mask 标填充位置。
  • 11.2(70):DDP:每 GPU 一个模型副本;init_process_group("gloo")(GPU 推荐 NCCL);Rank=进程编号;multiprocessing 起进程;输出 Rank 0/Rank 1 各自 Loss。
  • 11.3(71):检查点=模型状态+优化器状态+损失,每 save_interval(10)个 epoch 存一次;TensorBoard SummaryWriter 记录每 epoch 损失。
  • 11.4(72):断点续训:保存 checkpoint(.pth)→中断→load_state_dict 恢复模型+优化器,从 epoch 10 续训(epoch 11 Loss 0.4103 < 0.4208 连上)。中断对收敛的影响:书只说「可继续」,未深究。
  • 11.5(73):综合案例 IMDB+BERT:预处理→DDP→TensorBoard+检查点→断点恢复→Test Accuracy 89.15%。
  • 11.6/11.7 小结+12 思考题。

第12章 微调实战(76-83;12.1-12.5 在 77-81-fm)

  • 12.1(77):微调数据:清洗→train_test_split 分层抽样 stratify(70/15/15:0.3 再 0.5)→同义词替换+随机插入增强(少样本)。
  • 12.2(78):层级冻结:param.requires_grad=False 冻全部→只解冻最后两层(encoder.layer.10/11)+分类头;AdamW 只优化可训练参数;省显存省时间。
  • 12.3(79):超参:学习率 2e-5 + 权重衰减 0.01 + AdamW + 线性调度器;学习率大→不收敛,小→过慢;权重衰减=小幅正则防过拟合。
  • 12.4(80):评估指标:准确率/精确率/召回率/F1;动态量化:torch.quantization.quantize_dynamic 把 Linear 层 32 位浮点→8 位整数(qint8),省内存加速推理;蒸馏再登场(KL 散度指导学生)。输出 Accuracy 1.00(演示数据)。
  • 12.5(81):综合案例:数据→冻结→超参→评估+量化+蒸馏全流程。
  • 12.6/12.7 小结+12 思考题。

全书读完的横向观察(写拆解用)

  1. 书的定位:第 1 章打地基(Transformer 组件),2-4 章三个模型(GPT 生成/BERT 理解/ViT 视觉),5 章参数高效微调,6 章数据,7 章算力优化,8 章鲁棒性,9 章优化器与调度,10 章压缩,11-12 章实战串起来。主线:把一个 Transformer 从零件、训练、调优、压缩到部署走一遍。
  2. 书的写法:每节「概念一段→代码(图片)→代码解析→运行结果→结果解析→比喻」;比喻极多(水果篮/餐厅/马拉松/搬运工/工具箱/百科全书)。我们的拆解可以借用其比喻但要有走查数字。
  3. 书的硬伤/可疑处(要点破):①GPT-4「1750亿参数」错(引言:91);②「Casual Tokenizer/Casual 3D CNN 分词器」「旋转嵌入层」(06:37/52)术语不通;③「线性衰减=等比下降」(58:36)数学错误;④「ViT 本质上也是编码器—解码器架构」(26:122)不严谨(原版 ViT 只有编码器);⑤LoRA 的代码实现把低秩模块加在特征上而非注意力权重上(32),与主流实现不同;⑥四组微调实验(5.1/5.2/5.3)输出完全相同,演示性质;⑦10.2 的 89.21% 与表格 0.8735 不一致;⑧无一本书引参考文献(84-fm 只是字体许可);⑨9.2 与 7.3 重复讲梯度累积。
  4. 书里没讲的(写进 notCovered):没有 RLHF/对齐;没有 Decoder 端到端真实预训练(GPT-2 只是小演示);没有 Scaling Law;没有 MoE/长上下文;没有推理框架/vLLM;没有 RAG;没有多模态以外的对齐话题;量化只一笔带过动态量化(没有 GPTQ/AWQ);LoRA 没讲 QLoRA。
  5. 引用素材最密集的段落:15(困惑度/评估)、19-20(MLM/-100 标签)、31-33(四种 PEFT)、43-45(AMP/DDP/DP/MP/梯度累积)、49(SimCLR/NT-Xent)、56(AdamW/LAMB)、59(五种调度器)、63-65(蒸馏温度 T²/剪枝数字)、69-73(实战流程)、77-81(微调实战)。