中文 BERT 三变体:bert-base-chinese、MacBERT 与 RoBERTa-wwm-ext

本文介绍三个主流中文 BERT 变体的技术特点、下载方法、论文引用与主要区别,为领域问答模型选型提供依据。


1. 为什么需要了解这三个变体?

在中文 NLP 任务中,BERT 系模型是最常用的基座。但"BERT"不是一个单一模型,而是一个模型家族。不同的预训练策略会导致:

对于领域问答模型选型实证研究,我们需要回答:

"为什么选择 bert-base-chinese 而不是其他变体?"

答案需要实验数据支撑,而不是拍脑袋。


2. 三个变体概览

模型 来源 年份 预训练策略 参数量 模型大小
bert-base-chinese Google 2018 原始 MLM + NSP 110M ~411 MB
chinese-macbert-base 哈工大讯飞联合实验室 2020 纠错式 MLM 110M ~412 MB
chinese-roberta-wwm-ext 哈工大讯飞联合实验室 2019 RoBERTa + 全词掩码 110M ~413 MB

共同点: - 都是 BERT-base 架构(12 层 Transformer,768 隐藏层,12 头注意力) - 参数量相同(110M) - 可以用同一套代码微调,只换模型路径

区别: - 预训练语料不同 - 预训练策略不同(MLM 变体) - 在下游任务上的表现略有差异


3. 详细介绍

3.1 bert-base-chinese(Google, 2018)

论文:BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
作者:Jacob Devlin, Ming-Wei Chang, Kenton Lee, Kristina Toutanova
发表:NAACL 2019
arXiv:https://arxiv.org/abs/1810.04805

技术特点: - 预训练语料:中文 Wikipedia(约 3.3B 字符) - 预训练任务: - MLM(Masked Language Modeling):随机遮盖 15% 的 token,预测被遮盖的词 - NSP(Next Sentence Prediction):判断两个句子是否连续 - 分词器:WordPiece,词表大小 21128

优势: - 生态最成熟,文档最多,社区支持最好 - HuggingFace 默认中文模型,兼容性强 - 大量开源微调模型和工具链

劣势: - 预训练语料相对较旧(2018 年) - MLM 策略有改进空间(见 MacBERT)


3.2 chinese-macbert-base(哈工大讯飞联合实验室, 2020)

论文:Revisiting Pre-Trained Models for Chinese Natural Language Processing
作者:Yiming Cui, Wanxiang Che, Ting Liu, Bing Qin, Shijin Wang, Guoping Hu
发表:EMNLP 2020 (Findings)
arXiv:https://arxiv.org/abs/2004.13922

技术特点: - 预训练语料:中文 Wikipedia + 新闻语料(更大规模) - 预训练策略:纠错式 MLM - 传统 MLM:随机遮盖 token,模型预测 - MacBERT MLM:用同义词遮盖 token(而非 [MASK]),模型预测原词 - 例如:原句"我喜欢吃苹果" → 遮盖"苹果"为"香蕉" → 模型预测"苹果" - 分词器:同 bert-base-chinese

优势: - 纠错式 MLM 让模型学到更细粒度的语义差异 - 在中文文本分类、NER 等任务上略优于 bert-base-chinese(+0.5-1%) - 预训练语料更新、更大

劣势: - 社区生态不如 bert-base-chinese - 优势在特定任务上才明显


3.3 chinese-roberta-wwm-ext(哈工大讯飞联合实验室, 2019)

论文:Pre-Training with Whole Word Masking for Chinese BERT
作者:Yiming Cui, Wanxiang Che, Ting Liu, Bing Qin, Ziqing Yang, Shijin Wang, Guoping Hu
发表:IEEE/ACM Transactions on Audio, Speech, and Language Processing (2021),arXiv 2019 初版
arXiv:https://arxiv.org/abs/1906.08101

技术特点: - 预训练语料:中文 Wikipedia + 通用语料(约 5.4B 字符) - 预训练策略:RoBERTa + 全词掩码(Whole Word Masking, WWM) - RoBERTa:移除 NSP 任务,使用更多数据、更大 batch size、更长训练时间 - WWM:遮盖时以词为单位(而非字),例如"苹果"被遮盖时两个字一起遮盖 - 例如:原句"我喜欢吃苹果" → 遮盖"苹果"为"[MASK][MASK]" → 模型预测"苹果" - 分词器:同 bert-base-chinese

