当前位置: 首页 > news >正文

【Diy-LLM】Task 1 分词器

分词器通常先用正则表达式对原始文本做预处理,再通过统计方法构建高效词表(vocab),并建立“文本片段 ↔ token ID”的映射。这个映射决定了模型看到的是字、词,还是更细的子词片段,从而直接影响后续语义建模的效率。

1 训练分词器

训练一个用于现代大型语言模型的分词器可以拆成四步:准备语料 → 初始化基础单元(可省略) → 统计并迭代合并 → 输出产物并用于编码、解码。

1.1 准备语料

1.在准备语料阶段,应尽量收集覆盖目标应用场景的多样化文本,以便训练出的词表对下游任务具有良好泛化能力。

  • 准备不同类型的文本信息比如小说、散文、诗歌等不同描述风格的信息。
  • 多种语言的文本信息比如中文、英文、韩语、法语等。

2.对原始文本进行清洗和标准化是必须的步骤,包含去除或屏蔽无关元数据、修正或删除乱码与非法字符、统一字符编码为UTF-8,并对重复或近重复样本进行去重以减少训练偏移。

3.对带有敏感信息或隐私的语料要提前进行脱敏处理与合规检查,明确哪些信息不可用于训练并记录数据来源与许可。

4.在多语言或混合语料场景中,应统计各语言占比,并评估是否对低资源语言进行过采样或定向保留,避免词表被高频语言主导。否则,语料类型与语言分布不均衡会加剧低资源语言的token碎片化,增加token开销,并降低其任务性能。

5.建议保留一小部分未参与训练的验证语料比如训练集:验证集=99:1,用来在训练过程中评估分词器对真实文本的编码效率与平均token长度等统计指标。

1.2 初始化基础单元

1.预分词的主要任务是将原始文本切分成可统计、可合并的基础单元,例如字符、字节或Unicode片段。常见策略包括基于空格和标点的切分、按Unicode类别划分,或直接采用字节级切分。

需要注意的是并不是所有的分词器都需要用户显式进行预分词。例如基于SentencePiece的分词器将标准化和预分词逻辑内置,因此无需在外部额外执行预分词步骤。

2.对大多数以空格为词边界的语言,可先用正则表达式按单词边界和标点进行初步切割,而对中文、日文等不以空格为词界的语言则通常采用逐字符或基于字的初始单元来保证覆盖性。

字节级预分词的好处:

  • token利用率更高,提高BPE合并token的自由度以及尽可能合并共现频率高的单个字符,提高文本信息压缩率。
  • 可兼容处理多种语言。
  • 学到更多高频片段,减少未登录词的出现情况,模型推理更快(token数少)。

3.预分词生成的基础单元序列将作为后续统计合并的输入,务必保存该序列与对应位置信息以便在训练过程反复高效更新。

1.3 统计并迭代更新

1.子词候选统计

遍历语料以收集用于后续决策的统计信息,具体方法随算法不同而异

  • BPE:统计当前字符、子词序列中相邻对的出现频次,每次贪心合并出现频次最高的相邻对,迭代构建词表——其决策仅基于频率统计。
  • WordPiece:评估合并或保留某些子词对对语料似然即语言模型性能的贡献,选择能显著提升语料拟合度的合并操作。
  • Unigram:从一个过大的种子词表出发,初始化每个token的概率。
  • SentencePiece:是一个语言无关的子词分词框架,提供统一的训练与编码流程,支持多种分词算法(如BPE和Unigram)。这些算法在同一框架下独立使用,而非直接融合使用,其互补性体现在不同任务和数据条件下的适用性差异。

总体来说,以上四种子词分词算法各有特点,没有哪一种是绝对最好的。选择算法时应根据具体的文本内容(语料分布)、任务类型(理解或生成)、词表规模以及是否需要处理多语言来决定,这样才能让训练出来的LLM模型发挥最佳性能。

2.迭代

