【mT5多语言翻译】之二——架构:从T5到mT5的模型演进与核心源码剖析
1. 从T5到mT5多语言能力的进化之路2019年Google推出的T5Text-to-Text Transfer Transformer模型开创了万物皆可文本生成的新范式。这个将各类NLP任务统一转化为文本到文本text-to-text框架的模型在GLUE、SuperGLUE等基准测试中刷新了多项记录。但T5的英语单一语言特性限制了其全球化应用场景于是mT5multilingual T5应运而生。架构延续性是mT5最显著的特征。作为T5的多语言版本mT5完全继承了T5的模型架构设计包括标准的Encoder-Decoder结构相对位置偏置Relative Position Bias机制相同的注意力头配置base版本12头large版本24头统一的文本到文本任务格式但mT5在以下三方面做出了关键改进词汇表扩展从T5的32,000词表扩展到250,000的多语言词表覆盖101种语言训练数据重构Common Crawl数据集经过严格过滤最终使用101种语言的750GB文本动态掩码策略针对多语言特性优化了Span Corruption预训练目标实际测试中当我们将英语翻译提示translate English to German: Hello world分别输入T5和mT5时T5能准确输出德语翻译而初始未经微调的mT5可能输出乱码——这正是因为mT5需要针对具体任务进行二次训练。2. 核心架构解析T5Block的双重身份T5/mT5的核心组件T5Block采用了条件化架构设计通过配置参数实现编码器与解码器的角色切换。这种设计使得同一套代码可以服务两种完全不同的功能场景。2.1 编码器模式下的T5Block当is_decoderFalse时T5Block简化为class T5Block(T5PreTrainedModel): def __init__(self, config): super().__init__(config) self.layer nn.ModuleList() self.layer.append(T5LayerSelfAttention(config)) # 自注意力层 self.layer.append(T5LayerFF(config)) # 前馈网络层其数据处理流程为输入序列通过T5LayerSelfAttention计算全局上下文表征经过LayerNorm后进行残差连接通过T5LayerFF进行非线性变换再次LayerNorm和残差连接2.2 解码器模式下的T5Block当is_decoderTrue时模块变为class T5Block(T5PreTrainedModel): def __init__(self, config): super().__init__(config) self.layer nn.ModuleList() self.layer.append(T5LayerSelfAttention(config)) # 自注意力层 self.layer.append(T5LayerCrossAttention(config)) # 新增交叉注意力层 self.layer.append(T5LayerFF(config)) # 前馈网络层新增的交叉注意力层使解码器能够访问编码器的输出这是机器翻译等序列生成任务的关键。实际运行时会经历三个阶段自注意力阶段处理已生成的目标语言token交叉注意力阶段查询源语言编码结果前馈变换阶段生成下一个token的概率分布3. 注意力机制的工程实现T5Attention类是整套架构中最精妙的设计它通过参数复用和条件分支实现了三种注意力计算编码器自注意力解码器自注意力解码器交叉注意力3.1 相对位置偏置的革新与传统Transformer不同T5/mT5抛弃了绝对位置编码采用更灵活的相对位置偏置class T5Attention(nn.Module): def __init__(self, config): self.relative_attention_bias nn.Embedding( config.relative_attention_num_buckets, config.num_heads)这种设计使得模型能够动态学习不同距离的位置关系更好地处理长序列最大支持512 token通过共享偏置矩阵减少内存占用3.2 注意力计算的三重分支forward方法中的核心逻辑体现在project函数def project(hidden_states, proj_layer, key_value_states, past_key_value): if key_value_states is None: # 自注意力分支 proj_states proj_layer(hidden_states) elif past_key_value is None: # 初始交叉注意力 proj_states proj_layer(key_value_states) else: # 缓存加速的交叉注意力 proj_states past_key_value这种设计实现了计算效率优化重复利用已计算的key-value对内存节省缓存机制避免重复计算功能统一单模块处理多种注意力模式4. 多语言适配的关键改造mT5在T5基础上进行了多项针对性改进这些改动主要集中在模型输入输出层面4.1 词汇表扩展策略原始T5的WordPiece分词器被替换为SentencePiece模型关键调整包括词表大小从32k→250k平衡各语言覆盖率非均匀采样特殊token增加语言标识符4.2 训练目标优化mT5改进了T5的Span Corruption预训练目标动态调整掩码长度平均3个token多语言混合采样低资源语言上采样引入语言ID作为附加特征4.3 实践中的注意事项使用mT5进行多语言翻译时需要注意必须显式指定语言对如translate English to French: ...低资源语言需要更多微调数据建议采用适配器Adapter进行参数高效微调通过HuggingFace Transformers加载预训练模型时可以清晰看到架构差异from transformers import T5Model, MT5Model t5 T5Model.from_pretrained(t5-base) mt5 MT5Model.from_pretrained(google/mt5-base) print(t5.config.vocab_size) # 输出: 32128 print(mt5.config.vocab_size) # 输出: 250112这套架构设计使得mT5在保持T5优秀特性的同时获得了处理跨语言任务的能力。在实际项目中我们通常会在mT5基础上追加特定语言的微调比如使用OPUS数据集进行中英翻译优化。模型展现出的零样本迁移能力尤其令人印象深刻——在某些低资源语言对上仅通过相近语言的微调就能获得可用性能。