
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),僅供參考