我们已经看到,嵌入模型将文本或图像等数据转换为数值向量。这些向量的一个基本属性是它们的维度 ,这简单来说就是每个向量中元素的数量(或分量)。例如,一个向量如 [ 0.1 , − 0.5 , 2.3 , . . . , − 1.8 ] [0.1, -0.5, 2.3, ..., -1.8] [ 0.1 , − 0.5 , 2.3 , ... , − 1.8 ] 可能有768个元素,这意味着它存在于一个768维的空间中。维度的选择并非随意;它对存储、计算以及表示本身的质量有重要作用。
“维度灾难”
处理高维向量(即包含许多元素,常有数百或数千个元素的向量)会带来一系列特殊的难题,这些难题统称为“维度灾难”。随着维度 d d d 的增加:
稀疏性: 向量空间的体积随 d d d 呈指数增长。想象一下点散布在一条线(1D)上,然后是一个正方形(2D),接着是一个立方体(3D)。随着维度的增加,可用空间比您通常拥有的数据点数量增长得快得多。结果,数据点变得极其稀疏,或者彼此之间距离很远。这使得找到有效的聚类或邻居变得更困难。
距离集中: 在高维空间中,大多数点对之间的距离往往变得几乎相等。最近点与最远点之间距离的比值接近1。这种反直觉的情况使得欧几里得距离等距离度量变得不那么具区分力。仅仅根据距离,区分近邻和远点变得更加困难,这对相似性搜索不利。
计算成本: 存储和处理高维向量需要更多的内存和计算能力。计算距离或执行搜索涉及对所有维度的操作,随着维度的增长,这些任务会明显变慢,消耗更多资源。考虑计算维度为 d d d 的两个向量 a ⃗ \vec{a} a 和 b ⃗ \vec{b} b 之间的欧几里得距离:
∣ ∣ a ⃗ − b ⃗ ∣ ∣ 2 = ∑ i = 1 d ( a i − b i ) 2 ||\vec{a} - \vec{b}||_2 = \sqrt{\sum_{i=1}^{d} (a_i - b_i)^2} ∣∣ a − b ∣ ∣ 2 = i = 1 ∑ d ( a i − b i ) 2
计算涉及 d d d 次减法、d d d 次平方和 d − 1 d-1 d − 1 次加法,其计算量与 d d d 成比例增加。相似性搜索算法,尤其是精确算法,其复杂度通常随 d d d 呈指数或多项式增长。
相对计算成本(如搜索时间)通常会随向量维度非线性增长。
高维度的益处
尽管存在维度灾难,但高维度并非天生是缺点。它们能够带来更强的表现力 。更多的维度提供了更多的“空间”,以捕捉数据中细致的模式、微小的区别和复杂的联系。例如,一个高维文本嵌入可能不仅编码主题,还能编码文本中的情感、风格以及提及的特定实体,从而能够进行更多的比较。
低维度的优势
反之,使用低维向量也有其优点:
效率: 它们需要更少的存储空间,并能更快地进行距离计算和搜索。
降噪: 较低的维度有时能起到降噪的作用,促使模型专注于数据中最主要的特征。
然而,过度地降低维度可能导致信息丢失 。重要的区别特征可能会被压缩或舍弃,使得原本不同的数据点在低维空间中显得更接近,从而降低搜索或分类任务的准确性。
寻求平衡:一项重要的取舍
为您的嵌入选择维度涉及平衡这些相互竞争的方面:
表现力与效率: 您的应用是需要高维度提供的表示能力,还是低维度的速度和较低资源消耗更受重视?
信息丰富度与维度灾难: 需要多少维度才能捕获核心信息,同时避免稀疏性和距离集中的负面作用?
最佳维度通常取决于以下方面:
嵌入模型: 预训练模型(如BERT或Sentence-BERT变体)通常具有固定的输出维度(例如768、384、1024)。微调可能会进行一些调整,但通常您会使用模型的原始维度。
任务: 搜索任务对高维度的承受能力可能比分类任务更强,因为分类任务的决策边界会变得复杂。
数据: 数据本身的复杂程度影响着需要多少维度才能有效表示。
计算资源: 可用内存、存储和处理能力会带来实际约束。
理解维度对于设计高效的基于向量的系统非常必要。虽然高维度能提供更丰富的信息,但它们伴随着计算成本和维度灾难带来的难题。通常,一种实用的做法是,首先使用所选嵌入模型提供的标准维度,然后考虑管理维度的技术,例如维度降低,我们将在接下来进行讨论。