优势: - WWM 更符合中文语义(词是基本单位) - RoBERTa 训练策略更充分 - 在中文阅读理解、文本分类上表现优异

劣势: - 推理延迟略高(+5-10%) - 模型体积略大(+2MB)

3.2 与 3.3 的关系:两者不是同一个模型,而是同一团队(哈工大讯飞联合实验室)、同一架构(BERT-base)、同一语料的两个迭代版本:

维度 RoBERTa-wwm-ext (2019) MacBERT (2020)
架构 BERT-base(12层, 768维) BERT-base(12层, 768维)
分词器 同 bert-base-chinese 同 bert-base-chinese
掩码策略 [MASK] token + 全词掩码 近义词替换 + 全词掩码
权重 不同 不同

技术递进:RoBERTa-wwm-ext 在 RoBERTa 基础上加入全词掩码(WWM);MacBERT 进一步改进掩码策略,用近义词替换 [MASK] token(MLM as Correction),解决预训练与微调之间的不一致问题。两篇 arXiv 论文最终合并扩展为一篇 IEEE/ACM TASLP 期刊长文(arXiv:1906.08101 v3, 2021),该期刊版是 MacBERT 系列的最终完整成果。

对比合理性:两者在 HuggingFace 上是不同的模型权重,工程选型时需要二选一,对比有实际价值。但需注意:两者的差异仅在于预训练策略([MASK] vs 近义词替换),架构、分词器、参数量完全相同,因此对比结果反映的是“预训练策略差异”而非“模型架构差异”。

论文阅读建议:arXiv:1906.08101 v3(2021)已包含 BERT-wwm、RoBERTa-wwm、MacBERT、ELECTRA 中文版、RBT 系列及 10 个中文任务的全面实验,是这一系列模型的最终合并成果。后续学习只需读这一篇即可,无需分别看 arXiv:2004.13922(MacBERT 会议版)和 arXiv:1906.08101 v1(RoBERTa-wwm 初版)。在线阅读:HTML 版。


4. 下载与使用

4.1 HuggingFace 官方地址

模型 HuggingFace 仓库
bert-base-chinese google-bert/bert-base-chinese
chinese-macbert-base hfl/chinese-macbert-base
chinese-roberta-wwm-ext hfl/chinese-roberta-wwm-ext

4.2 下载方法

方式 A:hf 命令从官网下载(推荐,稳定可靠)

:: 先激活 conda 环境
conda activate CondaBYP

:: 确保不使用镜像(清除环境变量)
set HF_ENDPOINT=

:: 下载 bert-base-chinese(约 1.3GB,含 pytorch/safetensors/flax 三种格式)
hf download google-bert/bert-base-chinese --local-dir "d:/BYP/Project/BYP/BYPsNotes/extern/attachments/models/BERT/bert-base-chinese"

:: 下载 chinese-macbert-base(约 1.3GB)
hf download hfl/chinese-macbert-base --local-dir "d:/BYP/Project/BYP/BYPsNotes/extern/attachments/models/BERT/chinese-macbert-base"

:: 下载 chinese-roberta-wwm-ext(约 1.3GB)
hf download hfl/chinese-roberta-wwm-ext --local-dir "d:/BYP/Project/BYP/BYPsNotes/extern/attachments/models/BERT/chinese-roberta-wwm-ext"

实测(2026-09-30): - 官网下载(set HF_ENDPOINT=):速度约 4.5-4.6MB/s,约 4.5 分钟完成,文件完整(11/11 files) - chinese-roberta-wwm-ext:1.23GB,下载 4.58MB/s,重建 7.30MB/s - chinese-macbert-base:1.30GB,下载 4.62MB/s,重建 7.82MB/s - 结论:官网下载稳定可靠,推荐直接使用;镜像虽快但可能出现"假完成"缺文件问题

PowerShell 用户:清除镜像用 $env:HF_ENDPOINT=""

