从零预训练ZEN模型:create_pre_train_data.py数据准备全解析

📅 2026/8/21 14:40:57
从零预训练ZEN模型:create_pre_train_data.py数据准备全解析
从零预训练ZEN模型create_pre_train_data.py数据准备全解析【免费下载链接】ZENA BERT-based Chinese Text Encoder Enhanced by N-gram Representations项目地址: https://gitcode.com/gh_mirrors/zen10/ZENZEN 是一个基于 BERT 的中文文本编码器通过引入N-gram 表示大幅增强模型对中文词与短语的理解能力。想要从零预训练 ZEN 模型第一步就是使用create_pre_train_data.py完成高质量的数据准备。本文将面向新手一步步拆解 ZEN 预训练数据生成脚本的参数、流程与踩坑点让你快速上手中文预训练。上图是 ZEN 的整体架构左侧为字符级编码器Character Encoder右侧为 N-gram 级编码器N-gram Encoder两者通过相加操作逐层融合这正是 ZEN 优于纯字符模型的关键设计。数据准备脚本就是为这个双通道结构准备字符 N-gram双份训练信号。一、ZEN 预训练为什么需要专门的数据准备脚本与普通 BERT 不同ZEN 的预训练目标有两个掩码语言模型MLM随机遮盖部分字符让模型预测被遮盖的字N-gram 增强从词表中匹配长度为 2~7 的字符组合如粤港澳大湾区作为额外输入注入编码器。因此原始语料必须先被脚本处理成包含tokens、ngram_ids、ngram_positions等字段的 JSON 样本run_pre_train.py才能直接读取训练。这个翻译过程就是create_pre_train_data.py的职责。二、环境准备与项目获取在运行脚本前先确认环境满足 requirements.txt 中的依赖核心包括 PyTorch1.2、transformers、tqdm 等。项目代码位于 ZEN 仓库根目录先获取项目git clone https://gitcode.com/gh_mirrors/zen10/ZEN数据准备脚本位于 examples/create_pre_train_data.py运行方式为python create_pre_train_data.py --train_corpus 语料.txt --output_dir 输出目录 --bert_model bert-base-chinese三、语料格式要求一个空行就是一篇文章脚本按空行划分文档这是新手最容易忽略的一点每一行被视为一个句子会被分词后作为一个 segment连续的空行表示文档边界空行之间的所有行组成一篇文档文档边界是必需的否则无法构造随机下一句Next Sentence负样本脚本会直接报错退出。例如zhwiki.txt中每篇百科条目之间留一个空行即可。相关逻辑见create_pre_train_data.py的Loading Dataset部分examples/create_pre_train_data.py。四、核心参数逐一解读最快配置方法脚本参数不多但每个都直接影响训练效果。下面是最常用参数的速查表参数默认值作用建议--train_corpus必填原始中文语料路径使用带空行分隔的多文档语料--output_dir必填预生成数据输出目录与run_pre_train.py的--pregenerated_data保持一致--bert_model必填分词器来源模型中文任务用bert-base-chinese--epochs_to_generate3生成几轮epoch数据语料小时可设 5~10--max_seq_len128每条样本最大长度长文本任务可调至 256/512--masked_lm_prob0.15字符遮盖概率与 BERT 标准一致即可--max_predictions_per_seq20每条样本最多遮盖数随max_seq_len增大而增大--do_whole_word_mask关闭是否整词遮盖建议开启--reduce_memory关闭用磁盘换内存语料很大时务必开启--max_ngram_in_sequence20每条样本最多匹配 N-gram 数默认即可需要注意脚本虽然提供了--ngram_list参数但实际加载 N-gram 词表时使用的是ZenNgramDict(args.bert_model, ...)即从bert_model目录下的ngram.txt读取见 ZEN/ngram_utils.py。因此请确保ngram.txt与模型文件放在同一目录。五、数据生成流程拆解脚本内部做了什么整个处理链路可以概括为四步加载并分词逐行读取语料用BertTokenizer将每句转为 token 列表按空行切分为文档存入DocumentDatabase构造句子对参照 BERT 的逻辑把文档切成 A/B 两段50% 概率从其他文档随机采样作为负样本构造下一句预测任务生成掩码标签按 15% 概率遮盖字符其中 80% 替换为[MASK]、10% 保留原字、10% 替换为随机词同时记录被遮盖位置与原始标签匹配 N-gram遍历长度 2~7 的所有字符片段在ngram_dict词表中查询是否存在对应 N-gram记录其 id、起始位置、长度与所属分段。上述逻辑分别对应create_instances_from_document与create_masked_lm_predictions两个核心函数examples/create_pre_train_data.py。六、输出文件说明epoch_N.json 与 metrics脚本会在--output_dir下生成两类文件epoch_0.json、epoch_1.json……每行一条 JSON 训练样本包含tokens、segment_ids、is_random_next、masked_lm_positions、masked_lm_labels以及ngram_ids、ngram_positions、ngram_lengths、ngram_tuples等 N-gram 字段epoch_0_metrics.json……记录该轮样本总数num_training_examples、max_seq_len等元信息供训练脚本校验数据完整性。run_pre_train.py会按epoch % num_data_epochs循环读取这些文件所以生成 3 轮数据、训练 20 个 epoch 也是可行的examples/run_pre_train.py。七、完整实战命令一键生成预训练数据以中文维基百科语料为例一条可直接运行的命令如下python create_pre_train_data.py \ --train_corpus /data/zhwiki/zhwiki.txt \ --output_dir /data/zhwiki/pregenerated_data \ --bert_model /data/bert/bert-base-chinese \ --do_lower_case \ --do_whole_word_mask \ --reduce_memory \ --epochs_to_generate 3 \ --max_seq_len 128 \ --masked_lm_prob 0.15 \ --max_predictions_per_seq 20命令执行时会先显示Loading Dataset进度条加载语料随后逐文档生成实例最终在输出目录中得到 3 组 JSON 文件。若语料为空行分隔不正确脚本会提示 No document breaks were found按上文第三部分修正即可。八、常见问题与避坑指南内存爆炸语料达到 GB 级时加上--reduce_memory文档会暂存到磁盘的 shelve 数据库中而不是全部驻留内存ngram.txt 找不到确认 N-gram 词表与bert_model在同一目录文件名必须是ngram.txt格式为词,频次每行一条样本数对不上metrics.json中的样本数是训练端断言依据若手动删改 JSON 会导致run_pre_train.py断言失败中文大小写中文语料建议统一开启--do_lower_case与中文 BERT 分词器保持一致。九、小结create_pre_train_data.py是 ZEN 预训练流水线的第一环它把普通中文语料翻译成模型能吃的字符级与 N-gram 级双重训练信号。掌握它的参数与输出格式你就能顺利衔接run_pre_train.py从零训练属于自己的中文 ZEN 模型。准备好语料现在就动手试试吧【免费下载链接】ZENA BERT-based Chinese Text Encoder Enhanced by N-gram Representations项目地址: https://gitcode.com/gh_mirrors/zen10/ZEN创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考