ZEN模型结构拆解:12层字符编码器与6层N-gram编码器如何协同工作
【免费下载链接】ZENA BERT-based Chinese Text Encoder Enhanced by N-gram Representations项目地址: https://gitcode.com/gh_mirrors/zen10/ZEN
中文NLP模型往往面临一个尴尬的处境:字符(Character)建模细粒度足够,却丢失了词与短语的边界信息;词(Word)建模信息丰富,却绕不开分词错误与未登录词的坑。ZEN模型(BERT-based Chinese Text Encoder Enhanced by N-gram Representations)就是为了打破这个僵局而生的——它用12层字符编码器与6层N-gram编码器双路并行、逐层融合,把中文里"字"与"词"两套信息同时吃透。今天这篇 ZEN模型结构拆解 文章,就用最直白的语言带你理解这两个编码器究竟如何分工、如何协同。
为什么需要两套编码器?中文建模的核心难题
在中文里,"字"和"词"各有短板:
- 纯字符模型(如原始BERT-Chinese):把每个汉字当成独立 token,"人民"、"人员"这些词被拆散,模型看不到词的整体语义。
- 纯词模型:依赖分词器,遇到新词、错分词会直接带偏语义。
ZEN 的思路很聪明:保留BERT的字符编码能力,再额外训练一个N-gram编码器来显式建模"词/短语"边界。这样既不用承担分词错误的风险,又能把潜在的词组信息送入网络。
双路并行:12层字符编码器与6层N-gram编码器的分工
字符编码器分支:继承BERT的"字级"理解能力
字符编码器本质上就是标准的 BERT Encoder 结构,在 ZEN/modeling.py 中可以看到它的配置:num_hidden_layers=12(12层 Transformer)、hidden_size=768、12个注意力头。
输入侧由 BertEmbeddings 完成字符嵌入 + 位置编码 + 类型嵌入的三合一向量拼接,输出的是每个字符对应的 768 维上下文表示。
N-gram编码器分支:新增的"词级"信息通道
N-gram 编码器是 ZEN 相对 BERT 的核心新增模块,配置项为num_hidden_word_layers=6,即6层 N-gram Transformer。它的词表来自一个专门的 N-gram 词典(由 ngram_utils.py 中的ZenNgramDict加载,例如ngram.txt),通过 BertWordEmbeddings 为每个 n-gram 生成嵌入向量。
输入的 n-gram 由Ngram Matching Matrix(匹配矩阵)控制——矩阵标记了每个 n-gram 是否出现在当前句子中、出现在哪个位置,这是两条分支能否对齐的关键桥梁。
协同工作的核心:逐层融合机制
两条分支不是各算各的,而是在ZEN 的每一个 Transformer 层里完成一次"信息交换",核心逻辑在ZenEncoder的 forward 中:
- 前 6 层中,字符编码器与 N-gram 编码器同步前向传播,各自产出当层表示;
- 每一层计算完毕后,把 N-gram 分支的输出通过
ngram_position_matrix(位置矩阵,即匹配矩阵)映射回字符序列的对应位置; - 执行
hidden_states += torch.bmm(ngram_position_matrix, ngram_hidden_states)完成逐位置加法融合,融合结果再送入下一层字符编码器。
这种"逐层相加"的设计,让字符表示每经过一层就"吸收"一次词级信息,越到高层,字与词的语义融合越充分;而 6 层之后的层继续在已经融合的表示上做更深层的抽象。
位置矩阵:N-gram信息如何"落回"字符位置
你可能好奇:N-gram 是一个整体,怎么加到每个字符上?答案就在ngram_position_matrix。
假设句子是"粤港澳大湾区",n-gram"粤港澳"覆盖字符 1–3,那么位置矩阵中该 n-gram 对应这三个位置均为 1,其余为 0。做矩阵乘法后,"粤港澳"的向量就被平均摊回这三个字符的表示上。这一机制在示例脚本 examples/utils_sequence_level_task.py 等数据处理代码中完成构造,是双分支协同的"翻译官"。
训练与下游任务适配
- 预训练任务:与 BERT 一致,采用MLM(掩码语言模型)+NSP(下一句预测)双任务,参考 run_pre_train.py。训练数据构建可查看 create_pre_train_data.py。
- 序列级任务(文本分类、情感分析、自然语言推理等):直接用
[CLS]的 pooled 输出接分类头,见 run_sequence_level_classification.py。 - 词级任务(分词、词性标注、命名实体识别等):对每个字符位置做标注,见 run_token_level_classification.py。
小结:ZEN 给中文预训练模型的启示
总结这份 ZEN模型结构拆解:12层字符编码器保证细粒度与通用性,6层N-gram编码器注入词级先验,位置矩阵负责逐层"翻译"对齐,加法融合完成信息交汇。它用较少的额外参数(约6层Transformer + n-gram词表),换来了中文理解能力的显著提升,也为后来者提供了"字词双通道"的经典范本。如果你在做中文 NLP 项目,ZEN 的这套结构设计非常值得借鉴。
【免费下载链接】ZENA BERT-based Chinese Text Encoder Enhanced by N-gram Representations项目地址: https://gitcode.com/gh_mirrors/zen10/ZEN
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考