拓冰建站拓冰建站
首页 / 资讯中心 / 正文

PaddleNLP LayoutXLMTokenizer 深度解析:基于 SentencePiece 的多模态文档理解分词器

人工智能大模型预训练微调LoRARLHF强化学习分布式训练【免费下载链接】PaddleNLPEasy-to-use and powerful LLM and SLM library with awesome model zoo.项目地址https://gitcode.com/gh_mirrors/pa/PaddleNLP点击查看免费下载导读本文以 PaddleNLP 仓库中paddlenlp.transformers.layoutxlm.tokenizer模块为核心系统讲解 LayoutXLM 模型面向多语言文档视觉理解任务的 Transformer 模型所使用的分词器设计与实现。通过本文你将掌握LayoutXLMTokenizer的 SentencePiece 子词切分机制、特殊 token 管理、id 与 token 双向转换、文本还原等核心能力并理解它如何与LayoutXLMModel的 bbox 空间位置嵌入协同工作从而具备在实际文档信息抽取任务中正确使用与二次开发该分词器的能力。一、文档定位从 API 文档到源码实现本仓库的docs/zh/source/paddlenlp.transformers.layoutxlm.tokenizer.rst采用 Sphinxautomodule指令自动生成 API 文档其完整内容为tokenizer .. automodule:: paddlenlp.transformers.layoutxlm.tokenizer :members: :no-undoc-members: :show-inheritance:该 RST 文件是 LayoutXLM 模块文档树的三个子页之一其余为 modeling 与 visual_backbone总览见 paddlenlp.transformers.layoutxlm.rst。它本身不包含直接文字说明而是声明从paddlenlp.transformers.layoutxlm.tokenizer模块自动提取所有公开成员含继承关系生成 API 文档。因此文档的实际技术主体完全由模块源码决定——即 tokenizer.py 中的LayoutXLMTokenizer类。下面的讲解将以该源码为骨架逐层展开其设计细节。二、LayoutXLMTokenizer 的总体设计与继承关系LayoutXLMTokenizer定义在 paddlenlp/transformers/layoutxlm/tokenizer.py 第 45 行继承自paddlenlp.transformers.PretrainedTokenizer即 PaddleNLP 统一的预训练分词器基类位于 paddlenlp/transformers/tokenizer_utils.py因此天然获得from_pretrained、save_pretrained、__call__、encode、decode、batch_encode等通用能力同时按自身需求覆写了分词相关的核心方法。从类属性可以看出它的几个关键配置类属性值含义resource_files_names{vocab_file: sentencepiece.bpe.model}预训练资源中词表文件名pretrained_resource_files_maplayoutxlm-base-uncased→ 远程sentencepiece.bpe.model各预训练权重对应的词表下载地址pretrained_init_configuration{layoutxlm-base-uncased: {do_lower_case: False}}预训练模型的初始化参数max_model_input_sizes{layoutxlm-base-uncased: 514}模型最大输入长度514 512 2 个特殊 tokenmodel_input_names[input_ids, attention_mask]模型标准输入名值得注意pretrained_init_configuration中do_lower_caseFalse表明该分词器默认不做大小写归一化与 BERT 的 uncased 处理不同这有利于保留文档 OCR 文本中的原始字符信息。三、基于 SentencePiece 的子词切分实现3.1 底层引擎与词表加载LayoutXLM 与 XLNet 一脉相承采用SentencePieceUnigram/BPE 子词模型作为底层切分引擎。构造函数中完成词表加载self.sp_model spm.SentencePieceProcessor() self.sp_model.Load(vocab_file)其中vocab_file即预训练发布的sentencepiece.bpe.model。切分入口_tokenize直接委托给 SentencePiecedef _tokenize(self, text): return self.sp_model.EncodeAsPieces(text)EncodeAsPieces返回的是子词piece列表例如对 unwanted 可能切分为[▁un, want, ed]这类以▁SPIECE_UNDERLINE标记词首的子词序列。3.2 特殊 token 与词汇表偏移offset机制构造函数的默认特殊 token 与 XLNet 保持一致参数默认值语义bos_tokens序列起始eos_token/sep_token/s序列结束 / 句子分隔cls_tokens分类起始unk_tokenunk未知词pad_tokenpad填充mask_tokenmask掩码源码中维护了一个显式的tokens_to_ids映射self.tokens_to_ids {s: 0, pad: 1, /s: 2, unk: 3} # The first real token , has position 4 in the original fairseq vocab and position 3 in the spm vocab self.offset 1 self.tokens_to_ids[mask] len(self.sp_model) self.offset这段代码揭示了 LayoutXLM 词表的特殊布局SentencePiece 词表自身把s、pad、/s、unk排在 id 03但布局 XLM 沿用了 fairseq 的词表排列习惯将,映射到 id 4即 spm 中的 id 3因此引入offset 1所有 SentencePiece 子词的真实 id 需要加上这个偏移mask被追加在词表末尾id 为len(self.sp_model) 1。相应地vocab_size的定义为property def vocab_size(self): return len(self.sp_model) self.offset 1 # Add the mask token即SentencePiece 词表大小 1offset 1mask token。3.3 token ↔ id 双向转换_convert_token_to_id与_convert_id_to_token实现双向映射均需要考虑 offsetdef _convert_token_to_id(self, token): if token in self.tokens_to_ids: return self.tokens_to_ids[token] spm_id self.sp_model.PieceToId(token) # Need to return unknown token if the SP model returned 0 return spm_id self.offset if spm_id else self.unk_token_id def _convert_id_to_token(self, index): if index in self.ids_to_tokens: return self.ids_to_tokens[index] return self.sp_model.IdToPiece(index - self.offset)其中有一个容易忽略的细节如果PieceToId返回 0SentencePiece 中 id 0 是unk占位则映射为self.unk_token_id即 3而不是直接使用0 offset从而保证未知子词正确落到unk。3.4 子词序列还原为字符串convert_tokens_to_string把子词列表拼接回可读文本核心是把 SentencePiece 的词首标记▁还原为空格def convert_tokens_to_string(self, tokens): out_string .join(tokens).replace(SPIECE_UNDERLINE, ).strip() return out_string例如子词序列[▁a, ▁weirdly, ▁test]会被还原为a weirdly test该行为由测试用例 test_tokenizer.py 中的test_internal_consistency显式断言。四、序列组装与特殊 token 处理4.1 单句与双句拼接规则build_inputs_with_special_tokens定义了 LayoutXLM 的序列格式单序列[CLS] tokens [SEP]即[cls_token_id] token_ids_0 [sep_token_id]双序列[CLS] tokens_0 [SEP] [SEP] tokens_1 [SEP]即cls token_ids_0 sep sep token_ids_1 sep。双序列场景下连续出现两个/s这与 XLNet 风格一致适合问题 文档或实体对这类文档关系抽取的输入组织方式。4.2 token type ids 与特殊 token 掩码create_token_type_ids_from_sequences对任意拼接结果统一返回全 0 的 token type idsLayoutXLM 不使用分段 id 区分句子而是通过 bbox 空间位置信息区分文本区域。get_special_tokens_mask支持两种模式输入already_has_special_tokensTrue时直接从现有 id 序列中标记sep_token_id/cls_token_id位置为 1否则按拼接规则生成掩码例如单序列为[1] [0]*len(tokens) [1]双序列为[1] [0]*n0 [1, 1] [0]*n1 [1]。4.3 需要添加的特殊 token 数量num_special_tokens_to_add(pairFalse)通过构造空序列调用build_inputs_with_special_tokens计算需要添加的特殊 token 数单序列为 2CLS SEP双序列为 5CLS 2×SEP SEP供下游训练逻辑在计算长度或 padding 时参考。五、与 LayoutXLMModel 的协作分词结果如何进入多模态模型LayoutXLMTokenizer负责产出input_ids而模型 LayoutXLMModel第 598 行起还额外接收bbox检测框坐标输入。文本侧嵌入由_calc_text_embeddings完成words_embeddings self.embeddings.word_embeddings(input_ids) position_embeddings self.embeddings.position_embeddings(position_ids) spatial_position_embeddings self.embeddings._cal_spatial_position_embeddings(bbox) token_type_embeddings self.embeddings.token_type_embeddings(token_type_ids) embeddings words_embeddings position_embeddings spatial_position_embeddings token_type_embeddings可见模型语义由词嵌入 位置嵌入 空间位置嵌入bbox 分段嵌入四部分叠加而成。因此实际使用中用户需要把 OCR 得到的每个 token 的边界框形如[x0, y0, x1, y1]的四元组列表与分词结果按 token 一一对齐后一起喂给模型——这正是测试用例 test_tokenizer.py 中get_words_and_boxes所构造的数据形态。此外当启用use_visual_backbone时模型还会融合VisualBackbone提取的图像特征_calc_img_embeddings形成文本 空间 视觉三模态表示。六、实践指南加载、调用与验证6.1 从预训练模型加载layoutxlm-base-uncased是仓库中唯一登记了词表资源的预训练模型加载方式与 PaddleNLP 其他预训练模型一致from paddlenlp.transformers import LayoutXLMTokenizer tokenizer LayoutXLMTokenizer.from_pretrained(layoutxlm-base-uncased)加载时会自动下载sentencepiece.bpe.model词表并应用max_model_input_sizes 514的长度限制输入 token 数建议不超过 512加上 CLS/SEP 后正好 514。6.2 保存与重新加载LayoutXLMTokenizer通过基类的save_pretrained将sentencepiece.bpe.model与 tokenizer 配置写入本地目录之后可用from_pretrained重新加载。测试用例test_save_sentencepiece_tokenizer见 test_tokenizer.py验证了原始词表文件被删除后仍可仅凭保存目录恢复并得到完全一致的编码结果这得益于save_pretrained会在保存时序列化底层 SentencePiece 模型。6.3 分词基本操作示例# 子词切分 pieces tokenizer.tokenize(a weirdly test) # 子词 - id ids tokenizer.convert_tokens_to_ids(pieces) # id - 子词 tokens tokenizer.convert_ids_to_tokens(ids) # 还原为字符串 text tokenizer.decode(ids) # 期望得到 a weirdly test对应的行为约束可见于 test_tokenizer.py 的test_internal_consistency分词→转 id→转 token→decode 的完整回路必须得到可读字符串。6.4 与模型串联的完整流程一个典型的文档理解推理流程为使用 OCR 工具抽取文档中的单词words与对应边界框boxes四元组坐标对每个 word 调用tokenizer.tokenize(word)获取子词并据此将 bbox 展开对齐到每个子词调用tokenizer(words, boxesboxes, ...)或自行构造input_ids、attention_mask、bbox得到模型输入将输入送入LayoutXLMForTokenClassification/LayoutXLMForRelationExtraction等下游头完成实体识别或关系抽取相关模型类见 modeling.py 第 839 行与第 1265 行。七、源码研读路线图如果你想进一步研究推荐按以下路径阅读仓库源码分词器实现paddlenlp/transformers/layoutxlm/tokenizer.py本文主体模型主体paddlenlp/transformers/layoutxlm/modeling.pyLayoutXLMModel、LayoutXLMForTokenClassification、LayoutXLMForRelationExtraction视觉骨干paddlenlp/transformers/layoutxlm/visual_backbone.py 及其配置 visual_backbone.yaml单元测试tests/transformers/layoutxml/test_tokenizer.py分词器行为契约与 tests/fixtures/test_sentencepiece.model测试用 SentencePiece 词表。八、总结LayoutXLMTokenizer是 LayoutXLM 多模态文档理解模型链路上的文本入口它以 SentencePiece 为切分引擎通过offset偏移机制兼容 fairseq 词表布局用▁标记还原文本并提供了与 XLNet 风格一致的序列组装规则。理解它的设计是正确使用bbox对齐、完成 OCR 文本到模型输入转换的前提也是深入 LayoutXLM 系列模型文本嵌入、空间位置嵌入、视觉嵌入三者融合的起点。赞分享人工智能大模型预训练微调LoRARLHF强化学习分布式训练【免费下载链接】PaddleNLPEasy-to-use and powerful LLM and SLM library with awesome model zoo.项目地址https://gitcode.com/gh_mirrors/pa/PaddleNLP点击查看免费下载相关推荐PaddleNLP UnifiedTransformerTokenizer 源码级解析基于 SentencePiece 的对话式分词器PaddleNLP UnifiedTransformerTokenizer 源码级解析基于 SentencePiece 的对话式分词器 本文围绕 Paddle人工智能大模型预训练微调LoRARLHF强化学习分布式训练模型推理服务推理引擎模型量化模型压缩本地部署NLPPaddleNLP T5Tokenizer 深度解析基于 SentencePiece 的 T5 分词器架构、参数与实战用法PaddleNLP T5Tokenizer 深度解析基于 SentencePiece 的 T5 分词器架构、参数与实战用法 T5Text to Text T人工智能大模型预训练微调LoRARLHF强化学习分布式训练模型推理服务推理引擎模型量化模型压缩本地部署NLPPaddleNLP FNetTokenizer 解析基于 SentencePiece 的 FNet 分词器完整使用指南PaddleNLP FNetTokenizer 解析基于 SentencePiece 的 FNet 分词器完整使用指南 导读 FNet 是 Google 提出人工智能大模型预训练微调LoRARLHF强化学习分布式训练模型推理服务推理引擎模型量化模型压缩本地部署NLP上一篇Protocol Buffers Objective-CiOS/macOS原生开发效率提升指南下一篇VeryNginx性能监控终极指南使用Prometheus和Grafana的可视化方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门