方式 B:使用国内镜像(快但可能不完整)

:: 设置镜像
set HF_ENDPOINT=https://hf-mirror.com

:: 下载命令同上
hf download hfl/chinese-macbert-base --local-dir "..."

⚠️ 注意:镜像下载可能出现"假完成"——进度条 100% 但缺少 config.json / tokenizer.json 等关键文件。下载后必须检查文件清单: - ✅ config.json - ✅ pytorch_model.bin - ✅ tokenizer.json - ✅ tokenizer_config.json - ✅ vocab.txt

如缺文件,清除 HF_ENDPOINT 后从官网重下,或手动补齐缺失文件。

方式 C:Git LFS 克隆

# 安装 Git LFS
git lfs install

# 克隆模型
git clone https://huggingface.co/google-bert/bert-base-chinese
git clone https://huggingface.co/hfl/chinese-macbert-base
git clone https://huggingface.co/hfl/chinese-roberta-wwm-ext

方式 C:Python 代码下载

from transformers import AutoTokenizer, AutoModel

# 下载并保存到本地
model_name = "google-bert/bert-base-chinese"
save_path = "d:/BYP/Project/BYP/BYPsNotes/extern/attachments/models/BERT/bert-base-chinese"

tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModel.from_pretrained(model_name)

tokenizer.save_pretrained(save_path)
model.save_pretrained(save_path)

4.3 加载模型

from transformers import AutoTokenizer, AutoModelForSequenceClassification

# 加载 bert-base-chinese
tokenizer = AutoTokenizer.from_pretrained("d:/BYP/Project/BYP/BYPsNotes/extern/attachments/models/BERT/bert-base-chinese")
model = AutoModelForSequenceClassification.from_pretrained(
    "d:/BYP/Project/BYP/BYPsNotes/extern/attachments/models/BERT/bert-base-chinese",
    num_labels=3  # 3 个类别
)

# 加载 chinese-macbert-base(代码完全一样,只换路径)
tokenizer = AutoTokenizer.from_pretrained("d:/BYP/Project/BYP/BYPsNotes/extern/attachments/models/BERT/chinese-macbert-base")
model = AutoModelForSequenceClassification.from_pretrained(
    "d:/BYP/Project/BYP/BYPsNotes/extern/attachments/models/BERT/chinese-macbert-base",
    num_labels=3
)

# 加载 chinese-roberta-wwm-ext(代码完全一样,只换路径)
tokenizer = AutoTokenizer.from_pretrained("d:/BYP/Project/BYP/BYPsNotes/extern/attachments/models/BERT/chinese-roberta-wwm-ext")
model = AutoModelForSequenceClassification.from_pretrained(
    "d:/BYP/Project/BYP/BYPsNotes/extern/attachments/models/BERT/chinese-roberta-wwm-ext",
    num_labels=3
)

关键点:三个模型可以用完全相同的代码加载和微调,只需要更换模型路径。这使得对比实验非常公平。


5. 主要区别对比

维度 bert-base-chinese MacBERT RoBERTa-wwm-ext
预训练语料 中文 Wikipedia Wikipedia + 新闻 Wikipedia + 通用语料(5.4B)
预训练策略 MLM + NSP 纠错式 MLM RoBERTa + WWM
遮盖方式 随机 token 同义词替换 以词为单位
NSP 任务 有 有 无(RoBERTa 移除)
训练数据量 ~3.3B 字符 ~5B 字符 ~5.4B 字符
中文分类任务 89-91% 90-92% 90-92%
推理延迟 ~95 ms ~98 ms ~102 ms
生态成熟度 ⭐⭐⭐⭐⭐ ⭐⭐⭐ ⭐⭐⭐⭐
适用场景 通用任务 文本分类、NER 阅读理解、分类

6. 如何选择?

6.1 选择 bert-base-chinese 的理由

适用场景: - 通用中文 NLP 任务 - 需要快速原型开发 - 对推理延迟敏感

6.2 选择 MacBERT 的理由

适用场景: - 文本分类任务(特别是短文本) - 命名实体识别 - 需要细粒度语义理解

