使用 Python 和 Jax 构建推荐系统(二) 数学考量

38 阅读4分钟

数学考量

齐夫定律与马太效应

在机器学习的广泛应用中,大规模语料库中唯一项(Token)的观测分布普遍遵循齐夫定律 (Zipf’s Law),即频率随排名的下降呈指数级衰减。在推荐系统领域,这种统计规律直接导致了马太效应 (The Matthew Effect),即流行度偏差

[!NOTE]

标题:电影评分数量与排名的长尾图

这张图片展示了一个经典的长尾分布(Long-tail Distribution)

Y轴 : 代表被评分的次数(即流行度或热度)。

X轴: 代表电影的排名。电影按照评分数量从高到低排序。

在这张电影评分图中,如果把“单词频率”换成“电影被评分的次数”,把“单词排名”换成“电影排名”,图形就完全符合幂律分布的特征。极少数的电影(头部)占据了极大部分的用户注意力(评分)。排名靠后的电影,其受关注度呈指数级下降,这符合齐夫定律。由马太效应可知,排名靠前的电影(头部)因为本身知名度高,会被推荐系统放在显眼位置,或者被更多人谈论。这导致更多人去观看并打分,从而进一步巩固了它们的高排名。 用户的注意力和时间是有限的。头部电影吸走了绝大部分流量,导致尾部电影(那些位于X轴右侧的数万部电影)很难被发现,长期处于“无人问津”的状态。

image.png

[!IMPORTANT]

**马太效应 **

马太效应或称流行度偏差 (popularity bias)指出,**最受欢迎的商品将继续吸引最多的注意力,并拉大与其他商品的差距。即“强者愈强”。**表现为热门商品的点击量远超平均水平,活跃用户贡献的评分数量远超平均水平。

假设**概率质量函数(离散型随机变量概率分布)**由齐夫定律描述,其中 MM 为物品总数,kk 为排名:

f(k,M)=1/kn=1M1/nf(k,M) = \frac{1/k}{\sum_{n=1}^{M} 1/n}

分母是调和级数 HM=n=1M1/nH_M = \sum_{n=1}^{M} 1/n,作为归一化因子,确保所有概率之和为 1。

对于用户 XX,第 ii 个最热门物品出现在其评分集中的概率 PiP_i 为:

P(i)=f(i,M)j=1Mf(j,M)=f(i,M)1=1/ij=1M1/jP(i) = \frac{f(i, M)}{\sum_{j=1}^{M} f(j, M)} = \frac{f(i,M)}{1} = \frac{1/i}{\sum_{j=1}^{M} 1/j}

排名为 ii 的同一个物品同时出现在 AABB 的集中的概率(联合概率)是各自概率的乘积:

Pi2=PiPi=(1/ij=1M1/j)2=1/i2(j=1M1/j)2P_{i}^2 = P_i \cdot P_i = \left( \frac{1/i}{\sum_{j=1}^{M} 1/j} \right)^2 = \frac{1/i^2}{(\sum_{j=1}^{M} 1/j)^2}

