详细摘要 摘要
生成:2025-06-17 12:12摘要详情
- 音频文件
- 2025-06-17 | Stanford CS336 Language Modeling from Scratch | Spring 2025 | Lecture 14: Data 2
- 摘要类型
- 详细摘要
- LLM 提供商
- openai
- LLM 模型
- gemini-2.5-pro-preview-06-05
- 温度
- 0.3
- 已创建
- 2025-06-17 12:12:38
摘要内容
概览/核心摘要 (Executive Summary)
本讲座深入探讨了大规模语言模型训练中数据过滤与去重的核心算法和技术。首先,回顾了上节课关于数据来源(如原始网络爬取、GitHub dumps)和基本处理流程(HTML转文本、过滤、去重)。本讲重点介绍了三类过滤算法:基于n-gram模型的KenLM,用于计算困惑度进行筛选,特点是快速但相对粗糙;基于快速分类器的fastText,通过词嵌入和哈希技巧实现高效文本分类,常用于判断数据质量或语言;以及基于重要性重采样的DSIR,通过估计目标数据与原始数据分布的比率进行数据选择,理论上更能保证数据多样性。
随后,讲座阐述了这些过滤机制在具体场景的应用:语言识别(如使用fastText识别特定语言文本,并讨论了其局限性),质量过滤(引用GPT-3、LLaMA、phi-1等模型的实践,强调高质量数据对模型性能的提升,甚至可通过大模型辅助生成高质量标注),以及毒性过滤(如Dolma项目使用fastText和Jigsaw数据集进行内容筛选)。
最后,详细讨论了数据去重技术。区分了完全重复和近似重复,并强调去重对于提升训练效率和避免内容记忆的重要性。介绍了精确去重(基于哈希值)、布隆过滤器(一种内存高效的近似集合成员测试结构,可控制假阳性率),以及针对近似重复的Jaccard相似度、MinHash(将Jaccard相似度与哈希碰撞概率关联)和局部敏感哈希(LSH)(通过“条带与行”的and-or结构,将相似项目以高概率映射到同一桶,实现对相似度阈值的“锐化”判断)。讲座强调,这些算法工具是基础,真正的理解和应用需要通过实践培养直觉。
过滤算法 (Filtering Algorithms)
给定目标数据集 $T$(通常较小,质量高)和大量原始数据 $R$,过滤算法的目标是在 $R$ 中找到一个与 $T$ 相似的子集 $T'$。
理想过滤算法特性:
* 泛化能力: 希望算法能从 $T$ 泛化,找到与 $T$ 不完全相同但性质相似的 $T'$。
* 极高效率: 必须能快速处理海量原始数据 $R$。
1. KenLM
KenLM是一种基于n-gram模型(采用Kneser-Ney平滑)的语言模型,实现快速,常用于数据过滤。
* 核心概念:
* 最大似然估计: 如三元语法 $p(\text{in} | \text{the cat}) = \frac{\text{count}(\text{the cat in})}{\text{count}(\text{the cat})}$。
* 平滑处理: Kneser-Ney平滑利用低阶n-gram信息处理未见过的n-gram,缓解数据稀疏问题。
* 代码示例: 使用KenLM计算困惑度 (Perplexity)。
* model = kenlm.Model("var/en.arpa.bin")
* 通过对数概率和token数量归一化计算困惑度,避免偏爱短文档。
* 示例困惑度:
* "Stanford University..." (维基百科摘录): 77.0 (原口误为187)
* "If you believe that the course staff..." (CS336网站内容): 111.0
* "asdf asdf asdf asdf asdf" (无意义文本): 1100000.0
* "the the the the the the the the the the the the the the the the" (重复词): 1.1 (讲者指出此模型对此类文本困惑度较低)
* 应用案例: CCNet (Wenzek et al. 2019)
* 对文本段落按困惑度升序排序,保留排名前1/3。
* 此方法被用于LLaMA的初代数据集构建。
* 总结: KenLM “快速但相对粗糙” (fast, but it's crude)。
2. fastText
fastText (Joulin et al. 2016) 是一种为文本分类设计的快速分类器,性能可与更慢的深度学习分类器媲美。
* 模型架构: Bag of Word Embeddings (词嵌入词袋)
* 通过引入一个隐藏层 $H$ 来减少参数数量,从 $V \times K$(词袋模型)降至 $H \times (V + K)$。
* 模型:$y = \text{softmax}(U(W(x).\text{mean}(\text{dim=0})))$,其中 $W$ 为词嵌入矩阵,$U$ 为分类头矩阵。讲者指出其本质上是线性分类器,无非线性激活。
* 实现技巧:
* 优化: 并行化、异步SGD。
* 学习率: 线性衰减。
* 特征: 使用n-grams词袋(如bigrams)。
* 哈希技巧: 将数量可能巨大的n-grams映射到固定数量的桶 (bins) 中(如 $10^7$ 个),以处理词表外和大规模n-gram问题。
* 应用: 对于质量过滤任务(好/坏),$K=2$,fastText实质上是二元线性分类器。
* 扩展性: 虽然可以使用更复杂的模型(如BERT, LLaMA)进行分类,但速度会变慢,可能不如直接用这些计算资源训练主模型。
3. DSIR (Data Selection via Importance Resampling)
DSIR (Xie et al. 2023) 是一种通过重要性重采样进行数据筛选的方法。
* 基本设置:
* 目标数据集 $D_p$: 较小,高质量。
* 提议(原始)数据集 $D_q$: 较大。
* 核心思想:
1. 在 $D_p$ 上拟合目标分布 $p$,在 $D_q$ 上拟合提议分布 $q$。
2. 使用重要性权重 $w(x) \propto p(x)/q(x)$ 对来自 $D_q$ 的样本进行重采样。
* 挑战与解决: $D_p$ 通常太小,难以估计好的模型 $p$。解决方案是使用哈希化的n-grams(类似fastText中的技巧)来估计分布。
* 代码示例: 简化的DSIR流程,使用unigram和哈希技巧估计文本概率。
* 结果: 在GLUE基准测试上,使用BERT-style模型时,DSIR表现略优于启发式分类 (fastText)。
| 方法 | MNLI | QNLI | QQP | RTE | SST-2 | MRPC | CoLA | STS-B | Avg |
| :------------------------- | :--- | :--- | :--- | :--- | :--- | :--- | :--- | :--- | :--- |
| Random selection | 82.3 | 88.9 | 89.3 | 67.3 | 90.0 | 87.4 | 49.4 | 88.6 | 80.2 |
| Heuristic classification | 82.6 | 89.7 | 88.5 | 68.9 | 88.9 | 86.0 | 48.1 | 88.6 | 79.8 |
| Top-K Heuristic | 83.3 | 88.6 | 89.0 | 70.0 | 91.1 | 86.3 | 50.2 | 89.3 | 81.4 |
| DSIR | 83.8 | 90.7 | 89.0 | 75.0 | 90.4 | 87.7 | 54.0 | 89.1 | 82.3 |
| Top-K DSIR | 83.3 | 89.6 | 89.4 | 72.4 | 91.0 | 86.1 | 49.9 | 89.5 | 81.3 |
* 与fastText比较:
* DSIR对整个分布进行建模,是捕获数据多样性的“更原则性的方法”。
* 两者计算复杂度相似。
* 两者都可以通过改进底层模型(如使用更复杂的n-gram或神经方法)来提升性能。
重要性采样 (Importance Sampling) 简介
- 设置: 目标分布 $p$ (希望从中采样),提议分布 $q$ (实际能从中采样)。
- 步骤:
- 从 $q$ 采样得到样本。
- 计算每个样本的权重 $w_i \propto p(x_i)/q(x_i)$ 并归一化。
- 根据权重 $w$ 从步骤1的样本中进行有放回的重采样。
过滤框架总结
所有方法都遵循“估计模型 -> 评分 -> 根据分数保留样本”的模式。
| 方法 | 核心思想 | 步骤 |
|---|---|---|
| KenLM (生成模型) | 估计目标数据 $T$ 的生成模型 $p_T(x)$。 | 1. $score(x) = p_T(x)$ (或其衍生的困惑度) 2. 保留 $score(x)$ 大于阈值的样本。 |
| fastText (判别分类器) | 训练分类器区分 $T$ 和 $R$。 | 1. $score(x) = p(x \in T |
| DSIR (重要性重采样) | 估计 $T$ 和 $R$ 的分布比率。 | 1. $score(x) = p_T(x) / p_R(x)$ 2. 按与 $score(x)$ 成正比的概率重采样。 |
过滤应用 (Filtering Applications)
相同的过滤机制可用于不同任务。
1. 语言识别 (Language Identification)
- 任务: 识别特定语言(如英语)的文本。
- 原因:
- 特定语言高质量数据整理困难。
- 计算受限时,多语言训练会分散单语言的计算资源/tokens。
- 模型差异: BLOOM (2022年) 仅30%英语数据,可能导致英语能力欠佳;而当前前沿模型(GPT-4, Claude, Gemini, Llama)通常是重度多语言且充分训练。
- 工具: fastText 语言识别模型。
- 开箱即用,支持176种语言,在Wikipedia、Tatoeba等多语言网站上训练。
- 案例: Dolma数据集保留 $p(\text{English}) \ge 0.5$ 的页面。
- 代码演示:
- "The quick brown fox..." -> 英语 (概率 0.71)
- 德语句子 -> 德语
- 数学公式 -> 弱识别为英语
- 代码片段 -> 俄语 (概率最高)
- "hello" -> 意大利语
- "bonjour" -> 法语
- 西班牙语和英语混合句 -> 偏向西班牙语
- 注意事项:
- 短序列文本识别困难。
- 低资源语言识别困难。
- 可能意外过滤掉英语方言。
- 相似语言(如马来语和印尼语)识别困难。
- 代码转换 (code-switching) 的界定和处理不明确。
- 案例: OpenWebMath (2年前论文)
- 目标: 从Common Crawl整理大型数学文本语料库。
- 过滤规则:
- 基于规则初筛(如包含LaTeX命令)。
- 使用在ProofPile上训练的KenLM模型,保留困惑度 < 15000 的文本。
- 训练fastText分类器预测文本是否为数学写作,根据规则调整阈值。
- 结果: 产生14.7B tokens,训练的1.4B参数模型性能优于在20倍通用数据上训练的模型。这展示了“数据过滤的效用” (utility of data filtering)。
2. 质量过滤 (Quality Filtering)
- 一些项目 (C4, Gopher, RefinedWeb) 不使用基于模型的过滤。
- 另一些项目 (GPT-3, LLaMA) 则使用,这正成为常态。
- 案例:
- GPT-3:
- 正样本: Wikipedia, WebText2, Books1, Books2 (非Common Crawl来源)。
- 负样本: Common Crawl。
- 训练了一个基于词特征的线性分类器,并根据分数随机保留文档。
- LLaMA (初代):
- 正样本: Wikipedia引用的页面 (非Wikipedia本身)。
- 负样本: Common Crawl中随机采样。
- 保留被分类为正样本的文档 (似乎没有随机采样)。
- phi-1:
- 理念: 使用极高质量的“教科书式”数据训练小模型 (1.3B)。
- 数据: 包括来自GPT-3.5/4的合成数据和过滤后的真实数据。
- 流程:
- 使用GPT-4对The Stack的Python子集中的10万个文档进行标注(判断其对学习基础编程概念的教育价值),获得高质量正样本 $T$。
- 使用这些标注数据训练一个随机森林分类器(输入为预训练的“cojam model”[不确定,原文如此]的嵌入)。
- 用该分类器从整个Python子集 $R$ 中筛选数据。
- 结果: 在HumanEval上,使用新过滤子集训练的模型性能 (17.68% @36k steps) 优于使用原始子集训练的模型 (12.19% @96k steps)。这说明可以使用强大的模型(如GPT-4)来创建高质量的小型标注集 $T$,然后蒸馏出一个快速分类器来扩展到大型原始数据集 $R$。
- GPT-3:
3. 毒性过滤 (Toxicity Filtering)
- 案例: Dolma的毒性过滤
- 数据集: Jigsaw Toxic Comments dataset (源自Wikipedia对话页面的评论,标注有toxic, severe_toxic, obscene, threat, insult, identity_hate等标签)。
- 模型: 训练了两个fastText分类器:一个针对仇恨言论,一个针对NSFW (Not Safe For Work) 内容。
- 代码演示:
- 示例1 ("Are you threatening me...") -> safe
- 示例2 (内容未展示) -> nsfw
- 讲者评论这两个示例句子本身都是“fine”,暗示分类器可能存在判断偏差或过于敏感。
数据去重 (Deduplication)
两种类型的重复
- 完全重复 (Exact duplicates): 如镜像网站、GitHub forks。
- 近似重复 (Near duplicates): 仅有少量词元差异的文本,如服务条款、模板化写作(如产品描述中替换实体)、轻微编辑错误。
- 示例: C4数据集中一句“This sentence is indeed English”出现了61,000次,来源于一个亚马逊产品的描述。
为什么要去重?
- 提高训练效率: 减少tokens数量。
- 避免记忆: 减轻版权和隐私问题,防止模型直接复述训练数据。
- 讲者认为去重与质量过滤是互补的:质量过滤是去除不好的数据,去重是确保好的数据只出现适量次数。
设计空间
- 项目单位 (Item): 句子、段落还是文档?
- 匹配方式 (How to match): 精确匹配、公共子项存在、还是公共子项比例?
- 处理动作 (Action): 全部移除,还是只保留一个?
核心挑战: 去重本质上是项目间的两两比较 ($O(n^2)$),需要近似线性的时间复杂度算法才能扩展到大规模数据集。哈希函数是实现这一目标的基础。
1. 哈希函数 (Hash Functions)
将项目映射到较小的哈希值(整数或字符串)。
* 加密哈希函数 (如 SHA-256): 抗碰撞性强,但速度慢。
* 非加密哈希函数 (如 MurmurHash, CityHash): 速度快,不保证强抗碰撞性,常用于哈希表。讲座中倾向于使用后者。
2. 精确去重 (Exact Deduplication)
- 流程:
- 项目: 字符串。
- 匹配: 精确匹配。
- 动作: 只保留一个。
- 通过计算每个项目的哈希值,将具有相同哈希值的项目分组,然后每组只保留一个。易于用MapReduce并行化。
- 案例: C4 数据集
- 项目: 3个句子的跨度 (span)。
- 匹配: 精确匹配。
- 动作: 只保留一个。
- 讲者顾虑: 从文档中间移除一个span可能会破坏文档的连贯性,但“人们似乎不在乎”。
3. 布隆过滤器 (Bloom Filter)
- 目标: 一种高效的、近似的数据结构,用于测试集合成员资格。
- 特点:
- 内存高效。
- 可更新(添加元素),但通常不能删除元素。
- 如果返回 "no",则元素绝对不在集合中。
- 如果返回 "yes",则元素很可能在集合中,但有小概率是 "no"(假阳性)。
- 原理:
- 使用一个位数组 (bit array) $m$ 和 $k$ 个独立的哈希函数。
- 插入: 对每个待插入项目,用 $k$ 个哈希函数计算出 $k$ 个位置,并将位数组中这些位置设为 1。
- 查询: 对每个待查询项目,用 $k$ 个哈希函数计算出 $k$ 个位置,只有当所有这些位置都为 1 时,才认为项目可能在集合中。
- 假阳性率分析:
- 假阳性率 $f \approx (1 - e^{-kn/m})^k$,其中 $n$ 是插入的项目数。
- 给定 $m/n$ 的比率,最优的 $k = \ln(2) \cdot (m/n)$。此时 $f \approx (0.5)^k$。
- 案例: Dolma
- 设置假阳性率为 $10^{-15}$。
- 对段落级别进行精确去重。
4. Jaccard 相似度与 MinHash
- Jaccard 相似度: 用于衡量两个集合 $A, B$ 的相似性。
$$J(A, B) = \frac{|A \cap B|}{|A \cup B|}$$
如果两个文档的 Jaccard 相似度大于某个阈值(如0.99),则认为它们是近似重复的。 - MinHash:
- 一种特殊的哈希函数 $h_{min}$,它满足 $P[h_{min}(A) = h_{min}(B)] = J(A, B)$。
- 思想: 对于一个随机排列(或随机哈希函数映射到整数),一个集合的MinHash值是该集合中所有元素经过排列(或哈希)后的最小值。两个集合的MinHash值相等的概率等于它们的Jaccard相似度。
- 论证: 考虑所有元素的并集,如果随机排列后的第一个元素恰好属于交集,则两个集合的MinHash值会相等。
5. 局部敏感哈希 (Locality Sensitive Hashing - LSH)
- 目标: 将相似的项目以高概率哈希到同一个桶中,不相似的项目以低概率哈希到同一桶。
- 问题: 单个MinHash的碰撞概率 $s$ (即Jaccard相似度) 是一个线性函数,不够 "陡峭"。希望当 $s > t_{threshold}$ 时碰撞概率接近1,当 $s < t_{threshold}$ 时碰撞概率接近0。
- 解决方案: Bands and Rows (条带与行)
- 使用 $n$ 个独立的MinHash函数,其中 $n = b \times r$ ($b$ 为条带数,$r$ 为每个条带的哈希函数/行数)。
- 将这 $n$ 个哈希签名分成 $b$ 个条带,每个条带有 $r$ 个哈希值。
- 碰撞规则: 如果两个文档至少有一个条带中的所有 $r$ 个哈希值都完全相同,则认为它们是候选对(可能碰撞)。
- 概率分析:
- 一个条带内所有 $r$ 个哈希值都匹配的概率: $s^r$ (AND逻辑)。
- 一个条带内不匹配的概率: $1 - s^r$。
- 所有 $b$ 个条带都不匹配的概率: $(1 - s^r)^b$。
- 至少在一个条带中匹配的概率 (即LSH碰撞概率): $P(\text{collision}) = 1 - (1 - s^r)^b$ (OR逻辑)。
- 这种 and-or 结构产生了一个S型曲线。
- 参数影响:
- 增加 r (每个band的hash数): 使S曲线更陡峭并向右移动(匹配更难,阈值更高)。
- 增加 b (band的数量): 使S曲线向左移动(匹配更容易,阈值更低)。
- 阈值近似: S型曲线的拐点(阈值)大约在 $t \approx (\frac{1}{b})^{1/r}$。
- 实践案例: 一篇论文中使用了 $b=20, r=450$,计算出的近似阈值 $t \approx 0.99$。在此阈值处的碰撞概率约为 $0.64$ (理论上趋近于 $1 - 1/e \approx 0.632$)。
核心观点与结论
讲座系统介绍了用于语言模型数据预处理的过滤和去重算法。
* 过滤: KenLM、fastText和DSIR等工具可以基于模型评分有效地筛选数据,应用于语言识别、质量提升和毒性内容去除。高质量、有针对性的数据对模型性能至关重要,甚至可以利用现有强模型辅助生成或筛选目标数据。
* 去重: 精确去重(如用布隆过滤器)和近似去重(MinHash与LSH)是处理海量数据中冗余的关键技术,有助于提高训练效率和避免模型过度记忆。LSH通过巧妙的“条带与行”设计,能够高效地找到近似重复的文档。
* 实践: 讲者最后强调,虽然提供了算法工具,但真正掌握数据处理需要在实践中不断尝试、观察和培养直觉。
讲者提及的待办事项/未来方向:
* 下一讲将开始讨论强化学习和对齐 (Reinforcement Learning and Alignment)。
转录中未明确说明或不确定的点:
* phi-1模型质量过滤中使用的嵌入模型称为 "cojam model",具体指代不明,可能是转录错误。
* 讲者在讨论近似去重时提到一篇论文 "70 duportrait",具体论文名称不明确,可能是转录错误,或指代与语义复制相关的研究。
* 讲者在开篇回顾时提到Bert到"homo"的模型,"homo"指代不明,可能是某个模型名称的转录错误或简写。
* 讲者在介绍KenLM时提到一个内容点可能丢失了:"I feel like there was some content that was I meant to go through that's missing. Oh, well, maybe got deleted."