←Back to Science Coding Hub/Part J/J5
J5EasyPart J · RecSys & Search Metrics

Cosine Similarity & Vector Top-K Retrieval

Industrial-grade implementation and mathematical foundations of Cosine Similarity & Vector Top-K Retrieval.

⏱️ Time Complexity: O(N * M * D + N * M)
💾 Space Complexity: O(N * M)
💡

Core Mental Anchor / Mnemonic

Master Cosine Similarity & Vector Top-K Retrieval: enforce numerical stability, check tensor shapes, and eliminate redundant memory allocations.

📐 Mathematical Derivation & Core Formula

cos⁡(θ)=u⋅v∥u∥2∥v∥2=(u∥u∥)(v∥v∥)⊤\cos(\theta) = \frac{u \cdot v}{\|u\|_2 \|v\|_2} = \left(\frac{u}{\|u\|}\right) \left(\frac{v}{\|v\|}\right)^\top
### Mathematical Derivation & Theoretical Principles
Detailed first-principles formulation and architectural mechanics for Cosine Similarity & Vector Top-K Retrieval.

Refer to the LaTeX equation above for the core operator definition. The operator is designed to ensure strict numerical bounds, avoiding floating-point overflows and gradient anomalies.

🔄 Tensor Dimensions & Shape Flow

queries (N, D), corpus (M, D) -> L2 归一 -> 点积 (N, M) -> argpartition 提取 top_k -> 局部排序输出

🛡️ Industrial Numerical Stability & Pitfalls

  • Ensure proper multi-dimensional tensor broadcasting and keepdims retention.
  • Enforce numerical guards (eps clamping and overflow thresholds) during exponentiation and division.
  • Verify train versus eval mode behavioral distinctions (e.g. frozen running statistics and dropout bypass).

💻 Industrial Code Implementation

import numpy as np

def vector_topk_retrieval(
    queries: np.ndarray,      # (N, D)
    corpus: np.ndarray,       # (M, D)
    top_k: int = 5
) -> tuple:
    # 1. L2 范数归一化 (防除零)
    q_norm = queries / np.maximum(np.linalg.norm(queries, axis=-1, keepdims=True), 1e-12)
    c_norm = corpus / np.maximum(np.linalg.norm(corpus, axis=-1, keepdims=True), 1e-12)
    
    # 2. 批量点积计算相似度: (N, D) @ (D, M) -> (N, M)
    scores = q_norm @ c_norm.T
    
    # 3. 使用 argpartition 快速提取 top_k (比全排序快数倍)
    topk_indices = np.argpartition(-scores, kth=top_k-1, axis=-1)[:, :top_k]
    
    # 局部按相似度精确降序排序
    row_indices = np.arange(len(queries))[:, np.newaxis]
    part_scores = scores[row_indices, topk_indices]
    sort_order = np.argsort(-part_scores, axis=-1)
    
    final_indices = np.take_along_axis(topk_indices, sort_order, axis=-1)
    final_scores = np.take_along_axis(part_scores, sort_order, axis=-1)
    
    return final_indices, final_scores

🧪 Runnable Assertions & Validation

Copy and run directly in Python / Jupyter to verify correctness:

import numpy as np
corpus = np.array([[1.0, 0.0], [0.0, 1.0], [-1.0, 0.0]])
query = np.array([[0.9, 0.1]]) # 明显与第 0 个最像
idx, scores = vector_topk_retrieval(query, corpus, top_k=1)
assert idx[0, 0] == 0
assert scores[0, 0] > 0.9
print("✓ 向量余弦 Top-K 检索自测通过")

🎯 Core Architecture Follow-up Q&A

Q1:What are the key trade-offs and memory bottlenecks when deploying Cosine Similarity & Vector Top-K Retrieval in high-throughput inference?
Memory bandwidth (HBM to SRAM I/O) is the primary latency factor. Fusing element-wise operations and avoiding intermediate tensor materialization significantly outperforms naive implementations.
Q2:How does Cosine Similarity & Vector Top-K Retrieval handle extreme numerical boundaries or precision reduction (FP16/BF16/INT8)?
Under low precision, operations must be upcasted to FP32 during accumulation to prevent underflow/overflow, followed by proper scaling and clamping before converting back to the target format.
←Prev: Confusion Matrix, Precision, Recall & Macro/Micro F1All 69 KernelsNext: BM25 (Okapi BM25) Ranking Algorithm→