ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Transformers 中的 CANINE:字符级无分词 Transformer 的架构解析与实用指南

Transformers 中的 CANINE:字符级无分词 Transformer 的架构解析与实用指南 Transformers 中的 CANINE字符级无分词 Transformer 的架构解析与实用指南【免费下载链接】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/transformersCANINECharacter Architectures with No tokenization In Neural Encoders是一种完全跳过分词tokenization-free的 Transformer 编码器它不做 subword / wordpiece 切分而是直接以「字符」为基本输入单元在原始 Unicode 码点codepoint上完成训练与推理。本文以 docs/source/en/model_doc/canine.md 为骨架结合本仓库内 configuration_canine.py、modeling_canine.py 与 tokenization_canine.py 的源码实现讲清它的设计动机、下采样-上采样的高效编码管线、配置与分词器细节并给出可直接运行的嵌入生成与下游微调示例。读完你会掌握如何在多语言、复杂拼写或含噪声文本场景下落地这一无需词表的模型方案。为什么需要无分词的模型传统预训练语言模型依赖分词器把文本切分成 subword 或 wordpiece。这带来两处天然的痛点词表与规则耦合语言对分词规则复杂或不一致的语言同一个词在不同拼写/书写系统中切分结果差异很大OOV 与形态切分错误会沿模型层层放大噪声输入脆弱打字错误、非常规拼写会直接破坏分词结果进而劣化表征。CANINE 的答案是以字符为单位模型处理的是原始 Unicode 字符序列不需要词表、不需要语言相关的分词器。理论上对任意书写系统的任意文本都能工作且天然对拼写噪声更鲁棒。字符输入的代价是序列显著变长为此 CANINE 使用了一个关键技巧——输入早期下采样downsampling先在浅层编码器中对字符上下文建模再把相邻若干字符压缩成一个分子molecule交给深层 Transformer避免深层网络逐字符处理带来的开销从而在保留字符级信息的同时维持可接受的训练与推理效率。原始 CANINE checkpoint 发布在 Google 组织下模型卡片中的google/canine-c与google/canine-s见 configuration_canine.py即为其典型代表。架构核心字符编码 → 下采样 → 深层编码 → 上采样CanineModel的骨架定义在 modeling_canine.py前向流程在 forward。与普通 BERT 不同它在一条序列上串联了三个 Transformer 编码器与两条卷积变换字符嵌入CanineEmbeddings为每个 Unicode 码点生成向量。由于全 Unicode 共有 1,114,112 个码点直接建大词表不可行CANINE 采用多重哈希嵌入multiple hashing把hidden_size切分成num_hash_functions份 shard每个 hash 函数用一份独立的num_hash_buckets大小的嵌入表。_hash_bucket_tensors中通过((input_ids 1) * prime) % num_buckets计算桶号素数表_PRIMES支持最多 16 个 hash 函数最后把各 shard 的向量torch.cat回完整维度见 modeling_canine.py。位置嵌入与 token type 嵌入随后叠加经 LayerNorm 与 dropout 输出。初始浅层字符编码器initial char encoder单层、带块状局部注意力的 Transformer负责对整条字符序列做轻量上下文建模见 initial_char_encoder 的构造。局部注意力把长度为 stride 的相邻字符切成块只允许块内互相 attend第一位置是否全局 attend 可通过参数开关把字符级计算的复杂度约束在可接受范围见 CanineAttention 的局部注意力分支。字符到分子下采样CharactersToMolecules将[CLS]单独保留后对剩余字符序列做kernelrate、striderate 的 Conv1d等价于每downsampling_rate个字符平均为一个向量得到长度为char_seq_len / downsampling_rate的分子序列见 modeling_canine.py。深层 BERT 编码器deep encoder在压缩后的分子序列上运行完整的深层 Transformer默认 12 层分子序列比字符序列短 4 倍这正是效率来源。分子到字符上采样用_repeat_molecules把每个分子向量按downsampling_rate复制回字符长度不足一个 window 的余数位置通过重复最后一个分子补齐见 modeling_canine.py再与第 2 步的字符编码在特征维拼接随后用upsampling_kernel_size宽的ConvProjectionConv1dkernel4把hidden_size*2投影回hidden_size见 modeling_canine.py。最终浅层字符编码器final char encoder在上采样回字符分辨率的表示上再跑一层全注意力 Transformer得到逐字符的最终输出last_hidden_state同时池化器CaninePooler取序列首 token 过 LinearTanh 得到pooler_output该线性层权重在预训练的 next sentence prediction 目标中训练见 modeling_canine.py。注意由于模型输出的是字符级表示因此 token 分类类任务的标签应理解为字符类别而非词级别标签源码与文档一致指出ConvProjection 中的注释与NotImplementedError按字符位置做 MLM 的 CanineForMaskedLM 目前尚未支持——CANINE 的预训练利用了 MLM 与 NSP 目标但在本仓库中它主要用于下游任务微调。配置详解CanineConfig 参数表配置类CanineConfig定义于 configuration_canine.pymodel_type canine。它完整继承了 BERT 风格公共参数并新增了 CANINE 特有参数参数默认值含义downsampling_rate4深层编码器前字符序列的下采样倍率每 N 个字符 → 1 个分子upsampling_kernel_size4卷积上采样投影层的核宽用于把维度从hidden_size*2投影回hidden_sizenum_hash_functions8多重哈希嵌入所用的哈希函数个数每个哈希函数各有一份独立嵌入矩阵num_hash_buckets16384哈希桶总数每个哈希函数嵌入表的行数local_transformer_stride128初始浅层编码器局部注意力的分块步长/宽度默认 128 便于 TPU/XLA 内存对齐公共参数与默认值同文件 L57-L75hidden_size768、num_hidden_layers12作用于深层编码器、num_attention_heads12、intermediate_size3072、hidden_actgelu、hidden_dropout_prob0.1、attention_probs_dropout_prob0.1、max_position_embeddings16384、type_vocab_size16、initializer_range0.02、layer_norm_eps1e-12特殊 token id 定义为pad_token_id0、bos_token_id0xE000、eos_token_id0xE001——它们正是 tokenization_canine.py 中 Unicode私有使用区Private Use Area的特殊码点。创建配置与随机初始化模型 from transformers import CanineConfig, CanineModel # Initializing a CANINE google/canine-s style configuration configuration CanineConfig() # Initializing a model (with random weights) from the google/canine-s style configuration model CanineModel(configuration) # Accessing the model configuration configuration model.config需注意downsampling_rate必须能整除序列各维度下采样使用nn.Conv1d(kerneldownsampling_rate, stridedownsampling_rate)CharactersToMolecules而上采样核宽upsampling_kernel_size决定卷积投影每次覆盖的字符窗口数量。分词器即字符切分器CanineTokenizer 原理CanineTokenizertokenization_canine.py是一个纯字符切分器核心逻辑只有两步_tokenize用list(text)把文本切分成单个字符_convert_token_to_id用ord(token)把字符转成 Unicode 码点整数。词表空间即为全 Unicodevocab_size返回1114112UNICODE_VOCAB_SIZE不需要下载任何vocab.txt之类的词表文件。特殊符号被定义在 Unicode 私有使用区内确保永远不会与真实字符冲突特殊码点值说明PAD0x0000[PAD]CLS/BOS0xE000[CLS]/[BOS]SEP/EOS0xE001[SEP]/[EOS]MASK0xE003[MASK]RESERVED0xE004[RESERVED]因此源码注释中特别强调不设[UNK]类字符——任何码点天然在词表内不存在未知词。分词器还实现/继承并适配了build_inputs_with_special_tokens、get_special_tokens_mask、create_token_type_ids_from_sequences等接口本仓库中借助token_type_ids_patternall_zeros、special_tokens_patterncls_sep等声明驱动基类的特殊 token 处理逻辑见 tokenization_canine.py。单条序列可直接处理任意长度文本model_max_length默认2048而CanineConfig.max_position_embeddings为16384超长截断与 padding 在调用分词器时完成。动手生成句子嵌入三种调用入口模型文档展示了用Pipeline与AutoModel生成句嵌入并指出同样流程也支持命令行入口。以下片段可直接运行示例文本来自模型文档方式一Pipelinefrom transformers import pipeline pipeline pipeline( taskfeature-extraction, modelgoogle/canine-c, device0, ) pipeline(Plant create energy through a process known as photosynthesis.)方式二AutoModel手工码点编码import torch from transformers import AutoModel model AutoModel.from_pretrained(google/canine-c, device_mapauto) text Plant create energy through a process known as photosynthesis. input_ids torch.tensor([[ord(char) for char in text]]) outputs model(input_ids) pooled_output outputs.pooler_output sequence_output outputs.last_hidden_state这里ord(char)手工把每个字符映射为码点——这正是 CANINE不需要 tokenizer的体现。若要走命令行方式本仓库的transformersCLI 通过子命令组织见 cli/transformers.py其中serve子命令即可将加载好的模型含 pipeline封装为对外推理服务见 cli/serve.py仓库内部还提供了把原始 TF checkpoint 转成 PyTorch 的脚本 convert_canine_original_tf_checkpoint_to_pytorch.py。方式三配合 AutoTokenizer 做批量编码推荐CANINE 可以带 tokenizer 使用也可以完全不使用。但对于批量推理与训练模型文档明确建议使用 tokenizer 统一补齐padding与截断truncation保证 batch 内序列等长from transformers import AutoTokenizer, AutoModel tokenizer AutoTokenizer(google/canine-c) model AutoModel.from_pretrained(google/canine-c) inputs [Life is like a box of chocolates., You never know what you gonna get.] encoding tokenizer(inputs, paddinglongest, truncationTrue, return_tensorspt).to(model.device) outputs model(**encoding)CanineTokenizer与CanineConfig、CanineModel等均已注册进 Auto API见 models/auto/auto_mappings.py、models/auto/tokenization_auto.py 与 models/auto/modeling_auto.py因此AutoModel.from_pretrained(google/canine-c)、AutoConfig与AutoTokenizer均可直接工作。下游任务模型清单与输出结构CanineModel之外仓库为常用任务提供了带任务头的模型全部定义于 modeling_canine.pyAuto 映射覆盖情况如 models/auto/modeling_auto.py 所示模型类任务头部与用法对应源码CanineModel基础编码器输出逐字符last_hidden_state与pooler_outputCanineModelCanineForSequenceClassification池化输出上接 Linear 分类头适用于 GLUE 类任务num_labels1时按回归MSE计算损失modeling_canine.pyCanineForMultipleChoice输入展平为(batch, num_choices, seq)池化输出上接 Linear→1 打分后对 choice 维度求交叉熵modeling_canine.pyCanineForTokenClassification直接使用逐字符序列输出接分类头标签按字符而非词计算modeling_canine.pyCanineForQuestionAnswering序列输出上接qa_outputs预测 span 起止 logits平均 start/end 交叉熵作为损失modeling_canine.pyCanineModelOutputWithPoolingCANINE 专属输出结构额外携带浅层/深层三组编码器的hidden_states与attentionsmodeling_canine.pyCanineModelOutputWithPooling与标准BaseModelOutputWithPooling略有差异其自定义 docstring 也说明了这一点由于模型内部串联了三个编码器开启output_hidden_statesTrue时返回的hidden_states元组包含三组状态且深层编码器对应的状态长度为seq_len // downsampling_rate分子分辨率浅层编码器对应状态保持字符分辨率。这一特性也被模型测试用例显式校验test_modeling_canine.py中按浅层 2 个输入/输出状态 深层num_hidden_layers1个状态 最终浅层 2 个状态的规律断言各层形状见 tests/models/canine/test_modeling_canine.py。分类、多选、token 分类、QA 等模型的输入参数均包含input_ids / attention_mask / token_type_ids / position_ids / inputs_embeds与 BERT 家族一致不同任务仅在labels形态上不同序列级标量、choice 下标、逐字符标签、起止位置对。CaninePreTrainedModel声明了supports_gradient_checkpointing Truemodeling_canine.py长序列微调时可通过开启梯度检查点来降低显存占用。使用注意与最佳实践可不用分词器但批量推荐用它单条输入可手工构造码点张量批量训练/推理务必用AutoTokenizer设置paddinglongest、truncationTrue否则长度不一致会导致attention_mask语义错乱、批次内无法对齐。定位是微调基座模型文档明确指出 CANINE 主要面向下游任务微调使用预训练阶段以 masked language modeling 与 next sentence prediction 为目标。二者不应混淆——当前 PyTorch 实现中面向掩码字符预测的 MLM 任务头尚不支持对应路径抛出NotImplementedError。长度与效率单条最长受max_position_embeddings16384约束默认model_max_length2048超长输入请先截断。字符级输入天然较长深层编码器只在 1/4 分辨率的分子序列上运行这是模型在逐字符 高效之间取得平衡的关键设计。对齐与正确性downsampling_rate与upsampling_kernel_size、local_transformer_stride需与预期序列长度配合使用默认 128 的 stride 是为了 TPU/XLA 内存对齐而设定见 configuration_canine.py。分子层注意力掩码由_downsample_attention_mask用 MaxPool 对字符掩码做下采样得到modeling_canine.py。验证与转换仓库在 tests/models/canine 提供建模与分词器的完整测试若需从 Google 原始 TF checkpoint 转换权重可参考转换脚本 convert_canine_original_tf_checkpoint_to_pytorch.py。总而言之CANINE 为分词规则复杂、噪声多、语种混杂的文本场景提供了一个词表无关的编码器方案以全 Unicode 字符为输入、用哈希嵌入控制参数规模、用浅层局部注意力 下采样/上采样卷积换取效率并以三阶段编码器输出既可用于句级任务pooler_output也可用于逐字符任务last_hidden_state的双分辨率表示。开发者可直接通过AutoModel与AutoTokenizer按本文示例完成嵌入生成与各下游任务的微调接入。【免费下载链接】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),仅供参考
返回列表