一句话理解
mBERT 是 Google 在 BERT 基础上用 104 种语言维基百科联合训练的多语言理解模型,是后续 LaBSE、XLM-R 等跨语言模型的"地基",也是论文实验③(MLM 置信度)的核心模型。
| 项目 | 内容 |
|---|---|
| 名称 | bert-base-multilingual-cased(简称 mBERT) |
| 发布方 | Google(2018 年 11 月) |
| 论文 | BERT: Pre-training of Deep Bidirectional Transformers |
| HuggingFace | google-bert/bert-base-multilingual-cased |
| 许可证 | Apache 2.0(可商用) |
注意:还有一个 uncased 版本
bert-base-multilingual-uncased,不区分大小写。研究一般用 cased 版本,保留大小写信息。
| 参数 | 值 | 含义 |
|---|---|---|
| 架构 | BERT-Base | 12 层 Transformer 编码器 |
| 参数量 | 179M | 1.79 亿个可训练参数 |
| 隐藏维度 | 768 | 每个 token 的向量维度 |
| 注意力头数 | 12 | 每层 12 个注意力头 |
| 支持语言数 | 104 | 覆盖主要语系 |
| 最大序列长度 | 512 | 最多处理 512 个 token |
| 词表大小 | 119,547 | WordPiece 多语言词表 |
| 文件大小 | ~714MB | PyTorch 格式权重 |
| 参数 | bert-base-chinese | mBERT |
|---|---|---|
| 语言数 | 1(中文) | 104 |
| 参数量 | 110M | 179M |
| 词表大小 | 21,128 | 119,547 |
| 文件大小 | ~400MB | ~714MB |
| 中文能力 | 专精 | 可用但不如专精版 |
mBERT 的词表是 104 种语言共享的,因此比单语 BERT 大得多(119K vs 21K),但每种语言分到的"有效容量"相对较少。
mBERT 在 104 种语言的维基百科上联合训练,训练目标与 BERT 完全相同:
关键区别:不同语言的文本会出现在同一个 batch 中,模型被迫学习跨语言的共享表示。
mBERT 的跨语言能力不是显式训练的,而是涌现出来的:
训练数据:104 种语言的维基百科(混合在一起)
训练目标:MLM + NSP(与单语 BERT 相同)
涌现能力:
- 不同语言的相似语义 → 向量空间中靠近
- 但这种对齐不如 LaBSE 精确(没有显式对比学习)
| 维度 | mBERT | LaBSE |
|---|---|---|
| 跨语言对齐 | 隐式涌现(较弱) | 显式对比学习(强) |
| 训练目标 | MLM + NSP | 翻译排名损失 |
| 句向量质量 | 一般 | 优秀 |
| MLM 能力 | ✅ 强(原始预训练头) | ⚠️ 可用但非设计目标 |
| 参数量 | 179M | 471M |
| 文件大小 | ~714MB | ~1.88GB |
结论: - 需要高质量句向量 → 用 LaBSE - 需要 MLM 预测能力 → 用 mBERT - 两者互补,不是替代关系
mBERT 也可用于句向量距离实验,作为 LaBSE 结果的交叉验证:
| 语言对 | LaBSE 距离 | mBERT 距离 |
|---|---|---|
| da-no | 0.0121 | 0.0160 |
| no-sv | 0.0156 | 0.0449 |
| da-sv | 0.0204 | 0.0462 |
解读: - 排序一致(da-no < no-sv ≈ da-sv)→ 结论稳健 - mBERT 分辨率更粗(距离差异更大)→ 不如 LaBSE 精细
mBERT 的 MLM 头可预测被遮住的词,通过计算预测概率分布的信息熵来度量模型对该位置的"确定程度":
输入:"Jeg elsker [MASK]"(挪威语"我爱___")
mBERT 预测:
"deg"(你) → 0.23
"ham"(他) → 0.15
"henne"(她) → 0.12
...
信息熵 = 6.25 bit
实验结果(top-1 置信度):
| 语言 | top-1 置信度 | 信息熵 |
|---|---|---|
| 丹麦语(da) | 0.2581 | 6.07 bit |
| 挪威语(no) | 0.2333 | 6.25 bit |
| 瑞典语(sv) | 0.2211 | 6.37 bit |
解读: - da 熵最低 → 模型对丹麦语最"确定" → 语言内部一致性最高 - sv 熵最高 → 模型对瑞典语最"不确定" → 词汇变化性更大 - 这与语言的历史演化路径一致
from transformers import AutoTokenizer, AutoModelForMaskedLM
import torch
# 加载模型
model_name = "google-bert/bert-base-multilingual-cased"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForMaskedLM.from_pretrained(model_name)
# 准备输入([MASK] 位置会被预测)
text = "Jeg elsker [MASK]" # 挪威语"我爱___"
inputs = tokenizer(text, return_tensors="pt")
# 预测
with torch.no_grad():
outputs = model(**inputs)
logits = outputs.logits
# 找到 [MASK] 位置
mask_token_index = (inputs.input_ids == tokenizer.mask_token_id)[0].nonzero(as_tuple=True)[0]
mask_logits = logits[0, mask_token_index]
# 取 top-5 预测
top_k = torch.topk(mask_logits, k=5)
for i, (score, token_id) in enumerate(zip(top_k.values, top_k.indices)):
token = tokenizer.decode([token_id])
print(f" {i+1}. {token} (置信度: {torch.softmax(mask_logits, dim=-1)[token_id]:.4f})")
from transformers import AutoTokenizer, AutoModel
import torch
tokenizer = AutoTokenizer.from_pretrained("google-bert/bert-base-multilingual-cased")
model = AutoModel.from_pretrained("google-bert/bert-base-multilingual-cased")
# 取 [CLS] 向量作为句向量
text = "Jeg elsker deg"
inputs = tokenizer(text, return_tensors="pt")
with torch.no_grad():
outputs = model(**inputs)
cls_vector = outputs.last_hidden_state[:, 0, :] # [CLS] 位置
mean_vector = outputs.last_hidden_state.mean(dim=1) # 平均池化
print(f"CLS 向量维度: {cls_vector.shape}") # (1, 768)
提示:mBERT 的句向量质量不如 LaBSE,因为 mBERT 没有经过句向量专项训练。如需高质量句向量,优先使用 LaBSE 或 Sentence-BERT。
mBERT 覆盖 104 种语言,包括:
| 语系 | 代表语言 |
|---|---|
| 日耳曼语族 | 英语、德语、荷兰语、丹麦语、挪威语、瑞典语、冰岛语 |
| 罗曼语族 | 法语、西班牙语、葡萄牙语、意大利语、罗马尼亚语 |
| 斯拉夫语族 | 俄语、波兰语、捷克语、保加利亚语 |
| 汉藏语系 | 中文(简/繁) |
| 日本-琉球语系 | 日语 |
| 韩语 | 韩语 |
| 闪含语系 | 阿拉伯语、希伯来语 |
| 印度-雅利安语支 | 印地语、孟加拉语、乌尔都语 |
| 南岛语系 | 印尼语、马来语、他加禄语 |
完整列表见 HuggingFace 模型卡
| 场景 | 是否适合 | 说明 |
|---|---|---|
| MLM 置信度/熵 | ✅ 最佳 | 原始预训练头保留完整 |
| 多语言分类/NER | ✅ 适合 | 104 语言覆盖广 |
| 句向量距离(交叉验证) | ⚠️ 可用 | 不如 LaBSE 精确 |
| 高质量跨语言句向量 | ❌ 不推荐 | 用 LaBSE |
| 单语专精任务 | ❌ 不推荐 | 用单语 BERT(如 bert-base-chinese) |
📝 创建:2026-09-29