NLP:相似性算法详解

点积相似性与余弦相似性详解

点积相似性与余弦相似性详解

1. 点积相似性(Dot Product Similarity)

  • 定义:两个向量的点积是各对应元素乘积之和,数学表示为:

    $\text{Dot}(A, B) = A \cdot B = \sum_{i=1}^{n} A_i \times B_i$

    其中,AB 为n维向量。

  • 特点

    • 长度敏感:结果受向量模长影响,模长大的向量点积可能更大。
    • 无界性:结果范围从负无穷到正无穷,具体取决于向量方向和维度。
  • 应用场景

    • 信息检索:TF-IDF加权的文档向量点积用于计算查询与文档的相关性分数(如BM25变种)。
    • 推荐系统:用户和物品的潜在因子向量点积直接预测评分(如矩阵分解)。
    • 注意力机制:点积注意力(如Transformer中的Scaled Dot-Product Attention),通过计算查询和键的点积获取权重。
  • 算法示例

    • 点积注意力:在Transformer模型中,计算查询矩阵 QQ 和键矩阵 KK 的点积,缩放后通过Softmax归一化:

      $\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V$

      其中,$d_k$为向量维度,缩放避免梯度消失。

  • 优缺点

    • 优点:计算高效,无需归一化;适合保留向量长度信息的场景。
    • 缺点:对向量长度敏感,长向量可能主导结果,不适合直接比较不同长度向量。

2. 余弦相似性(Cosine Similarity)

  • 定义:两个向量的余弦相似性为点积除以模长乘积,数学表示为:

    $\text{CosSim}(A, B) = \frac{A \cdot B}{|A| \times |B|} = \frac{\sum_{i=1}^{n} A_i B_i}{\sqrt{\sum_{i=1}^{n} A_i^2} \times \sqrt{\sum_{i=1}^{n} B_i^2}}$

    结果范围在 [−1,1](或 [0,1]当向量非负时)。

  • 特点

    • 方向敏感:仅关注向量方向,忽略模长差异。
    • 归一化:结果标准化,适合比较不同长度向量。
  • 应用场景

    • 词向量比较:Word2Vec、GloVe等词嵌入的语义相似度计算(如“king”与“queen”)。
    • 文本聚类/分类:TF-IDF或BERT句向量的文档相似性度量。
    • 语义搜索:通过余弦相似性匹配查询与候选文本(如Elasticsearch的语义插件)。
  • 算法示例

    • 归一化点积:若向量已归一化为单位向量($|A| = |B| = 1$),则点积等于余弦相似性,简化计算:

      $\text{CosSim}(A, B) = A \cdot B$

    • 预训练模型应用:Sentence-BERT生成句向量后,直接计算余弦相似性用于语义匹配。

  • 优缺点

    • 优点:消除长度影响,适合文本等方向敏感的任务。
    • 缺点:忽略模长信息(如TF-IDF中,词频可能反映重要性),需两次模长计算。

3. 对比与选择

  • 数学关系

    • 余弦相似性是归一化的点积,即:

      $\text{CosSim}(A, B) = \frac{\text{Dot}(A, B)}{|A| \times |B|}$

    • 当向量被归一化后,两者等价。

  • 选择依据

    • 使用点积:需保留长度信息(如推荐系统中用户活跃度、物品热度)。
    • 使用余弦相似性:需纯方向比较(如语义相似性、短文本匹配)。
  • 典型NLP应用

    • 点积:推荐系统评分预测、注意力机制中的原始得分计算。
    • 余弦相似性:词/句相似度、文档聚类、语义检索。

4. 实战示例

  1. 词向量比较(余弦相似性)

    1
    2
    3
    4
    5
    import numpy as np
    from sklearn.metrics.pairwise import cosine_similarity

    # 假设vec_king和vec_queen为归一化后的词向量
    similarity = cosine_similarity([vec_king], [vec_queen])[0][0]
  2. 注意力计算(缩放点积)

    1
    2
    3
    4
    5
    def scaled_dot_product_attention(Q, K, V):
    d_k = Q.shape[-1]
    scores = np.dot(Q, K.T) / np.sqrt(d_k)
    attention_weights = softmax(scores) # 伪代码,需实现softmax
    return np.dot(attention_weights, V)

5. 总结

  • 点积相似性:直接高效,适合长度敏感场景,但需注意模长影响。
  • 余弦相似性:消除模长干扰,专注方向差异,是NLP语义任务的首选。
  • 算法选择:根据任务需求(是否需保留长度信息)和计算环境(是否允许额外归一化步骤)权衡。
作者

光星

发布于

2025-04-20

更新于

2025-04-27

许可协议

评论