一、大语言模型简介
大语言模型(如GPT、BERT、LLaMA、Grok等)是基于深度神经网络(主要是Transformer架构)的模型,通过在大规模文本数据上训练,学习语言的统计规律、语义和上下文关系。它们可以完成多种任务,包括文本生成、分类、翻译、问答等。训练和推理是模型生命周期的两个核心阶段:
- 训练:从海量数据中学习语言模式,优化模型参数。
- 推理:使用训练好的模型处理新输入,生成输出。
二、大语言模型的训练过程
训练一个大语言模型是一个复杂的过程,涉及数据准备、模型架构设计、优化算法、分布式计算和微调等多个阶段。以下是详细分解:
1. 数据准备
数据是LLM训练的基础,其质量和规模直接影响模型性能。
(1) 数据收集
- 来源:
- 网络爬取:如Common Crawl(数十TB的网页数据,包含论坛、博客、新闻等)。
- 公开数据集:Wikipedia(多语言百科全书)、BooksCorpus(免费电子书)、ArXiv(学术论文)。
- 专有数据:企业可能使用内部数据(如社交媒体帖子、客服对话)。
- 多模态数据(新兴趋势):如图像-文本对(用于多模态LLM,如CLIP)。
- 规模:
- GPT-3训练数据约45TB(压缩后约570GB),包含约5000亿个token(假设平均token长度为4字节)。
- LLaMA-3(假设)可能使用更大规模数据,如100TB+。
- 多样性:
- 覆盖多种语言(英语、汉语、西班牙语等)。
- 包含多种领域(科技、文学、法律、日常对话)。
- 风格多样(正式、口语、创意写作)。
- 细节:
- 数据通常以纯文本或JSON格式存储。
- 收集需要遵守版权和隐私法规(如GDPR)。
- 工具:如
wget
、BeautifulSoup
(Python爬虫)、Apache Nutch。
(2) 数据清洗
- 去噪:
- 移除广告、导航菜单、HTML标签、乱码。
- 示例:使用正则表达式过滤HTML标签(
<.*?>
)。 - 工具:
lxml
、html2text
。
- 去重:
- 使用哈希算法(如MinHash)或精确匹配检测重复文本。
- 工具:
datasketch
(MinHash实现)。 - 目的:避免模型记住重复模式,减少过拟合。
- 过滤低质量内容:
- 移除语法错误严重的文本、过短的句子。
- 使用语言模型(如BERT)评分文本质量,过滤低分内容。
- 隐私保护:
- 移除个人信息(如姓名、电话号码)。
- 工具:正则表达式、NER(命名实体识别)模型。
- 示例:
- 原始文本:
<p>Buy now for $99! Visit www.example.com</p>
- 清洗后:
Buy now for $99!
- 原始文本:
(3) 数据预处理
- 分词(Tokenization):
- 目标:将文本分割成token(单词、子词或字符)。
- 算法:
- Byte-Pair Encoding (BPE):
- 初始将文本拆分为字符,迭代合并高频字符对。
- 示例:单词“unhappiness”可能拆为“un”+“happi”+“ness”。
- 实现:
sentencepiece
库、tokenizers
(Hugging Face)。
- WordPiece(BERT使用):
- 类似BPE,但优化交叉熵损失。
- Unigram(SentencePiece使用):
- 从大词汇表开始,逐步删除低概率token。
- Byte-Pair Encoding (BPE):
- 词汇表:
- 大小:通常为3万到10万(GPT-3约5万,BERT约3万)。
- 包含特殊token,如
[CLS]
(分类)、[SEP]
(分隔)、<|start|>
(开始)。
- 代码示例(使用Hugging Face
tokenizers
):from tokenizers import Tokenizer from tokenizers.models import BPE from tokenizers.trainers import BpeTrainer tokenizer = Tokenizer(BPE()) trainer = BpeTrainer(vocab_size=30000, special_tokens=["<|start|>", "<|end|>"]) tokenizer.train(files=["corpus.txt"], trainer=trainer) encoded = tokenizer.encode("Hello, world!") print(encoded.tokens) # ['Hel', 'lo', ',', 'wor', 'ld', '!']
- 序列化:
- 将token映射为数字ID。
- 示例:
Hello
→ 1001,,
→ 1002。 - 存储为张量(如PyTorch的
torch.tensor
)。
- 分组:
- 将文本切分为固定长度序列(最大长度如512或2048 token)。
- 填充(Padding):短序列补齐到最大长度,使用
[PAD]
。 - 截断(Truncation):长序列截断,保留关键部分。
- 注意力掩码(Attention Mask):
- 生成掩码张量,标记有效token(1)和填充token(0)。
- 示例:输入
[Hello, world, [PAD]]
,掩码为[1, 1, 0]
。
- 代码示例:
import torch tokens = [1001, 1002, 1003] # Hello, world padded = tokens + [0] * (512 - len(tokens)) # 填充到512 attention_mask = [1] * len(tokens) + [0] * (512 - len(tokens)) input_tensor = torch.tensor([padded]) mask_tensor = torch.tensor([attention_mask])
2. 模型架构
LLM通常基于Transformer架构,以下是详细分解。
(1) Transformer核心组件
- 自注意力机制(Self-Attention):
- 原理:
- 每个token的表示通过查询(Query)、键(Key)、值(Value)向量计算。
- 注意力分数衡量token间的相关性。
- 数学公式:
- 输入:嵌入矩阵
X ∈ ℝ^{n×d}
,n为序列长度,d为嵌入维度。 - 计算Q、K、V:
Q = XW_Q
,K = XW_K
,V = XW_V
,其中W_Q, W_K, W_V ∈ ℝ^{d×d_k}
。
- 注意力权重:
Attention(Q, K, V) = softmax(QK^T / √d_k)V
。√d_k
为缩放因子,防止数值过大。
- 输入:嵌入矩阵
- 代码示例(简化的自注意力):
import torch import torch.nn as nn class SelfAttention(nn.Module): def __init__(self, d_model, d_k): super().__init__() self.d_k = d_k self.W_q = nn.Linear(d_model, d_k) self.W_k = nn.Linear(d_model, d_k) self.W_v = nn.Linear(d_model, d_k
- 原理: