大模型基础-分词器

42 阅读2分钟

模型语料

语料应用的全流程

timeline
    title 大模型训练中语料应用的全流程
    section 数据准备阶段
        语料收集与清洗
        : 原始文本 → 清洗文本
        分词器训练
        : 文本子集 → 分词规则
        语料预处理
        : 清洗文本 → Token序列
    
    section 预训练阶段
        无监督学习
        : Token序列 → 基础模型权重
        下一个词预测
        : 万亿级token训练
    
    section 监督微调阶段
        指令-回答对
        : 高质量对话数据 → 指令跟随模型
        任务特定数据
        : 对齐基础能力
    
    section 对齐阶段
        人类反馈学习
        : 偏好排序数据 → 奖励模型
        强化学习
        : 优化策略 → 对齐模型
    
    section 部署阶段
        少样本学习
        : 示例prompts → 上下文学习
        持续学习
        : 新数据 → 模型更新   

分词器构建

分词器构建流程概要

graph TD

 数据准备--> 训练
 训练-->优化
 优化--> 部署与验证


 subgraph 数据准备
        A1[语料收集]
        A2[数据清洗]
        A3[配置设定]
 end
 

subgraph 训练
        B1[算法选择]
        B2[参数训练]
        B3[规则生成]
end

subgraph 优化
        C1[压缩优化]
        C2[特殊标记添加]
        C3[格式转换]
 end
subgraph 部署与验证
        
        D1[质量评估]
        D2[集成测试]
        D3[版本管理]
 end

分词器构建关键环节

准备阶段(数据与配置准备)
核心任务
  • 语料收集与采样
  • 数据清洗与标准化
  • 构建参数配置

 #多元语料收集
 corpus_source ={
  "网页数据":["Common Crawl","Wikipedia"],
  "书籍文本":["Project Futenberg","arXiv论文"],
  "对话数据":["客服记录","论坛讨论"],
  "代码数据":["GitHup 公开仓库"],
  "多语言数据":["OSCAR","mC4"]
 
 }
 
 # 代表性采样
def sample_corpus(full_corpus,target_size="50GB"):
# 分层采样确保多样性
samples = {
  "英语": 40%,
  "中文": 15%,
  "代码"10%,
  "其他语言"35%,
  "学术文本": 5%,
  "对话文本"5%

}

return balanced_sample(full_corpus,samples)


# 数据清洗
清洗流程 =[
 "去重(模糊去重+精度去重)",
 "语言识别与分类",
 "质量过滤",
 "毒性内容过滤",
 "标准化(Unicode,大小写,空格)"
]


训练阶段(核心算法与执行)
核心任务
  • 算法选择与初始化
  • 迭代合并训练
  • 规则学习与生成
BPE算法训练详细过程

class BPETrainer:
 def _init_(self,corpus,vocab_size=32000):
     self.corpus=corpus
     self.target_size=vocab_size
     self.vocab=set() // 最终的词汇表
     self.merges=[] // 合并规则记录
 
 def train(self):
   # 步骤1:基础字符初始化
   self.initialize_base_vocab()
   # 当前词汇表:256 字节+ 特殊标记
   
   # 步骤2: 迭代合并
   iterator=0
   while len (self.vocb)<self.target_size:
   iterator+=1
   # 统计当前所有符号对的频率
   pair_frequences=self.count_pairs(self.corpus)
   
   # 选择最高频对(排除已存在的完整词)
   best_pair=self.select_best_pair(pair_frequences)
   
   if not best_pair or best_pir.frequency<self.min_frequency:
   break
   
   # 执行合并
   new_token= best_pair.left+best_pair.right
   self.vocab.add(new_token)
   self.merges.append(best_pair,new_token)
   
   
   # 在语料中应用合并
   self.corpus =self.apply_merge(self.corpus,best_pair,new_token)
   
   # 定期保存检查点
   if(iteration) %1000==0:
     self.save_checkpoint(iteration)
 return self.vocab,self.merge

优化阶段
任务核心
  • 词汇表压缩与优化
  • 特殊标记集成
  • 格式转换与序列化
def optimize_vocabulary(raw_vocab,raw_merges):
# 1.移除低频合并(清洗噪音)
optimized_merges=[]
for merge in raw_merges:
   if merge.frequency>MIN_FREQ_THRSHOLD:
    optimized_merges_append(merge)
# 2.添加必须保留的完整词(即使频率不高)
must_keep=[
            "ChatGPT","Transformer","深度学习", # 领域的关键术语
            "COVID-19","Blockchain",           # 新兴的重要词汇
            "😊","👌" # 常用表情符号
          ]


# 平衡多语言覆盖
lang_balance ={
    "en",45%
    "zh","15%",
    "es":80%,
    "code":12%,
    "other":20%
}


ensure_language_balance(optimized_vocab,lang_balance)

# 添加功能标记
add_special_tokens(optimized_vocab,["<|endoftext|>","<|padding|>"]

return optimized_vocab,optimized_merges