学途智助
首页
分类
标签
关于网站
登录
eeettt123
2025-08-16
18
作者编辑
CS336学习记录-Lec13&14
小书匠/收集/知乎问答/zhuobai/8a7d2c4262f2d8fe6f016d32dbe07b1f [toc] 发布于: 美国 创建时间: 2025-8-11 22:27:26 点赞总数: 9 评论总数: 0 收藏总数: 10 喜欢总数: 0 之前的课程我们都在思考:how to train a model _given data,_ 而这两节课我们会主要 focus:what _data_ should we train on? percy 老师在课程刚开始就抛出一个 hot take: **data 是训练 LLM 最重要的东西。** 为什么是这个观点呢,我们来看看各家公司披露了什么信息。开源权重的模型(Llama 3、DeepSeek)在架构设计甚至训练流程方面都有完全的透明度, **_但几乎不会公开其使用的 data 相关信息_** 。造成这种数据保密的原因有二:商业竞争压力和版权责任问题。而本质上,数据问题是一个 **long-tail problem** ,它的复杂度与人力投入成正比——这与模型架构和系统设计的 scale 不同。 ## Lecture13-Data 1 整个模型的训练阶段可以粗略划分为: - **Pre-training** :在 raw text(例如网页文档)上进行大规模训练 - **Mid-training** :在 high quality data 上继续训练,增强模型能力 - **Post-training** :通过 instruction following data 进行 fine-tune,或者进行 RLHF 来优化模型的指令理解能力 而实际上,这些阶段之间的界限往往模糊,甚至可能存在更多中间阶段,但基本流程可以理解为:\[大量 lower quality data\] 到 \[少量 high quality data\]。 我们先从 pre-training 开始,看看一些热门模型所用的 data。 - **_Bert:_** 回到 2018 年,当时的 Bert 主要用两个 corpus 训练,BooksCorpus 和 [Wikipedia](https://www.wikipedia.org/)。前者总共有 7K 本书,985 M words,而后者截至 2024 年,拥有 329 种语言版本、共 6200 万篇文章,要求不包含 original thought(不允许发表意见、宣传、个人网页等),并且收录有知名度的文章(可靠来源)。但即使是高质量来源,也可能包含恶意内容 - **_GPT2:_** 使用 WebText 训练,总共 8 million 页,40GB text,整体质量不高 - **_Common Crawl:_** 一家成立于 2007 年的非营利组织。大约每个月进行一次 web crawl,截至目前(2008–2025 年),已进行过约 100 次 crawl。抓取过程使用 Apache Nutch(如下图),从一批 seed URLs 开始(至少数亿个),从 queue 中下载网页,并将其中的 hyperlinks 加入 queue  - **_CCNet:_** common crawl 的质量其实不是很高,CCNet 的 goal 就是自动化建立 large, high-quality datasets。其中包括 Deduplication(基于 light normlization),Language identification(保留目标语言,比如英语),Quality filtering(保留看起来类似 Wikipedia 的文档) - **_C4:_** Collosal Clean Crawled corpus,它们也发现 Common Crawl 大多数并不是有用的 natural language,不再使用模型来 filter,而是一些 manual rules - **_GPT-3:_** 使用处理后的 Common Crawl、更多 link 的 WebText2、神秘的 books corpora、和 Wikipedia。总共 570 GB (400 billion tokens) - **_The Pile:_** 收集了 22 种 high-quality 领域,总共 825 GB of text (~275B tokens)。其中还特别介绍了下 Project Gutenberg 和 Books3,stackexchange(StackOverflow 的信息) 和 GitHub  - **_Gopher:_** 使用 MassiveText dataset 训练,包含 MassiveWeb、C4、Books、News、GitHub、Wikipedia - **_LLaMA:_** 时间线来到 2022 年,dataset 包括使用 CCNet 处理 CommonCrawl、C4(更加多样;rule-based过滤)、GitHub(保留宽松许可协议的代码,基于 manual rules 过滤)、Wikipedia(2022 年 6–8 月的数据,manual filtering)、Project Gutenberg、Books3(The Pile)、arXiv(移除评论,参考文献)、Stack Exchange。总共1.2 T token - **_RefinedWeb:_** 它们认为 web data is all you need,使用 trafilatura 将 HTML 处理为 text,使用 Gopher rules 过滤,避免 ML-based filtering 产生的 bias,发布了 600B (总共 5T) tokens - **_Dolma:_** 主要组成如下图  - **_DataComp-LM:_** 它们的 goal 是定义一个用于测试不同数据处理算法的 standard dataset,将 Common Crawl 处理为 DCLM-pool(240 T token),使用 quality classifier 从 DCLM-pool 中筛选得到 DCLM-baseline,最终得到 3.8T tokens,筛选过程如下图  - **_Nemotron-CC:_** 认为 DCLM filter 过滤了太多 data,需要更多的 token 在 data part 我们肯定要明确下 **_copyright(版权)_** 的问题,percy 老师在视频科普了很多关于 copyright 的问题,我主要总结下 foundation models 相关的考量:1、copying data(即使仅作为训练的第一步)即已构成侵权,即便之后不做任何处理; 2、 训练 ML model 是 transformative 的(与简单的复制粘贴相去甚远)3、ML system 主要关心 idea(例如“停车标志”),而不是具体的表达(某个停车标志图片的具体艺术化细节)。 最后是关于 **_Mid-training + post-training_** 的内容,这里我们主要 focus 一些特别的能力。 1. **_long context:_** 模型对长上下文是有需求的(例如想在整本书上做问答),比如 DeepSeek v3 就支持 128K tokens 的回答,而 Transformer 的计算量随 sequence length 呈二次方增长,所以在 pre train 处理 long context 效率不高,更倾向于后期扩展 2. **_tasks:_** 将大量现有 NLP dataset 转为 prompts 3. **_instruction chat:_** 更多开放式的指令,大量使用合成数据。这里有很多 dataset 比如 Alpaca、Vicuna 等等就不一一介绍了 ## Lecture14-Data 2 这节课我们主要 deep dive into the mechanics,主要包含三部分内容: - **_filtering 算法_** (比如 classifiers) - **_filtering 的应用_** (language, quality, toxicity) - **_Deduplication_** (Bloom filters, MinHash, LSH) 首先来看一些 filtering 的算法,我们可以从 high level 的角度去理解 filtering:给定一些 **target data** T 和很多 **raw data** R, 找到 R 中和 T 相似的子集 T'。  1. **_KenLM_** KenLM 是最初为机器翻译开发的 fast implementation,常用于 data filtering,极其简单并且高速,只需统计并归一化。其中 n-gram 语言模型的 Maximum likelihood estimation:n = 3: p(in | the cat) = count(the cat in) / count(the cat),但问题是当 n 较大时,很多 n-gram 的计数为 0,所以使用 Kneser-Ney smoothing 处理未见过的 n-gram,比如 p(in | the cat) depends on p(in | cat) too。总结的话, **_Kneser-Ney n-gram 语言模型的速度快,但方法粗糙。_** 2. **_FastText_** fastText 的任务是文本分类(例如情感分类),目标是训练一个快速的 text classifier,它们发现,fastText 的效果与速度更慢的 neural network classifiers 相当。 ```text H = 16 # Hidden dimension V = 8192 # Vocabulary size K = 64 # Number of classes W = nn.Embedding(V, H) # Embedding parameters (V x H) U = nn.Linear(H, K) # Head parameters (H x K) y = softmax(U(W(x).mean(dim=0))) # Output probabilities (K) ``` 可以看到 classifier 的参数量只有 H\*(V + K) parameters 3. **_DSIR_** DSIR 也就是 Data Selection for Language Models via Importance Resampling,那什么是 Importance Sampling 呢,假设我们有两个分布,p 是 target distribution,q 是 proposal distribution,比如下面的数据示例,如果我们随机从 q 中采样 100 个示例,会发现大多数都是 0 和 1,因为 q(0)=0.4,q(1)=0.3,概率较大,与 p 不相同。我们应该怎么做呢, **_计算权重 w = p(x) / q(x),也就是如果某个样本 x 在 p 下概率比在 q 下大,就给它更大的权重,反之权重更小。_** 归一化后再重采样,q 中采样的分布会更接近 p。 ```text # 数据示例 vocabulary = [0, 1, 2, 3] p = [0.1, 0.2, 0.3, 0.4] q = [0.4, 0.3, 0.2, 0.1] # 1. Sample from q n = 100 samples = np.random.choice(vocabulary, p=q, size = n) Samples (q): [0 2 0 2 1 1 0 1 0 1 0 0 0 0 1 1 0 3 1 1 1 1 1 1 3 1 0 2 0 1 3 0 2 1 1 2 0 0 0 3 2 1 1 0 1 1 0 3 2 0 2 0 1 0 1 2 2 2 0 0 0 0 2 1 0 2 0 1 3 0 0 0 0 0 0 0 1 1 2 2 2 1 0 1 1 0 1 0 1 0 1 1 3 3 0 1 0 0 2 0] # 2. Compute weights over samples (w \propto p/q) w = [p[x] / q[x] for x in samples] z = sum(w) # @inspect z w = [w_i / z for w_i in w] # 3. Resample samples = np.random.choice(samples, p=w, size=n) ``` 那 DSIR 的流程是怎样的呢,假设我们有较小的 target dataset D\_p,很大的 raw dataset D\_q,我们用 D\_p 拟合目标分布 p;然后用 D\_q 拟合分布 q;最后使用 p、q 以及原始样本 D\_q 进行 importance resampling。但这样的话 D\_p 太小,无法估计出一个良好的模型,需要用到 哈希 n-grams。计算流程如下图所示:  了解完算法后我们开始进入 filtering 的应用。 1. **_Language identification_** language identification 的目的是 **_找到特定语言(例如英语)的 text_** ,那为什么不直接做 multilingual(多语言)呢,首先在任何特定语言中,想要处理高质量数据都很困难;在算力受限的情况下,每种语言可分配的计算量/训练 token 更少;在 BLOOM 模型中,英语只占 30%(训练不足),因此英语表现受损;大多数前沿模型(GPT-4、Claude、Gemini)都是高度多语言化的。目前就有利用 fastText 做成的 language identification,现成的 classifier,支持 176 种语言。 2. **_Quality filtering_** 一些 dataset 会特意不使用 model-based filtering (C4, Gopher, RefinedWeb, FineWeb, Dolma),而有些会使用 model-based filtering (GPT-3, LLaMA, DCLM) \[并且正在成为标准\]。我们来看一个模型 **phi-1 ,** 它们的理念是: **_使用高质量数据(如教材)来训练一个小模型(1.5B 参数),_** 数据包括来自 GPT-3.5(后期换成 GPT-4)的合成数据,以及经过筛选的数据。 使用预训练 codegen model的输出 embedding 在 **T** 上训练 random forest classifier,从 **R** 中选取被 classifier 判定为正例的数据。 ```text R = "Python subset of the Stack" # Raw data prompt = "determine its educational value for a student whose goal is to learn basic coding concepts" T = "Use GPT-4 with this prompt to classify 100K subset of R to get positive examples" ``` 3. **_Toxicity filtering_** 我们来看一看 Dolma 是如何做有害内容过滤的。Jigsaw Toxic Comments dataset (2018) 的项目目标是帮助人们在网上进行更好的讨论,数据来自 Wikipedia 讨论页的评论,并带有以下标签:`{toxic, severe_toxic, obscene, threat, insult, identity_hate}`。训练了两个 fastText 分类器:hate: positive = {unlabeled, obscene}, negative = all else 和 NSFW: positive = {obscene}, negative = all else。 最后我们来到 Deduplication part!总共有两类 duplicates: **_Exact duplicates_** (镜像站点, GitHub forks) 和 **_Near duplicates_** ,文本内容几乎相同,只是少数 token 不同。near duplicates 的例子有很多,比如一些 service 和 licenses,模板化写作和复制粘贴过程中的细微格式差异(如下图)等等。Deduplication 显然对训练数据是有好处的,比如能提高训练效率(token 减少),避免模型 memorization(缓解版权与隐私问题)。  C4 是怎么做 exact deduplication 的呢,item 是3 句组成的片段,使用 exact match 移除所有重复项只保留一个,但是这样有一个问题:当从文档中间移除一个 3 句片段时,可能会导致剩余文档不连贯。对于这种情况呢,some people 认为:what ever。 Bloom Filter 是一种高效的 **用很少的内存判断某个元素是否在集合中** 的近似算法。首先会建一个长度为 m 的位数组(全是 0),每个元素经过 k 个哈希函数,映射到 k 个位置,把这些位置的值设为 1,然后在查询时,对元素做同样的 k 次哈希,如果这几个位置全是 1,就认为“可能在集合中”;否则一定不在。这种方法的优点是速度快、内存占用小,缺点是可能出现假阳性,不能直接删除元素。 了解完 exact deduplication 我们来看下 approximate set membership,先定义一个 similarity measure,Jaccard similarity(如下图)。例如对于 A = {"1", "2", "3", "4"},B = {"1", "2", "3", "5"},jaccard = 3/5。如果两个文档的 Jaccard similarity ≥ threshold,就认为它们是 near duplicates。但挑战在于要在线性时间内找出 near duplicates。  最后还有关于 MinHash 和 Locality sensitive hashing (LSH) 的讲解,篇幅有限就不详细记录了。 原文地址:[CS336学习记录-Lec13&14](https://zhuanlan.zhihu.com/p/1937123775616390806)
Python
赞
博客信息
作者
eeettt123
发布日期
2025-08-16
其他信息 : 其他三字母的人名首字母都是其他同学发布的哦