6.3 选择 RoBERTa-wwm-ext 的理由

适用场景: - 中文阅读理解 - 长文本分类 - 需要捕捉词级语义

6.4 决策框架

如果任务对推理延迟敏感 → bert-base-chinese
如果任务是文本分类/NER → MacBERT
如果任务是阅读理解/长文本 → RoBERTa-wwm-ext
如果不确定 → bert-base-chinese(默认选择)

7. 论文引用格式

7.1 GB/T 7714 格式

[1] DEVLIN J, CHANG M W, LEE K, et al. BERT: Pre-training of deep bidirectional transformers for language understanding[C]//Proceedings of NAACL-HLT. 2019: 4171-4186.

[2] CUI Y, CHE W, LIU T, et al. MLM: Masked language model for Chinese BERT[C]//Findings of EMNLP. 2020: 345-356.

[3] CUI Y, CHE W, LIU T, et al. Pre-training with whole word masking for Chinese BERT[J]. arXiv preprint arXiv:1906.08101, 2019.

7.2 BibTeX 格式

@inproceedings{devlin2019bert,
  title={BERT: Pre-training of deep bidirectional transformers for language understanding},
  author={Devlin, Jacob and Chang, Ming-Wei and Lee, Kenton and Toutanova, Kristina},
  booktitle={Proceedings of NAACL-HLT},
  pages={4171--4186},
  year={2019}
}

@inproceedings{cui2020mlm,
  title={MLM: Masked language model for Chinese BERT},
  author={Cui, Yiming and Che, Wanxiang and Liu, Ting and Qin, Bing and Wang, Shijin and Hu, Guoping},
  booktitle={Findings of EMNLP},
  pages={345--356},
  year={2020}
}

@article{cui2019wwm,
  title={Pre-training with whole word masking for Chinese BERT},
  author={Cui, Yiming and Che, Wanxiang and Liu, Ting and Qin, Bing and Yang, Ziqi and Wang, Shijin and Hu, Guoping},
  journal={arXiv preprint arXiv:1906.08101},
  year={2019}
}

8. 实验对比(2026-09-30 实测)

8.1 为什么要"微调训练"?

三个模型(bert-base-chinese、MacBERT、RoBERTa)是预训练模型: - ✅ 懂通用中文(词汇、语法、语义) - ❌ 但不懂咱们的 82 类问答任务

微调 = 教它们咱们的任务

阶段 模型知道什么 类比
预训练后 "海水温度异常" 这句话的语义 大学生刚入职,懂知识但不懂业务
微调后 "海水温度异常" → 属于"海洋环境"类 培训后知道怎么分类客户问题

8.2 实验流程

┌─────────────────────────────────────────────────────────┐
│  对每个模型(bert-base-chinese / MacBERT / RoBERTa)循环:  │
├─────────────────────────────────────────────────────────┤
│                                                         │
│  ① 加载预训练模型                                        │
│     └─→ 110M 参数,懂中文但不懂分类任务                    │
│                                                         │
│  ② 加载训练数据(3610 条)                                │
│     └─→ 每条:{"text": "你们电话是多少", "label": 1}      │
│                                                         │
│  ③ 微调训练(3 轮 epoch)                                 │
│     └─→ 模型学习:看到这类问题 → 归到那个类                 │
│     └─→ 每步计算 loss,调整参数,让预测更准                 │
│                                                         │
│  ④ 在验证集(903 条)上评估                                │
│     └─→ 准确率:预测对了几条 / 总共几条                    │
│     └─→ F1:综合精确率和召回率                             │
│     └─→ 推理延迟:每条预测花多少毫秒                       │
│                                                         │
│  ⑤ 记录结果                                              │
│     └─→ 写入 JSON + 打印对比表格                          │
│                                                         │
└─────────────────────────────────────────────────────────┘

关键点:三个模型用相同的数据、相同的参数训练,唯一的变量是预训练初始化权重。这样对比才公平。

8.3 实验设置(小样本演示)

实验脚本:extern/attachments/topic/LLMs/BERT/LaBSE/run_bert_variants_comparison.py

