mBERT:多语言 BERT 原始模型详解

一句话理解

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 对比

参数 bert-base-chinese mBERT
语言数 1(中文) 104
参数量 110M 179M
词表大小 21,128 119,547
文件大小 ~400MB ~714MB
中文能力 专精 可用但不如专精版

mBERT 的词表是 104 种语言共享的,因此比单语 BERT 大得多(119K vs 21K),但每种语言分到的"有效容量"相对较少。


核心能力:多语言联合表示

训练方式

mBERT 在 104 种语言的维基百科上联合训练,训练目标与 BERT 完全相同:

  1. MLM(掩码语言模型):遮住 15% 的词,根据上下文预测
  2. NSP(下一句预测):判断两个句子是否连续

关键区别:不同语言的文本会出现在同一个 batch 中,模型被迫学习跨语言的共享表示。

跨语言能力的来源

mBERT 的跨语言能力不是显式训练的,而是涌现出来的:

训练数据:104 种语言的维基百科(混合在一起)
训练目标:MLM + NSP(与单语 BERT 相同)

涌现能力:
  - 不同语言的相似语义 → 向量空间中靠近
  - 但这种对齐不如 LaBSE 精确(没有显式对比学习)

与 LaBSE 的对比

维度 mBERT LaBSE
跨语言对齐 隐式涌现(较弱) 显式对比学习(强)
训练目标 MLM + NSP 翻译排名损失
句向量质量 一般 优秀
MLM 能力 ✅ 强(原始预训练头) ⚠️ 可用但非设计目标
参数量 179M 471M
文件大小 ~714MB ~1.88GB

结论: - 需要高质量句向量 → 用 LaBSE - 需要 MLM 预测能力 → 用 mBERT - 两者互补,不是替代关系


在计量语言学中的应用

论文实验③-A:句向量距离(复测)

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 精细

论文实验③-B:MLM 置信度

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 熵最高 → 模型对瑞典语最"不确定" → 词汇变化性更大 - 这与语言的历史演化路径一致


使用方法

基本用法(MLM 预测)

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

相关笔记