可知两个用户在其评分集中共享一个物品的概率随着其流行度排名的平方而下降。(分母 (j=1M1j)2\left(\sum_{j=1}^{M} \frac{1}{j}\right)^2 是一个固定的数值。这表明,用户相似度分数的计算在数学上极度依赖于少数头部热门物品,而非长尾物品

基于集合相似度的计算

在推荐系统中,衡量用户 AABB 相似度最直观的方法是看他们的重合度,相似度通常定义为交集大小与并集大小的比值

Sim(A,B)=IAIBIAIBSim(A, B) = \frac{|\mathcal{I}_A \cap \mathcal{I}_B|}{|\mathcal{I}_A \cup \mathcal{I}_B|}

假设用户 AABB,分别拥有 NA=IAN_A = |\mathcal{I}_A|NB=IBN_B = |\mathcal{I}_B| 个评分。假设语料库中有 MM 个物品 {V1,V2,,VM}\{V_1, V_2, \dots, V_M\}。分子部分 IAIB|\mathcal{I}_A \cap \mathcal{I}_B| 代表两人共同拥有的物品数。对于每一个物品 ViV_i,我们定义一个指示变量 XiX_i

  • 如果物品 ViV_i 同时出现在用户 A 和用户 B 的评分集中,则 Xi=1X_i = 1
  • 否则,Xi=0X_i = 0

那么,两个用户共同评分的物品总数(即交集的大小)可以表示为所有指示变量的和:

IAIB=i=1MXi|\mathcal{I}_A \cap \mathcal{I}_B| = \sum_{i=1}^{M} X_i

对于第 ii 个物品,用户 AA 选中的概率是 PiP_i,用户 BB 选中的概率也是 PiP_i。假设两人选电影是独立行为,那么两人同时选中第 ii 个物品的联合概率就是:

P(A and B chose i)=Pi×Pi=Pi2P(A \text{ and } B \text{ chose } i) = P_i \times P_i = P_i^2

根据期望的线性性质,总和的期望等于期望的总和:

E[IAIB]=E[i=1MXi]=i=1ME[Xi]E[|\mathcal{I}_A \cap \mathcal{I}_B|] = E\left[ \sum_{i=1}^{M} X_i \right] = \sum_{i=1}^{M} E[X_i]

对于离散的指示变量,其期望值等于它取 1 时的概率:

E[Xi]=1P(Xi=1)+0P(Xi=0)=P(Xi=1)E[X_i] = 1 \cdot P(X_i = 1) + 0 \cdot P(X_i = 0) = P(X_i = 1)

由于总共有 MM 个物品,将所有物品“被共同选中”的概率累加起来,就得到了期望的交集大小

E[IAIB]=i=1MPi2E[|\mathcal{I}_A \cap \mathcal{I}_B|] = \sum_{i=1}^{M} P_i^2

分母 IAIB\| \mathcal{I}_A \cup \mathcal{I}_B \| 是两人评分集合的并集大小,起到缩放的作用,将结果约束在 [0,1][0, 1] 之间。

因此,由于单个物品共享带来的相似度期望分数为:

Ssingle=i=1MPi2IAIBS_{single} = \frac{\sum_{i=1}^{M} P_{i}^2}{\| \mathcal{I}_A \cup \mathcal{I}_B \|}

为了计算总的平均相似度,需要把“共享 tt 个物品”的所有可能性累加起来。

Stotal=t=1min(NA,NB)i1=1Mt+1i2=i1+1Mt+2it=it1+1M(k=1tPik2)IAIBtS_{total} = \sum_{t=1}^{\min(N_A, N_B)} \frac{\sum_{i_1=1}^{M-t+1} \sum_{i_2=i_1+1}^{M-t+2} \dots \sum_{i_t=i_{t-1}+1}^{M} \left( \prod_{k=1}^{t} P_{i_k}^2 \right)}{\| \mathcal{I}_A \cup \mathcal{I}_B \|^t}

稀疏性

稀疏性是齐夫分布在推荐系统矩阵表示中的直接后果。随着马太效应将大部分评分推向少数热门列,用户-物品矩阵在传统线性代数意义上变得高度稀疏

于任意用户 XX,选中排名为 ii 的物品 ViV_i 的概率 PiP_i 依然由齐夫定律定义:

Pi=1/ij=1M1/jP_i = \frac{1/i}{\sum_{j=1}^{M} 1/j}

为了衡量稀疏性对协作的影响,需要计算:对于一个用户 XX,有多少其他用户会和他因为同一个物品 ViV_i 产生关联?

单个物品的碰撞期望计算)假设系统中共有 MM 个用户。对于排名第 ii 的物品,其他任一用户选中它的概率也是 PiP_i。因此,在 M1M-1 个其他用户中,选中该物品的期望人数为:

Ei=(M1)PiE_i = (M - 1) \cdot P_i

将所有 MM 个物品能带来的“共享机会”累加,得到与用户 XX 至少共享一个评分的其他用户总数的理论期望值:

Total Shared Users=i=1M(M1)Pi\text{Total Shared Users} = \sum_{i=1}^{M} (M - 1) \cdot P_i

这组公式揭示了稀疏性将重点推向最受欢迎的用户,并有使推荐器变得短视 (myopic) 的风险。

[!NOTE]

X轴:用户的排名

Y轴:相似度计数

  • 这代表了系统在该排名区间内发现的“相似用户对”的数量。
  • 数值越高,说明算法在该排名附近越容易找到协作邻居。

从散点分布的总趋势可以看出,随着用户排名的增加,相似度计数呈现明显的下降趋势。

image.png

协同过滤的用户相似度

在协同过滤算法体系中,衡量用户之间的相似程度是构建推荐系统的逻辑起点。通过将用户映射到多维特征空间,可以将抽象的兴趣转化为可计算的几何距离或统计相关性,从而实现基于邻域的预测。

