大语言模型(LLM)的训练和推理

一、大语言模型简介

大语言模型(如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)。
    • 工具:如wgetBeautifulSoup(Python爬虫)、Apache Nutch。

(2) 数据清洗

  • 去噪
    • 移除广告、导航菜单、HTML标签、乱码。
    • 示例:使用正则表达式过滤HTML标签(<.*?>)。
    • 工具:lxmlhtml2text
  • 去重
    • 使用哈希算法(如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。
    • 词汇表
      • 大小:通常为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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱看烟花的码农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值