BPE、WordPiece、Unigram、SentencePiece这四种迭代算法简要分析:

  • BPE算法:可以借助第一步子词候选统计数据作为初始化数据,进行单个token合并形成新的token,然后在多次迭代过程中动态统计共现次数,得到新的token。
  • WordPiece算法:会在迭代过程中动态统计当前词汇表中所有相邻子词对的出现情况。其关键并非简单合并频率最高的对子,而是优先选择能最大提升语料整体似然的子词对,从而形成更有表征意义的token。
  • Unigram算法:它基于一个子词概率语言模型,将一个句子的概率定义为其所有可能分词方式概率的总和。核心思想是通过迭代优化子词概率,使得整个语料的似然最大化。
  • SentencePiece算法:它是一个独立的分词工具和实现库,能够直接从原始文本训练子词模型,因此无需用户在外部显式执行预分词步骤。它在内部会将空格、词边界等信息编码为特殊字符(训练输出中常见的▁用于表示词首空格),从而可以将空格也作为建表对象之一,接着会在这些初始token上应用BPE或Unigram算法,生成最终的token词表及映射。

这个迭代过程中需要保持特殊控制token(如<PAD>、<UNK>、<CLS>、<MASK>等),在分词器迭代更新过程中不参与修改,这样可以确保它们的词——数字映射保持固定,编码后的离散数字序列能够准确还原为原始文本。同时,这些token不会在统计合并或概率优化中被拆分或覆盖,从而有效减少碎片化token的出现。无论使用BPE、WordPiece、SentencePiece还是Unigram等算法,这一策略都适用有助于保护关键token的完整性,保证模型训练和推理的一致性。

3.通用终止条件

当继续训练已无法显著提升分词压缩效率或语言建模质量时(如词表达到上限或高频合并不再明显),算法停止。例如,在BPE训练中,早期“is”、“he”合并能明显减少token数,但后期只剩低频组合(比如拼写错误词),继续合并几乎不减少token数,这时就可以停止。

4.大规模语料优化

通过分布式统计与近似计数等工程手段,在保证结果稳定可复现的前提下高效处理超大规模语料。例如,训练1TB语料的tokenizer时,不可能单机统计所有"词组"频率,通常会把数据切分到多台机器并行统计,再合并结果,同时固定随机种子保证每次训练得到同一个词表。

5.监控与评估指标

通过token粒度、压缩率和OOV等指标评估分词器是否在“表达能力”和“效率”之间取得良好平衡。例如,如果一个tokenizer把*“international”*切成20个token,说明粒度太细;如果直接当成一个token,又会容易导致OOV问题,因此需要在token粒度和词表覆盖之间找到平衡点。

总结:分词器训练的核心是迭代更新候选子词 → 控制词表大小或收敛指标 → 监控质量指标,不同算法仅在“候选生成方式”和“迭代更新策略”上有差异。

1.4 输出产物并用于编码与解码

1.导出核心产物

训练完成后需要导出至少两个关键文件:

  • vocab文件:记录所有token及其对应的id,是编码器和解码器的核心索引。
  • merges文件:按顺序记录所有子词合并规则或概率模型。二者共同决定tokenizer的编码与解码逻辑,并确保编码的可逆。

2.下游使用前的验证与评估

  • 将tokenizer应用于一部分验证集后,建议统计以下关键指标:平均token数与最大长度分布,直接影响显存占用、训练速度和推理效率;碎片化情况,检查关键实体、专业术语是否被拆得过碎,避免影响模型理解;跨语言token平衡度,多语言任务中需确保不同语言的常见模式都有足够的token支持。

  • 如果后续需要扩表如加入新领域术语、专业词或品牌名等,建议优先采用这些方式而非完全重训tokenizer:增量训练加入新的merges项清理极低频token

  • 扩表后应进行一次回归测试,确保:与旧模型保持兼容且根据数字化编码可以还原回到最开始的输入文本、不发生token分配冲突或token耗尽问题。

4.版本管理与可复现性保证

词表与merges文件应纳入严格的版本控制,包括:语义化版本号(如1.2.0 )、每次修改的变更日志、在训练脚本和推理pipeline中显式固定tokenizer版本,防止模型训练阶段与推理部署阶段使用不同tokenizer,导致结果不可复现或性能下降。

2 常用的分词器

在NLP的发展历程中,分词策略经历了几次重要的演变。我们主要关注四种最典型的范式:字符、字节、词级、BPE分词器,以及结合课程lecture1各个分词器伪代码转化为python代码实践。

在LLM的token划分中,常见策略包括:

(1)基于规则的预分词(如按空格和标点切分);

(2)按Unicode类别分段(如连续汉字、连续拉丁字母或数字);

(3)更底层的UTF-8字节级切分。

