本文全称:基于 Embedding 的相似度检索(Word2Vec),核心目标是通过无监督学习来计算词的分布式表示
# Embedding 是什么
你有一堆单词(比如 猫 、 狗 、 汽车 ), 就是把这些词变成一串数字(比如 [-0.2, 0.5, 1.3...] ),这串数字能代表这个词的含义
- 意思相近的词(
猫和狗),它们的数字串也相似 - 就是生成这种数字串的工具之一
# One-Hot Representation
一种最简单的词向量方式是 编码,用一个很长的 串来表示, 编码可以采用稀疏方式存储,利用 给每个词分配一个编号,但是这种方法有以下缺点:
- 当词量不断增大时,会直接维度爆炸
- 任意两个词直接说孤立的
- 当维度特别大时, 会变得特别多,使得向量中,有用的信息特别短
# Distributed representation
基本想法是:通过训练将某种语言中的每一个词映射成一个固定长度的短向量(这个短是相对于 的长而言的),所有这些向量构成一个词向量空间,而每一个向量则可视为该空间中的一个点,在这个空间上引入 “距离”,就可以根据词之间的距离判断语法、语义上的相似性
# 统计语言模型
统计语言模型是用来计算一个句子的概率的模型,基于语料库构建
表示由 个词 按顺序构成的句子,联合概率为
利用贝叶斯公式可链式分解为
但是计算的量级是很恐怖的
若语料库词典大小为 ,那么长度为 的任意句子,理论上有 种可能,那么总参数数量为 , 是每个句子需要计算的数量
# N-gram 模型
根据大数定理,当语料库词典足够大时,可以近似看作
- :表示 连续出现的次数(当 很大时,计算 会变得很困难)
从贝叶斯公式的链式分解可以看出,一个词出现的概率与它前面的所有词都相关。如果假定,一个词出现的概率只与它前面固定数目的词相关呢?
这就是 模型的基本思想,认为
通过这样的简化,统计变得容易,模型参数量参考如下(假定词典大小为 ),模型的量级是 ,在实际应用中,一般取 的三元模型
| 模型参数量 | |
|---|---|
| 4 \times 10^ | |
| 8 \times 10^ | |
| 16 \times 10^ |
但是 模型还需要平滑化,因为
- 时,并不能认为
- 时,也不能认为
# 神经概率语言模型(NNLM)
对于统计语言模型的训练而言,利用最大似然,目标函数可以设为
- :语料库(),即所有文本数据的集合
- :语料库中的当前词()
- :词 的上下文,即 周边相关词的集合
我们的目的就是让这个值最大,上述是学习语言规律的描述,实际时,通常使用最大对数似然
通过训练,得到最优参数集 ,
相较 ,参数更小,可以直接通过计算来获取概率,而不需要通过事先保存概率值
神经网络分为三层
- 映射层:将 个单词映射为对应 的拼接(这一层就是
多层感知机的输入层) - 隐藏层:激活函数用 双曲正切函数
- 输出层:需要根据前 个单词预测下一个单词,所以是一个多分类器,用
整个模型的最大计算量集中在最后一层中,因为一般来说,词汇表很大,需要算每一个词的条件概率
# NNLM 的局限性
- 计算效率低(后续改进:负采样...)
- 上下文窗口长度固定为 个词,针对可变长上下文无法建模(后续改进:)
- 只有一个隐藏层,特征提取能力有限
# NNLM 相较 n-garm 的优势
因为 建模时,词语间的相似性可以通过词向量来体现,例如下面的s1 = Lxy is Study 在文章中出现过 次,而 s2 = Zmc is study 只出现一次
那么 计算的结果,,但 和 的唯一区别就是 Zmc 和 Lxy , 和 应该很接近才是,但 就不好处理这样的情况
# Word2Vec 的网络结构
是轻量级的神经网络,其模型仅包含输入层、隐藏层和输出层。根据输入输出的不同,主要包括
- 在知道 的情况下,预测
- 在知道 的情况下,预测 w_{t-2},w_{t-1},w_{t+1},w_
# CBOW
# Simple CBOW Model
输入一组上下文词,预测一个词。这个模型,表面看似是找到预测词,但模型的真正目的是找到
- 输入权重 :将 词映射为稠密向量
- 输出权重 :将向量映射回词的概率
- 输入层
- 输入中心词周围的前后 个词,每个词用 编码表示
- 投影层
- 权重矩阵 :输入层到隐藏层的权重矩阵,维度是 , 是词向量的维度,通常远小于
- 对上下文所有词向量求平均,得到一个 维向量作为隐藏层的输出
- 其中, 是上下文数量; 是上下文词的 向量
- 输出层
- 权重矩阵 :隐藏层到输出层的权重矩阵,维度为
- 将隐藏层输出 和 相乘,得到未归一化的得分向量
- 利用 将得分转换为概率分布
# CBOW Multi-Word Context Model
与 类似,只不过输入输出改为了多个上下文窗口,可以通过多个窗口联合优化,适用于大规模数据
# Skip-gram Model
- 输入层
- 输入中心词的 编码(假设维度是 ,记为 )
- 投影层
- 权重矩阵 :将 输入映射为 维词向量 ,维度
- 输出层
- 权重矩阵 :将词向量映射到上下文词的概率分布 ,维度
注意: 是词向量学习工具,并非序列预测模型,也就是说,最后输出的是 维向量,只是表示了上下文中,各词出现的概率,而并不会预测词的位置,顺序
# CBOW 和 SG 的对比
# 训练效率与计算成本
| 特性 | CBOW | Skip-gram |
|---|---|---|
| 计算速度 | 更快(一次预测一个词) | 较慢(一次预测多个词) |
| 内存占用 | 较低(隐藏层是上下文词的平均) | 较高(需处理多个上下文词输出) |
| 优化技巧 | 负采样、层次化 | 同 |
# 数据需求与词频敏感性
| 特性 | CBOW | Skip-gram |
|---|---|---|
| 低频词表现 | 较差(上下文平均稀释信息) | 更好(每个中心词独立训练) |
| 高频词偏好 | 容易过度平滑高频词 | 对高频词捕捉更细致 |
| 小数据集表现 | 更优(训练目标更简单) | 较差(需更多数据覆盖多样性) |
# 语义捕捉能力
| 特性 | CBOW | Skip-gram |
|---|---|---|
| 词向量质量 | 更平滑,适合通用语义 | 更精细,适合复杂语义关系 |
| 类比任务表现 | 一般(如 "king - man + woman") | 更优(显式建模中心词与上下文) |
| 长距离依赖 | 较弱(上下文平均削弱位置信息) | 稍强(独立预测每个上下文词) |
# 典型应用场景
| 场景 | CBOW | Skip-gram |
|---|---|---|
| 小规模数据 | ✅ 推荐(计算高效) | ❌ 需更多数据 |
| 高频词主导任务 | ✅ 如主题分类 | ❌ 可能过度拟合高频词 |
| 低频词或细粒度语义 | ❌ 效果一般 | ✅ 如医疗术语、罕见词挖掘 |
| 词类比任务 | ❌ 表现中等 | ✅ 如 "巴黎 - 法国 + 中国 ≈ 北京" |
# Hierarchical Softmax 与 负采样
# Hierarchical Softmax(层次化 Softmax)
主要用于解决大词汇表,如 时的计算瓶颈问题,核心思路是:
将词汇表中的所有词,组织成一棵哈夫曼树,预测路径转换为从根节点到目标叶子结点的路径概率运算。计算量从 降至
# 负采样
主要用于解决大词汇表下的计算瓶颈问题,核心思路是:
将多分类问题(从 个词中选 个正确词)转化为二分类问题(区分正样本和噪声样本)
- 传统 ,需要计算所有的概率,然后找出最高的几个;用了负采样之后,只要判断,某个词的得分是否高于 个随机词即可。时间复杂度取决于 的取值
低频词在负采样中,会表现较好