词向量基础:从独热编码到分布式表示的演进
文章目录
- 一、词向量概述
- 1.1 词向量介绍
- 1.2 对词向量的理解
- 二、古典时代 - 离散表示
- 2.1 独热编码
- 2.2 核心思想
- 2.3 详细步骤
- 2.4 优点和缺点
- 三、现代时代 - 分布式表示
- 3.1 分布式表示的核心
- 3.2 如何学习分布式表示? - Word2Vec
- A. Skip-gram (跳元模型)
- B. CBOW (连续词袋模型)
- 3.3 分布式表示的优势
- 四、总结对比与演进图
- 4.1 总结对比
- 4.2 演进流程
一、词向量概述
1.1 词向量介绍
词向量是自然语言处理(NLP)的核心技术,它将离散的单词转换为连续的稠密向量,使机器能够理解语义和语法关系。本文从最基础的独热编码(One-Hot Encoding)出发,逐步介绍其局限性,并阐述如何通过分布式表示(Distributed Representation)解决这些问题,最终演进到现代词向量模型(如Word2Vec、GloVe、FastText)。
1.2 对词向量的理解
想象一下,我们如何让计算机理解“国王”和“女王”这两个词?在计算机看来,它们都只是无意义的字符串。要让机器理解语言,我们首先需要将词语转换成它能处理的数学形式——向量。将词语表示为向量的过程,就是“词向量”或“词嵌入”的核心任务。
这个演进过程主要分为两个时代:
- 古典时代:离散表示
- 核心思想: 每个词都是独一无二的、孤立的原子。
- 代表技术: 独热编码
- 现代时代:分布式表示
- 核心思想: 一个词的含义由它周围的词语决定(“词义由上下文界定”)。
- 代表技术: Word2Vec, GloVe, FastText
下面,我们详细拆解这两个时代。
二、古典时代 - 离散表示
2.1 独热编码
独热编码是最直观、最简单的词向量表示方法。有以下特点:
- 每个词表示为一个高维稀疏向量
- 向量维度等于词汇表大小
- 每个向量只有一个位置为1,其余为0
- 无法体现词汇间的语义相似性
2.2 核心思想
在一个巨大的词典中,给每个词分配一个唯一的整数索引。然后,创建一个与词典长度相等的向量。对于某个词,其对应的索引位置为1,其余所有位置都为0。
2.3 详细步骤
假设我们有一个非常小的句子库(语料库):"我喜欢学习人工智能,人工智能很有趣。"
1. 构建词典:
首先,我们提取出所有不重复的词语,并给它们一个唯一的ID。
* 我: 1
* 喜欢: 2
* 学习: 3
* 人工智能: 4
* 很: 5
* 有趣: 6
* ,: 7 (忽略标点,这里仅为示例)
* 。: 8 (忽略标点,这里仅为示例)
我们的词典大小 V = 6
。
2. 创建向量:
向量的维度就是词典的大小 V
。每个词的向量都是一个 V
维的向量。
* “我” 的向量:
[1, 0, 0, 0, 0, 0]
(索引1的位置为1)
* “喜欢” 的向量:
[0, 1, 0, 0, 0, 0]
(索引2的位置为1)
* “学习” 的向量:
[0, 0, 1, 0, 0, 0]
(索引3的位置为1)
* “人工智能” 的向量:
[0, 0, 0, 1, 0, 0]
(索引4的位置为1)
2.4 优点和缺点
1、优点
- 简单直观: 非常容易理解和实现。
- 信息无损: 在词典范围内,每个词的表示都是独一无二的,没有信息损失。
2、致命缺点
- 维度灾难:
词典中有多少词,向量的维度就有多少。现代语料库的动辄是几十万甚至上百万的词汇量。这意味着每个词的向量都会是一个极其稀疏(绝大部分是0)且维度极高的向量。这会消耗巨大的存储空间,并给后续的机器学习模型带来巨大的计算负担。 - 语义鸿沟:
这是独热编码最根本的缺陷。它完全无法表达词语之间的语义关系。- 向量
[1, 0, 0, 0, 0, 0]
(“我”) 和[0, 1, 0, 0, 0, 0]
(“喜欢”) 之间的夹角是90度。 - 向量
[0, 1, 0, 0, 0, 0]
(“喜欢”) 和[0, 0, 1, 0, 0, 0]
(“学习”) 之间的夹角也是90度。 - 向量
[0, 0, 0, 1, 0, 0]
(“人工智能”) 和[0, 0, 0, 0, 1, 0]
(“很”) 之间的夹角还是90度。
在数学上,所有词向量都是正交的,它们之间没有任何“远近”或“相似”的概念。计算机无法从这种表示中学习到“国王”和“女王”比“国王”和“自行车”更相似”这样的常识。这对于需要理解语义的机器翻译任务来说是致命的。
为了解决语义鸿沟,人们引入了词-文档矩阵,比如TF-IDF。它虽然考虑了词在文档中的频率,但本质上还是一种离散的、基于计数的表示,无法捕捉词语间的深层语义联系。
- 向量
简单来说局限性如下:
- 维度灾难:词汇表规模大时,向量维度极高
- 语义鸿沟:任意两个词的余弦相似度都是0,无法衡量语义相似性
- 存储效率低:高维稀疏向量占用大量存储空间
三、现代时代 - 分布式表示
为了克服独热编码的缺陷,分布式表示应运而生。它的核心思想源于著名的分布假说:一个词的含义由它所处的上下文决定。
“You shall know a word by the company it keeps.” (J.R. Firth, 1957)
“你通过一个词的‘伙伴’来认识它。”
这意味着,如果两个词在很多上下文中都出现,那么它们的含义就很相似。分布式表示就是将这个思想数学化。
3.1 分布式表示的核心
- 低维稠密向量: 每个词不再由一个巨大的稀疏向量表示,而是由一个低维(例如50维、100维、300维)的稠密向量表示。这个向量的每一维都是一个浮点数,不再只有0和1。
- 语义信息编码: 向量中的每个维度都没有直观的语义解释,但整个向量的方向和位置编码了该词的丰富语义信息。语义相近的词,其向量在向量空间中的距离也更近。
一个绝佳的类比:
想象一下一个由成千上万种调料构成的巨大空间。每种调料(词)都可以用一个包含“甜度”、“咸度”、“酸度”、“鲜度”等多个维度的向量来表示。 - 盐 的向量可能是
[高, 低, 低, 低]
- 糖 的向量可能是
[高, 低, 低, 低]
- 醋 的向量可能是
[低, 低, 高, 低]
在这个空间里,盐和糖的距离很近,因为它们的“咸度”和“甜度”维度都很高。而盐和醋的距离就远。这个空间没有直接定义“甜味”,但“甜度”这个维度隐含地表达了它。这就是分布式表示的精髓:通过在多个潜在维度上的组合,来表达复杂的、抽象的概念。
简单来说,核心思想如下:
- 用低维稠密向量表示词汇
- 语义相似的词在向量空间中距离较近
- 向量的每个维度都携带语义信息
主要优势如下:
- 降维:通常使用几百维向量表示词汇
- 语义捕获:能够捕获词汇间的语义和语法关系
- 泛化能力:相似词共享相似的向量表示
3.2 如何学习分布式表示? - Word2Vec
Word2Vec是实现分布式表示最著名、最经典的方法,由Google在2013年提出。它通过一个巧妙的“预测任务”来学习词向量。主要有两种模型架构:
A. Skip-gram (跳元模型)
目标: 给定一个中心词,预测它周围的上下文词。
工作流程:
- 选择一个中心词: 在句子
"The quick brown fox jumps over the lazy dog"
中,我们选择中心词"fox"
。 - 定义窗口大小: 假设窗口大小为2。
- 生成训练样本: 对于中心词
"fox"
,其上下文词是["quick", "brown", "jumps", "over"]
。- 训练样本对:(
fox
->quick
), (fox
->brown
), (fox
->jumps
), (fox
->over
)
- 训练样本对:(
- 神经网络训练:
- 输入层: 中心词
"fox"
的独热编码向量。 - 隐藏层: 一个线性层,将输入的独热编码向量乘以一个巨大的权重矩阵
W
。这个矩阵的行就是我们想要学习的词向量!输入是"fox"
的独热编码,相当于从W
中选取了对应"fox"
的那一行作为隐藏层的输出。这个输出就是"fox"
的向量表示v_fox
。 - 输出层: 另一个线性层,将隐藏层的向量
v_fox
乘以另一个权重矩阵W'
。然后通过Softmax函数,计算出词典中每个词作为上下文词的概率。 - 损失函数: 模型的目标是让正确的上下文词(如
"quick"
)的概率最大化。通过反向传播,不断调整权重矩阵W
和W'
。最终,W
中的每一行(即每个词的向量)都会因为预测任务而被优化,使其能很好地代表该词,并与其他词建立联系。
训练完成后,我们只保留权重矩阵W
,它就是我们得到的词向量表。
- 输入层: 中心词
B. CBOW (连续词袋模型)
目标: 给定上下文词,预测中心词。
工作流程:
还是用上面的例子和窗口大小2。
- 选择上下文词: 对于中心词
"fox"
,其上下文词是["quick", "brown", "jumps", "over"]
。 - 生成训练样本: 输入是上下文词,输出是中心词。
- 训练样本对:(
["quick", "brown", "jumps", "over"]
->fox
)
- 训练样本对:(
- 神经网络训练:
- 输入层: 上下文词(
"quick"
,"brown"
,"jumps"
,"over"
)的独热编码向量。通常会将这些向量的平均值或拼接作为隐藏层的输入。 - 隐藏层: 同样是一个线性层,其权重矩阵
W
的列代表了词向量。输入的平均向量与W
相乘,得到隐藏层输出。 - 输出层: 另一个线性层和Softmax,预测中心词是
"fox"
的概率。
两种模型对比:
- 输入层: 上下文词(
- Skip-gram: 小型语料库上表现更好,因为它能更好地学习稀有词的表示。
- CBOW: 训练速度更快,对高频词的表示效果更好。
3.3 分布式表示的优势
- 捕捉语义关系: 这是最大的优势。由于向量空间中的距离和角度代表了语义相似度,模型可以学习到类似
vector('国王') - vector('男人') + vector('女人') ≈ vector('女王')
这样的线性关系。 - 降维与泛化: 从百万维降到几百维,极大地节省了空间和计算资源。
- 处理泛化: 在训练时从未见过的词,只要其上下文是模型见过的,模型也能在一定程度上理解其含义。
四、总结对比与演进图
4.1 总结对比
特性 | 独热编码 | 分布式表示 |
---|---|---|
核心思想 | 词是孤立的原子 | 词义由上下文决定 |
向量形式 | 高维、稀疏、离散 | 低维、稠密、连续 |
维度来源 | 词典大小 | 预设的超参数 (如300) |
语义信息 | 无,无法表达相似度 | 丰富,向量距离=语义相似度 |
存储/计算 | 极高,效率低 | 较低,效率高 |
对未登录词 | 无法处理 | 无法处理 (但FastText可以) |
4.2 演进流程
独热编码
(维度灾难, 语义鸿沟)
↓
词-文档矩阵
(TF-IDF等, 仍无法捕捉深层语义)
↓
分布式表示
(基于分布假说, 解决语义鸿沟)
↑
Word2Vec
(Skip-gram & CBOW, 实现分布式表示)
↑
GloVe
(全局矩阵分解 + 上下文窗口, 结合了全局统计和局部上下文)
↑
FastText
(引入子词信息, 解决了未登录词问题)
这个演进过程,就是NLP领域从“数豆子”(统计词频)到“理解世界”(捕捉语义)的伟大跨越。掌握了从独热编码到分布式表示的演进,你就理解了现代NLP的灵魂。