解析:基于 SentencePiece 的 DeBERTa-v2/v3 分詞器實(shí)戰(zhàn)指南)
人工智能大模型預(yù)訓(xùn)練微調(diào)LoRARLHF強(qiáng)化學(xué)習(xí)分布式訓(xùn)練【免費(fèi)下載鏈接】PaddleNLPEasy-to-use and powerful LLM and SLM library with awesome model zoo.項(xiàng)目地址https://gitcode.com/gh_mirrors/pa/PaddleNLP點(diǎn)擊查看免費(fèi)下載DeBERTa-v2/v3 系列模型采用 SentencePiece 子詞分詞方案其分詞器與 BERT 時(shí)代基于 WordPiece 的實(shí)現(xiàn)有本質(zhì)區(qū)別。本文以 PaddleNLP 官方 API 文檔 paddlenlp.transformers.deberta_v2.tokenizer 為骨架結(jié)合 tokenizer.py 的完整源碼與 test_tokenizer.py 測(cè)試用例系統(tǒng)講解DebertaV2Tokenizer的加載方式、全部構(gòu)造參數(shù)、核心編碼解碼流程與底層SPMTokenizer實(shí)現(xiàn)細(xì)節(jié)。讀完本文你將能夠獨(dú)立完成 DeBERTa-v2/v3 系列模型的加載、分詞、特殊 token 拼裝與保存復(fù)用并理解其與 WordPiece 分詞器在行為上的關(guān)鍵差異。一、從 API 文檔到實(shí)現(xiàn)DebertaV2Tokenizer 概覽PaddleNLP 中文文檔中的 deberta_v2 模塊頁(yè) 通過(guò) Sphinxautomodule指令自動(dòng)生成其中tokenizer子頁(yè)即本文對(duì)應(yīng)的 paddlenlp.transformers.deberta_v2.tokenizer.rst它渲染的正是paddlenlp.transformers.deberta_v2.tokenizer模塊的完整文檔內(nèi)容。該模塊位于 paddlenlp/transformers/deberta_v2/包含configuration.pyDebertaV2Config配置類vocab_size 為 128100max_position_embeddings 為 512type_vocab_size 為 0modeling.pyDeBERTa-v2 模型結(jié)構(gòu)tokenizer.py本文核心定義了DebertaV2Tokenizer與內(nèi)部輔助類SPMTokenizer。模塊對(duì)外只暴露一個(gè)類__all__ [DebertaV2Tokenizer]并且已通過(guò) paddlenlp/transformers/init.py 導(dǎo)出因此可以直接使用from paddlenlp.transformers import DebertaV2Tokenizer二、快速上手從預(yù)訓(xùn)練模型加載分詞器DebertaV2Tokenizer繼承自PretrainedTokenizer詞表資源類型為 SentencePiece 模型文件.spm后綴。源碼中通過(guò)三個(gè)類屬性聲明資源映射見(jiàn) tokenizer.pyresource_files_names {sentencepiece_model_file: spm.model} pretrained_resource_files_map PRETRAINED_VOCAB_FILES_MAP pretrained_init_configuration PRETRAINED_INIT_CONFIGURATION max_model_input_sizes PRETRAINED_POSITIONAL_EMBEDDINGS_SIZES其中PRETRAINED_VOCAB_FILES_MAP定義了 4 個(gè)開(kāi)箱即用的官方權(quán)重tokenizer.py模型名說(shuō)明microsoft/deberta-v2-xlargeDeBERTa-v2 xlarge24 層、1024 隱藏維microsoft/deberta-v3-baseDeBERTa-v3 base12 層、768 隱藏維microsoft/deberta-v3-largeDeBERTa-v3 large24 層、1024 隱藏維deepset/deberta-v3-large-squad2在 SQuAD 2.0 上微調(diào)過(guò)的 v3-large這些模型對(duì)應(yīng)的 SentencePiece 詞表由 PaddleNLP 托管spm.model文件PRETRAINED_INIT_CONFIGURATION統(tǒng)一將do_lower_case預(yù)設(shè)為FalsePRETRAINED_POSITIONAL_EMBEDDINGS_SIZES將最大輸入長(zhǎng)度統(tǒng)一設(shè)為 512。最標(biāo)準(zhǔn)的加載方式是通過(guò)AutoTokenizer.from_pretrained這也是源碼在詞表文件缺失時(shí)報(bào)錯(cuò)信息中推薦的用法from paddlenlp.transformers import AutoTokenizer tokenizer AutoTokenizer.from_pretrained(microsoft/deberta-v3-base)也可以直接實(shí)例化DebertaV2Tokenizer此時(shí)需要傳入本地.spm詞表文件路徑from paddlenlp.transformers import DebertaV2Tokenizer tokenizer DebertaV2Tokenizer(./spm.model)如果傳入的vocab_file路徑不存在構(gòu)造函數(shù)會(huì)拋出ValueError并提示改用AutoTokenizer.from_pretrained(PRETRAINED_MODEL_NAME)從預(yù)訓(xùn)練模型加載tokenizer.py。測(cè)試用例 test_tokenizer.py 使用倉(cāng)庫(kù)自帶的測(cè)試詞表tests/fixtures/spiece.model進(jìn)行驗(yàn)證。三、構(gòu)造函數(shù)參數(shù)完全解析DebertaV2Tokenizer.__init__的完整簽名tokenizer.pydef __init__( self, sentencepiece_model_file, vocab_fileNone, do_lower_caseFalse, split_by_punctFalse, bos_token[CLS], eos_token[SEP], unk_token[UNK], sep_token[SEP], pad_token[PAD], cls_token[CLS], mask_token[MASK], sp_model_kwargs: Optional[Dict[str, Any]] None, **kwargs, ) - None:各參數(shù)含義與注意事項(xiàng)參數(shù)類型默認(rèn)值說(shuō)明sentencepiece_model_filestr必填SentencePiece 模型文件通常以.spm結(jié)尾內(nèi)含詞表與合并規(guī)則vocab_filestrNone詞表文件路徑為None時(shí)直接復(fù)用sentencepiece_model_filedo_lower_caseboolFalse分詞前是否將輸入轉(zhuǎn)為小寫(xiě)。注意 DeBERTa 官方預(yù)訓(xùn)練配置為False與 BERT 不同split_by_punctboolFalse是否在標(biāo)點(diǎn)處預(yù)先切分后再交給 SentencePiece 編碼bos_tokenstr[CLS]序列開(kāi)始 tokenDeBERTa 中實(shí)際承擔(dān)該角色的是cls_tokeneos_tokenstr[SEP]序列結(jié)束 token實(shí)際承擔(dān)該角色的是sep_tokenunk_tokenstr[UNK]詞表外 token 的替換符sep_tokenstr[SEP]分隔 token用于拼接雙序列pad_tokenstr[PAD]填充 token用于 batch 內(nèi)長(zhǎng)度對(duì)齊cls_tokenstr[CLS]分類 token序列首位置mask_tokenstr[MASK]掩碼 token用于掩碼語(yǔ)言建模sp_model_kwargsdictNone透?jìng)鹘oSentencePieceProcessor.__init__()的關(guān)鍵字參數(shù)見(jiàn)第五節(jié)構(gòu)造過(guò)程中的關(guān)鍵行為tokenizer.py所有特殊 token 字符串都會(huì)被包裝為AddedToken(token, lstripFalse, rstripFalse)即默認(rèn)不觸發(fā)左右空白剝離通過(guò)_build_special_tokens_map_extended注冊(cè)完整特殊 token 表校驗(yàn)詞表文件存在后實(shí)例化內(nèi)部SPMTokenizer完成底層加載。四、核心 API 與編碼解碼流程4.1 詞表與基礎(chǔ)轉(zhuǎn)換vocab_size屬性返回詞表大小tokenizer.py底層為 SentencePiece piece 數(shù)。測(cè)試夾具tests/fixtures/spiece.model的vocab_size為 30000見(jiàn) test_tokenizer.pyget_vocab()返回原始詞表與新增詞表的合并副本_convert_token_to_id(token)直接調(diào)用spm.PieceToId(token)_convert_id_to_token(index)在索引越界時(shí)回退到unk_tokentokenizer.py。測(cè)試 test_convert_token_and_id 驗(yàn)證了pad與 id0的雙向轉(zhuǎn)換test_get_vocab則斷言詞表首項(xiàng)為pad、第二項(xiàng)為unk、末項(xiàng)為[PAD]共 30001 個(gè)鍵含特殊 token。4.2 分詞入口_tokenizedef _tokenize(self, text: str) - List[str]: if self.do_lower_case: text text.lower() return self._tokenizer.tokenize(text)即先按需小寫(xiě)化再交給SPMTokenizer.tokenize→_encode_as_pieces。后者tokenizer.py會(huì)先將輸入統(tǒng)一為 Unicodeconvert_to_unicode兼容 bytes 輸入然后若split_by_punctTrue先用_run_split_on_punc按標(biāo)點(diǎn)切詞再對(duì)每個(gè)詞片段分別spm.encode(w, out_typestr)否則直接spm.encode(text, out_typestr)返回 piece 列表。測(cè)試用例覆蓋了do_lower_case與split_by_punct的四種組合test_tokenizer.py。例如do_lower_caseTrue時(shí) \tHeLLo!how \n Are yoU? 被切為[▁hello, !, how, ▁are, ▁you, ?]其中▁是 SentencePiece 表示詞首空格的專用字符UTF-8 字節(jié)\xe2\x96\x81。4.3 特殊 token 拼裝格式build_inputs_with_special_tokenstokenizer.py定義了 DeBERTa 的標(biāo)準(zhǔn)輸入格式單序列[CLS] X [SEP]雙序列[CLS] A [SEP] B [SEP]get_special_tokens_masktokenizer.py返回與輸入等長(zhǎng)的 0/1 掩碼1 表示特殊 token。單序列為[1, 0...0, 1]雙序列為[1, 0...0, 1, 0...0, 1]若輸入已含特殊 token則回退到基類邏輯。create_token_type_ids_from_sequencestokenizer.py為雙序列任務(wù)生成 token type ids第一段全部為 0第二段全部為 1。注意 DeBERTa-v2/v3 的配置中type_vocab_size為 0見(jiàn) configuration.py模型結(jié)構(gòu)上并不依賴該區(qū)分但方法仍保留以便與 BERT 系接口兼容。build_offset_mapping_with_special_tokenstokenizer.py為序列標(biāo)注任務(wù)構(gòu)建偏移映射特殊 token 的偏移固定為(0, 0)單序列(0,0) X (0,0)雙序列(0,0) A (0,0) B (0,0)4.4 預(yù)處理與持久化prepare_for_tokenization(text, is_split_into_wordsFalse, **kwargs)tokenizer.py當(dāng)is_split_into_wordsTrue或add_prefix_spaceTrue時(shí)在文本前補(bǔ)一個(gè)空格這符合 SentencePiece 以▁標(biāo)記詞首的慣例save_vocabulary(save_directory, filename_prefixNone)tokenizer.py委托給內(nèi)部SPMTokenizer.save_pretrained將.spm文件寫(xiě)入目標(biāo)目錄可配合tokenizer.save_pretrained(...)完成整套保存save_resources(save_directory)tokenizer.py按resource_files_names遍歷將sentencepiece_model_file復(fù)制到目標(biāo)目錄源目標(biāo)相同時(shí)跳過(guò)保證資源文件隨模型一并落盤(pán)。五、sp_model_kwargsSentencePiece 采樣參數(shù)詳解DebertaV2Tokenizer與SPMTokenizer都將sp_model_kwargs原樣透?jìng)鹘osentencepiece.SentencePieceProcessor(**sp_model_kwargs)tokenizer.py。官方文檔明確支持的三個(gè)關(guān)鍵參數(shù)參數(shù)作用取值說(shuō)明enable_sampling開(kāi)啟子詞正則化subword regularizationTrue/Falsenbest_sizeunigram 采樣參數(shù)對(duì) BPE-Dropout 無(wú)效0或1不采樣取最優(yōu)切分 1從 nbest_size 個(gè)候選中采樣 0視為無(wú)窮大使用 forward-filtering-and-backward-sampling 算法在整張格lattice上采樣alphaunigram 采樣的平滑參數(shù)對(duì) BPE 而言是合并操作的 dropout 概率浮點(diǎn)數(shù)通常取0.1附近的小值典型用法——推理時(shí)保持確定性切分訓(xùn)練時(shí)啟用子詞正則化# 推理確定性切分 tokenizer DebertaV2Tokenizer(./spm.model) # 訓(xùn)練/數(shù)據(jù)增強(qiáng)子詞正則化 tokenizer DebertaV2Tokenizer( ./spm.model, sp_model_kwargs{enable_sampling: True, nbest_size: -1, alpha: 0.1}, )六、內(nèi)部實(shí)現(xiàn)SPMTokenizer 類SPMTokenizertokenizer.py是DebertaV2Tokenizer的底層引擎負(fù)責(zé)與 SentencePiece C 處理器交互。理解它能解釋許多黑盒行為。6.1 詞表加載與 id 布局spm sp.SentencePieceProcessor(**self.sp_model_kwargs) spm.load(vocab_file) bpe_vocab_size spm.GetPieceSize() self.vocab {spm.IdToPiece(i): i for i in range(bpe_vocab_size)} self.ids_to_tokens [spm.IdToPiece(i) for i in range(bpe_vocab_size)]詞表直接來(lái)自spm.IdToPiece。源碼注釋揭示了典型 SentencePiece 模型開(kāi)頭三個(gè) piece 的約定unk、s、/s分別對(duì)應(yīng) id 0、1、2。測(cè)試 test_get_vocab 驗(yàn)證了tests/fixtures/spiece.model的鍵順序首項(xiàng)pad、次項(xiàng)unk、末項(xiàng)[PAD]。也就是說(shuō)[PAD]、[CLS]、[SEP]、[MASK]等 DeBERTa 特殊 token 是被追加到 SentencePiece 詞表末尾的而不是像 BERT 那樣占據(jù) id 0-4。6.2 特殊 token 保護(hù)機(jī)制decodetokenizer.py在還原文本時(shí)會(huì)跳過(guò)特殊 token——[MASK]、[CLS]等不會(huì)被 SentencePiece 的 piece 解碼器處理而是在普通片段解碼結(jié)果后原樣拼接并在相鄰特殊 token 之間插入空格。add_special_token則支持運(yùn)行時(shí)向詞表追加新特殊 token。part_of_whole_word(token, is_bosFalse)tokenizer.py用于判斷 token 是否屬于一個(gè)完整詞的中間部分以▁開(kāi)頭的 piece 表示新詞起點(diǎn)返回False單個(gè)空白/控制/標(biāo)點(diǎn)字符或特殊 token 也返回False。這對(duì)需要按詞邊界恢復(fù)整詞的序列標(biāo)注任務(wù)很有用。6.3 標(biāo)點(diǎn)切分與字符分類_run_split_on_punctokenizer.py將文本按標(biāo)點(diǎn)拆成獨(dú)立片段標(biāo)點(diǎn)自身保留_is_punctuation將 ASCII 中所有非字母/數(shù)字字符33–47、58–64、91–96、123–126 區(qū)間以及 UnicodeP*類別視為標(biāo)點(diǎn)_is_whitespace與_is_control共同構(gòu)成字符分類工具其中\(zhòng)t、\n、\r被當(dāng)作空白而非控制字符處理。6.4 序列化支持SPMTokenizer實(shí)現(xiàn)了__getstate__/__setstate__tokenizer.pypickle 序列化時(shí)把底層spm處理器置為None反序列化時(shí)用sp.SentencePieceProcessor(**self.sp_model_kwargs)重新加載詞表文件并兼容舊版本缺少sp_model_kwargs屬性的場(chǎng)景。這使得 tokenizer 可以安全地隨訓(xùn)練腳本跨進(jìn)程/跨設(shè)備傳輸。七、測(cè)試驗(yàn)證行為基準(zhǔn)與注意事項(xiàng)倉(cāng)庫(kù)在 test_tokenizer.py 中通過(guò)TokenizerTesterMixin基類 自定義用例對(duì)DebertaV2Tokenizer做了全面驗(yàn)證可作為復(fù)現(xiàn)基準(zhǔn)from_pretrained_kwargs {add_prefix_space: True}即從預(yù)訓(xùn)練加載時(shí)默認(rèn)啟用前綴空格from_pretrained_vocab_key sentencepiece_model_file與類屬性resource_files_names對(duì)應(yīng)端到端測(cè)試 test_full_tokenizer對(duì)This is a test得到 ids[13, 1, 4398, 25, 21, 1289]、tokens[▁, T, his, ▁is, ▁a, ▁test]。其中單字符T反向轉(zhuǎn)換回unkback_tokens_target中第 2 項(xiàng)直觀展示了 SentencePiece 詞表粒度的行為差異。需要特別注意的兩點(diǎn)do_lower_case默認(rèn)關(guān)閉DeBERTa-v3 官方預(yù)訓(xùn)練即采用大小寫(xiě)敏感分詞這與 BERT 系do_lower_caseTrue的默認(rèn)習(xí)慣相反加載后請(qǐng)勿盲目套用小寫(xiě)化預(yù)處理慢/快分詞器一致性已知問(wèn)題測(cè)試中test_sentencepiece_tokenize_and_convert_tokens_to_string與test_sentencepiece_tokenize_and_decode兩個(gè)用例被unittest.skip跳過(guò)源碼注釋明確說(shuō)明fast tokenizer 中存在一個(gè) bug 導(dǎo)致與 slow tokenizer 不一致。這意味著在部署 fast tokenizer 路徑時(shí)應(yīng)針對(duì)實(shí)際語(yǔ)料做一致性回歸驗(yàn)證。八、實(shí)戰(zhàn)完整加載與編碼示例將上述內(nèi)容串成一條可運(yùn)行的完整流程基于microsoft/deberta-v3-basefrom paddlenlp.transformers import AutoTokenizer # 1. 加載自動(dòng)下載 spm.model 詞表 tokenizer AutoTokenizer.from_pretrained(microsoft/deberta-v3-base) # 2. 單序列編碼自動(dòng)拼裝 [CLS] X [SEP] text DeBERTa improves the BERT design with disentangled attention. inputs tokenizer(text, max_length512, truncationTrue) print(inputs[input_ids][:10]) # 首 token 為 cls_token_id末 token 為 sep_token_id # 3. 雙序列編碼問(wèn)答/文本對(duì)任務(wù)[CLS] A [SEP] B [SEP] pair tokenizer(What is DeBERTa?, A model with disentangled attention.) print(pair[token_type_ids][:5]) # 第一段為 0 # 4. 解碼還原 print(tokenizer.decode(inputs[input_ids])) # 5. 保存與復(fù)用 tokenizer.save_pretrained(./my_deberta_v3) reloaded DebertaV2Tokenizer.from_pretrained(./my_deberta_v3)結(jié)語(yǔ)DebertaV2Tokenizer是 PaddleNLP 中融合 SentencePiece 子詞能力與 BERT 系特殊 token 約定的一類典型實(shí)現(xiàn)它以.spm模型為唯一詞表資源通過(guò)SPMTokenizer完成 piece 編碼、特殊 token 保護(hù)、標(biāo)點(diǎn)切分與可序列化封裝并借助AutoTokenizer無(wú)縫接入 4 個(gè)官方預(yù)訓(xùn)練權(quán)重。理解其構(gòu)造參數(shù)do_lower_case、split_by_punct、sp_model_kwargs與底層行為▁詞首標(biāo)記、特殊 token 追加至詞表末尾、采樣式切分是在 DeBERTa-v2/v3 上進(jìn)行微調(diào)、推理與數(shù)據(jù)增強(qiáng)的前提。更多細(xì)節(jié)可繼續(xù)閱讀 configuration.py、modeling.py 以及 test_tokenizer.py 中的全部測(cè)試用例。贊分享人工智能大模型預(yù)訓(xùn)練微調(diào)LoRARLHF強(qiáng)化學(xué)習(xí)分布式訓(xùn)練【免費(fèi)下載鏈接】PaddleNLPEasy-to-use and powerful LLM and SLM library with awesome model zoo.項(xiàng)目地址https://gitcode.com/gh_mirrors/pa/PaddleNLP點(diǎn)擊查看免費(fèi)下載相關(guān)推薦PaddleNLP UnifiedTransformerTokenizer 源碼級(jí)解析基于 SentencePiece 的對(duì)話式分詞器PaddleNLP UnifiedTransformerTokenizer 源碼級(jí)解析基于 SentencePiece 的對(duì)話式分詞器 本文圍繞 Paddle人工智能大模型預(yù)訓(xùn)練微調(diào)LoRARLHF強(qiáng)化學(xué)習(xí)分布式訓(xùn)練模型推理服務(wù)推理引擎模型量化模型壓縮本地部署NLPQbot 銀行股配對(duì)交易實(shí)戰(zhàn)協(xié)整檢驗(yàn)、z-score 價(jià)差信號(hào)與 backtrader 多數(shù)據(jù)回測(cè)Qbot 銀行股配對(duì)交易實(shí)戰(zhàn)協(xié)整檢驗(yàn)、z score 價(jià)差信號(hào)與 backtrader 多數(shù)據(jù)回測(cè) 本文基于 Qbot 倉(cāng)庫(kù) 量化三 配對(duì)交易 https:/人工智能大模型預(yù)訓(xùn)練微調(diào)LoRARLHF強(qiáng)化學(xué)習(xí)分布式訓(xùn)練模型推理服務(wù)推理引擎模型量化模型壓縮本地部署NLPLeetCode-Go 題解 | 1670. Design Front Middle Back Queue用 container/list 與中位指針實(shí)現(xiàn)前中后隊(duì)列LeetCode Go 題解 | 1670. Design Front Middle Back Queue用 container/list 與中位指針實(shí)現(xiàn)前中人工智能大模型預(yù)訓(xùn)練微調(diào)LoRARLHF強(qiáng)化學(xué)習(xí)分布式訓(xùn)練模型推理服務(wù)推理引擎模型量化模型壓縮本地部署NLP上一篇排序算法內(nèi)存占用Learn-Algorithms中的空間復(fù)雜度下一篇自然語(yǔ)言驅(qū)動(dòng)的瀏覽器自動(dòng)化革命Stagehand如何重塑Web交互范式創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考