ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Transformers 中的 CPM 中文预训练语言模型:GPT-2 架构与 Jieba-RS + SentencePiece 分词器解析

2026/9/11 19:26:00 拓冰建站 浏览量
Transformers 中的 CPM 中文预训练语言模型:GPT-2 架构与 Jieba-RS + SentencePiece 分词器解析 Transformers 中的 CPM 中文预训练语言模型GPT-2 架构与 Jieba-RS SentencePiece 分词器解析【免费下载链接】transformers Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and multimodal models, for both inference and training.项目地址: https://gitcode.com/GitHub_Trending/tra/transformersCPMChinese Pre-trained Language Model是清华大学团队发布的面向中文的生成式预训练语言模型本文基于本仓库的 CPM 模型文档对应 英文版结合源码实现系统讲解 CPM 的模型背景、与 GPT-2 的关系以及CpmTokenizer/CpmTokenizerFast两套分词器的设计原理、构造参数与实际用法。读完本文你将掌握 CPM 分词器的完整工作流程并能在中文生成任务中正确加载与使用它。CPM 模型概述面向中文的生成式预训练语言模型CPM 模型由 Zhengyan Zhang、Xu Han、Hao Zhou、Pei Ke、Yuxian Gu、Deming Ye、Yujia Qin 等学者在论文 CPM: A Large-scale Generative Chinese Pre-trained Language Model 中提出技术报告2020-12-01 发布于 HF Papers2021-04-10 贡献给 Hugging Face Transformers。该模型由社区贡献者 canwenxu 提供原始实现位于 TsinghuaAI/CPM-Generate。论文摘要的核心事实如下背景GPT-3 凭借 1750 亿参数和 570GB 训练数据展现出强大的 few-shot甚至 zero-shot学习能力但其训练语料以英文为主且参数并未公开难以直接应用于中文 NLP 任务。CPM 的定位CPM 在大规模中文训练数据上进行生成式预训练拥有26 亿参数与100GB 中文训练数据在当时是最大的中文预训练语言模型。能力可支撑对话、作文生成、完形填空、语言理解等多种下游中文 NLP 任务实验表明其在 few-shot甚至 zero-shot设定下表现良好。需要说明的是上述数字26 亿参数、100GB 数据来自论文摘要原文属于论文披露的客观信息是否最大仅指论文发表时的状况不宜延伸为当前结论。架构要点与 GPT-2 相同的解码器架构文档中的 Tip 明确说明CPM 的架构与 GPT-2 相同区别仅在于分词tokenization方法。API 参考信息请参见 GPT-2 文档。这意味着 CPM 采用 GPT-2 式的自回归解码器causal LM结构使用方式上与 GPT-2 一脉相承。值得注意的是当前仓库中 CPM 模块只实现了分词器并未实现独立的CpmModel模型类——这一点可以从测试文件 test_tokenization_cpm.py 中的注释 There is noCpmModel 得到印证。因此在实际使用时分词由CpmTokenizer/CpmTokenizerFast负责而模型权重加载与生成推理则遵循 GPT-2 的用法将 CPM 视为 GPT-2 架构的中文版本。仓库中 CPM 模块的文件结构如下src/transformers/models/cpm/tokenization_cpm.py慢速分词器CpmTokenizersrc/transformers/models/cpm/tokenization_cpm_fast.py快速分词器CpmTokenizerFastsrc/transformers/models/cpm/init.py模块惰性加载入口_LazyModuleCpmTokenizer慢速分词器源码解析CpmTokenizer继承自PreTrainedTokenizertokenization_cpm.py其核心设计是基于Jieba-RS结巴分词的 Rust 实现Python 包rjieba与SentencePiece的两段式分词先由 Jieba-RS 完成中文词语切分再由 SentencePiece 的 BPE/Unigram 子词模型切出子词。类注释中明确写道Runs pre-tokenization with Jieba-RS segmentation tool. It is used in CPM models.依赖与词表文件词表文件VOCAB_FILES_NAMES {vocab_file: spiece.model}即一个 SentencePiece 模型文件.spm。硬依赖rjieba。两个分词器在初始化时都会尝试import rjieba若未安装则抛出带提示的ModuleNotFoundErrorYou need to install rjieba to use CpmTokenizer or CpmTokenizerFast.见 tokenization_cpm.py。安装方式为pip install rjieba sentencepiece。构造参数一览CpmTokenizer的构造参数tokenization_cpm.py如下参数默认值说明vocab_file必填SentencePiece 词表文件.spm用于实例化词表do_lower_caseFalse分词前是否将输入转为小写remove_spaceTrue分词前是否去除首尾空格并合并多余空白keep_accentsFalse是否保留重音符号为False时按 NFKD 规范化去除组合字符bos_tokens预训练时使用的序列起始 token注意构建带特殊 token 的序列时序列开头实际用的是cls_tokeneos_token/s序列结束 token构建序列时序列末尾实际是sep_tokenunk_tokenunk词表外 tokensep_tokensep分隔 token用于拼接多个序列pad_tokenpad填充 token用于 batch 内长度对齐cls_tokencls分类 token位于序列首位mask_tokenmask掩码 token构造时会被包装为AddedToken(mask_token, lstripTrue, rstripFalse)即像普通词一样保留其前的空格additional_special_tokens[eop, eod]额外特殊 token从命名看应分别表示段落结束与文档结束代码中未展开解释sp_model_kwargsNone透传给sentencepiece.SentencePieceProcessor的额外关键字参数注意源码 docstring 中do_lower_case标注的默认值是True但函数签名与super().__init__传递的实际默认值是False实际行为以代码签名为准。另外该分词器将_pad_token_type_id设置为3tokenization_cpm.py这是 padding 位置的 token type id与下面将提到的 segment id0/1/2区分开。文本预处理流水线preprocess_text每次分词前文本会依次经过preprocess_texttokenization_cpm.py处理若remove_spaceTrue先strip()再按空白切分后重新拼接压缩多余空格将替换为、替换为中文语境中的引号统一若keep_accentsFalse按 Unicode NFKD 规范化并删除组合字符combining marks若do_lower_caseTrue转为小写。分词主流程_tokenize 与数字逗号回切_tokenizetokenization_cpm.py的实现为调用preprocess_text得到规范化文本通过self.sp_model.encode(text, out_typestr)得到 SentencePiece 子词序列数字千分位逗号回切对每个子词若len(piece) 1且以逗号结尾、且逗号前一位是数字例如1,000被切成一个子词时则把逗号之前的部分去掉句首空格标记▁用EncodeAsPieces重新切分再在末尾补回逗号。这样保证数字串与逗号能按语义正确拆分。分词结果中▁SPIECE_UNDERLINE是 SentencePiece 的空格标记。反向拼接时convert_tokens_to_string会把▁还原为空格并strip()tokenization_cpm.py。特殊 token 序列格式与 token type idsbuild_inputs_with_special_tokenstokenization_cpm.py定义了输入序列的组装格式单序列X sep cls双序列如文本分类、问答A sep B sep cls对应的get_special_tokens_mask与create_token_type_ids_from_sequences生成的 segment id 为第一段为0第二段为1末尾cls段为2padding 位置则为_pad_token_type_id 3。解码还原空格与换行CpmTokenizer定义了一个字符映射表self.translator str.maketrans( \n, \u2582\u2583)即空格 →▂U2582、换行 →▃U2583。在_decode中tokenization_cpm.py会先调用父类解码再删除普通空格、把▂还原为空格、▃还原为换行。这种先占位再还原的机制确保了中英文混合文本中空格信息在 token 化过程中不丢失。词表保存save_vocabularytokenization_cpm.py支持将当前词表以spiece.model保存到指定目录若原词表文件不存在则通过serialized_model_proto()序列化写出。CpmTokenizerFast基于 Tokenizer 的快速分词器CpmTokenizerFast继承自PreTrainedTokenizerFasttokenization_cpm_fast.py同样基于 Jieba-RS 与 SentencePiece核心差异在于词表文件除spiece.model外还支持tokenizer.jsonVOCAB_FILES_NAMES {vocab_file: spiece.model, tokenizer_file: tokenizer.json}可直接从预构建的 Tokenizer 文件恢复速度更快。批量编码前置处理_batch_encode_plustokenization_cpm_fast.py会对每个输入先执行self.jieba.cut(text, False)完成 Jieba-RS 中文分词再用translator将结果中的空格与换行替换为▂/▃占位符拼接为带空格分隔的字符串后交给底层 Tokenizer 编码。这正是慢速分词器空格/换行占位思路在快速路径中的落地。特殊 token 与 segment idbuild_inputs_with_special_tokens、create_token_type_ids_from_sequences与慢速版完全一致_pad_token_type_id同样为3。解码_decode与慢速版相同删除普通空格、还原▂→空格、▃→换行。保存限制save_vocabulary要求can_save_slow_tokenizer为真否则抛错提示无法回存慢速分词器所需信息。实践安装、加载与分词验证环境准备使用 CPM 分词器前需要安装两个依赖pip install rjieba sentencepiecerjiebaJieba-RS是必需项缺失时会直接报错并给出安装提示sentencepiece用于加载spiece.model。加载与分词示例from transformers import AutoTokenizer tokenizer AutoTokenizer.from_pretrained(TsinghuaAI/CPM-Generate) text Hugging Face大法好谁用谁知道。 tokens tokenizer.tokenize(text) print(tokens) # [▁Hu, gg, ing, ▁, ▂, ▁F, ace, ▁大法, ▁好, ▁, ,, ▁谁, ▁用, ▁谁, ▁知, 道, ▁, 。] ids tokenizer.encode(text) print(tokenizer.decode(ids))上述示例中的期望输出直接取自仓库测试 test_tokenization_cpm.py可观察到中文词大法好谁用知道被 Jieba-RS 正确切分再由 SentencePiece 拆出子词Hugging 与 Face 之间的空格在 token 序列中体现为独立的▂token解码后还原为空格实现了中英混排文本的信息无损往返全角逗号被归一化为半角,对应preprocess_text与测试中的normalized_text。测试还验证了 token → id 的转换例如▁Hu → 13789以及decode能还原出Hugging Face大法好,谁用谁知道。unk的规范化文本。AutoTokenizer 自动映射在自动加载体系 tokenization_auto.py 中cpm架构被映射到CpmTokenizer在 tokenizers 可用时因此上述AutoTokenizer.from_pretrained写法对 CPM 系列 checkpoint 是开箱即用的。小结CPM 是本仓库中一个模型架构复用 GPT-2、分词完全定制的典型案例它以 26 亿参数和 100GB 中文语料进行生成式预训练而仓库内为其提供的核心资产是CpmTokenizer与CpmTokenizerFast两套基于 Jieba-RS SentencePiece 的中文分词器。理解preprocess_text的规范化流程、_tokenize的数字逗号回切逻辑、▂/▃空格换行占位机制以及单序列X sep cls、双序列A sep B sep cls的特殊 token 格式是正确使用和微调 CPM 系列模型的关键。相关实现与验证均可直接在 tokenization_cpm.py、tokenization_cpm_fast.py 与 test_tokenization_cpm.py 中查阅。【免费下载链接】transformers Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and multimodal models, for both inference and training.项目地址: https://gitcode.com/GitHub_Trending/tra/transformers创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考