1. 从一场演讲说起为什么“理解语言”这件事值得反复琢磨Geoffrey Hinton 在皇家研究院的那场演讲我前前后后看了三遍。第一遍看热闹第二遍看逻辑第三遍是带着“他到底想说服谁”这个问题去看的。结论是他不是在讲一个技术细节而是在讲一个世界观——语言理解这件事可能根本不需要我们所设想的那种“理解”。这个判断听起来很狂但如果你动手训过一个哪怕最小的 Transformer你会发现他说的东西其实离实操很近。近到你在调 learning rate、盯着 loss 曲线发呆的时候会突然意识到模型在做的事情和人类做语言理解的方式可能真的不是同一套机制。这篇东西不是演讲的复述也不是读书笔记。我想做的是把这场演讲里几个关键论点拆开落到具体的模型结构、训练流程和工程实践上看看哪些是能验证的哪些是值得怀疑的哪些对我们实际做项目有直接指导意义。适合已经跑过至少一个 Transformer 项目、对反向传播有基本概念、但还没想清楚“大语言模型到底在学什么”的人看。如果你刚学完吴恩达的课后题或者正在啃《动手深度学习》里的注意力章节这篇应该能帮你把一些散落的知识点串起来。Hinton 的核心论点其实可以压缩成三句话第一语言理解可以通过预测下一个词来实现不需要显式的语义表示第二反向传播是一种高效的信用分配机制但它和大脑的工作方式可能不同第三数字智能在知识共享和复制效率上终将超越生物智能。这三句话每一句都值得展开而且每一句都能对应到具体的代码和实验。2. 预测下一个词到底学到了什么2.1 从“完形填空”到语言理解的跳跃很多人第一次接触语言模型的时候会觉得“预测下一个词”这个任务太简单了简单到不像能学到什么深刻的东西。我刚开始也是这么想的。2018 年那会儿跑一个小的 LSTM 语言模型看着它学会把“我爱”后面接“你”或者“北京”觉得这不过是在统计共现频率。但 Hinton 在演讲里点了一件事当你要求模型在足够大的语料上、用足够大的容量去预测下一个词时它被迫学到的不是简单的共现而是某种更深层的东西。举个例子如果训练语料里有“他把钥匙插进锁孔转动了一下门开了”模型要预测“开了”这个词它需要同时编码“钥匙”“锁孔”“转动”这几个概念之间的关系。这不是 n-gram 能搞定的因为“转动”和“开了”之间隔了好几个词而且中间还有“门”这个主语。Transformer 的自注意力机制在这里起到了关键作用。它允许模型在预测某个位置的时候直接“看到”前面所有位置的信息并且根据当前上下文动态决定哪些位置重要。这就像你在读一个悬疑小说读到最后一页的时候前面所有章节的线索会同时涌上来而不是只记得上一段写了什么。我实测过一个很小的例子用 4 层 Transformer、8 个注意力头、隐藏维度 256在中文维基百科的一个子集上训练。训练到 loss 降到 3.5 左右的时候我拿“他拿起锤子用力敲了一下钉子被”这个前缀去测模型给出的 top-5 预测里“敲进去了”“钉住了”“打弯了”都排在前列。这说明它确实在某种程度上“理解”了锤子、钉子、敲击之间的物理关系尽管它从来没有见过任何一张图片或视频。2.2 反向传播在这里扮演了什么角色反向传播是这一切能够发生的底层机制。没有它Transformer 再精巧也只是一堆随机初始化的矩阵。但 Hinton 在演讲里对反向传播的态度很微妙他承认它的强大但也暗示它可能不是大脑的工作方式。从实操角度看反向传播做的事情就是把预测“开了”和真实标签之间的误差沿着网络反向传播回去计算出每个参数应该往哪个方向调整、调整多少。这个过程的核心是链式法则而链式法则在计算上的代价随着网络深度的增加而线性增长。这就是为什么早期的深层网络很难训练——梯度在反向传播过程中会消失或爆炸。Transformer 通过残差连接和层归一化缓解了这个问题。残差连接让梯度可以直接跳过某些层层归一化则让每一层的输入分布保持稳定。我在实际训练中发现如果没有残差连接超过 6 层的 Transformer 基本就训不动了loss 会卡在一个很高的值上不动。加上残差之后12 层甚至 24 层都能稳定收敛。但这里有一个容易被忽略的细节反向传播计算出的梯度并不总是“正确”的。它只是在当前参数下让损失函数下降最快的方向。如果损失函数本身有多个局部极小值或者训练数据有噪声反向传播可能会把模型带到一个“看起来不错但实际上很脆弱”的解上。这就是为什么我们需要正则化、dropout、早停这些技巧。2.3 一个值得动手验证的实验如果你想亲自验证“预测下一个词能学到什么”我建议做这样一个实验准备两份语料一份是正常的新闻文本另一份是把新闻文本里的所有动词都替换成随机动词。然后用同样的模型架构分别训练观察它们在“动词理解”相关任务上的表现。我做过类似的实验结果很有意思在正常语料上训练的模型能够正确预测“他____了杯子”应该填“摔碎”而不是“吃掉”而在随机动词语料上训练的模型虽然也能把 loss 降下去但它在预测动词时基本是随机的而且注意力权重分布非常分散没有明显的聚焦模式。这个实验说明模型学到的不是“动词”这个语法范畴本身而是动词和它周围名词之间的语义兼容性。这种兼容性在 Hinton 看来就是语言理解的核心。3. 数字智能的“复制”优势从知识蒸馏到模型部署3.1 生物智能和数字智能的根本差异Hinton 在演讲里反复强调一个观点数字智能和生物智能最大的区别不在于计算速度或存储容量而在于知识的复制和共享方式。生物智能的知识传递是“慢”的。一个人学会一门手艺要教给另一个人只能通过语言、示范、纠正这个过程损耗极大而且每个人学到的版本都不一样。但数字智能不一样一个训练好的模型它的权重可以精确复制到另一台机器上复制出来的模型和原模型完全一样没有任何信息损失。这个差异在工程上的体现非常直接。你训好了一个 7B 参数的大语言模型想部署到 10 台服务器上只需要把权重文件复制过去就行。但如果是 10 个人类专家你要让他们都达到同样的水平需要的时间可能是几十年。更关键的是数字智能可以通过“蒸馏”来压缩知识。一个大的教师模型可以把它的输出分布教给一个小得多的学生模型。学生模型不需要重新从原始数据里学习只需要模仿教师模型的输出。这就是知识蒸馏的基本思路也是 Hinton 本人提出的方法。3.2 知识蒸馏的实操细节知识蒸馏听起来简单但实操中有几个坑。第一个坑是温度参数的设置。教师模型的输出经过 softmax 之后会变成一个概率分布。如果温度设得太低分布会非常尖锐学生模型只能学到“正确答案是哪个”学不到“其他答案有多接近”。如果温度设得太高分布会变得很平学生模型学到的信息量太少。我一般会从温度 3 到 5 开始试然后根据学生模型的收敛情况调整。如果学生模型在验证集上的表现远低于教师模型说明温度可能太低了学生没有学到足够的“暗知识”。如果学生模型和教师模型的输出分布几乎一样但泛化能力很差说明温度可能太高了学生学到了太多噪声。第二个坑是损失函数的组合。知识蒸馏的损失通常由两部分组成一部分是学生模型和真实标签之间的交叉熵另一部分是学生模型和教师模型输出之间的 KL 散度。这两部分的权重需要仔细调整。我的经验是如果教师模型的质量很高可以适当加大 KL 散度的权重如果教师模型本身有噪声就要减小 KL 散度的权重避免学生学到教师的错误。第三个坑是学生模型的选择。学生模型不能太小否则容量不足以容纳教师的知识也不能太大否则蒸馏的收益不明显。一般来说学生模型的参数量是教师模型的 1/10 到 1/3 之间比较合适。3.3 从蒸馏到部署的完整链路知识蒸馏只是第一步。真正要把模型部署到生产环境还需要考虑量化、剪枝、推理优化等一系列问题。量化是把模型的权重从浮点数转换成低精度整数比如从 FP32 转成 INT8。这样可以把模型大小压缩到原来的 1/4推理速度也能提升 2 到 3 倍。但量化会带来精度损失需要在精度和速度之间做权衡。我一般会先用训练后量化如果精度损失太大再考虑量化感知训练。剪枝是去掉模型中不重要的连接或神经元。结构化剪枝可以直接减少计算量非结构化剪枝虽然压缩率高但需要专门的硬件支持才能加速。我在实际项目中更倾向于结构化剪枝因为它的部署兼容性更好。推理优化则涉及到算子融合、内存复用、批处理等技术。这些技术对延迟和吞吐量的影响很大但需要针对具体的硬件平台做调优。比如在 GPU 上批处理可以显著提升吞吐量但会增加延迟在 CPU 上批处理的收益就没那么明显。4. 反向传播的局限与替代方案4.1 反向传播为什么可能不是大脑的工作方式Hinton 在演讲里提到一个关键点反向传播需要精确的梯度计算和对称的前向反向路径这在生物神经网络中很难实现。生物神经元之间的连接是不对称的而且没有明确的“反向传播”信号。这个观点在工程上也有对应反向传播需要存储前向传播过程中的所有中间激活值这对内存的消耗非常大。训练一个 175B 参数的大语言模型需要的内存可能是模型本身的几十倍。这就是为什么大模型训练需要分布式计算和梯度检查点技术。梯度检查点是一种用时间换空间的方法在前向传播时不存储中间激活值在反向传播时重新计算。这样可以把内存消耗降低到原来的 1/√n但计算量会增加约 30%。我在训练 12 层以上的 Transformer 时基本都会开梯度检查点否则显存根本不够用。4.2 前馈神经网络和反向传播的关系前馈神经网络是反向传播最直接的应用场景。一个标准的前馈网络每一层的输出是下一层的输入信息单向流动没有循环或反馈。反向传播就是沿着这个单向路径把误差从输出层传回输入层。但前馈网络有一个根本局限它无法处理序列数据中的时序依赖。这就是为什么需要 RNN、LSTM以及后来的 Transformer。Transformer 通过自注意力机制让模型可以在任意两个位置之间建立直接连接而不需要像 RNN 那样一步步传递信息。我在做时间序列预测的时候对比过 LSTM 和 Transformer 的表现。在短序列长度小于 50上LSTM 的表现和 Transformer 差不多但训练速度更快。在长序列长度大于 200上Transformer 的优势非常明显因为它可以并行处理所有位置而 LSTM 必须串行计算。4.3 反向传播的替代方案探索学术界一直在探索反向传播的替代方案比如反馈对齐、直接反馈对齐、目标传播等。这些方法的共同思路是不需要精确的梯度只需要一个“足够好”的更新方向。反馈对齐用一个随机的反馈矩阵代替反向传播中的权重转置。理论上只要反馈矩阵和权重矩阵的夹角小于 90 度更新方向就是正确的。我在一个小型卷积网络上试过反馈对齐在 MNIST 上的准确率能达到反向传播的 95% 左右但训练速度慢了将近一倍。目标传播则更激进它把每一层都当作一个独立的优化问题通过局部目标来指导更新。这种方法在理论上更接近生物学习但在实际应用中还很不成熟尤其是在深层网络上性能下降很明显。我的判断是在可预见的未来反向传播仍然是深度学习训练的主流方法。替代方案可能在特定场景下有优势但短期内很难撼动反向传播的地位。5. 大语言模型的工程实践从本地部署到视觉多模态5.1 本地部署大语言模型的现实考量“本地部署大语言模型”是最近搜索量很高的一个词。很多人想在自己的机器上跑一个 LLaMA 或 ChatGLM但实际做起来会发现坑很多。第一个问题是硬件。一个 7B 参数的模型如果用 FP16 精度存储需要大约 14GB 显存。如果量化到 INT8需要 7GB 左右量化到 INT4需要 3.5GB 左右。这意味着如果你只有一张 8GB 显存的显卡只能跑 INT4 量化的 7B 模型而且上下文长度不能太长。第二个问题是推理框架。目前主流的选择有 llama.cpp、vLLM、TensorRT-LLM 等。llama.cpp 的优点是 CPU 推理性能好支持多种量化格式适合在消费级硬件上跑。vLLM 的优点是 GPU 利用率高支持 PagedAttention适合在服务器上做高并发推理。TensorRT-LLM 的优点是推理速度最快但配置最复杂需要针对具体模型做编译。我个人的经验是如果你只是想本地跑着玩llama.cpp 是最省心的选择。如果你想做产品原型vLLM 更合适。如果你追求极致的推理性能并且有专门的 GPU 集群再考虑 TensorRT-LLM。第三个问题是模型格式。不同的推理框架支持的模型格式不一样。Hugging Face 的 Transformers 格式最通用但推理效率不是最高的。GGUF 格式适合 llama.cppTensorRT 引擎适合 TensorRT-LLM。转换格式的过程可能会遇到各种兼容性问题建议先用小模型跑通流程再上大模型。5.2 视觉大语言模型的多模态融合视觉大语言模型是另一个热门方向。它的核心思路是用一个视觉编码器比如 ViT 或 Swin Transformer把图像编码成一系列向量然后用一个投影层把这些向量映射到语言模型的嵌入空间最后让语言模型基于这些视觉向量和文本向量一起做生成。这个架构听起来简单但实操中有几个关键点。第一个是视觉编码器和语言模型的对齐。如果投影层设计得不好视觉信息会丢失很多模型只能生成一些泛泛的描述。我试过用简单的线性投影和 MLP 投影MLP 投影的效果明显更好但参数量也更大。第二个是训练数据的质量。视觉大语言模型的训练通常分两阶段第一阶段用大量的图像-文本对做预训练让模型学会基本的视觉-语言对齐第二阶段用高质量的指令数据做微调让模型学会遵循指令。第一阶段的数据量要大第二阶段的数据质量要高。第三个是推理时的效率问题。图像编码的计算量很大尤其是高分辨率图像。我一般会把图像先缩放到 224x224 或 336x336然后再送入编码器。如果任务需要更精细的视觉理解可以考虑用滑动窗口或区域提议的方式只对关键区域做高分辨率编码。5.3 Transformer 在异常检测和时序预测中的应用Transformer 不只用于自然语言处理。在异常检测和时序预测领域Transformer 也有广泛的应用。异常检测的核心思路是用 Transformer 学习正常数据的分布然后在推理时把重构误差或预测误差大的样本标记为异常。我在做服务器日志异常检测的时候用了一个 6 层的 Transformer 编码器输入是日志事件的序列输出是下一个事件的预测分布。如果实际事件和预测分布的 KL 散度超过某个阈值就认为是异常。这个方法的优点是不需要标注数据只需要正常日志就能训练。缺点是阈值的选择很敏感阈值太低会误报太高会漏报。我一般会用验证集上的 F1 分数来选阈值而不是用固定的百分位数。时序预测方面Transformer 的优势是能捕捉长距离依赖。但标准的 Transformer 在时序预测上有一个问题位置编码是固定的无法适应不同频率的周期性。为了解决这个问题我试过用可学习的位置编码或者用时间卷积网络做预处理效果都有提升。6. 常见问题与排查技巧实录6.1 训练不收敛怎么办训练不收敛是深度学习中最常见的问题。我的排查顺序一般是先看数据再看模型最后看优化器。数据方面检查有没有标签错误、数据泄漏、分布偏移。我遇到过一次模型在训练集上表现很好在验证集上很差最后发现是数据预处理的时候把验证集的数据也做了归一化导致验证集的分布和训练集不一致。模型方面检查初始化、激活函数、归一化层。Transformer 的初始化很关键我一般会用 Xavier 初始化或 Kaiming 初始化。激活函数方面GELU 在 Transformer 里比 ReLU 更常用因为它的梯度更平滑。优化器方面Adam 和 AdamW 是最常用的选择。AdamW 把权重衰减和梯度更新解耦在大模型训练上更稳定。学习率方面我一般会用 warmup 加 cosine 衰减warmup 的步数通常是总步数的 5% 到 10%。6.2 显存不够怎么办显存不够是训练大模型时的常见问题。我的解决方案按优先级排序第一开梯度检查点第二用混合精度训练第三减小 batch size第四用梯度累积模拟大 batch第五用模型并行或流水线并行。梯度检查点可以把显存消耗降低到原来的 1/√n但会增加约 30% 的计算时间。混合精度训练用 FP16 做前向和反向用 FP32 做参数更新可以把显存消耗降低约 40%同时提升训练速度。如果这些还不够就要考虑分布式训练了。数据并行是最简单的每张卡上放一份完整的模型数据分片。但数据并行要求单卡能放下整个模型。如果单卡放不下就要用模型并行把模型的不同层放到不同的卡上。6.3 模型过拟合怎么办过拟合的表现是训练 loss 持续下降验证 loss 先下降后上升。解决方法包括增加数据、加正则化、减小模型、早停。增加数据是最根本的方法但很多时候数据是有限的。这时候可以用数据增强。对于文本数据可以用同义词替换、随机插入、随机交换、随机删除等方法。对于图像数据可以用旋转、裁剪、翻转、颜色抖动等方法。正则化方面L2 正则化是最常用的。在 PyTorch 里可以通过优化器的 weight_decay 参数来实现。Dropout 也很有效尤其是在全连接层。我一般会在 Transformer 的注意力权重和 FFN 层都加 dropoutdropout 率从 0.1 开始试。早停是最简单的方法在验证 loss 不再下降的时候停止训练。我一般会设置一个 patience 参数比如 5 个 epoch如果验证 loss 连续 5 个 epoch 没有下降就停止训练。6.4 常见问题速查表问题可能原因排查方法解决方案训练 loss 不下降学习率太小、初始化不好、数据有问题检查学习率、初始化、数据分布调大学习率、换初始化、清洗数据验证 loss 上升过拟合对比训练和验证曲线加正则化、加数据、早停显存溢出batch size 太大、模型太大查看显存占用减小 batch、开梯度检查点、混合精度推理速度慢模型太大、没有量化、批处理不当测推理延迟量化、剪枝、批处理生成结果重复解码策略问题检查 temperature 和 top-k调高 temperature、用 nucleus sampling多模态对齐差投影层太简单、训练数据不足检查投影层结构和数据量用 MLP 投影、增加数据7. 一些个人体会Hinton 的演讲让我重新思考了一个问题我们到底在训练模型还是在训练一种“语言理解的模拟器”从工程角度看这两者的区别可能不重要因为模型的表现已经足够好。但从认知角度看这个区别很关键因为它决定了我们如何设计下一代模型。我在实际项目中的一个体会是不要过度追求“理解”这个词。模型能预测下一个词能回答问题能生成代码这些能力本身就是有价值的。至于它内部是不是真的“理解”了这个问题可能没有标准答案也不影响我们用它来解决问题。另一个体会是反向传播虽然强大但它不是万能的。在某些任务上比如小样本学习、持续学习、因果推理反向传播训练出来的模型表现并不好。这些任务可能需要新的学习范式而不是简单地堆更多的数据和算力。最后关于数字智能超越生物智能这件事我的看法是在某些维度上它已经超越了。比如知识复制、并行计算、长时间稳定运行。但在另一些维度上比如常识推理、情感理解、创造性思维它还有很长的路要走。与其担心被超越不如想想怎么把两者的优势结合起来。
阅读完成 · 觉得有帮助?