向量在机器学习中的实战:从嵌入到降维
2026-04-12
向量在机器学习中的实战:从嵌入到降维
作者:你的名字 · 日期:2026-04-12
摘要:在机器学习系统中,向量是把真实世界事物(文本、图像、用户、物品)映射到可计算空间的通用工具。本文以工程视角介绍向量的常用表示、相似度计算、归一化策略、降维与向量搜索,并给出实践中的经验与简明代码示例,帮助你在真实项目中稳健使用向量。
1. 向量为何在 ML 中无处不在
向量把复杂对象(如一段句子或一张图片)表示为一组数值,从而可以用线性代数与距离度量来比较、检索与学习。现代模型(word2vec、BERT、CLIP、ResNet 等)都把输入映射为向量,工程中常见任务(检索、推荐、聚类、分类)都以向量为核心。
2. 嵌入(Embeddings)简要分类
- 文本嵌入:词向量(word2vec、GloVe)、句子/段落向量(SBERT、sentence-transformers)、上下文嵌入(BERT 系列)。
- 图像特征:CNN、视觉 Transformer 的最后一层或池化输出可作为图像向量。
- 异构实体:用户、物品、知识图谱节点也常被学成低维向量用于相似性计算与召回。
每种嵌入都有预训练与微调两条路径:预训练模型可快速上手,微调能让向量更贴合下游任务。
3. 距离与相似度:选对指标很重要
- 欧氏距离(L2):保留向量间的绝对数值差异,适合在相同尺度下比较。高维时受“距离集中”影响。
- 余弦相似度:衡量方向相似性,常用于文本/语义相似度任务;对向量长度不敏感(若不想让长度影响相似度,优先选择余弦)。
经验法则:文本嵌入一般用余弦;若做度量学习并对欧氏空间进行训练(如某些 ANN 库),可直接使用 L2。
4. 归一化与数值稳定性
- L2 归一化(将向量除以范数)在计算余弦相似度前通常是必要步骤。批量操作中注意不要除以零向量。
- 标准化(零均值单元方差)多用于特征工程与某些降维算法。
- 在训练过程中,避免在嵌入层使用大幅度未经约束的激活,这会导致训练不稳定或距离失真。
5. 降维与可视化
- PCA:线性降维,快速且可解释,常用于预览高维分布。
- t-SNE:非线性可视化,保留局部邻域结构,适合观察簇结构,但对超参数敏感。
- UMAP:兼顾全局与局部,速度与可扩展性优于 t-SNE,近年常被推荐用于大型嵌入可视化。
实践建议:先用 PCA 降到几十维再用 UMAP/t-SNE 做 2D 可视化,能减少噪声影响并加速计算。
6. 向量搜索与近似最近邻(ANN)
当数据量增长到百万级或以上,精确搜索变得昂贵。常用方案:
- Faiss(Facebook AI Similarity Search):高性能向量索引,支持多种索引类型、压缩和 GPU 加速。
- Annoy、HNSWlib:轻量且在多数场景表现稳定。
选择索引时需要权衡吞吐、延迟、索引构建时间和内存占用;可通过模拟查询分布评估召回率与 QPS 下的延迟。
7. 工程实践要点与常见坑
- 保存向量时同时保存元数据(原始 id、原始文本、时间戳),便于后续审计与再训练。
- 避免直接把未归一化的向量与余弦相似度混用。
- 高维稀疏向量(例如 one-hot 或 TF-IDF)与稠密嵌入的处理方式不同,检索索引策略也会变化。
- 向量量化(PQ、OPQ)可大幅缩减内存,但会带来精度损失,适合对吞吐敏感的在线系统。
8. 快速上手:Python 示例
计算余弦相似度与用 PCA 做降维的最小示例:
import numpy as np
from sklearn.decomposition import PCA
def cosine_sim(a, b):
a = np.asarray(a, dtype=float)
b = np.asarray(b, dtype=float)
na = np.linalg.norm(a)
nb = np.linalg.norm(b)
if na == 0 or nb == 0:
return 0.0
return np.dot(a, b) / (na * nb)
# 批量相似度(归一化后做矩阵乘法更快)
def batch_cosine_similarity(X, Y):
# X: (m, d), Y: (n, d)
X_norm = X / np.linalg.norm(X, axis=1, keepdims=True)
Y_norm = Y / np.linalg.norm(Y, axis=1, keepdims=True)
return np.dot(X_norm, Y_norm.T)
# PCA
X = np.random.randn(1000, 128)
pca = PCA(n_components=2)
X2 = pca.fit_transform(X)
提示:在大规模场景中避免在 Python 层逐条归一化,利用向量化或在数据库/索引层面处理。
9. 总结与进一步阅读
向量是连接现实世界与机器可计算空间的桥梁。理解不同相似度指标、归一化策略、降维工具与索引技术,能让你在工程中更好地构建高效且可靠的向量系统。
进一步阅读:Faiss 文档、HNSW、sentence-transformers 官方教程、PCA/t-SNE/UMAP 论文。
© 你的名字