对于独热编码余弦相似度结果为0和词向量解决了词之间相似性问题的理解
文章目录
- 深入理解
- 简单案例
- 结论
- 词向量(Word Embedding)简介
- 词向量如何解决相似性问题?
- 简单案例:基于上下文的词向量训练
- 总结
- 对于独热表示的向量,如果采用余弦相似度计算向量间的相似度,可以明显的发现任意两者向量的相似度结果都为 0,即任意二者都不关,也就是说独热表示无法解决词之间的相似性问题。
深入理解
- 独热编码(One-Hot Encoding)是一种将类别型变量转换为二进制向量的方法。对于一个有NNN 个不同类别的特征,独热编码会创建一个长度为NNN的向量,其中只有一个元素为 1(表示当前类别),其余元素为 0。例如,对于三个类别 “猫”、“狗”、“鸟”,其独热编码可能分别为 [1,0,0][1, 0, 0][1,0,0]、[0,1,0][0, 1, 0][0,1,0] 和[0,0,1][0, 0, 1][0,0,1]。
- 余弦相似度用于衡量两个向量在方向上的相似性,其中 A⋅BA \cdot BA⋅B 是向量的点积,∣A∣|A|∣A∣ 和∣B∣|B|∣B∣ 是向量的模(欧几里得范数)。计算公式为:
余弦相似度=A⋅B∥A∥⋅∥B∥\text{余弦相似度} = \frac{A \cdot B}{\|A\| \cdot \|B\|} 余弦相似度=∥A∥⋅∥B∥A⋅B
对于任意两个不同的独热向量:
- 点积A⋅B=0A \cdot B = 0A⋅B=0(因为独热向量只有一个 1,且不同向量的 1 位置不同)。
- 每个向量的模 ∣A∣=∣B∣=1|A| = |B| = 1∣A∣=∣B∣=1(因为只有一个 1,其余为 0)。
因此,余弦相似度为:
余弦相似度=01⋅1=0\text{余弦相似度} = \frac{0}{1 \cdot 1} = 0 余弦相似度=1⋅10=0
- 这表明任意两个不同的独热向量是完全不相关的(相似度为 0),无法反映它们之间可能存在的语义或实际关系。
简单案例
假设我们有以下三个词的独热编码:
- “猫”:[1,0,0][1, 0, 0][1,0,0]
- “狗”:[0,1,0][0, 1, 0][0,1,0]
- “鸟”:[0,0,1][0, 0, 1][0,0,1]
计算 “猫” 和 “狗” 的余弦相似度:
- 点积:
[1,0,0]⋅[0,1,0]=(1⋅0)+(0⋅1)+(0⋅0)=0[1, 0, 0] \cdot [0, 1, 0] = (1 \cdot 0) + (0 \cdot 1) + (0 \cdot 0) = 0 [1,0,0]⋅[0,1,0]=(1⋅0)+(0⋅1)+(0⋅0)=0 - 模:
∥[1,0,0]∥=12+02+02=1∥[0,1,0]∥=02+12+02=1\|[1, 0, 0]\| = \sqrt{1^2 + 0^2 + 0^2} = 1 \\ \|[0, 1, 0]\| = \sqrt{0^2 + 1^2 + 0^2} = 1 ∥[1,0,0]∥=12+02+02=1∥[0,1,0]∥=02+12+02=1 - 余弦相似度:
01⋅1=0\frac{0}{1 \cdot 1} = 0 1⋅10=0
计算 “猫” 和 “鸟” 的余弦相似度:
- 点积:
[1,0,0]⋅[0,0,1]=(1⋅0)+(0⋅0)+(0⋅1)=0[1, 0, 0] \cdot [0, 0, 1] = (1 \cdot 0) + (0 \cdot 0) + (0 \cdot 1) = 0 [1,0,0]⋅[0,0,1]=(1⋅0)+(0⋅0)+(0⋅1)=0 - 模:
∥[1,0,0]∥=1∥[0,0,1]∥=1\|[1, 0, 0]\| = 1 \\ \|[0, 0, 1]\| = 1 ∥[1,0,0]∥=1∥[0,0,1]∥=1 - 余弦相似度:
01⋅1=0\frac{0}{1 \cdot 1} = 0 1⋅10=0
计算 “狗” 和 “鸟” 的余弦相似度:
- 点积:
[0,1,0]⋅[0,0,1]=(0⋅0)+(1⋅0)+(0⋅1)=0[0, 1, 0] \cdot [0, 0, 1] = (0 \cdot 0) + (1 \cdot 0) + (0 \cdot 1) = 0 [0,1,0]⋅[0,0,1]=(0⋅0)+(1⋅0)+(0⋅1)=0 - 模:
∥[0,1,0]∥=1∥[0,0,1]∥=1\|[0, 1, 0]\| = 1 \\ \|[0, 0, 1]\| = 1 ∥[0,1,0]∥=1∥[0,0,1]∥=1 - 余弦相似度:
01⋅1=0\frac{0}{1 \cdot 1} = 0 1⋅10=0
结论
- 通过计算可以发现,任意两个不同词的独热编码的余弦相似度均为 0。表明独热编码无法捕捉词与词之间的相似性(例如 “猫” 和 “狗” 都是动物,但相似度为 0)。
- 这是独热编码的局限性之一,因此在实际 NLP 任务中通常会使用更高级的词表示方法(如词嵌入 Word2Vec、GloVe 等)来解决这一问题。
词向量(Word Embedding)简介
- 词向量(Word Embedding)是一种将词语映射到低维连续向量空间的技术,其核心思想是让语义或用法相似的词在向量空间中距离更近。与独热编码不同,词向量是稠密向量(非稀疏),每个维度表示词的某种潜在语义或语法特征(如“性别”、“动作”、“情感”等)。
关键特点:
- 低维稠密:通常维度为 50-300(远小于独热编码的维度)。
- 语义可计算:通过向量运算可以捕捉词的关系(如“国王 - 男 + 女 ≈ 女王”)。
- 相似性量化:余弦相似度可以反映词之间的语义相关性。
词向量如何解决相似性问题?
独热编码的相似度恒为 0,而词向量通过以下方式解决:
- 相似词向量接近:通过训练(如预测上下文),模型会使得“猫”和“狗”的向量方向接近。
- 连续空间表示:向量的每一维对应某种潜在特征,例如:
- 维度1:动物性(猫=0.9,狗=0.8,汽车=0.1)
- 维度2:家用性(猫=0.7,狗=0.6,汽车=0.3)
简单案例:基于上下文的词向量训练
- 假设有一个小型语料库和简化的词向量(维度=2):句子:
"猫 吃 鱼"
,"狗 吃 肉"
- 初始随机向量(训练前):
- 猫: [0.2, 0.4]
- 狗: [0.3, 0.1]
- 吃: [0.5, 0.5]
- 鱼: [0.1, 0.6]
- 肉: [0.2, 0.2]
- 目标:通过训练(如Skip-gram模型),调整向量使得共享上下文的词(如“猫”和“狗”都邻近“吃”)在向量空间中接近。
训练步骤(简化):
- 输入“吃”,预测上下文“猫”或“狗”。
- 计算“吃”的向量与“猫”的向量点积,通过Softmax得到概率。
- 根据预测误差反向传播,更新“吃”、“猫”、“狗”的向量。
训练后可能结果(假设):
- 猫: [0.8, 0.5]
- 狗: [0.7, 0.4]
- 吃: [0.6, 0.6]
此时,“猫”和“狗”的向量更接近。
计算相似度(训练后)
余弦相似度公式:
相似度=A⋅B∥A∥⋅∥B∥\text{相似度} = \frac{A \cdot B}{\|A\| \cdot \|B\|} 相似度=∥A∥⋅∥B∥A⋅B
- 猫 vs 狗:
- 点积:0.8×0.7+0.5×0.4=0.56+0.20=0.760.8 \times 0.7 + 0.5 \times 0.4 = 0.56 + 0.20 = 0.760.8×0.7+0.5×0.4=0.56+0.20=0.76
- 模:∣A∣=0.82+0.52≈0.94|A| = \sqrt{0.8^2 + 0.5^2} \approx 0.94∣A∣=0.82+0.52≈0.94,∣B∣≈0.81|B| \approx 0.81∣B∣≈0.81
- 相似度:0.760.94×0.81≈0.99\frac{0.76}{0.94 \times 0.81} \approx 0.990.94×0.810.76≈0.99
- 猫 vs 肉(无关词):
- 假设“肉”向量为 [0.2, 0.2]
- 点积:0.8×0.2+0.5×0.2=0.260.8 \times 0.2 + 0.5 \times 0.2 = 0.260.8×0.2+0.5×0.2=0.26
- 相似度:0.260.94×0.28≈0.99\frac{0.26}{0.94 \times 0.28} \approx 0.990.94×0.280.26≈0.99
词向量的典型应用
- 词类比任务: 国王−男+女≈女王\text{国王} - \text{男} + \text{女} \approx \text{女王}国王−男+女≈女王
- 文本分类:将词向量求和/平均作为句子表示。
- 语义搜索:用向量相似度匹配查询词和相关文档。
总结
词向量通过将词映射到连续空间,使得:
- 语义相似的词向量距离接近。
- 支持向量运算捕捉复杂关系(如类比关系)。
- 解决了独热编码无法表示相似性的缺陷。
实际中,Word2Vec、GloVe等模型通过大规模语料训练,自动学习这种分布式表示。