背景
以前在存储EMBEDDING模型输出向量的时候,由于不同模型输出的向量维度不同,而向量数据库同一个表只能存储同一维度长度的向量,当时使用的方案是直接在向量后面补0来拓展。
最近在思考这样做为什么不会影响相似度的计算,同时研究了一下余弦相似度计算公式的推导过程。
向量长度
一维向量的长度
对于向量 x=(x)
它的长度是 ∥x∥=∣x∣
二维向量的长度
对于向量 x=(x1,x2)
1 2 3 4 5 6 7 8 9
| (x1, x2) * |\ | \ x2 | \ ||x|| | \ |____\ x1
|
它的长度是 ∥x∥=x12+x22
三维向量的长度
对于向量 x=(x1,x2,x3)
它的长度是 ∥x∥=x12+x22+x32
n维向量的长度
对于向量 x=(x1,x2,...,xn)
它的长度是 ∥x∥=x12+x22+...+xn2
这一定义也被称为向量的 L2 范数(Euclidean Norm)。
向量点积公式
点积定义分为几何定义和代数定义两种,两种可以相互推导。
https://zh.wikipedia.org/wiki/点积#代数定义
余弦相似度计算
两个向量之间的余弦值可以通过 欧几里得点积公式 求出:
A⋅B=∥A∥⋅∥B∥⋅cosθ
其中,θ 表示向量 A 与向量 B 之间的夹角。
推导一下可得:
similarity=cos(θ)=∥A∥⋅∥B∥A⋅B=∑i=1n(Ai)2×∑i=1n(Bi)2∑i=1nAi×Bi
其中:
- Ai 表示向量 A 在第 i 个维度上的分量
- Bi 表示向量 B 在第 i 个维度上的分量
- n 为向量的维度数
将分子与分母中的求和项显式展开,可得:
i=1∑nAiBi=A1B1+A2B2+⋯+AnBn
i=1∑n(Ai)2=A12+A22+⋯+An2
i=1∑n(Bi)2=B12+B22+⋯+Bn2
可以看到,余弦相似度的计算仅依赖于各维度对应分量的乘积和平方和。
不影响相似度计算的向量维度拓展方法
假设原始向量为 n 维:
A=(A1,A2,…,An),B=(B1,B2,…,Bn)
为了统一向量维度,在末尾补 0 将其扩展到 m 维(m>n):
A′=(A1,A2,…,An,m−n0,…,0)
B′=(B1,B2,…,Bn,m−n0,…,0)
扩维后的点积为:
A′⋅B′=i=1∑mAi′Bi′=i=1∑nAiBi+i=n+1∑m0⋅0=i=1∑nAiBi
可以看到补 0 的维度不会对点积产生任何贡献
扩维后的向量长度为:
∥A′∥=i=1∑m(Ai′)2=i=1∑nAi2+i=n+1∑m02=i=1∑nAi2=∥A∥
由上述展开可以看出,向量补 0 扩维不会改变点积结果,
因此 对于同一个模型输出的向量,通过填0改变向量的长度,因此不会影响余弦相似度的计算结果。