【八股学习】大模型预训练数据 || 数据污染 || MHA、MQA和GQA || RoPE || KV Cache
大模型预训练数据通常需要经过哪些清洗、过滤和去重步骤大模型预训练数据的清洗、过滤和去重是决定模型性能和训练效率的核心环节。这通常不是一个简单的线性流程而是一个多层级、多工具组合的工程系统。数据清洗从原始网页到可用文本目标是把混乱的原始数据如Common Crawl的WARC文件转化为干净、连贯的自然语言文本。HTML解析与正文提取工具trafilatura、jusText、readability-lxml、selectolax。操作剥离HTML标签、CSS、JavaScript保留正文文本。需要处理嵌套结构识别并去掉导航栏、广告、页脚等“锅炉板”内容。特殊处理将代码块、表格、数学公式用特殊标记保留或转换为文本而非简单删除。文本规范化Unicode归一化统一用NFKC等标准处理全角/半角、特殊空格如\xa0。控制字符与乱码清理移除零宽字符、无效字节序列、私人使用区PUA字符。保留关键的换行符和标点但删除过多连续空行。句子与段落切分修复被错误截断的行内换行重构连贯段落。语言识别与筛选工具fastText、langdetect、cld3或pycld2。操作以段落甚至文档级判断主语言。通常设定置信度阈值如0.7丢弃多语言混杂严重的文档。对于多语模型需要分语种筛选后再按比例混合。启发式与规则过滤在语义质量过滤前先用低成本规则剔除明显的低质数据。文档级统计特征过滤长度截断丢弃字符数极少100或过长100,000的文档。词汇与符号特征平均词长、句子长度的分布异常。大写词占比过高可能为广告或垃圾。特殊符号如“•”、“|”占比过高。停用词占比过低暗示非自然语言如日志、词表。重复密集度同一文档内词/ngram的重复比率如每行重复的日志。内容黑名单与敏感词过滤维护一套脏词、攻击性语言、涉政敏感词列表用于排除文档或标注风险。使用URL、域名的黑名单筛除已知的垃圾站、色情网站等。“困惑度”轻量过滤用一个已经训练好的小语言模型如KenLM 5-gram计算文档的轻量困惑度Perplexity丢弃极高困惑度的乱码文本。这一步介于规则和模型过滤之间。基于模型的深度质量过滤这是现代高质量预训练数据的核心利用训好的分类器或更复杂指标筛选高质量文本。文本质量分类器训练数据通常人工标注一批“wiki-like”高质量正例以及随机、混有垃圾的负例。常用方法在低成本的n-gram特征上训练线性分类器如CCNet的做法或用轻量级Transformer如基于DistilBERT做文档级评分。输出每个文档的质量得分只保留得分大于预设阈值的部分。例如Falcon利用分类器对RefinedWeb进行多层过滤。教育价值或毒性过滤教育价值过滤类似Gopher的做法利用分类器评估内容是否富有知识性、逻辑性筛除低信息量的闲聊或无意义枚举。毒性/有害内容过滤用预训练的毒性分类器如Detoxify或OpenAI的Moderation API风格模型剔除高度有毒、仇恨言论。综合信号融合结合链接来源的PageRank权重、网站权威性等外部信号提升高质量源如百科、学术库的权重抑制论坛水贴。去重精确与近似结合的多阶段漏斗去重是防止训练数据记忆、污染测试集、浪费计算的关键。通常分三到四层。第一层URL/来源级去重对同一URL只保留最新或首次抓取的版本。基于URL规范化后的MD5等指纹快速剔除完全重复的页面。第二层文档级精确去重方法对文档全文做哈希如SHA-256或对文档内所有行排序后哈希。效果移除完全一样的文档数据集中常见镜像拷贝。第三层模糊去重近似重复检测核心算法MinHash LSH局部敏感哈希。操作流程将文档切分为n-gram如5-gram或13-gram的集合。计算该集合的MinHash签名如128个哈希值。用LSH进行桶分将签名相似的文档分入同一桶。在桶内比较Jaccard相似度超过阈值如0.8的文档视为近似重复保留最长或最新的那个。工具datasketchtext-dedup或自建Spark/Marquez流水线。规模需要在文档簇内进行常跨文档比较inter-document dedup如Falcon/RefinedWeb就是大规模应用MinHash去除同源转载、轻微修改的文章。第四层段落/句子级去重可选但关键目的去除文档内部或跨文档中高频重复的模板化语句如法律条文、网站版权声明、代码头注释。方法对每个句子或固定长度片段哈希若某片段在全量数据中出现次数超过阈值如10次则将该片段标记或移除。或者使用后缀数组找出所有重复子串并替换。注意避免移除代码或诗歌中的正常重复结构需谨慎设定阈值。去污染与隐私脱敏基准数据集去污染查找并移除与任何已知评测基准如MMLU、HellaSwag、HumanEval等高度相似的文本。采用n-gram重叠搜索如13-gram一旦发现长串匹配就从训练集中剔除该文档防止数据泄露保证评测公正。个人身份信息脱敏PII识别利用正则表达式和命名实体识别检测邮箱、身份证号、电话号码、IP地址等。处理策略直接移除文档或将敏感实体替换为特殊占位符如[EMAIL]、[PHONE]。需要平衡隐私保护与文本连贯性。什么是数据污染如何检查训练数据是否包含评测集数据污染简单说就是训练集中混入了本应在测试阶段才使用的评估基准数据。这是预训练数据清洗中一项专门的去污染工作因为它会直接破坏模型评估的公正性。什么是数据污染它主要有两种形式直接重叠训练文本直接包含评测集的题目、选项和答案。例如网上有人发布了“MMLU题库及解析”模型训练时“背”下了答案。间接重叠训练数据包含评测集的源文本但可能没有直接的问题。比如训练集包含了小说原文而评测集是基于该小说的阅读理解题。这会让模型因“读过”原文而获得不公平的上下文优势。核心危害是导致基准性能虚高我们无法判断模型是真理解了还是单纯记性好。这会阻碍技术迭代和模型间的公平对比。如何检查训练数据是否包含评测集检查的核心就是在大海训练集里捞针评测集中的特定文本片段。这是一个计算密集型任务常用以下由严到松的方法组合1. 核心方法n-gram 重叠检测这是目前最主流、最被认可的方法也是 GPT-3、LLaMA、PaLM 等模型论文中的标准做法。原理如果训练数据和评测集中的某个样本连续重合了足够长的一段文本就可以判定为污染。操作流程构建“针”的索引从每个评测样本如问题和每个选项拼接的文本中提取所有连续的 n-gram通常 n13即连续 13 个词这个长度足以唯一标识一段文本。将这些 n-gram 存入一个高效检索结构中。在“大海”中搜索将整个训练语料也切分成 13-gram逐一检查它们是否出现在上一步构建的索引中。判定污染一旦发现匹配就扩展匹配长度获得最长公共子序列。如果训练文档与评测样本的最长公共子序列不一定是 13-gram 的整倍数占评测样本本身的长度比例超过预设阈值如 50%则标记该训练文档为“污染文档”。例子一篇训练文章里恰好有“光合作用的原料是水和二氧化碳产物是有机物和氧气”这句话它和一个生物评测题目的文本有超过80%的连续重合就会触发污染标记。为什么是 13-gram这是一个经验值能在召回率避免遗漏和精确率避免误伤之间取得良好平衡。太短如 5-gram会有大量巧合匹配太长如 20-gram则可能漏掉被轻微编辑过的污染。2. 补充方法模糊匹配与语义检测上述精确匹配法可以发现直接复制但无法应对他人刻意“改写”后的数据例如同义替换、翻译回译、总结摘要等。为此需要更高级的补充手段MinHash LSH局部敏感哈希这正是前文提到的模糊去重技术在去污染场景下的应用。它对改写、小幅增删有很强的鲁棒性。将训练文档和评测样本都转换成 MinHash 签名在桶内比对 Jaccard 相似度就能发现“撞衫”的数据。基于嵌入向量的语义检索用文本嵌入模型如 BGE、E5将所有评测样本编码成向量。然后将可疑的高风险训练文档段也编码通过向量相似度搜索找出语义高度相近的对。这能发现翻译成其他语言又翻回来的污染。倒排索引与模型困惑度针对常识、数学等评测也可直接搜索关键词然后让一个小语言模型计算该段落与评测题的困惑度。如果模型对这段训练文本接上评测问题的语言感到极其“不意外”低困惑度说明很可能训练时已见过。工程实现与处理在实际项目中这个检查过程通常是分离评测集将所有用于评估的基准数据MMLU, HellaSwag, HumanEval 等统一处理成id, 文本, 源的格式。建立全量索引在 Spark 或 Ray 集群上对经过初步清洗的训练集建立 13-gram 的倒排索引或后缀数组。批量碰撞检测用每个评测样本的所有 13-gram去索引里快速检索碰撞的文档 ID。后验过滤与移除对碰撞的文档进行精确比对根据最长公共子序列长度/比例阈值最终确定污染文档列表。执行移除将这些文档从最终训练集中完全剔除而不是打标签。一个Token经过Decoder-only模型得到下一个Token概率分布需要经过哪些主要计算步骤当一个 Token 进入 Decoder-only 模型如 GPT 系列最终得到下一个 Token 的概率分布需要经历以下几个核心计算步骤。这个过程本质就是模型的一次前向传播。输入表示从 Token 到向量Token 嵌入输入 Token 的 ID 通过嵌入矩阵 We映射为一个稠密向量 h0维度为 d_model。 例如词汇表大小 V模型维度 d嵌入矩阵就是 V×d的查找表。位置编码由于自注意力自身不包含顺序信息需要给 h0加上一个位置编码向量。 GPT 类模型通常使用可学习的位置嵌入直接根据当前 Token 的绝对位置查表得到然后与 Token 嵌入相加堆叠的 Decoder 层处理这是模型的主体由多个结构相同但参数独立的层堆叠而成如 GPT-3 有 96 层。每层依次执行步骤 A带因果掩码的多头自注意力生成 Q、K、V输入 hin通过三个不同的线性层产生 Query、Key、Value 矩阵。计算注意力分数得到一个注意力分数矩阵。应用因果掩码这是 Decoder 的核心。使用一个上三角矩阵多为 -∞遮盖未来位置确保当前 Token 只能看到自身及之前的 Token防止信息泄露。计算注意力权重对遮盖后的分数做 Softmax得到归一化的注意力权重。加权求和权重矩阵乘以 V得到注意力输出。多头拼接与线性投影将多个头的输出拼接通过一个线性层 WO映射回原维度得到自注意力的最终输出 attn_out。步骤 B残差连接与层归一化 (Add Norm)将 attn_out和该层的输入 hin相加残差连接再进行层归一化Layer Normalization现在多用 Pre-LN即归一化在子层之前但原理上计算流程仍是残差相加后接归一化或先将输入归一化再进子层然后残差相加。主流实现如 GPT-2 使用 Post-LN但 GPT-3 及以后很多用 Pre-LN。具体顺序不影响抽象步骤。步骤 C前馈神经网络 (FFN)归一化后的结果通过一个全连接网络通常由两个线性变换和一个激活函数组成如 ReLU、GeLU 或 SwiGLU 变体这个网络对每个位置独立计算扩展并压缩维度增强非线性表达。步骤 D再次残差连接与层归一化将 FFN 的输出与输入它的向量相加残差连接再做层归一化。 此时得到该层的最终输出并作为下一层的输入。输出概率分布经过所有 Decoder 层后得到最终的隐藏状态向量 hfinal仅取当前 Token 位置对应的向量。线性层 (LM Head)将 hfinal乘以一个线性变换矩阵 Wlm维度为 d×V通常与 Token 嵌入矩阵共享权重得到每个词的原始分数或加上偏置)。Softmax 函数将 logits 转换成概率分布此时每个位置的值代表词汇表中对应 Token 成为下一个 Token 的概率。MHA、MQA和GQA在KV头数量、效果、显存占用及推理速度上有什么区别在 Decoder-only 模型中多头注意力MHA、多查询注意力MQA和分组查询注意力GQA的核心区别在于KV 头的共享方式。这直接影响模型效果、推理显存和速度。以总头数 HKV 头数 Hkv为例三者的对比如下特性MHA (标准多头注意力)MQA (多查询注意力)GQA (分组查询注意力)KV 头数量HkvH(每个 Q 头对应独立的 K、V 头)Hkv1(所有 Q 头共享同一组 K、V)HkvG其中 1GH(Q 头分成 G组组内共享 K、V)模型效果最好表达能力最强基准最高。略有下降因 KV 表示受限可能轻微影响生成质量和训练收敛。接近 MHA通过分组共享平衡了表达力与效率实际效果几乎无损。推理显存占用 (KV Cache)最大需缓存所有 H个头的 K、V大小为 2×L×H×dk。最小仅缓存 1 组 K、V显存为 MHA 的 1/H。居中缓存 G组显存为 MHA 的 G/H倍。 例如 H32,G4则节省约 8 倍显存。推理速度最慢KV Cache 庞大显存带宽成为瓶颈数据搬运开销大。最快极小的 KV Cache 大幅减少了显存读写解码速度显著提升。居中速度介于两者之间通过减少 KV Cache 大小获得明显加速。关键细节说明为什么影响显存和速度自回归生成时每个 token 都要将过去所有 token 的 K、V 矩阵缓存在显存中KV Cache避免重复计算。KV 头数量直接决定了这个缓存的大小。缓存越小推理时显存占用越低从显存读取数据的速度瓶颈也越小推理就越快。为什么 GQA 成为主流MQA 将效率推向极致但效果损失可能难以接受。GQA 则在两者间找到了平衡。LLaMA 2、LLaMA 3、Mistral 等主流模型均采用 GQA。通常设置 G8或 G4这样几乎可以保持与 MHA 相同的质量同时获得数倍的推理效率和显存节省。参数量与训练MQA 和 GQA 减少了 K、V 投影矩阵的参数量训练速度可能稍快但主要增益仍在推理阶段。RoPE相比绝对位置编码有哪些优势外推到更长上下文时可能出现什么问题RoPE旋转位置编码在处理长序列和捕捉相对关系上确实比绝对位置编码有显著优势但在外推到更长上下文时也并非完美无缺。相比绝对位置编码的优势绝对位置编码如可学习的嵌入或固定的正弦编码通常是在词嵌入上相加一个位置向量而RoPE的核心创新是通过旋转矩阵来实现位置信息的注入。这带来了几个关键优势内在地捕捉相对位置这是RoPE最本质的设计优势。经过RoPE编码后两个token的Query和Key向量做内积时结果天然只依赖于它们之间的相对距离而不依赖于各自的绝对位置。这让模型能更直接、高效地学习“两个词距离多远”这样的关系而非从绝对坐标中间接推导。更好的序列长度外推能力绝对位置编码遇到训练时没见过的长度会因找不到对应的位置向量而性能崩溃。RoPE则不同它通过旋转角度来编码位置而角度可以连续变化。因此即使测试序列长于训练序列模型也能计算出相应的旋转矩阵这为外推提供了可能性能下降也相对平缓。具备远程衰减特性RoPE天然带有一个符合语言直觉的属性随着两个token相对距离的增加它们注意力分数的上限会逐渐降低。这意味着模型会自然地更关注邻近的上下文有助于聚焦局部信息。参数效率与灵活性RoPE是一种固定的数学变换不引入任何可学习参数。这避免了为最大序列长度预留嵌入空间的问题让模型结构更简洁灵活。外推到更长上下文时的问题尽管RoPE具备外推基础但直接将模型应用到远超训练长度的文本例如从2K外推到32K效果通常还是会显著下降这主要源于模型在推理时遇到了训练阶段从未见过的“旋转角度”。具体表现为以下问题高频维度的“角度混叠”这是最关键的问题。RoPE会在不同维度上设置不同频率低维度高频旋转很快即使微小的位置变化也会带来大的角度变化。当位置ID变得非常大时这些高频维度的旋转角度会远超训练时的分布出现周期性重复。模型会因此将不同的远距离位置混淆为相同的“位置指纹”导致注意力混乱。注意力分数的“分布失真”外推时由于旋转角度异常Query和Key的内积值可能进入一个全新的范围导致Softmax后的注意力权重分布异常。模型可能会突然对某些无关的token分配极高的注意力或让注意力分布变得极度平坦无法有效提取信息直接表现为困惑度PPL急剧升高。低频维度的“周期未完成”负责长程依赖的低频维度其旋转周期非常长。当外推长度远小于其完整周期时模型就没法见到一个完整的位置周期变化。这意味着模型在处理长程依赖时缺少了足够的训练信号难以准确利用低频维度的位置信息。为了解决这些问题研究者们提出了位置插值PI、NTK-aware RoPE和YaRN等方法。它们的核心思路都是通过对旋转频率或位置索引进行缩放把长文本的位置压缩回模型训练时熟悉的范围内从而在不重新预训练的情况下显著扩展模型的上下文窗口。推理阶段KV Cache缓存了什么其显存占用与哪些因素有关推理阶段的KV Cache本质上是用空间换时间的经典做法它缓存的是每一层中历史Token在注意力计算时生成的Key和Value向量。KV Cache到底缓存了什么可以把它理解为模型对历史上下文的“压缩记忆”。具体来说它是一组堆叠的矩阵假设模型有L层每层有多头注意力。推理时每层都需要重新计算注意力KV Cache就为每一层、每个注意力头都维护了独立的K和V缓存。缓存的是计算结果而非原始输入存储的是原始嵌入序列[x_1, x_2, ..., x_t]分别乘以本层的W_K和W_V权重矩阵后得到的Key和Value向量。模型不会缓存Query因为Query只来自当前最新的Token。它是逐步填充的初始化时为空。生成第一个Token时整个输入序列的K、V被计算并存入缓存。之后每生成一个新Token只需计算这个新Token的K、V并将其追加到缓存尾部。这样就不用对过去所有Token做重复的矩阵乘法了。显存占用的决定性公式KV Cache的显存占用可以通过这个公式精确计算显存占用 2 × 层数 × 缓存序列长度 × KV头数 × 每个头的维度 × 精度字节数其中每个因素都直接影响最终大小2常数代表需要同时缓存Key和Value两组向量。层数更深参数大的模型缓存层数也多占用线性增加。例如34层的模型就比12层的模型占用更多。缓存序列长度这是最关键、最动态的因素。它随时间线性增长。对话轮次越多、输出越长这个值就越大显存占用也线性增长。它是推理后期显存紧张的主要原因。KV头数与每头维度这取决于注意力架构MHA、MQA、GQA。KV头数越少缓存越小。例如在总头数相同的情况下GQA的KV缓存就比MHA小得多。每头维度d_k是模型隐藏层维度除以总头数。精度字节数FP16占2字节量化到INT8或INT4则只占1或0.5字节。量化能直接且成倍地减少显存占用。