- 2025-03-12
-
发表了主题帖:
《大语言模型原理与工程实践》预训练数据构建
# 第三章 预训练数据构建
## 3.1 数据类别及来源
大语言模型的预训练数据主要包含以下类别:
| 数据类型 | 常用数据来源 | 特点 |
|-------------|----------------------------------|----------------------------------------------------------------------|
| **网页数据** | CommonCrawl、C4 | 规模大、多样性高,需严格清洗 |
| **书籍数据** | BookCorpus、Books1/Books2 | 高质量长文本,增强长程依赖能力(受版权限制,获取困难) |
| **百科数据** | 维基百科、百度百科 | 权威性强,语言规范,常分配更高训练权重 |
| **代码数据** | The Stack、GitHub | 提升代码生成能力,含注释和文档 |
| **其他数据** | 学术论文、新闻、多语言、垂直领域 | 增强领域专业性或多语言能力 |
---
### 3.1.1 网页数据
#### 核心来源
- **CommonCrawl**:每月抓取约20TB原始数据,含菜单/乱码,需二次清洗。
- **开源衍生数据集**:
- **C4**:基于CommonCrawl筛选,305GB高质量英文数据。
- **RefinedWeb**:6,000亿Token开源数据,用于训练Falcon模型。
#### 处理挑战
- 需去除低质量内容(广告、乱码),保留正文文本(可用WET格式或自定义解析工具)。
---
### 3.1.2 书籍数据
#### 典型数据集
- **BookCorpus**:开源书籍语料库。
- **CBooks-150K**:复旦大学开源中文书籍数据集,涵盖多领域。
#### 价值
- 长文本连贯性提升模型长程依赖能力,但版权限制导致数据稀缺。
---
### 3.1.3 代码数据
#### 数据构成
#### 开源数据集
- **The Stack**:6TB代码数据,覆盖300+语言。
- **StarCoder训练集**:882GB(含783GB代码数据+GitHub Issues/提交信息)。
---
## 3.2 数据预处理流程
### 3.2.1 正文提取
- **网页数据**:使用WET格式或工具(如jusText)解析HTML。
- **书籍数据**:转换EPUB/MOBI为TXT,PDF需段落识别和格式修正。
### 3.2.2 质量过滤
#### 规则过滤
- 格式统一(标点半角化、去除空白符)。
- 删除低质量文档(如符号占比过高、句子数
- 2025-03-09
-
发表了主题帖:
《大语言模型原理与工程实践》预训练语言模型+初步大语言模型
本帖最后由 佛系阿yu 于 2025-3-9 16:38 编辑
《大语言模型原理与工程实践》第二章到此即结束了,后面有毕业论文,工作实习和论文返修,后面从第三章开始将会是大篇幅的文字,我扫了一下感觉难度很高,我将继续努力更新。
# 2.3 预训练语言模型
基于Transformer结构的预训练语言模型分为三类:
1. **Encoder-Only模型**(如BERT):捕获双向上下文,擅长文本理解任务(NLU)。
2. **Decoder-Only模型**(如GPT系列):单向生成,擅长文本生成任务。
3. **Encoder-Decoder模型**(如T5、BART):统一为序列到序列框架,灵活通用。
---
## 2.3.1 Decoder的代表:GPT系列
### 核心思想
- **预训练+微调**:利用大规模无标注文本预训练,捕捉语言模式,再针对下游任务微调。
- **模型结构**:基于Transformer Decoder,保留多头自注意力机制和前馈网络,移除交叉注意力。
- **训练任务**:自回归语言模型,预测下一个词
最大化似然函数:
$$ L(X) = \sum_i \log P(w_i|w_1, \cdots, w_{i-1}; \Theta) $$
### GPT系列参数对比
| 模型 | 发布时间 | 参数量(亿) | 训练数据量 |
|--------|----------|--------------|------------|
| GPT-1 | 2018 | 1.17 | 5GB |
| GPT-2 | 2019 | 15 | 40GB |
| GPT-3 | 2020 | 1750 | 45TB |
---
## 2.3.2 Encoder的代表:BERT
### 核心特点
- **双向性**:捕获上下文双向关系,提升文本理解能力。
- **模型结构**:基于Transformer Encoder,包含多头自注意力和前馈网络。
- **预训练任务**:
- **掩码语言模型(MLM)**:预测被掩码的词(如“The [MASK] sat on the mat” → 预测“cat”)。
- **下一句预测(NSP)**:判断两个句子是否连续。
### 参数规模
- **BERT-base**:12层Encoder,768特征维度,1.1亿参数。
- **BERT-large**:24层Encoder,1024特征维度,3.4亿参数。
---
# 2.4 初探大语言模型
## 2.4.1 InstructGPT(ChatGPT前身)
### 目标
将基座模型(如GPT-3)从文本续写升级为遵循人类指令的对话模型,通过**对齐(Alignment)**实现。
### 三阶段流程
1. **有监督微调(SFT)**:用1.3万条人工标注的指令数据微调基座模型。
2. **奖励模型训练(RM)**:基于3.3万条排序数据训练评价模型。
3. **强化学习优化(PPO)**:用奖励模型指导模型生成更优回答。
流程如图所示:
### 效果与不足
- **效果**:1.3B参数的InstructGPT性能超过175B的GPT-3。
- **缺点**:生成内容不确定性、有害指令响应不合理、幻觉问题。
---
## 2.4.2 LLaMA系列(Meta开源模型)
### 模型改进
1. **结构优化**:
- **Pre-normalization**:输入前进行层归一化(RMSNorm)。
- **SwiGLU激活函数**:增强非线性表示能力。
- **Rotary Embedding**:相对位置编码(RoPE)优化长程依赖。
2. **训练数据**:LLaMA2使用2万亿Token数据(网页、代码、书籍等),训练耗时21天(2048块A100 GPU)。
### 微调策略
1. **有监督微调**:27,540条高质量人工指令数据。
2. **RLHF改进**:
- **Pairwise排序数据**:100万对标注数据。
- **双奖励模型**:分别评估回答的“有用性”和“安全性”。
- **拒绝采样微调**:迭代优化生成结果。
### 效果对比
- 经过RLHF的模型在有用性和无害性上显著优于仅微调模型。
---
# 附录:相关资源
- **代码实践**:
- GPT系列:Hugging Face的`transformers`库(如`gpt2`、`gpt-neo`)。
- LLaMA:Meta官方GitHub仓库(需申请访问权限)。
- **数据集**:
- InstructGPT数据集:人工标注的高质量指令数据。
- LLaMA训练数据:CommonCrawl、GitHub代码、维基百科等公开语料。
- 2025-03-06
-
发表了主题帖:
《大语言模型原理与工程实践》Transformer结构
终于到了最关键的Transformer这个经典结构,说实话我这个没有机器学习基础的人看的还是比较云里雾里的,这里我只挑了最重要的多头自注意力机制机制,这个是Transformer核心。整体的算法流程架构讲解可以参考
https://zhuanlan.zhihu.com/p/82312421
https://zhuanlan.zhihu.com/p/338817680
我觉得已经写得很好,可以参考上述讲解
## 🧩 什么是Transformer?
Transformer是2017年Google提出的一种神经网络结构,即卷积神经网络(CNN)和RNN后,成为文本建模领域最流行的架构。最初用于机器翻译。它彻底改变了自然语言处理(NLP)领域,像BERT、GPT这些大模型都是基于它构建的。
---
## 🔍 Transformer的核心结构
Transformer是一种基于**自注意力机制**的**编码器(Encoder)**和**解码器(Decoder)**结构,每个部分都有多层堆叠的模块。下面用“做菜”来类比:
- **编码器**:像厨师处理食材,把输入文本(如“我爱机器学习”)转化成计算机理解的“特征向量”。
- **解码器**:像根据菜谱一步步做菜,用编码器的信息生成输出(如翻译成英文“I love machine learning”)。
其核心架构如下图所示
---
编码器的秘密武器:自注意力机制
#### 什么是自注意力?
想象你读一句话:“猫吃了鱼,因为它饿了。”
“它”指代“猫”还是“鱼”?自注意力机制能自动找到词语之间的关系,比如让模型知道“它”和“猫”关联更紧密。
#### 举个栗子🌰
假设输入句子是:“Thinking Machines”
1. **词嵌入**:将每个词转为向量(比如`x1=[0.2, 0.5, 0.3], x2=[0.7, 0.1, 0.3]`)。
2. **生成Q/K/V向量**:
- **查询(Query)**:当前词想知道“我需要关注谁?”
- **键(Key)**:其他词说“我有什么信息?”
- **值(Value)**:实际传递的信息。
因此Thinking和Machines分别有q,k,v向量,分别为1和2
Thinking的Q向量:`q1 = x1 * W_Q = [0.3, 0.4, 0.8]`
Machines的K向量:`k2 = x2 * W_K = [0.6, 0.2, 0.4]`
3. **计算注意力分数矩阵S** :
$$ S = \text{Softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right) $$
- 假设`Thinking`对`Machines`的注意力分数是0.8,说明模型认为这两个词关系紧密。
4. **多头注意力**
- **问题**:单一注意力只能捕捉一种关系,比如“主谓关系”。
- **解决**:用多个“头”同时捕捉不同关系。
**例子**:
- 头1:捕捉“主谓关系”(Thinking → Machines)。
- 头2:捕捉“并列关系”(Thinking和Machines都是名词)。
- 最后拼接所有头的输出,得到更全面的信息。
**具体流程:**
在多头自注意力模块中,模型有多个独立的注意力头,每个头都有自己的 Q,K,V 矩阵。这样,每个头都可以捕捉输入序列中的不同关系。然后,所有注意力头的输出被拼接起来,通过一个线性层进行变换,得到多头自注意力的输出。多头自注意力机制先将输入分配到h个注意力头,再将每个注意力头的结果拼接起来作为输出,计算方法如下:
### 综上
多头自注意力机制如下图所示。多头自注意力机制呈现了一种细致且高效的自注意力计算方法。每个注意力头都维护自己的 Q,K,V 矩阵,同时计算其对应的注意力分数。这种设计策略使得模型有能力在多个子空间中捕捉到各种上下文关系,进一步增强其对输入序列的解读深度。
**其他输入模块,残差连接与层归一化,前馈神经网络,解码器可以参考链接。**
-
回复了主题帖:
《大语言模型原理与工程实践》分词技术
Jacktang 发表于 2025-3-6 07:34
分词技术总结的到位,就是这个粒度怎么理解
我个人理解,指的是这些Token的大小,也就是细粒度程度,即分词后的最小单位,可以是字符、子词、词语,甚至短语或句子。不同的分词粒度会影响模型的表示能力、计算复杂度以及对词汇变化的适应能力。
- 2025-03-05
-
发表了主题帖:
《大语言模型原理与工程实践》分词技术
# 分词技术(Tokenization)
## 1. 分词粒度分类
### (1)Word粒度(Word-level)
#### 核心意义:
- 将文本按自然语言中的完整词语切分
- **中文示例**:“我喜欢吃苹果” → [“我”, “喜欢”, “吃”, “苹果”]
- **英文示例**:“let’s go to lib” → [“let’s”, “go”, “to”, “lib”]
#### 优缺点:
**优点:** 保留完整语义单元
**缺点:** 1.无法处理未在词表中的词(Out of Vocabulary, OOV),由于无法无限制扩大词表
| 优点 | 缺点 |
|--------------------------|---------------------------------------|
| 保留完整语义单元 | 无法处理未在词表中的词(Out of Vocabulary, OOV),由于无法无限制扩大词表|
| | 存在大量低频词占据词表空间,导致其无法在模型中得到训练,尤其是英文中的词根词缀问题,不能泛化 |
---
### (2)Character粒度(Character-level)
#### 核心意义:
- 将文本拆分为单个字符或字母
- **中文示例**:“我喜欢吃苹果” → [“我”, “喜” ,欢”, “吃”, “苹”, “果”]
- **英文示例**:“let’s go to lib” → [“l”, “e”, “t”, “’”, “s”, “g”, “o”, “t”, “o”,“l”,“i”, “b”]
#### 优缺点:
| 优点 | 缺点 |
|--------------------------|-----------------------------------|
| 词表简洁 | 损失语义丰富性 |
| 可避免OOV问题 | 增加输入序列长度 |
---
### (3)Subword粒度(Subword-level)
#### 核心意义:
- 用子词单元平衡词与字符单元
- **中文示例**:“我喜欢吃苹果” → [“我”, “喜” ,欢”, “吃”, “苹”, “果”]
- **英文示例**:“let’s go to lib” → [“let”, “’”, “s”, “go”, “to”, “li”, “##b”]
#### 优点:
1. 可有效处理OOV;
2. 允许学习词缀关系;
3. 具有灵活性;
4. 具有跨语言一致性。
---
## 2. 三种主流Subword词表构造方法总结
### (1) BPE(Byte Pair Encoding)
#### 核心思想
- **基于频率的迭代合并**:从字符级别开始,迭代合并出现频率最高的连续字符对,直到达到预设词表大小。
- **适用场景**:通用文本处理,尤其适用于需要高频合并的场景。
#### 流程步骤
1. **初始化**:构建包含基础字符(字母、标点等)的初始词表。
2. **分解文本**:将单词拆分为字符序列,并添加词尾标记(如``)。
3. **统计与合并**:统计字符对频率,合并最高频的字符对,重复迭代直至词表达标。
#### 典型应用
- **模型**:GPT、XLM
- **工具**:直接应用于文本预处理。
---
### (2) WordPiece
#### 核心思想
- **基于似然的合并**:每次合并选择能最大化整体数据对数似然的字符对,而非仅依赖频率。
- **适用场景**:关注语义片段提取的场景(如预训练模型)。
#### 流程步骤
1. **初始化**:同BPE,构建基础字符词表。
2. **训练语言模型**:使用Unigram语言模型估计subword概率。
3. **优化词表**:选择加入后能最大化总概率的subword单元,迭代扩展词表。
#### 典型应用
- **模型**:BERT
- **特点**:更注重合并的语义价值。
---
### (3) Unigram语言模型
#### 核心思想
- **逆向筛选**:从完整词开始,逐步删除对整体似然损失最小的subword单元,动态调整词表。
- **适用场景**:需要灵活控制词表大小,保留重要词或子词。
#### 流程步骤
1. **初始化**:构建包含单字符和高频n-gram的大词表。
2. **概率估计**:计算每个subword在训练语料中的出现频率。
3. **评分与筛选**:评估删除每个subword的损失,保留高价值单元,迭代缩减词表。
#### 典型应用
- **工具**:SentencePiece
- **模型**:T5、ALBERT、XLNet
---
## 对比表格
| 方法 | 核心策略 | 合并/筛选依据 | 典型工具/模型 |
|---------------|------------------------|---------------------|----------------------|
| **BPE** | 高频字符对迭代合并 | 字符对频率 | GPT、XLM |
| **WordPiece** | 最大化对数似然合并 | 概率增益 | BERT |
| **Unigram** | 逆向删除低价值subword | 似然损失 | SentencePiece(T5等)|
-
回复了主题帖:
《大语言模型原理与工程实践》+词表示技术
Jacktang 发表于 2025-3-5 07:33
静态词向量和动态词向量怎么区分
静态词向量指的是单词的向量表示是固定的,无论单词出现在什么样的上下文中,其向量表示都不会改变。
动态词向量指的是同一个单词在不同的上下文中会有不同的向量表示,即词的表示会随着上下文语境而变化。
- 2025-03-03
-
发表了主题帖:
《大语言模型原理与工程实践》+词表示技术
**又过了很久没有更新,最近在忙着写硕士毕业大论文,刚忙完才开始看书第二章内容,然后还要参加春招,小论文修改,学习ROS等。不得不说这本书写的感觉GPT味道很浓,对我这种初学者还是比较难看的,我只能慢慢的根据我看书自己的理解+DeepSeek实例进行进一步理解,然后增加些代码增加体会。后面就不一章章更新了,而是学习到了什么就更新什么。**
------------
------------
## 2.1.1 词表示技术
**词通常是自然语言处理中的最小单位。**
因此如何将词进行向量表示是文本语言学习的第一步,其主要有三种表示方法。
### 1. 独热表示(One-Hot Encoding)
- **原理:** 每个词对应一个高维向量,向量中只有词索引位置为1,其余为0。
- **特点:**
- **维度灾难**:词表大小决定向量维度(例如10万词需10万维)
- **无法表示语义关系**:所有向量正交,无法体现词之间的相似性
- **实例:**
- 词表:[“猫”, “狗” , “苹果”]
- 独热编码:
```
猫 → [1, 0, 0]
狗 → [0, 1, 0]
苹果 → [0, 0, 1]
```
- **PS:** 这里还是很好理解的:Onion-16:
---
### 2. 分布式表示(Distributional Representation)
- **原理:** 词的语义可以由其上下文表示,即词的前后文推断语义。
#### PS: 在进行后述介绍前,先要讲解一些概念,有个印象即可,不用非常理解
#### (1)共现矩阵(Co-occurrence Matrix)
- **定义:** 共现矩阵是一种记录两个或多个知识单元在同一文档中出现频率的统计矩阵。 通过构建共现矩阵,我们可以进一步进行作者共现、关键词共现、引文共现等分析。常见有以下两类:
- **1)词-文档矩阵(Term-Document Matrix)**
- **核心思想:**统计每个词在每篇文档中出现的次数。
- **实例:**
```
我有两本书分别是:
书1:《猫的习性》 → 关键词:猫、鱼
书2:《狗的饲养》 → 关键词:狗、骨头
书3:《水果健康》 → 关键词:苹果、维生素
```
构建矩阵:
通过矩阵可以看到:
”猫“和”鱼“在书1中同时出现 → 可能属于同一主题(宠物饲养)
“苹果”和“维生素”在书3中共现 → 可能属于健康主题
- **2)词-上下文矩阵(Word-Context Matrix)**
- **核心思想:**统计每个词在局部窗口内与其他词的共现频率。
- **实例:**
```
句子:“我喜欢吃苹果,苹果富含维生素”
设定窗口大小=2(即看中心词左右各2个词)
原始句子分词:[“我”, “喜欢”, “吃”, “苹果”, “,”, “苹果”, “富含”, “维生素”]
第一处"苹果"的上下文(窗口=2): [“吃", “,”]
第二处"苹果"的上下文(窗口=2): [“,", “富含”]
合并上下文词:["吃", ",", ",", "富含"]
```
构建矩阵:
---
### 3. 基于预训练的词嵌入(Pre-trained Embeddings)
**核心思想:** 与分布式相似,同样将每个词映射为一个低维稠密实值向量,但其是先在语料库中利用某种语言模型进行预训练,然后应用于下游任务,其可随着任务更新调整(**前者分布式则不行**)。分为**静态词向量**和**动态词向量**。
#### (1)静态词向量(Static Word Embedding)语言模型
**特点:** 每个词对应一个固定向量,无法处理一词多义。
**经典模型:**
**1)Word2Vec:**:通过预测上下文词学习向量
**实例:**
```
#安装库:命令行中运行 pip install gensim
from gensim.models import KeyedVectors
#加载预训练模型(需提前下载GoogleNews-vectors-negative300.bin文件)
model = KeyedVectors.load_word2vec_format('GoogleNews-vectors-negative300.bin', binary=True)
#计算相似度(值在-1到1之间,越接近1越相似)
print(model.similarity('cat', 'dog')) # 输出示例:0.78 → 猫和狗语义相似
print(model.similarity('cat', 'car')) # 输出示例:0.32 → 猫和汽车不相关
```
**2)GloVe**:结合全局词共现统计与局部上下文窗口
#### (2)动态词向量(Static Word Embedding)语言模型
**特点:** 随着上下文语境不同而动态变化,BERT(Bidirectional Encoder Representation from Transformers)为代表模型。
**实例:**
```
# 安装库:命令行中运行 pip install transformers
from transformers import BertTokenizer, BertModel
import torch
# 加载BERT的分词器和模型
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertModel.from_pretrained('bert-base-uncased')
# 输入句子并编码
sentence = "He deposited money in the bank."
inputs = tokenizer(sentence, return_tensors="pt") # return_tensors="pt" 返回PyTorch张量
# 模型推理(获取词向量)
outputs = model(**inputs)
# 提取"bank"的向量(假设"bank"是倒数第二个token)
tokens = tokenizer.tokenize(sentence) # 输出:['he', 'deposited', 'money', 'in', 'the', 'bank', '.']
bank_index = len(tokens) - 2 # 倒数第二个位置是"bank"
bank_vector = outputs.last_hidden_state[0, bank_index, :]
print(bank_vector.shape) # 输出:torch.Size([768]) → 768维向量
```
- 2025-02-12
-
发表了主题帖:
《大语言模型原理与工程实践》第一章
今天正好是正月十五元宵节,在此祝大家元宵节快乐!!蛇年暴富!!!(大家都是吃水饺还是汤圆呢?)
其实过年前就已经收到了这本书,之后Deepseek就火遍全网,既互联网革命之后AI革命开始席卷各大领域,这仅仅是个开始,后面大模型技术将会影响各行各业。过年期间一直在忙着写论文,因为本人现在是研三马上毕业,真的是又有小论文,还有大论文,还有工作等各方面的事,加上过年串门真的是忙的和陀螺一样,所以现在才来更新。我研究的是无人系统的传统运动控制,对于深度学习和强化学习只是了解部分皮毛,因此这本书对我的难度还是相当大的,我只是把它作为我拓展视野的工具,大概率以后对我的工作没有很大的帮助,但是闲下来学习新知识总没什么太大的问题。希望后面能够坚持下来写博客的习惯,之后能够不断的和大家进行技术分享和学习,一起进步。
# 第一章 解锁大语言模型
## 目录大纲
1.1 什么是大语言模型
1.2 语言模型的发展
1.3 GPT系列模型的发展
1.4 大语言模型的关键技术
1.5 大语言模型的涌现能力
1.6 大语言模型的推理能力
1.7 大语言模型的缩放定律
---
## 内容概要
### 1.1 什么是大语言模型
- **技术基础**:基于深度学习的神经网络(前向传播/反向传播)
- **典型应用**:问答系统、机器翻译、故事创作
- **核心挑战**:
- 算力需求呈指数级增长
- 数据质量与规模的强依赖性
### 1.2 语言模型的发展
- **演进路线**:
- 统计语言模型(N-gram)
- 深度学习模型(RNN/LSTM)
- Transformer革命(BERT/GPT)
- **LLM特征**:参数多样性、强生成能力、涌现性
### 1.3 GPT系列模型的发展
- **时间跨度**:2018年GPT-1到2023年GPT-4
- **架构分类**:
- 编码器-解码器
- 纯编码器
- 纯解码器(主流路径)
- **技术突破**:从自监督预训练到强化学习的完整技术闭环
### 1.4 大语言模型的关键技术
- **三阶段训练范式**:
1. 预训练
2. 有监督微调(SFT)
3. 强化学习
### 1.5 大语言模型的涌现能力
- **核心表现**:
- 学习能力提升
- 语言理解和生成能力
- 创新和探索
### 1.6 大语言模型的推理能力
- **五大维度**:
- 逻辑推理
- 推断和推理问题解决
- 关联和关系理解
- 多步求解
- 常识理解
### 1.7 大语言模型的缩放定律
- **四大效应**:
- 数据效应
- 表示能力
- 特征复用
- 优化效果
- **研究意义**:
- 泛化能力和适应性
- 开放性研究
- 领域应用
- 未来研究
---
## 读后感
### 知识体系构建
本章系统性地构建了大语言模型的知识框架:
✅ 从技术起源到前沿发展
✅ 从理论原理到工程实践
✅ 从单模态处理到多模态涌现
### 关键启示
1. **技术迭代速度**:GPT系列7年演进史印证了大模型的产业变革
2. **能力涌现本质**:参数规模突破临界点后产生的质变,揭示了智能涌现的物理规律
3. **工程实践挑战**:算力需求(如GPT-3单次训练成本超千万美元)与数据治理成为落地瓶颈
### 延伸思考
- **伦理维度**:模型规模扩展是否必然带来智能提升?如何量化评估模型理解能力?
- **产业机遇**:在垂直领域(医疗/法律)如何突破大模型幻觉实现可靠应用?
- **技术前瞻**:神经符号系统融合是否可能突破现有缩放定律的边际效应?
> 本章为读者搭建了理解LLM的完整认知框架,既展现了技术发展的澎湃动力,也客观揭示了现实挑战。作者通过清晰的演进脉络和详实的技术解析,为后续深入探讨工程实践奠定了坚实基础。
- 2025-01-20
-
回复了主题帖:
【测评入围名单(最后1批)】年终回炉:FPGA、AI、高性能MCU、书籍等65个测品邀你来~
个人信息无误,确认可以完成测评计划。