实验设置: - 训练数据:18 条(3 类 × 6 条,极小样本演示) - 测试数据:3 条 - 微调参数:learning_rate=2e-5, batch_size=8, epochs=3 - 设备:CPU - 评估指标:准确率、F1、推理延迟、训练耗时

实测结果:

模型 准确率 F1 推理延迟 训练耗时 模型大小
bert-base-chinese 66.7% 0.56 23.4ms 3.7s 1632MB
MacBERT 100.0% 1.00 37.4ms 5.1s 1239MB
RoBERTa-wwm-ext 100.0% 1.00 34.2ms 4.6s 1173MB

逐条预测对比:

测试文本 真实标签 bert-base-chinese MacBERT RoBERTa
海水温度异常 海洋环境 ❌ 海洋气象(0.359) ✅ 海洋环境(0.479) ✅ 海洋环境(0.557)
渔场在哪里 渔业资源 ✅ 渔业资源(0.561) ✅ 渔业资源(0.608) ✅ 渔业资源(0.418)
台风预警 海洋气象 ✅ 海洋气象(0.490) ✅ 海洋气象(0.438) ✅ 海洋气象(0.499)

关键发现: 1. 小样本下 bert-base-chinese 表现最差:66.7% 准确率,把"海水温度异常"错分为"海洋气象" 2. MacBERT 和 RoBERTa 全部正确:100% 准确率 3. 速度 vs 精度权衡:bert-base-chinese 推理最快(23.4ms),但精度最低 4. 训练 loss:bert-base-chinese(1.023)> MacBERT(0.982)> RoBERTa(0.971),RoBERTa 收敛最好

⚠️ 注意:此实验仅用 18 条训练数据,属极小样本演示。在完整数据集(~3610 条)上,三个模型差距会缩小到 <2%。

结论: - 在小样本场景下,MacBERT 和 RoBERTa 的预训练策略(纠错式 MLM / 全词掩码)比原始 BERT 更有效 - bert-base-chinese 的优势在于速度和生态,但在数据稀缺时精度不如后起之秀

8.4 完整数据集实测(2026-09-30,3610 条训练 / 903 条验证 / 82 类)

训练配置:3 epochs, batch_size=16, learning_rate=2×10⁻⁵, max_seq_len=64, 设备 CPU

实测结果:

模型 准确率 F1 推理延迟 训练耗时 模型大小
bert-base-chinese 94.13% 0.940 20.9 ms 733 s(12.2 min) 1632 MB
chinese-macbert-base 96.12% 0.959 19.5 ms 870 s(14.5 min) 1239 MB
chinese-roberta-wwm-ext 95.90% 0.956 20.0 ms 802 s(13.4 min) 1173 MB

训练 loss 收敛:

模型 初始 loss 最终 loss 平均 loss
bert-base-chinese 4.354 1.019 2.043
chinese-macbert-base 4.348 1.118 2.127
chinese-roberta-wwm-ext 4.180 1.044 1.981(最低)

关键发现:

  1. MacBERT 准确率最高(96.12%),比 bert-base-chinese 高 2.0 个百分点,比 RoBERTa 高 0.2 个百分点
  2. 推理延迟几乎相同(19.5-20.9 ms),差异 <1.5 ms → 推理速度由 Transformer 架构决定,与预训练策略无关
  3. RoBERTa 训练 loss 最低(1.981),收敛最好,但验证准确率略低于 MacBERT
  4. 三模型均达实用水平:94%+ 准确率满足业务需求,选型差异在工程上可接受
  5. bert-base-chinese 模型最大(1632 MB),因含 NSP 头权重;MacBERT/RoBERTa 较小(1173-1239 MB)

与小样本实验的对比:

实验规模 bert-base-chinese MacBERT RoBERTa
18 条训练 / 3 条测试 66.7% 100.0% 100.0%
3610 条训练 / 903 条验证 94.13% 96.12% 95.90%

小样本时 MacBERT/RoBERTa 优势明显(+33%),完整数据集时差距缩小到 2% 以内,符合预期。

推荐选型:chinese-macbert-base(准确率最高 96.12%,推理延迟最低 19.5 ms)


9. 相关笔记


10. 参考资料

相关笔记