Diy-LLM 学习笔记-01

张开发
2026/4/21 3:27:14 15 分钟阅读
Diy-LLM 学习笔记-01
原文链接https://datawhalechina.github.io/diy-llm/#/./chapter2/chapter2_%E5%88%86%E8%AF%8D%E5%99%A8分词器开始之前分享最近的一点感悟。解决一个问题不难难的是找出问题、找到核心矛盾点来然后再使用各种方法解决问题。提出问题1.分词器是用来做什么的在大语言模型LLM实现的过程中它起到什么作用解决了什么问题 2.然后问题是怎么训练放一张文章中的原图。如图1。它解释了在用户使用LLM时候输入是文本形式的语言而LLM需要的是数字ID序列。那么问题来了两者不匹配该怎么办答案是分词器。分词器的作用就是将人类语言转换成机器能够读懂的数字ID序列使用户能够丝滑的与LLM进行交互。图1 分词器与LLM好了接下来目标就明确了怎样做才能很好的将人类语言 翻译成机器能够读懂的数字呢训练分词器在把数据喂给大模型之前要对数据进行“分词”。利用正则表达式对原始数据进行预处理构建一套词元--数字离散序列转化 列表vocab。这将决定模型看到的世界是由字、词或是由其它片段组成的将影响到后续模型对语义的理解效率。文章写到训练一个LLM分词器可以拆成四步 准备语料 —— 初始化基础单元可省略—— 统计并迭代合并 —— 输出产物并用于编码、解码。准备语料此处讲到5点包括1收集覆盖目标应用场景的多样化文本2对原始文本进行清洗和标准化处理3对带有敏感信息或隐私的语料要提前进行脱敏处理与检查4在多语言或混合语料场景中统计各语言占比并评估对低资源语言的过采样或定向保留避免被高频语言主导5保留小部分未参与训练的验证语料。初始化基础单元1预分词的主要任务是将原始文本切分成可统计、可合并的基础单元如字符字节或Unicode片段。此处还提到token划分时的常见策略xxx2对以空格作为词边界的语言使用正则表达式按单词边界和标点进行初步分割对不以空格作为单词边界的语言采用逐字符或基于字的初始单元进行覆盖。3预分词生成的基础单元作为后续的输入要保存序列和对应的位置信息。统计并迭代更新1子词候选统计。文章在此处重点介绍了4种遍历语料收集统计信息的方法包括BPE、WordPiece、Unigram和SentencePiece。分别适用于不同的场景和模型。2算法迭代。3算法终止条件。 当训练无法明显提升分词压缩效率或语言建模质量时算法停止。4大规模语料优化。讲的是使用分布式统计与近似计算等方法在保证结果稳定和可复现的前提下高效处理大规模语料。5监控预评估指标。 有token粒度、压缩率和OOV等指标评估分词器能否实现“表达能力”和“效率”之间的平衡。输出产物并用于编码和解码导出核心文件。merges.txt和vocab.json文件。常用的分词器1 字符分词器将文本拆解为最小的字符单位。优点词表很小只包含基础的字符和符号没有OOV问题也就是不会出现“未知词”。缺点序列过长将一段话变成字符后长度会增加在后续计算中会消耗资源语义稀疏单个字符不具备语义。2字节分词器计算机底层存储文本是字节直接操作二进制字节。3词级分词器早期深度学习的主流做法。基于空格或分词算法将文本切分为具备独立语义的“词”。优点Token保留了完整的语义信息缺点词表爆炸OOV问题严重遇到没见过的次标记UNK信息丢失。4BPE分词器LLM最主流的分词算法试图在字符集和词级之间寻找平衡。实现思想统计语料中相邻字符对出现的频率迭代地将最频繁出现的字符对合并成一个新的Token。实现过程初始化将单词拆成字符序列统计计算所有相邻字符对的频率合并将频率最高的相邻字符对 合并成新的Token循环重复上述步骤直到预设的此表大小停止。4种分词器对比| 分词器类型 | 粒度 | 词表大小 | 词表外(OOV) | 序列长度 | 代表模型 || 字符级 | 细 | 小 (100–5k) | 无 | 非常长 | Char-RNN || 字节级 | 更细字节| 很小 (~256–1k) | 无 | 很长 | GPT-2 || 词级 | 粗 | 极大 (100k) | 严重 | 短 | Word2Vec, GloVe ||BPE|中自适应|适中 (30k–100k)|极少|适中|GPT-4, Llama 3|文章大部分内容来自原文原文写的更加丰富具体建议看原文进行更深入地学习与理解。

更多文章