为分类任务微调表示模型
深入讲解为分类任务微调表示模型的完整流程:分类头设计、全量微调 vs LoRA 的选择、小样本场景下的 SetFit 方案,以及过拟合防范与模型评估。
从 Transformer 编解码器架构、GPT 与 BERT 的设计取舍,到上下文长度限制、推理延迟指标、预训练与微调范式——系统梳理大模型的基础概念。
编码器是双向的,能同时看到整个输入序列,擅长理解语义;解码器是单向的,只能从左到右逐个生成token,天然适合文本生成。两者的核心区别在于注意力的方向性——编码器用的是全注意力,解码器用的是因果掩码注意力(只看前文)。只用编码器当然有用,BERT就是典型例子,做文本分类、NER、语义匹配这些理解任务效果很好。只用解码器更是主流路线,GPT系列全是这个架构,事实证明只要模型够大、数据够多,纯解码器不仅能生成,理解能力也不差。现在回头看,完整的编码器-解码器架构(如T5)反而用得少了,大家发现纯解码器架构足够通用,工程上也更简单。
原始Transformer(Attention is All You Need)是一个完整的编码器-解码器结构,设计初衷是做机器翻译这类seq2seq任务。GPT只保留了解码器部分,扔掉了编码器和交叉注意力层。具体来说有几个关键区别:1)GPT去掉了编码器以及解码器中与编码器交互的cross-attention层,每个block只剩下masked self-attention和FFN;2)GPT用的是学习到的位置编码(learned positional embedding),而不是原始论文中的正弦位置编码;3)GPT的训练目标是自回归语言建模(预测下一个token),而不是翻译任务的序列到序列损失。本质上GPT做了一个大胆的简化——证明了只靠解码器做自回归预训练,再加上微调或提示,就能覆盖各种NLP任务,不需要编码器-解码器的完整结构。
BERT类(仅编码器):双向注意力让它对语义理解非常强,分类、匹配、NER这些任务效果好,但天然不适合生成任务,因为它没有自回归能力。GPT类(仅解码器):自回归生成是它的强项,而且架构简单统一,scaling law表现好,缺点是单向注意力在理解任务上理论上不如双向的,但实际上模型够大后这个差距很小。编码器-解码器(如T5、BART):理论上最灵活,编码器理解输入、解码器生成输出,适合翻译、摘要这类有明确输入输出的任务,但工程复杂度更高,而且实践中发现它并没有比纯解码器好到哪去。所以目前的趋势很明确:需要高效理解(比如做embedding)用编码器,通用场景用解码器,编码器-解码器架构逐渐边缘化了。
RNN中的注意力(如Bahdanau Attention)是在解码器的每一步,对编码器的所有隐状态做加权求和,本质上是解码器去"查询"编码器,是一个跨序列的注意力。它的问题在于编码器本身还是顺序处理的RNN,信息仍然要一步步传递,长距离依赖的问题没有根本解决。Transformer的自注意力完全不同:它在同一个序列内部,让每个位置直接和所有其他位置交互,完全绕开了顺序处理的限制。这带来两个根本性的好处:第一,任意两个位置之间的路径长度是O(1),不管间隔多远都能直接建立联系;第二,所有位置的注意力可以并行计算,训练效率大幅提升。可以说自注意力是把注意力从一个辅助模块提升成了模型的核心计算范式。
最长上下文长度的限制主要来自两方面:一是位置编码,模型在训练时只见过一定长度范围内的位置,超出这个范围位置编码就失效了,模型不知道怎么处理那么远的位置关系;二是注意力计算的显存开销是O(n²)的,序列太长显存扛不住。至于为什么是输入+输出的总长度——因为自回归生成时,模型每生成一个新token,都要和前面所有token(包括输入和已生成的输出)做注意力计算。从模型视角看,输入和输出拼在一起就是一个连续的序列,它根本不区分哪些是用户输入的、哪些是自己生成的,所以上下文窗口自然就是整个序列的长度。输入占的越多,留给输出的空间就越少。
首字延迟(TTFT, Time To First Token)是从用户发送请求到收到第一个输出token的时间,主要由预填充(prefill)阶段决定,就是模型处理整个输入序列的时间。输入吞吐量是单位时间能处理的输入token数,反映prefill效率。输出吞吐量是单位时间能生成的输出token数,反映逐token生成的速度。不同场景的侧重点差异很大:聊天对话最在意首字延迟,用户等超过1-2秒就会觉得卡;长文档摘要、RAG这类场景输入很长,输入吞吐量是关键;代码生成、长文写作输出很长,输出吞吐量更重要;批处理场景(如离线数据标注)则主要看总吞吐量,延迟不太敏感。实际部署时这三个指标往往是互相制约的,比如增大batch size能提高吞吐但会增加延迟。
两步范式的重要性在于解耦了"学知识"和"学行为"。预训练在海量无标注文本上做,成本极高但只需要做一次,模型从中获得了语言能力(语法、语义理解)、世界知识(事实、常识、推理模式)和基础的模式识别能力。但预训练出来的模型本质上只会"续写",不会好好回答问题。微调(特别是SFT+RLHF)用相对少量的高质量标注数据,教模型怎么按照人类期望的方式行为:SFT教它遵循指令的格式和风格,RLHF进一步对齐人类偏好,让它的回答更有用、更安全、更诚实。打个比方,预训练像是一个人读了一辈子的书,微调像是岗前培训,教它怎么把知识用到具体工作中。没有预训练的知识基础,微调无从下手;没有微调的行为引导,预训练模型不知道该怎么好好说话。
核心原因是数据量和数据质量的大幅提升。Llama-1 70B用了约1.4T token训练,而Llama-3 8B用了超过15T token,数据量翻了10倍,而且数据经过了更严格的清洗和去重。根据scaling law,在模型大小固定的情况下,增加训练数据量可以持续提升性能,Llama-1其实是"欠训练"的。此外Llama-3还做了几个关键改进:更大的词表(128K vs 32K)提升了分词效率特别是多语言能力;用了GQA替代MHA减少推理开销的同时保持了质量;训练工程上也优化了很多。说白了,Llama-1时代大家都在追求参数量,后来发现给小模型喂足够多高质量的数据,效果反而比大而"饿"的模型好。Chinchilla论文揭示的这个规律在Llama-3上得到了充分验证。
RELATED