(1)、(2)方法在以下场景中存在局限:文本缺乏显式分隔符,或出现长段同类字符(例如连续中文长句、拼接的代码标识符、压缩后的字符串)。在这些情况下,预处理阶段难以有效断句,为了保证文本可编码,可能会被迫回退到更细粒度的兜底切分(接近字符级)。

相比之下,UTF-8字节级策略具有最强的通用性,它把任意文本统一拆为字节序列,从而从根本上减少未词汇表外(OOV)问题并覆盖任意字符集。但因为它以最细粒度开始,训练时通常需要更多轮的共现统计与合并来把零散字节压缩为紧凑且具语义的token,才能在Transformer计算效率与语义表征之间取得平衡。

3 思考🤔

1)有研究表明,视觉特征能够增强LLM的理解能力,但并非适用于所有语言任务。那么是否可以在视觉表征与离散 token 之间寻求一种动态“平衡点”:同时为模型提供两类表征方式,并借鉴MoE的思想设计轻量级动态路由,使模型能够在不同任务或文本片段中自动选择或融合最合适的词——数字映射表形式,从而显著提升跨场景的适配能力?

2)能否设计一种“自适应分词器”,在训练阶段先与LLM分开训练,并通过一种特殊机制将训练好的分词器与模型结合,使其在下游任务中仍能动态学习和优化token划分策略?

3)借助微分子词模块、元学习或强化学习等方法,让分词器能够从少量对话或任务样本中自动发现最合适的token划分方式,从而降低下游任务对数据的依赖同时提升模型的鲁棒性和泛化能力?

http://www.jsqmd.com/news/643727/

相关文章:

  • PINN实战避坑指南:PyTorch训练中的常见错误与调优技巧(以Burgers方程为例)
  • lychee-rerank-mm快速体验:一键部署智能排序工具
  • 从GKCTF 2021 CheckBot看CSRF攻击的实战应用
  • 终极指南:如何免费解锁《原神》60FPS限制,让游戏帧率飙升!
  • 国产GIS神器SXEarth+MapGIS10实战:5分钟搞定遥感影像与高程数据下载及三维可视化
  • Linux命令:hibernate
  • LangChain4j实战:手把手教你用Tools工具解决大模型“幻觉”,让AI准确获取当前日期和实时数据
  • **发散创新:基于RBAC模型的开源权限管理系统设计与实现**在现代软件架构中,权限控制
  • 2026年室内灯具品牌推荐:品质与健康照明的优选 - 品牌排行榜
  • SVG、XML 及其生态技术全景指南:从基础规范到工程实践
  • inquire 日期选择器 DateSelect 完全指南:交互式日历实现原理
  • Chart.js项目实战:科学研究数据可视化完整指南
  • Phi-4-Reasoning-Vision惊艳效果:同一张图在THINK/NOTHINK模式下的推理差异
  • Local SDXL-Turbo实操手册:从键盘输入到画面生成的完整链路
  • 基于SpringBoot+Vue音乐推荐系统设计与实现+毕业论文+指导搭建视频
  • 别再死磕理论了!用SolidWorks Simulation做结构优化,从设计算例到拓扑算例保姆级避坑指南
  • 2026年优质灯具品牌推荐:聚焦LED照明领域实力之选 - 品牌排行榜
  • PyTorch 2.9 效果实测:一键部署,体验GPU加速的模型训练速度
  • 05樊珍4月14
  • 终极戴尔G15散热控制指南:开源神器TCC-G15完全解析
  • CLAP-htsat-fused高兼容:Windows/Mac/Linux全平台Docker支持
  • Towards-Realtime-MOT性能评估与调优:如何达到MOTA 64%+的跟踪精度
  • 3分钟快速上手:XUnity.AutoTranslator终极Unity游戏汉化指南
  • 4步快速完成B站视频转文字:免费开源工具bili2text终极指南
  • 【AI】操作审计:所有执行行为可追溯
  • 2026年停车场照明品牌技术发展与应用场景分析 - 品牌排行榜
  • Gokapi与OpenID Connect集成:企业级身份认证配置全指南
  • 3步解锁外语视频自由:PotPlayer百度翻译插件完全指南
  • ZIO性能优化终极指南:让你的应用快10倍的秘诀
  • 别再为PLC和DCS通讯头疼了!手把手教你用Modbus桥接器搞定西门子S7-300/400与DCS对接