在经典几何学中,点与点之间的关系通常由**度量(Metric)**定义。一个标准的度量空间需要满足包括三角不等式在内的严格数学性质:

d(a,c)d(a,b)+d(b,c)d(a, c) \leq d(a, b) + d(b, c)

在机器学习任务中,研究者更倾向于使用**相似度(Similarity)**函数。当不相似度函数 dd 的取值范围在 [0,1][0, 1] 时,相似度定义为:

Sim(a,b):=1d(a,b)\text{Sim}(a, b) := 1 - d(a, b)

在实际工程中,许多有效的相似性度量并不完全满足度量空间的公理(如三角不等式),这些空间被称为伪空间(Pseudo-spaces)。尽管在数学严谨性上有所欠缺,但它们在捕捉高维数据的关联特征方面具有极高的实用价值。

最近邻理论

最近邻(Nearest Neighbors)算法是一种基于几何思想的非参数化方法,广泛应用于分类、排名和聚类任务。给定特征向量定义的空间及空间内的一点,通过计算距离找到与其地理位置最接近的其他点。CF 将用户映射到由物品评分定义的特征空间中。通过寻找目标用户的最近邻,可以将已有数据中的用户偏好迁移至新用户,从而实现预测推理。

皮尔逊相关系数

在协同过滤场景下,用户通常不在同一个特征空间内(每个人评分的物品集合不同)。皮尔逊相关系数通过提取两个用户共同评分的物品子集,计算其评分分布的相关性。该方法相比欧几里得距离的优势在于,通过减去均值 rˉ\bar{r},它能够自动抵消用户评分尺度不一(如某些用户习惯性给高分,某些则偏严苛)带来的偏差。

AABB 为两个用户,RA,B\mathcal{R}_{A,B} 为他们共同评分过的物品集合。用户 AA 对物品 xx 的评分为 rA,xr_{A,x}。用户相似度 USim(A,B)\text{USim}(A,B) 的计算公式如下:

USim(A,B)=xRA,B(rA,xrˉA)(rB,xrˉB)xRA,B(rA,xrˉA)2xRA,B(rB,xrˉB)2\text{USim}(A, B) = \frac{\sum_{x \in \mathcal{R}_{A,B}} (r_{A,x} - \bar{r}_A)(r_{B,x} - \bar{r}_B)}{\sqrt{\sum_{x \in \mathcal{R}_{A,B}} (r_{A,x} - \bar{r}_A)^2} \sqrt{\sum_{x \in \mathcal{R}_{A,B}} (r_{B,x} - \bar{r}_B)^2}}

符号定义:

  • RA,B\mathcal{R}_{A,B}:用户 AA 和用户 BB 共同评价过的物品交集。
  • rA,xr_{A,x}:用户 AA 对物品 xx 的原始评分。
  • rˉA\bar{r}_A:用户 AA 在共同评分集合中的平均评分。
  • USim(A,B)\text{USim}(A, B):取值范围为 [1,1][-1, 1],其中 11 表示完全正相关,1-1 表示完全负相关。

注意这是描述用户评分的联合分布变量的相似性

通过相似性进行评分

引入用户相似度后,可以通过加权聚合邻居的评价来估计目标用户对未见物品的兴趣

对于用户 AA 和物品 ii,其亲和力分数 Aff(A,i)\text{Aff}(A, i) 的计算公式如下:

Aff(A,i)=rˉA+UNAUSim(A,U)(rU,irˉU)UNAUSim(A,U)\text{Aff}(A,i) = \bar{r}_A + \frac{\sum_{U \in N_A} \text{USim}(A,U) \cdot (r_{U,i} - \bar{r}_U)}{\sum_{U \in N_A} |\text{USim}(A,U)|}

符号定义:

  • Aff(A,i)\text{Aff}(A,i):预测用户 AA 对物品 ii 的评分。
  • rˉA\bar{r}_A:用户 AA 在其历史评分记录中的平均分,代表其基础“慷慨程度”。
  • NAN_A:用户 AA邻域(Neighborhood),即与其最相似的一组用户。
  • USim(A,U)\text{USim}(A,U):用户 AA 与邻居 UU 之间的相似度权重(通常由皮尔逊相关系数得出)。
  • rU,irˉUr_{U,i} - \bar{r}_U:邻居 UU 对物品 ii 的评分与其自身平均分的差值。

该模型基于以下假设:用户 AA 的评分行为等于其自身的平均评分偏好,加上邻居偏离其自身均值的加权修正。 这种方法不仅参考了相似用户的观点,还修正了不同用户之间“评分慷慨程度”的差异。

相似度向度量空间的转换

虽然皮尔逊相关系数(Pearson Correlation, PA,BP_{A,B})在衡量相关性方面表现出色,但它直接定义的距离 d=1PA,Bd = 1 - P_{A,B} 在数学上并不构成严格的度量空间(Metric Space)。其主要缺陷在于不满足三角不等式。为了在需要严格度量性质的算法(如某些高维空间索引或聚类算法)中使用相关系数,需要进行数学变换。

转换方法公式特性
直接补数1PA,B1 - P_{A,B}满足非负性、自反性、对称性,但不满足三角不等式。
平方根变换1PA,B\sqrt{1 - P_{A,B}}最常用方法。能够将其转化为符合三角不等式的欧几里得度量。
角度转换arccos(PA,B)\arccos(P_{A,B})将相关性视为向量间的夹角,在余弦相似度场景中尤为常见。

推荐系统中的探索与利用

在构建推荐系统时,开发者往往面临着维持当前最优性能与探索未知潜力的平衡问题。单纯依赖历史数据最大化短期收益(如 MPIR 算法),往往会导致系统陷入局部最优,并引发长期的负面效应。

最热门商品推荐器 (MPIR):虽然易于实现且逻辑清晰,但其本质是放大马太效应。随着时间,循环反馈会失效。MPIR 会持续向用户展示已知的热门物品,这导致这些物品的流行度进一步上升。在极限情况下,推荐系统将退化为平凡推荐器,即失去个性化能力,仅能反馈大盘趋势。

模态状态风险

在缺乏随机化机制的情况下,单纯最大化损失函数(或奖励函数)会导致算法迅速陷入模态状态 (Modal State) 。这意味着算法无法再学习到关于长尾物品或潜在兴趣的任何新信息,从而使系统的整体探索能力陷入停滞。

探索与利用框架

为了克服上述故障模式,推荐系统引入了源自多臂老虎机 (Multi-armed Bandits, MAB) 的策略。

利用 (Exploit):基于当前已知的最优先验估计,选择预期奖励最高的推荐方案(“臂”),以最大化即时收益。

探索 (Explore):以一定的概率尝试非最优或未知的替代方案,目的是收集更多数据,更新对物品分布的估计。

给定一组候选推荐方案(臂) AA,智能体(Agent)的目标是最大化奖励函数 R(yt)R(y_t)。由于智能体初始并不知道结果 YaAY_{a \in A} 的真实分布,其执行逻辑如下:

  1. 假设先验分布:假设 YaAY_{a \in A} 遵循某种分布。
  2. 数据更新:通过观察推荐结果 yty_t,更新分布参数。
  3. 期望估计:在足够观察后,估计各方案的期望奖励 μaA=E[R(Ya)]\mu_{a \in A} = \mathbb{E}[\mathcal{R}(Y_a)]

ϵ\epsilon-贪婪算法

ϵ\epsilon-贪婪(ϵ\epsilon-greedy)是处理探索-利用权衡最直观且高效的算法。

对于参数 ϵ[0,1]\epsilon \in [0, 1]

  • 以概率 1ϵ1 - \epsilon 执行“利用”:选择当前估计奖励最高的物品。
  • 以概率 ϵ\epsilon 执行“探索”:从候选池中随机选择一个物品。
from jax import random
key = random.PRNGKey(0)

def get_most_popular_recs_ep_greedy(
    max_num_recs: int,
    epsilon: float
) -> Optional[List[str]]:
    # 验证超参数范围
    assert 0 < epsilon < 1.0
    
    items_popularity_dict = get_item_popularities()
    
    if items_popularity_dict:
        # 1. 排序器逻辑:按流行度降序排列
        sorted_items = sorted(
            items_popularity_dict.items(),
            key=lambda item: item[1],
            reverse=True,
        )
        top_items = [i[0] for i in sorted_items]
        recommendations = []
        
        # 2. 填充推荐列表
        for i in range(max_num_recs):
            # 确定当前步骤是利用还是探索
            if random.uniform(key) > epsilon: 
                # 利用:弹出当前最热门的物品
                recommendations.append(top_items.pop(0))
            else: 
                # 探索:从剩余物品池中随机抽取
                explore_choice = random.randint(1, len(top_items))
                recommendations.append(top_items.pop(explore_choice))
                
        return recommendations
    return None

引入 ϵ\epsilon-贪婪策略后,推荐系统的三层架构需进行相应的职责调整:

组件状态变更说明
收集器 (Collector)无需变更依然负责获取物品的原始流行度计数。
排序器 (Ranker)无需变更依然按流行度对候选物品进行全序排列。
服务端 (Server)核心变更不再直接截取 Top-K,而是集成 ϵ\epsilon 逻辑,逐个确定推荐位是填充排名靠前的物品还是随机物品。

ϵ\epsilon 的取值直接决定了系统的“好奇心”程度。

动态衰减策略:通用的最佳实践是在系统运行初期设置较大的 ϵ\epsilon(高强度探索),随着收集的数据增多,逐步减小 ϵ\epsilon 的值,直至收敛到一个较小的稳定值。

自然语言处理与推荐系统的几何关联

在工业级推荐系统的演进过程中,借用自然语言处理(NLP)领域的序列建模直觉已成为一种标准范式。Word2Vec 模型通过词语在句子中的共现关系来学习词的语义表示。将其逻辑迁移至推荐系统,便催生了将用户行为序列视作句子,将交互物品视作单词的建模策略

Skip-gram 结构的 Word2Vec 通过预测上下文单词来学习目标单词的隐含意义。其核心逻辑如下:

  • 输入与输出:输入为经过独热编码(One-hot Encoding)的单词,输出层维度等于词汇表大小,用于预测共现概率。
  • 瓶颈层(Bottleneck Layer):网络中间存在一个维度远小于词汇表大小的隐藏层。
  • 表征压缩:通过训练,高维稀疏的独热向量被映射到低维稠密的潜在空间(Latent Space)。在这个空间中,向量间的几何相似性直接对应了语义的相似性。

推荐系统利用上述思想实现从协同过滤(CF)向序列化建模的跨越:

  • 句子与序列:将用户在特定时间内的有序互动记录(如电影评分序列、商品点击序列)视为 NLP 中的句子。
  • 单词与物品:序列中的每一个互动项被视为单词。
  • 相似性假设:模型通过物品在大量用户历史中的共现关系学习其向量表示。基于此,推荐系统可以从“寻找相似用户”转向“寻找相似物品”,即假设用户未来会喜欢与其历史行为空间距离接近的物品。

潜在空间与向量搜索

通过模型学习,物品被嵌入到一个高维的潜在空间(或称表示空间、环境空间)。推荐系统的本质任务转变为在该空间内进行高效的几何搜索。

在高维潜在空间中,距离度量面临维度诅咒:

  • 欧几里得距离失效:随着维度增加,空间趋于稀疏,欧几里得距离的性能显著下降。局部距离虽有参考价值,但全局距离的可靠性较低。
  • 余弦相似度(Cosine Similarity):在实践中,余弦距离通常比欧几里得距离表现更好,因为它关注的是向量的方向而非绝对长度。
  • 相似度最大化:工程实现上,最大化向量点积或余弦相似度通常比最小化距离函数更具鲁棒性。

[!NOTE]

在数学中,欧几里得距离被定义为连接两点之间的线段长度

二维空间 (2D)

对于平面上的两个点 P(x1,y1)P(x_1, y_1)Q(x2,y2)Q(x_2, y_2),距离 dd 为:

d(P,Q)=(x2x1)2+(y2y1)2d(P, Q) = \sqrt{(x_2 - x_1)^2 + (y_2 - y_1)^2}

三维空间 (3D)

对于空间中的点 P(x1,y1,z1)P(x_1, y_1, z_1)Q(x2,y2,z2)Q(x_2, y_2, z_2)

d(P,Q)=(x2x1)2+(y2y1)2+(z2z1)2d(P, Q) = \sqrt{(x_2 - x_1)^2 + (y_2 - y_1)^2 + (z_2 - z_1)^2}

n 维空间 (n-D)

在机器学习等高维场景中,设两点为 P(x1,x2,,xn)P(x_1, x_2, \dots, x_n)Q(y1,y2,,yn)Q(y_1, y_2, \dots, y_n)

d(P,Q)=i=1n(xiyi)2d(P, Q) = \sqrt{\sum_{i=1}^n (x_i - y_i)^2}

[!NOTE]

余弦相似度

对于 nn 维向量 AABB,其余弦相似度定义为两向量的点积除以它们模长的乘积:

similarity=cos(θ)=ABAB=i=1nAiBii=1nAi2i=1nBi2\text{similarity} = \cos(\theta) = \frac{A \cdot B}{\|A\| \|B\|} = \frac{\sum_{i=1}^{n} A_i B_i}{\sqrt{\sum_{i=1}^{n} A_i^2} \sqrt{\sum_{i=1}^{n} B_i^2}}

符号定义:

  • ABA \cdot B:向量的点积。
  • A\|A\|B\|B\|:向量的模长(即 L2 范数)。

使用相似性产生推荐

给定用户 AA 及其喜欢的物品集合,通过潜在空间中的向量运算可以推导出推荐结果。

符号定义:

  • RA\mathcal{R}_A:用户 AA 已评分或交互过的物品集合。
  • vxv_x:物品 xx 在潜在空间中的特征向量,其中 xRAx \in \mathcal{R}_A
  • AA:用户 AA 的关联向量集 {vxxRA}\{v_x \mid x \in \mathcal{R}_A\}
  • vyv_y:待预测物品 yy 的特征向量。
  • rxr_x:用户对物品 xx 的评分或反馈权重。
  • USim()\text{USim}(\cdot):潜在空间中的相似度函数(如余弦相似度)。
  • avg(A)\text{avg}(A):用户兴趣的中心向量,定义为 1ni=1nvi\frac{1}{n} \sum_{i=1}^{n} v_i(其中 n=RAn = |\mathcal{R}_A|)。

推荐生成策略:

均值重心法

假设用户喜欢的物品在潜在空间中具有聚类特性。通过取平均值,模型试图捕捉用户兴趣的最大公约数。寻找与用户交互历史平均位置最接近的物品。

y=argmaxyItems(USim(vy,avg(A)))y^* = \operatorname*{argmax}_{y \in \text{Items}} \left( \text{USim}(v_y, \text{avg}(A)) \right)

均值重心法的优点在于计算极其简单,在线预测时只需一次向量搜索。但也容易受到“长尾”行为的影响。如果用户同时喜欢两种完全不同的东西(如:硬核科幻与浪漫喜剧),其重心可能落在空间中一个荒芜的中间区域,导致推荐出“平庸且不相关”的物品。

加权反馈法
  • RA|\mathcal{R}_A|:用户交互过的物品总数

引入用户评分作为权重,提升高质量反馈的影响力。高评分或高频互动的物品在空间中对用户坐标的拉引力更强。这使得用户向量向其最满意的物品区域偏移。

y=argmaxyItems(USim(vy,xRArxvxxRArx))y^* = \operatorname*{argmax}_{y \in \text{Items}} \left( \text{USim} \left( v_y, \frac{\sum_{x \in \mathcal{R}_A} r_x \cdot v_x}{\sum_{x \in \mathcal{R}_A} r_x} \right) \right)
单点加权推荐

针对多兴趣用户,寻找与特定喜好物品最相似的推荐。单点加权策略保留了用户交互历史中每一个物品的独立特征。它认为用户的兴趣并非单一的聚合点,而是分布在潜在空间中的多个离散坐标点

y=argmaxy{USim(vy,vx)rxyItems,vxA}y^* = \text{argmax}_{y} \left\{ \text{USim}(v_y, v_x) \cdot r_x \mid y \in \text{Items}, v_x \in \mathcal{A} \right\}
Top-K 覆盖

对用户喜欢的不同物品分别执行搜索,获取 kk 个多样化结果。

S=xRAtop-kyItems(USim(vy,vx)rx)S = \bigcup_{x \in \mathcal{R}_A} \operatorname*{top-k}_{y \in \text{Items}} \left( \text{USim}(v_y, v_x) \cdot r_x \right)

最近邻搜索

在完成物品向量化后,推荐系统面临的核心工程问题是如何从数百万甚至数亿个物品向量中快速找到与目标向量最相似的项。精确最近邻搜索需要计算目标向量与全量库中每个向量的距离,其计算复杂度随库规模呈线性增长,无法满足在线实时推荐的延迟要求。

为了平衡精度与速度,工程实践中普遍采用**近似最近邻(Approximate Nearest Neighbors ANN)**搜索算法,通过索引结构(如量化、聚类或图结构)缩小搜索范围,仅返回物理距离极其接近(而非绝对最近)的结果。ANN 算法能以极微小的精度损失换取数个数量级的执行速度提升。在任何需要执行 argmax\text{argmax}argmin\text{argmin} 运算的大规模向量检索场景中,ANN 均是实际的底层实现支柱。