内容纲要
这一篇讲的是 从词向量到句向量的演化史,这其实是 NLP 中一条“从土路走向高速公路”的演进轨迹,下面正式开始👇
一、引言
在自然语言处理中,词(word)是最小的可处理单位,但句子(sentence)才是语义的完整承载者。词向量的成功(如 Word2Vec)解决了词语表示问题,但如何将一句话变成一个“语义可比较、可运算”的向量呢?
这就是句向量(Sentence Embedding)要解决的问题。它是文本相似度、语义搜索、问答系统、对话系统等核心模块的底座。
本文将带你走一遍从词向量到句向量的进化之路,理解为什么“平均词向量”不够用,BERT 不能直接拿来用,以及 Sentence-BERT 是如何一鸣惊人的。
二、第一代:平均词向量(Word2Vec / GloVe)
理念: 把句子里每个词的向量取平均,表示整个句子。
# Word2Vec 句向量 = 所有词向量的平均
sentence_vector = np.mean([word_vec[w] for w in sentence], axis=0)
优点:
- 快速、简单,几行代码就能搞定。
- 在短文本中效果尚可。
缺点:
- 忽略词序、结构、上下文。
- 语义表达能力有限,比如 “我不喜欢苹果” 和 “我喜欢苹果” 的句向量几乎相同。
三、第二代:基于 RNN/CNN 的句子编码器
理念: 使用 RNN(如 LSTM/GRU)或 CNN 提取整个句子的上下文特征。
代表模型:
- InferSent(Facebook 提出,使用 Bi-LSTM + max pooling)
- Universal Sentence Encoder(Google 提出,有 Transformer 和 DAN 两种架构)
输入句子 → 编码器(Bi-LSTM / CNN / Transformer) → 固定长度向量
优点:
- 考虑了词序和上下文。
- 可通过有监督学习优化句向量质量。
缺点:
- 训练成本高。
- 泛化能力依赖于训练任务,可能不通用。
四、第三代:BERT 本体 VS 句向量之痛
你可能会问:“BERT 不是很强吗?为啥不能直接拿来算句向量?”
BERT 本体的设计初衷是做分类(如问答、NER),而非直接学习句向量。当你直接用 BERT 的 [CLS]
向量表示句子,再拿来算相似度时,会发现效果 非常不稳定(在 STS 数据集上表现很差)。
# BERT 输出中 CLS 向量的位置
cls_vec = outputs.last_hidden_state[:, 0, :]
问题原因:
- 没有使用相似度损失进行训练。
- 向量不满足“相似句子靠近”的空间分布特性。
五、第四代:Sentence-BERT 的横空出世
提出者: 德国达姆施塔特工业大学,2019 年
核心思想:
- 用 Siamese 网络结构 + BERT 编码器
- 加入句对监督信号(如 STS-B),直接优化句子间语义距离
句子A → BERT → 向量A
句子B → BERT → 向量B
→ 计算相似度 → MSE/Triplet/Contrastive 损失训练
优点:
- 支持余弦相似度直接计算。
- 与 BERT 兼容,可直接用 huggingface 中预训练模型。
代码使用:
from sentence_transformers import SentenceTransformer
model = SentenceTransformer('paraphrase-MiniLM-L6-v2')
vec = model.encode("我爱自然语言处理")
效果对比(STS-B dev):
方法 | Spearman 相关系数 |
---|---|
BERT + CLS | 0.61 |
BERT + mean pooling | 0.66 |
SBERT | 0.84 ✅ |
六、第五代:跨模态 / 指令微调 / 多语言句向量
句向量也在不断拓展边界:
- 多语言:LaBSE、LASER 等支持上百种语言互相比较。
- 跨模态:CLIP 用图片+文本做匹配,生成共同空间。
- 指令微调:像
text-embedding-ada-002
,可理解任务背景、指令目标。 - LLM embedding:如 Mistral、Gemma、ChatGLM 提取的句向量也在流行。
这些新范式正在逐步取代静态的 embedding,往“任务感知”方向演进。
七、总结:哪种句向量适合你?
场景 | 推荐技术 |
---|---|
快速相似度、轻量部署 | Word2Vec 平均向量 |
强语义理解、中文处理 | Sentence-BERT(中文版本) |
多语言任务 | LaBSE / LASER |
搜索引擎、问答召回 | SBERT + 向量数据库 |
多模态语义检索 | CLIP / BLIP 系列 |
智能体语义感知 | OpenAI Embedding / 指令微调模型 |
引用资料
- Reimers, N., & Gurevych, I. (2019). Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks. arXiv:1908.10084
- Cer, D. et al. (2018). Universal Sentence Encoder. arXiv:1803.11175
- Mikolov, T. et al. (2013). Efficient Estimation of Word Representations in Vector Space. arXiv:1301.3781
- Huggingface Sentence Transformers:https://www.sbert.net/
- OpenAI Text Embeddings:https://platform.openai.com/docs/guides/embeddings