尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

从词向量到Transformer:动画速成大模型技术演进链路

从词向量到Transformer:动画速成大模型技术演进链路 从 2013 年 Word2Vec 出现到 2017 年 Transformer 架构在《Attention Is All You Need》论文中横空出世再到如今 GPT、BERT 系大模型席卷各行各业这十年间 NLP 技术走过了一条相当清晰的演进路径。很多人学习大模型时第一个遇到的困惑不是数学公式难懂而是不知道词向量、注意力机制、Transformer 这些概念之间到底是怎么串起来的。它们看起来是不同阶段的技术但实际是一条完整的因果链没有词向量的语义表示就没有办法让神经网络高效处理文本没有 RNN 在长文本上的吃力就不会催生注意力机制没有注意力机制的并行化改造就不会有 Transformer没有 Transformer 的规模放大就不会有今天的大模型。这篇文章想帮你做的就是把这条链彻底理清楚。我会从词向量讲起一路讲到 Transformer 的核心架构最后落到大模型的两条技术路线。整个过程会结合动画视角来解释——因为你会发现用“动起来”的方式理解注意力机制比看十遍公式都管用。文章末尾会给出配套的入门学习路线和避坑建议建议先收藏再看。1. 这篇文章真正要解决的问题先说说为什么大多数人学大模型原理时会卡在半路。如果你直接去读 Transformer 原论文迎面而来的是缩放点积注意力公式、多头注意力结构、位置编码表术语密度非常高。如果你直接去看大模型科普视频又往往停在“它能写诗、能编程、能做 Agent”的演示层和真正的原理隔着一条鸿沟。问题出在哪里出在缺少一个“从旧技术到新技术”的过渡视角。很多人不知道 Transformer 里的 Q、K、V 是从信息检索里的 Query、Key、Value 借来的概念只是觉得这个命名很怪很多人不知道位置编码是为了弥补自注意力“不感知顺序”的天生缺陷只是死记公式很多人不知道 GPT 和 BERT 从同一个架构出发、却走了完全不同的训练路线只是笼统地说“它们都是大模型”。这篇文章要解决的核心问题是帮你建立一条从词向量到 Transformer 再到 AI 大模型的完整认知链路并告诉你每个环节解决的是什么痛点。读完这篇文章你会达到三个目标能向别人说清楚词向量解决了什么问题、Word2Vec 和 GloVe 有什么本质区别。能理解 Transformer 里自注意力、多头注意力、位置编码各自承担什么职责。能分清 BERT 和 GPT 的架构差异以及为什么 GPT 路线的“下一个词预测”能一路放大成通用大模型。顺便回答一个很多初学者都问过的问题为什么最后是 Transformer 胜出而不是更强的 RNN 或 CNN2. 词向量让机器从“查字典”变成“理解语义”2.1 从 One-Hot 编码的困境说起在神经网络处理文本之前最常见的做法是把单词表示成一个高维稀疏向量。这种方法叫 One-Hot 编码。假设词表里有 5 万个词那么每个词就是一个 5 万维的向量只有当前词对应的那一维是 1其余全是 0。这种表示有两个致命问题。第一个问题是维度爆炸。5 万维的向量存储开销极大而且绝大多数维度都是 0计算效率极低。模型每处理一个词都要面对一个巨大的稀疏向量。第二个问题更致命One-Hot 编码完全无法表达词与词之间的语义关系。“猫”和“狗”这两个词的 One-Hot 向量之间没有任何相似性因为它们是两个不同位置上的 1。在计算机眼里“猫”和“狗”的距离与“猫”和“冰箱”的距离完全一样。这是一个非常反直觉的事实我们人类一眼就知道“猫”和“狗”相关但 One-Hot 编码告诉模型的是“它们毫无关系”。如果模型连最基本的语义相关性都感知不到那后面的句法分析、情感判断、机器翻译都无从谈起。2.2 分布式表示把语义压缩进低维向量分布式表示的核心思想是不要用一位去表示一个词而是用一个低维稠密向量比如 100 到 300 维来表示一个词。这个向量里的每一个维度不再是“某个词出现与否”的开关而是某种抽象语义特征的强度。举个例子“国王”的向量可能在某些维度上和“男人”接近在另一些维度上和“王后”接近。当模型计算两个词向量的余弦相似度时“猫”与“狗”的距离会明显小于“猫”与“冰箱”的距离。这种能力是 One-Hot 编码永远不具备的。更经典的一个发现是词向量之间可以做算术运算。“国王”的向量减去“男人”的向量再加上“女人”的向量结果非常接近“王后”的向量。这个著名的king - man woman ≈ queen例子直观展示了分布式表示学到的不只是单词还有单词背后隐含的语义关系。2.3 Word2Vec 的训练目标让上下文相同的词靠近Word2Vec 是 2013 年由 Tomas Mikolov 团队提出的词向量训练方法。它把词向量训练问题巧妙地转换成了一个“预测任务”。Word2Vec 有两条训练路线CBOWContinuous Bag-of-Words给定上下文词预测中间词。比如看到“我__猫”模型要预测空格里是“喜欢”。Skip-gram给定中间词预测上下文词。比如看到“喜欢”模型要预测周围可能出现的词是“我”和“猫”。训练完成后网络中间层的权重矩阵就成了词向量表。整个过程没有人工标注只需要大量无标注文本。这一点非常重要它是后来“用海量文本预训练模型”这一思路的雏形。2.4 GloVe用全局共现统计补充局部窗口Word2Vec 只利用了一个固定大小窗口内的局部共现信息窗口之外的词间关系它看不到。GloVeGlobal Vectors for Word Representation的思路则是直接利用整个语料库的全局共现矩阵构造一个“词向量内积等于共现概率对数”的优化目标。从效果上看GloVe 对全局语义的把握更好尤其在词语类比任务上表现出色从工程上看Word2Vec 的训练速度更快更容易快速迭代。需要强调的是词向量领域的进步并没有随着 Word2Vec 和 GloVe 而停止。后来的 ELMo、BERT 等模型都包含词向量层但它们打破了过去“词向量训练好就固定不动”的做法让词向量在运行过程中可以根据上下文动态调整。这就是“静态词向量”和“动态词向量”的区别。下面给一个非常简短的 gensim 示例展示如何加载预训练词向量并计算相似度# 文件路径src/word2vec_demo.py from gensim.models import KeyedVectors # 假设你有一个 word2vec 格式的向量文件 # 这里演示的是加载后的查询逻辑实际路径请按本机情况修改 model KeyedVectors.load_word2vec_format(word2vec.model.bin, binaryTrue) # 计算两个词的余弦相似度 sim model.similarity(猫, 狗) print(猫 vs 狗 相似度:, sim) # 找最相似的词 result model.most_similar(中国, topn5) print(与中国最相似的词:, result)如果没有提前准备模型文件这一段只需要理解逻辑即可。接下来我们进入神经网络处理序列问题的时代。在进入下一节之前把本节的核心结论固定下来词向量让模型第一次获得了“语义相似性”的感知能力它把离散的、高维的、无语义的符号压缩成了连续的、低维的、可计算的语义空间。没有这个基础后面一切基于神经网络的文本处理都无从谈起。3. RNN 与 CNN 的瓶颈为什么处理长文本总是差一口气有了词向量模型终于可以“理解”单词了。但自然语言不是一堆独立单词的集合而是有顺序、有结构的序列。如何处理序列就成了下一个核心问题。3.1 RNN 的优雅与宿命RNN循环神经网络的设计思路非常自然把文本看作一个时间步接一个时间步的序列模型维护一个隐藏状态每读一个词就把新词的信息和旧的隐藏状态融合生成一个新的隐藏状态。这个隐藏状态相当于模型到目前为止“记住”的内容。这个设计有两个明显优点一是天然支持变长输入二是参数共享不论句子多长都使用同一套循环参数。但 RNN 有一个绕不开的宿命难以处理长距离依赖。比如句子开头的“张三”和隔了 30 个词之后的“他”机器需要判断这两个词指向同一个人。随着距离变长梯度在反向传播时会不断连乘。如果梯度小于 1连乘之后会趋近于 0前面位置的信息就无法更新参数这就是“梯度消失”。如果梯度大于 1连乘之后会爆炸模型训练不稳定这就是“梯度爆炸”。后来出现的 LSTM 和 GRU 通过引入门控机制在一定程度上缓解了梯度消失问题让模型学会了“选择性记忆”。但门控并没有从根本上改变 RNN 顺序处理的宿命每个时间步必须等前一个时间步计算完才能开始计算。这在 GPU 时代是致命的——并行度极低训练效率上不去。3.2 CNN 的局部视野感受野不够用CNN卷积神经网络在图像领域取得了巨大成功于是也有人尝试把它用到文本上。CNN 的思路是用一个固定宽度的卷积核在文本序列上滑动捕捉 n-gram 级别的局部特征。比如一个窗口大小为 3 的卷积核可以看到“我/喜欢/猫”这三个连续词。多个不同宽度的卷积核叠加可以捕捉不同粒度的短语特征。CNN 的优势是并行度高多个位置的卷积可以同时计算。但它的劣势也很明显卷积核的感受野有限捕捉长距离依赖需要堆很多层网络。句子越长层数需求越大模型越深训练难度也越高。对于“张三……他”这种动辄跨越几十个词的依存关系CNN 常常力不从心。3.3 为什么 RNN 和 CNN 都差一口气把 RNN 和 CNN 放在一起看会发现它们的问题恰好是对称的模型并行能力长距离依赖主要瓶颈RNN差必须逐步计算弱虽有门控但仍受限训练慢梯度问题CNN强可并行弱受感受野限制需要很深网络才能覆盖长距离RNN 有良好的顺序建模能力但跑不快CNN 能并行计算但看不远。我们需要一个既能并行、又能直接建模任意距离依赖的架构。这个需求直接推动了注意力机制的成熟和 Transformer 的诞生。4. Attention 机制的诞生让模型学会“关注重点”4.1 从人脑注意力说起先做一个小实验。请快速扫一眼这句话“北京是中国的首都也是举办过夏奥会和冬奥会的城市。”当我问你“北京有哪些身份”时你不会把这句话里所有词都重新读一遍而是会快速锁定“中国的首都”“举办过夏奥会和冬奥会的城市”这两处关键位置忽略“是”“也”“的”等虚词。人脑处理信息时天然会对关键信息分配更多注意力对无关信息进行过滤。Attention 机制就是把这种能力搬进神经网络。4.2 注意力机制的朴素理解在最早的 Seq2Seq 机器翻译模型里编码器把整个源语言句子压缩成一个固定向量解码器再从这个固定向量里生成目标语言。问题是句子很长的时候一个固定向量根本装不下所有信息翻译效果会大打折扣。注意力机制的核心改动是解码器在生成每个目标词时不再只依赖一个固定向量而是动态地回看源语言所有位置的隐藏状态给每个位置分配一个权重。权重越高说明这个源语言词对当前目标词的生成越重要。比如翻译“I love cats”到中文时生成“猫”这个字时模型会给“cats”很高的注意力权重。这里引出了 Attention 机制中最关键的一步计算相似度。模型需要衡量“当前要生成的内容”和“源语言每个位置的内容”之间的相关性。相关性高的位置权重就大。4.3 Q、K、V 的来由这就是 Transformer 里 Q、K、V 三个概念的雏形。Query查询可以理解为你头脑里的一个问题。比如“这里应该翻译成什么”Key键可以理解为源语言每个位置提供的“标签”。比如“I 在第一位”“cats 在第三位”。Value值可以理解为源语言每个位置提供的“内容本身”。比如“I 这个词的内容”“cats 这个词的内容”。注意力权重的计算过程就是用 Query 去和所有 Key 做匹配得到一组相似度分数。这组分数经过 softmax 归一化后变成权重。最后用权重对 Value 做加权求和得到输出。用一个生活化的例子你在图书馆找书你的 Query 是“如何学习 Transformer 架构”图书馆每一本书的标题相当于 Key书的内容相当于 Value。你先用 Query 和所有书的 Key 比对找到了几本标题最相关的书然后重点阅读里面和“Transformer”“注意力机制”相关的章节忽略其他内容。到这里你应该理解了注意力机制的本质它不是一个复杂得不可解释的黑盒而是一个“动态选择信息”的加权求和过程。5. Transformer 核心架构拆解自注意力、多头机制与位置编码2017 年谷歌团队发表论文《Attention Is All You Need》提出了 Transformer 架构。这篇论文的标题非常直白我们连 RNN 和 CNN 都不用了只要注意力机制就够了。5.1 自注意力每个词都在观察整个句子Transformer 里的注意力和 4.2 节里提到的 Seq2Seq 注意力有一个重要区别Seq2Seq 注意力是解码器去关注编码器的输出而 Transformer 用的是自注意力。自注意力的意思是句子里的每个词都要和句子里的其他所有词计算相关性然后用相关性加权融合彼此的信息。举个例子。输入句子是“它没有通过考试因为它没有复习”。模型在处理第二个“它”时需要判断它指代的是谁。自注意力机制会让第二个“它”去关注“考试”“复习”等词再结合上下文推断出这是一个指代关系。这种“句子内部每个词互相观察”的机制让模型可以一步到位建模任意两个词之间的关系无论它们在句子中隔了多远。这正是 RNN 和 CNN 一直想做但做不好的事。自注意力的计算公式如下Attention(Q, K, V) softmax(Q * K^T / sqrt(d_k)) * V其中 Q、K、V 分别由输入向量乘上三个不同的权重矩阵得到d_k是 Key 向量的维度。除以sqrt(d_k)是为了防止 Q 和 K 的点积结果过大导致 softmax 之后梯度变得过小。下面用 PyTorch 实现一个最小版的自注意力计算# 文件路径src/self_attention.py import torch import torch.nn.functional as F def self_attention(x, W_q, W_k, W_v): x: 输入序列, shape [batch, seq_len, d_model] W_q, W_k, W_v: 线性变换矩阵 返回: 自注意力输出, shape 与 x 相同 Q x W_q # [batch, seq_len, d_k] K x W_k # [batch, seq_len, d_k] V x W_v # [batch, seq_len, d_v] d_k K.shape[-1] scores Q K.transpose(-2, -1) / (d_k ** 0.5) # [batch, seq_len, seq_len] weights F.softmax(scores, dim-1) output weights V # [batch, seq_len, d_v] return output, weights # 模拟输入 torch.manual_seed(42) batch, seq_len, d_model 1, 4, 8 x torch.randn(batch, seq_len, d_model) # 定义映射矩阵 d_k d_v 8 W_q torch.randn(d_model, d_k) W_k torch.randn(d_model, d_k) W_v torch.randn(d_model, d_v) output, weights self_attention(x, W_q, W_k, W_v) print(输出形状:, output.shape) print(注意力权重:\n, weights)运行这段代码后你会得到一个[batch, seq_len, seq_len]的注意力权重矩阵。这个矩阵里第 i 行第 j 列的值就表示“第 i 个词在编码时分配给第 j 个词的注意力权重”。5.2 多头注意力从多个角度看关系自注意力有一个问题它只计算一种“相关性”。但语言里的关系是多种多样的。两个词之间可能是语法上的主谓关系可能是语义上的指代关系也可能是逻辑上的因果关系。如果只用一组 Q、K、V模型很难同时捕捉这么多不同维度的关系。多头注意力的思路是用多组 Q、K、V让模型从多个不同的表示子空间去计算注意力然后把结果拼起来再做一次线性变换。到这一步Transformer 的灵魂就到位了每个词在编码时并行地从多个角度观察整个句子的其他词捕捉多种不同类型的关系。可以用一个简单的类比来理解多头注意力你读一段文本时不会只从一个角度理解。你会同时关注语法结构、语义内容、情感色彩、逻辑关系。每一层关注都相当于一个“头”。多个头的输出最终会被融合成你的整体理解。5.3 位置编码给并行计算补上顺序信息前面说过自注意力是并行计算所有词之间的关系不分先后。但自然语言的顺序是极重要的。“张三打了李四”和“李四打了张三”用的词完全一样但含义完全相反。RNN 天然按顺序处理不存在这个问题Transformer 完全并行就必须补上位置信息。Transformer 的做法是在输入词向量上叠加一个位置编码向量。这样模型在计算注意力时既能看到词本身的语义也能感知到词在句子中的位置。原始论文使用正弦和余弦函数生成位置编码PE(pos, 2i) sin(pos / 10000^(2i/d_model)) PE(pos, 2i 1) cos(pos / 10000^(2i/d_model))其中pos是位置索引i是维度索引。这样的好处是不同位置的编码向量各不相同且模型可以通过线性变换在一定程度上感知相对位置。一个简单的 Python 实现# 文件路径src/positional_encoding.py import numpy as np def get_positional_encoding(max_len, d_model): pe np.zeros((max_len, d_model)) position np.arange(0, max_len).reshape(-1, 1) div_term np.exp(np.arange(0, d_model, 2) * (-np.log(10000.0) / d_model)) pe[:, 0::2] np.sin(position * div_term) pe[:, 1::2] np.cos(position * div_term) return pe pe get_positional_encoding(10, 8) print(位置编码矩阵形状:, pe.shape) print(前两个位置的向量:\n, pe[:2])5.4 残差连接与层归一化让深层网络更加稳定Transformer 还有一个容易被忽略但非常重要的组件残差连接和层归一化。残差连接把输入直接加到输出上即output layer(x) x。这样做的目的是让梯度可以从深层直接流回浅层有效缓解深层网络的训练困难。每个子层外都套一层残差连接再跟着一个 Layer Normalization。层归一化的作用是让每一层的输入数据分布保持稳定加快训练收敛速度。在 NLP 任务中Layer Normalization 通常比 Batch Normalization 更合适因为它是针对单个样本做的归一化不依赖 batch 大小。这两部分组合起来让 Transformer 可以堆到很深的层数而不至于训练崩溃。GPT-3 有 96 层 Transformer 块没有稳定的网络结构设计这么深的模型根本无法训练。6. 从编码器-解码器到大模型BERT 和 GPT 的两条路线Transformer 原始论文提出的是一个完整的编码器-解码器架构用于机器翻译。但后来的大模型发展并没有完全沿用这个整体结构而是各取了一半。6.1 编码器与解码器的分工编码器负责把输入序列转换成一组包含上下文信息的向量表示。它适合“理解类”任务比如文本分类、命名实体识别、情感判断。解码器负责根据已有的上下文逐词生成目标序列。它适合“生成类”任务比如机器翻译、文本续写、对话生成。这决定了后续两个大模型家族的技术路线分叉。6.2 BERT编码器路线主打“理解一切”BERTBidirectional Encoder Representations from Transformers由 Google 在 2018 年提出只用了 Transformer 的编码器部分。BERT 的预训练任务有两个掩码语言模型Masked Language Model随机遮住句子中的一些词让模型根据双向上下文预测被遮住的词。这迫使模型同时利用每个词左侧和右侧的信息。下一句预测Next Sentence Prediction给模型两个句子让它判断第二句是不是第一句在原文中的下一句帮助模型理解句间关系。BERT 的强项是深度理解。它在问答、文本分类、实体识别等任务上效果拔群是 NLP 竞赛刷分的利器。它的局限是本身不太擅长自由生成文本因为训练目标从一开始就不是“生成下一个词”。6.3 GPT解码器路线主打“生成一切”GPT 走出了一条完全不同的路。它只使用 Transformer 的解码器部分并做了一个关键简化使用带掩码的自注意力。每个词只能看到它之前左侧的词不能看到右侧。GPT 的预训练任务只有一个给定前面的词预测下一个词。这个任务看起来简单得朴素但它的威力远超想象。GPT-1 发布于 2018 年参数量 1.17 亿表现尚可但不算惊艳。GPT-2 在 2019 年把参数量拉到 15 亿零样本生成能力显著提升。GPT-3 在 2020 年把参数量推到 1750 亿并展示了令人惊讶的少样本学习能力——不需要微调只需要在提示词里给几个示例模型就能学会新任务。后来的 ChatGPT 则是在 GPT 基础上加入了人类反馈强化学习RLHF让模型学会更好地理解和执行人类指令。为什么“预测下一个词”能发展成通用人工智能的雏形核心原因是自然语言本身就是一片极其丰富的信息载体。模型为了做到下一个词预测必须从海量文本中学习大量的世界知识、逻辑推理、语法规则和常识判断。就像一个人要能接住任何一句话他必须非常了解这个世界。GPT 做的事情本质上就是“把全人类写入文本的世界知识压缩进一个巨大的神经网络里”。6.4 两条路线的对比维度BERTGPT架构Transformer 编码器Transformer 解码器注意力方式双向注意力单向掩码注意力预训练任务掩码语言模型 下一句预测预测下一个词擅长任务理解类、判别类生成类、对话类代表模型BERT、RoBERTa、ALBERTGPT 系列、ChatGPT到这里你可以回答一个经常被问到的面试题“为什么最后是 Transformer 胜出”答案有两个层面一是 Transformer 解决了 RNN 并行度低和 CNN 感受野有限的问题二是 Transformer 的解码器路线被证明可以通过“预测下一个词”这一简单目标在参数量和模型复杂度的加持下涌现出理解、推理、生成等多种能力。7. 为什么动画是最适合入门的理解方式前面讲了这么多原理现在来回答标题里提到的“动画急速入门”为什么是一个有效的学习方式。7.1 注意力机制天然适合视觉化表达自注意力的计算过程如果把每个词之间的注意力权重画成一张热力图效果非常直观。比如下图描述的场景我在这里用文字描述输入句子是“The animal didnt cross the street because it was too tired”。当模型处理it这个词时一张注意力可视化热力图会显示it和animal之间有非常高的权重和street的权重较低。这让我们一眼就看出模型已经学会了指代消解。如果做成动画把一次前向传播过程逐层展开你会看到每个词先被编码成词向量词向量逐渐带上位置信息。在每一层 Transformer 块中句子里的每个词都向其他所有词发出“查询”和“响应”注意力权重实时变化。经过多层传播后每个词向量的颜色逐渐发生变化从最初只包含词本身信息变成包含整个句子的上下文信息。这种动态过程用文字描述需要好几段但用动画半分钟就能看懂。动画还有一个非常大的优势它能建立“动态直觉”。很多初学者看公式时不知道 Q、K、V 在训练过程中到底在做什么。看动画时你会直观地感受到训练之前注意力可能均匀分布或随机聚集训练之后注意力逐渐聚焦到语义相关的词上。这个“从混沌到有序”的过程一旦印在脑子里再看公式就会有恍然大悟的感觉。7.2 词向量的演化也适合动画展示词向量同样适合用动画展示。比如在训练 Word2Vec 的过程中把词向量投影到二维平面用 t-SNE 或 PCA 降维你会看到训练初期所有词向量的点杂乱分布在平面上。随着训练进行语义相近的词开始聚拢。训练结束时“苹果”“香蕉”“橙子”聚在一个区域“猫”“狗”“鸭子”聚在另一个区域。这个视觉化过程能让初学者迅速理解一个关键概念词向量训练的本质就是把语义相似的词在向量空间中放到相近的位置。7.3 动画学习的正确姿势不过这里要给一个提醒动画是一个很好的“第一遍理解”工具但绝不能替代“第二遍精读”。正确的学习姿势是先看动画建立对整个流程的直观印象知道每个模块在做什么。再看公式把动画里的“注意力连线”和公式中的矩阵乘法对应起来。最后动手写代码实现一个小型自注意力模块验证你对公式的理解。只有经过这三个阶段知识才真正扎进脑子里。只看动画会变成“懂了但写不出代码”只看公式会变成“公式认识我、我不认识公式”。8. 大模型训练的工程环节与常见误区理解了原理之后有必要说说大模型训练在工程上到底有哪些环节。很多初学者以为大模型 把 Transformer 层数堆多一点训练时间拉长一点。实际远没有这么简单。8.1 大模型训练的一般流程从原始文本到可用的对话大模型大致要走通以下环节数据采集与清洗从网页、书籍、论文、代码仓库等来源采集海量文本去除重复、去除敏感内容、进行语言过滤、质量打分。数据质量直接决定模型上限。预训练用海量无监督文本训练模型训练目标是“预测下一个词”。这一阶段会消耗大量算力通常在数千张 GPU 上并行训练数周。监督微调SFT准备高质量的人类指令和回答数据让模型学会按照指令格式输出而不是笼统地续写文本。人类反馈强化学习RLHF训练一个奖励模型对人类偏好进行建模再通过强化学习如 PPO 算法让模型逐步对齐人类的偏好和价值观。评测与上线在各类公开 benchmark 和实际业务场景里评测模型能力检测幻觉、偏见、安全等问题通过后再上线提供服务。8.2 常见误区与避坑这里有四个初学者最容易踩的坑值得单独拿出来说。误区一认为参数量越大越好。参数量大确实能提升模型能力但训练成本、推理成本、部署难度也会指数级上升。对小规模业务而言7B 到 13B 的开源模型经过微调后已经能解决很多实际问题不需要硬追几百 B 的超大模型。误区二认为微调是“万能解药”。基础模型没学会的知识微调很难教会。微调更多是调整回答风格、输出格式和行为模式。比如模型本身数学能力弱你给它 1 万条例题做微调效果远不如接入一个计算器工具。误区三忽略数据质量的重要性。微调数据的质量比数量重要得多。一百条精心标注的高质量问答常常胜过一万条从网上随便抓的问答。数据里的脏标签、矛盾指令会让模型学会一些奇怪的行为。误区四把提示词工程和微调混为一谈。提示词工程是零成本、见效快的优化手段微调是成本高、需要数据积累的深度定制方式。实际项目中通常先用提示词工程验证可行性再决定是否投入微调。9. 本地体验与入门实践建议前面讲完了理论最后给出几个可以马上动手的实践方向。这里不涉及大规模算力需求只要有普通电脑就能上手。9.1 用 Hugging Face 运行一个小型 GPT 模型强烈建议初学者先跑一个小型生成模型直观感受“预测下一个词”的效果。下面是一个最小示例# 文件路径src/gpt_demo.py from transformers import AutoTokenizer, AutoModelForCausalLM # 使用一个小型 GPT-2 模型进行演示 model_name gpt2 tokenizer AutoTokenizer.from_pretrained(model_name) model AutoModelForCausalLM.from_pretrained(model_name) prompt The future of AI is inputs tokenizer(prompt, return_tensorspt) outputs model.generate( inputs.input_ids, max_new_tokens20, do_sampleTrue, temperature0.9 ) print(tokenizer.decode(outputs[0], skip_special_tokensTrue))运行这段代码模型会基于“The future of AI is”续写出一段话。你可以改变提示词、调节temperature参数观察生成结果的多样性。9.2 亲自动手实现一个小型 Transformer 块如果想深入理解 Transformer建议不用库而是用 PyTorch 从零实现一个简易 Transformer 块。核心组件是自注意力、多头注意力、前馈网络、残差连接和层归一化。前面 5.1 节已经给出了自注意力的实现你可以在此基础上扩展出完整的 Transformer 块。建议练习顺序实现单头自注意力。扩展成多头注意力。加上位置编码。加上残差连接和层归一化。在文本分类任务上训练一个微型 Transformer。9.3 用现成模型做提示词实验如果不想训练模型也可以直接在各类大模型对话产品里做提示词实验。比如让模型解释概念、改写文本、提取结构化信息观察不同提示词对输出质量的影响。这是理解“模型输入-输出映射关系”最便捷的方式。9.4 学习路线总结最后给你一条清晰的学习路径阶段学习内容产出第一阶段词向量原理 自注意力可视化能解释 Q、K、V 的含义第二阶段用 PyTorch 实现自注意力跑通一个最小注意力模块第三阶段理解 Transformer 整体结构和 BERT/GPT 差异能区分编码器与解码器路线第四阶段用 Hugging Face 运行小型模型能独立做文本生成实验第五阶段学习微调、RLHF、模型评测能参与实际大模型应用开发我把这篇文章理解成一次从 2013 年 Word2Vec 到 2023 年大模型的快速穿越。读完你应该清楚词向量解决的是“语义表示”问题RNN 和 CNN 尝试解决“序列建模”问题但各有短板注意力机制引入“动态权重”的思路Transformer 把注意力机制推向极致并解决了并行性问题而 GPT 用“预测下一个词”这个简单目标把 Transformer 解码器的潜力释放到了前所未有的高度。如果你正在学习大模型我建议你把动画当成第一遍理解的工具把公式和源码当成第二遍精读的教材把动手实验当成最终检验标准。三者结合才能把这条技术演进链真正内化成自己的知识体系。下一篇文章可以继续深入的方向包括多头注意力的实现细节与计算开销、KV Cache 在推理阶段的加速原理、LoRA 等参数高效微调方法、以及大模型推理中的量化与部署问题。选一个你最感兴趣的方向开始动手吧。
返回列表