一句话理解
LaBSE 是一个"句子→向量"转换器:输入任意语言的句子,输出 768 维向量;109+ 种语言的同义句在向量空间中彼此靠近("我爱你"和"I love you"余弦相似度 ≈ 0.93)。
| 项目 | 内容 |
|---|---|
| 名称 | LaBSE(Language-agnostic BERT Sentence Embedding) |
| 发布方 | Google Research(2022 年) |
| 论文 | Language-agnostic BERT Sentence Embedding(发表于 ACL 2022,NLP 顶会) |
| Google 官方 | Kaggle Models(TensorFlow 格式;原 TensorFlow Hub 已于 2023 年 11 月迁入 Kaggle) |
| HuggingFace(社区移植版) | sentence-transformers/LaBSE(PyTorch 格式,本笔记使用此版) |
| 许可证 | Apache 2.0(可商用) |
| 本地路径 | extern/attachments/models/BERT/LaBSE/ |
论文发布平台:ACL Anthology 是国际计算语言学学会(ACL)的论文数字档案馆,收录 ACL/EMNLP/NAACL 等 NLP 顶会历年论文,开放获取。
模型发布平台:Kaggle 是 Google 旗下的数据科学平台,提供数据集、ML 竞赛与免费算力。名字来自日语"掛け算"(kakesan,乘法),寓意数据科学的组合效应。2010 年由 Anthony Goldbloom 创立,2017 年被 Google 收购。LaBSE 原发布于 TensorFlow Hub,该平台已于 2023 年 11 月整体迁入 Kaggle Models;HuggingFace 上的版本是社区将 TensorFlow 权重转为 PyTorch 格式的移植版。
计算机不认识文字,只认识数字。把句子的"意思"编码成一个向量(一串数字),就可以用数学运算衡量两句话的意思有多像:
"我爱猫" → [0.82, 0.13, -0.45, ...] (768维)
"我养了一只猫" → [0.80, 0.15, -0.43, ...] ← 向量很接近(同义)
"今天天气好" → [-0.31, 0.67, 0.22, ...] ← 向量很远(无关)
| 应用 | 怎么用句向量 |
|---|---|
| 语义搜索 | 用户问题 → 向量 → 在知识库所有文档向量中找最近的 |
| 聚类 | 几万条评论 → 向量 → 自动分成"好评/差评/投诉"几组 |
| 去重 | 两封邮件向量几乎一样 → 重复内容 |
| 平行语料挖掘 | 中文句向量与英文句向量在同一空间 → 找跨语言最近的对 → 得到翻译对 |
| 分类 | 句向量 + 分类层 → 判断情感/意图/类别 |
BERT 的预训练目标(MLM 完形填空 + NSP 下一句预测)没有显式训练模型产出好的句向量:
| 取向量方式 | 问题 |
|---|---|
| 取 [CLS] 向量 | [CLS] 被训练来做 NSP 二分类,学到的是"分类信号"而非"完整语义" |
| 平均池化(所有 token 取平均) | "的""了"等功能词稀释了"猫""爱"等内容词的语义信号 |
Sentence-BERT(Reimers & Gurevych, EMNLP 2019)首次通过孪生网络 + 三元组损失专门训练 BERT 产出好的单语句向量,证明了句向量质量可以大幅提升。
BERT(单语):
"我爱猫" → 向量 A
"I love cats" → 报错,不懂英文以外的语言 ❌
mBERT(多语言):
"我爱猫" → 向量 A
"I love cats" → 向量 B
但 A 和 B 离得很远 ❌ (按语言分帮派,不按意思分)
LaBSE(跨语言对齐):
"我爱猫" → 向量 A
"I love cats" → 向量 A'
A ≈ A' ✅ (按意思对齐,不按语言)
| 用法 | 代表 | 目标 | 对句向量的要求 |
|---|---|---|---|
| 文本分类 | bert-base-chinese 做领域问答 | 输入问题 → 输出类别 | 不要求句向量好,只需 [CLS] 能区分不同类别 |
| 句向量 | LaBSE 做跨语言检索 | 输入句子 → 输出高质量向量 | 要求向量精确反映语义,距离有意义 |
前者用 BERT 做"选择题"(选类别),后者追求让 BERT 做"连线题"(把同义句连起来)。
LaBSE = Language-agnostic BERT Sentence Embedding,拆开看每个词就是在描述"这是个什么东西、能干啥":
| 词素 | 含义 | 说明 |
|---|---|---|
| Language-agnostic | 语言无关的 | agnostic = "不关心、不绑定";不管你输入中文、英文、日文还是阿拉伯语,模型都不在意"这是哪种语言",只在意"这句话是什么意思" |
| BERT | 基于 BERT 架构 | Transformer Encoder + 双向注意力 + MLM 预训练;底层是 mBERT + TLM(翻译语言建模) |
| Sentence | 句子级 | 不是输出每个 token 的词向量,而是把整句话压成一个 768 维向量(通过 [CLS] 或 mean pooling) |
| Embedding | 嵌入/向量表示 | 把"一句话"映射成固定长度向量:句子 → [0.21, -0.88, 0.05, ..., 0.63],之后可用余弦相似度、聚类、检索等 |
“把句子变成向量”不是新概念,很早就有 Doc2Vec、Skip-Thought、InferSent、Universal Sentence Encoder、SBERT 等。而且原生 BERT 直接取 [CLS] 或平均 token 向量做句向量,效果甚至不如平均 GloVe。
LaBSE 的创新不在于“句子→向量”这个动作,而在于:
不是“任意语言无脑通吃”,而是:
准确意思是:模型不靠语言 ID 来切换行为,也不要求你告诉它"这是中文/英文";它用一个共享编码器把不同语言塞进同一个语义空间。不是"懂所有语言",而是"不按语言分帮派"。
合起来一句话:LaBSE 是用 BERT 架构训练出来的、跨语言通用的句子向量模型;不同语言的同义句,在它的向量空间里会彼此靠近。
LaBSE 横跨了 BERT 家族的两个维度(用途 + 语言),可以拆成三个组成部分:
LaBSE = Sentence-BERT 的训练方法
+ mBERT 的多语言底座
+ 跨语言翻译对训练数据
| 组成部分 | 来源 | 贡献了什么 |
|---|---|---|
| Sentence-BERT 的方法 | Reimers & Gurevych, EMNLP 2019 | 孪生网络 + 对比学习 → 专门训练句向量质量 |
| mBERT 的多语底座 | Google, 2018 | 104 语言共享 Transformer Encoder → 多语言输入能力 |
| 跨语言训练数据 | LaBSE 论文新增 | 翻译排序 + AMS → 不同语言的同义句在向量空间对齐 |
BERT 模型家族
├── 按大小 → BERT-base / DistilBERT / TinyBERT / MobileBERT ...
├── 按用途(句向量)
│ ├── Sentence-BERT → 单语句向量(英文)
│ ├── LaBSE → 跨语言句向量(109+ 语言) ← 在这里
│ └── sentence-transformers 库 → 各种预训练句向量模型
└── 按语言 → 单语言版 / 多语言版 / 中文增强版
💡 一句话定位:Sentence-BERT 解决了"BERT 句向量差"的问题,LaBSE 在此基础上进一步解决了"跨语言句向量无法比较"的问题。
例如:
"我爱自然语言处理" ─┐
"I love NLP" ─┼─ 三句话的向量在 LaBSE 中靠得很近
"私はNLPが好きです" ─┘ (语义相同,不同语言)
在理解式模型谱系中的位置:
NLU(理解)
└─ Encoder-only(BERT)
└─ 把整句压成向量 → Sentence Embedding
└─ 多语言版 → LaBSE
LaBSE 自己不生成句子,它做的是:把句子"理解"成一个向量,让不同语言的句子可以比较。
| 参数 | 值 | 含义 |
|---|---|---|
| 基础架构 | mBERT(多语言 BERT) | 12 层 Transformer 编码器 |
| 参数量 | 471M | 4.71 亿个可训练参数 |
| 隐藏维度 | 768 | 句向量输出维度 |
| 支持语言数 | 109 | 覆盖主要语言与部分低资源语言 |
| 最大序列长度 | 512 | 最多处理 512 个 token |
| 文件大小 | ~1.88GB | PyTorch 格式权重 |
BERT(单语)
↓ 扩展词表
mBERT(104 语言,通用理解)
↓ 翻译对对比学习微调
LaBSE(109 语言,跨语言句向量对齐)
LaBSE 不是全新架构,而是在 mBERT 的基础上加了一个投影层(Dense layer),并通过翻译对的对比学习重新训练,使不同语言的相同语义在向量空间中靠近。
论文:Fangxiaoyu Feng, Yinfei Yang, Daniel Cer, Naveen Arivazhagan, Wei Wang. Language-agnostic BERT Sentence Embedding. ACL 2022, pp. 878–891. PDF | 视频
| 作者 | 族裔 | 论文时期所在 | 研究方向 | 现况 |
|---|---|---|---|---|
| Fangxiaoyu Feng(冯方晓宇) | 华人 | Google Translate | 翻译训练数据挖掘、跨语言嵌入 | Google Senior Staff Engineer |
| Yinfei Yang(杨银飞) | 华人 | Google Research | 句向量、视觉-语言基础模型 | 已转至 Apple AI/ML |
| Daniel Cer | — | 句向量(Universal Sentence Encoder 一作) | Google Research Scientist | |
| Naveen Arivazhagan | 印度裔 | Google Research | 大规模多语言机器翻译(GNMT 核心成员) | Google Research |
| Wei Wang(王巍) | 华人 | 神经机器翻译(GNMT 核心成员) | Google Research Scientist |
团队基因:Google Translate + Google Research 联合——Feng/Wang 侧重翻译系统与数据,Yang/Cer 侧重句向量表示(Yang 和 Cer 是 Universal Sentence Encoder 核心作者),Arivazhagan 是多语言 NMT 专家。LaBSE 恰好需要"翻译系统"与"句向量"两方面能力的交叉。
BERT 在单语句向量上表现很好,但跨语言句向量尚未被系统探索。论文目标:如何让不同语言的同义句在向量空间中靠近。
| 技术 | 作用 | 来源 | 通俗做法 |
|---|---|---|---|
| MLM(Masked Language Modeling) | 单语完形填空预训练,学习语言内部语义 | BERT 原始预训练 | 遮住一个词,用上下文猜 → 让模型学会"理解"一种语言 |
| TLM(Translation Language Modeling) | 翻译对联合训练,跨语言句子拼接后做 MLM,学习跨语言对齐 | XLM(Conneau & Lample, 2019) | 中英文拼在一起,遮一个词,用另一种语言猜 → 让模型学会"跨语言理解" |
| Dual-Encoder Translation Ranking | 双编码器结构,用翻译对做对比学习,让翻译对向量靠近、非翻译对远离 | Guo et al., 2018 | 中文"我爱猫"和英文"I love cats"的向量要相似 → 让"翻译对"的句向量彼此靠近 |
| Additive Margin Softmax | 改进的损失函数,加大类间距离,让向量空间更具判别力 | Yang et al., 2019 | 不仅要求同义句靠近,还要求不同义句保持足够远的距离 → 让句向量之间的"距离"更有意义 |
| 维度 | LASER | LaBSE |
|---|---|---|
| 基础架构 | 双向 LSTM | Transformer Encoder |
| 检索准确率(Tatoeba) | 65.5% | 83.7% |
| 语言数 | ~93 | 109+ |
| 单语迁移学习 | 未优化 | 仍有竞争力 |
输入:"我爱自然语言处理"
↓
LaBSE 编码器(Transformer Encoder)
↓
每个 token 都有一个 768 维向量
↓
池化(Pooling)→ 整句变成一个 768 维向量
↓
输出:[0.12, -0.03, 0.88, ..., 0.41] (768 个数)
最终拿到手的就是这一个 768 维向量,代表整句话的语义。
| 输出类型 | 可用性 | 说明 |
|---|---|---|
| ✅ 句子向量(768 维) | 设计目标 | 官方 API 给你的就是这个 |
| ⚠️ token 向量 | 技术上能取 | 但没专门优化过,质量不如句向量 |
| ❌ 生成文字 | 不可能 | Encoder-only 模型不生成文本 |
实际使用时基本就是:
sentence = "我爱自然语言处理"
vector = model.encode(sentence) # → [768维向量]
LaBSE 的训练目标是翻译排名损失(Translation Ranking Loss):
训练数据:翻译句子对(如 "我爱你" ↔ "I love you")
目标函数:
- 翻译对的向量 → 余弦相似度高(靠近)
- 非翻译对的向量 → 余弦相似度低(远离)
使用本地部署的 LaBSE 模型(sentence-transformers 库)运行:
跨语言同义句对:
| 句子对 | 语言 | 余弦相似度 |
|---|---|---|
| "我爱你" vs "I love you" | 中-英 | 0.9337 |
| "我爱你" vs "Je t'aime" | 中-法 | 0.9544 |
| "我爱你" vs "Ich liebe dich" | 中-德 | 0.9639 |
| "丹麦语" vs "dansk sprog" | 中-丹 | 0.7870 |
| "挪威语" vs "norsk språk" | 中-挪 | 0.7788 |
| "瑞典语" vs "svenska språket" | 中-瑞 | 0.7460 |
跨语言无关句对:
| 句子对 | 语言 | 余弦相似度 |
|---|---|---|
| "我爱你" vs "今天天气很好" | 中-中 | 0.2500 |
| "我爱你" vs "The weather is nice" | 中-英 | 0.2989 |
结论: - 欧美语言翻译对:相似度 > 0.93(极高) - 北日耳曼三语:相似度 0.75~0.79(较高,可用于距离度量) - 无关句对:< 0.30(明显分离)
mBERT 的平行句向量有一个经典问题:按语言聚类,不按意思聚类。即“我爱你”的向量和“丹麦语”的向量更近(都是中文),而不是和“I love you”更近。
LaBSE 通过翻译排序训练解决了这个问题:按意思聚类,不按语言聚类。即“我爱你”和“I love you”的向量更近,尽管它们属于不同语言。
| 维度 | mBERT | LaBSE |
|---|---|---|
| 目标 | 多语言理解 | 跨语言句向量 |
| 句向量质量 | 一般(按语言聚类) | 专门优化过(按意思聚类) |
| 跨语言相似度 | 弱 | 强 |
| 训练目标 | MLM + NSP | MLM + TLM + 翻译排序 |
| 架构 | 单编码器 | 双编码器(参数共享) |
| 支持语言 | ~104 | 109+ |
| 典型用途 | 分类/NER/MLM 预测 | 句检索/平行语料挖掘/语言距离 |
一句话:mBERT 是“多语言理解模型”,LaBSE 是“多语言句向量模型”。
| 维度 | bert-base-chinese | mBERT | LaBSE |
|---|---|---|---|
| 语言数 | 1(中文) | 104 | 109 |
| 参数量 | 110M | 179M | 471M |
| 文件大小 | ~400MB | ~714MB | ~1.88GB |
| 核心能力 | 中文语义理解 | 多语言理解 + MLM | 跨语言句向量对齐 |
| 句向量质量 | 单语内优秀 | 一般 | 跨语言优秀 |
| 典型用途 | 中文分类/NER | MLM 预测/多语言分类 | 跨语言检索/语言距离 |
from sentence_transformers import SentenceTransformer
# 从本地路径加载(推荐,无需联网)
model = SentenceTransformer(r"d:\BYP\Project\BYP\BYPsNotes\extern\attachments\models\BERT\LaBSE")
# 编码句子
sentences = ["我爱你", "I love you", "今天天气很好"]
embeddings = model.encode(sentences)
print(embeddings.shape) # (3, 768)
from sklearn.metrics.pairwise import cosine_similarity
emb_zh = model.encode(["我爱你"])
emb_en = model.encode(["I love you"])
similarity = cosine_similarity(emb_zh, emb_en)[0][0]
print(f"跨语言相似度: {similarity:.4f}") # 约 0.93
LaBSE 用于度量丹麦语(da)、挪威语(nob)、瑞典语(sv)三种近缘语言的语义距离:
实验流程:
1. 准备 150 组三语平行句(Tatoeba 语料)
2. 用 LaBSE 分别编码三个语言的句子 → 768 维向量
3. 计算每对语言的余弦相似度
4. 距离 = 1 - 相似度中位数
实验结果:
| 语言对 | 相似度中位数 | 距离 |
|---|---|---|
| da-no(丹麦-挪威) | 0.9879 | 0.0121 |
| no-sv(挪威-瑞典) | 0.9844 | 0.0156 |
| da-sv(丹麦-瑞典) | 0.9796 | 0.0204 |
解读: - da-no 距离最小 → 符合历史语言学事实(挪威书面语源自丹麦语) - 三对距离梯度清晰 → 证明 LaBSE 能捕捉近缘语言的细微差异
| 场景 | 是否适合 | 说明 |
|---|---|---|
| 跨语言检索 | ✅ 最佳 | 核心设计目标 |
| 跨语言语义相似度 | ✅ 最佳 | 翻译对训练保证 |
| 语言距离度量 | ✅ 适合 | 论文实验①验证 |
| 平行语料挖掘 | ✅ 适合 | 两堆不同语言句子,算向量相似度,找翻译对 |
| 多语言语义搜索 | ✅ 适合 | 用任意语言搜任意语言的库 |
| 跨语言去重 | ✅ 适合 | 跨语言重复内容检测 |
| 多语言聚类 | ✅ 适合 | 把多语言文本按语义聚类,不按语言分开 |
| 单语分类/NER | ⚠️ 可用但不推荐 | 用单语 BERT 更轻量 |
| 文本生成 | ❌ 不适合 | Encoder-only 模型不生成文本 |
| 维度 | SBERT | LaBSE |
|---|---|---|
| 语言 | 主要是单语(英文为主) | 109+ 语言,跨语言 |
| 目标 | 同语言句子相似度 | 跨语言句子相似度 |
| 输出 | 句向量 | 句向量 |
| 本质 | Encoder-only 句向量 | Encoder-only 跨语言句向量 |
一句话:SBERT 是单语句向量模型,LaBSE 是多语言跨语言句向量模型。
词向量(Word2Vec):词 → 向量(每个词一个固定向量,不考虑上下文)
↓
句向量(Sentence Embedding):句子 → 向量(不是新概念,但要做好很难)
↓
BERT:出 token 向量,不直接等于好句向量
↓
mBERT:多语言版 BERT,能理解多语言(但句向量按语言聚类)
↓
LaBSE:在 mBERT 基础上,专门训成“跨语言句向量器”
(句向量按意思聚类,不按语言聚类)
📝 创建:2026-09-29