本文全称:基于 Embedding 的相似度检索(Word2Vec),核心目标是通过无监督学习来计算词的分布式表示

# Embedding 是什么

你有一堆单词(比如 汽车 ),EmbeddingEmbedding 就是把这些词变成一串数字(比如 [-0.2, 0.5, 1.3...] ),这串数字能代表这个词的含义

  • 意思相近的词( ),它们的数字串也相似
  • Word2VecWord2Vec 就是生成这种数字串的工具之一

# One-Hot Representation

一种最简单的词向量方式是 OneHotOne-Hot 编码,用一个很长的 0101 串来表示,OneHotOne-Hot 编码可以采用稀疏方式存储,利用 HashHash 给每个词分配一个编号,但是这种方法有以下缺点:

  • 当词量不断增大时,会直接维度爆炸
  • 任意两个词直接说孤立的
  • 当维度特别大时,00 会变得特别多,使得向量中,有用的信息特别短

# Distributed representation

基本想法是:通过训练将某种语言中的每一个词映射成一个固定长度向量(这个是相对于 OneHotReoresentationOne-Hot~Reoresentation而言的),所有这些向量构成一个词向量空间,而每一个向量则可视为该空间中的一个点,在这个空间上引入 “距离”,就可以根据词之间的距离判断语法、语义上的相似性

# 统计语言模型

统计语言模型是用来计算一个句子的概率的模型,基于语料库构建
W=(w1,...,wT)W=(w_1,...,w_T) 表示由 TT 个词 w1,...,wTw_1,...,w_T 按顺序构成的句子,联合概率为 p(W)=p(w1,...,wT)p(W) = p(w_1,...,w_T)
利用贝叶斯公式可链式分解为

p(W)=p(w1)p(w2W1)p(wTw1,...,WT1)p(W) = p(w_1)·p(w_2|W_1)···p(w_T | w_1,...,W_{T-1})

但是计算的量级是很恐怖的
若语料库词典大小为 NN,那么长度为 TT 的任意句子,理论上有 NTN^T 种可能,那么总参数数量为 kNTk·N^Tkk 是每个句子需要计算的数量

# N-gram 模型

根据大数定理,当语料库词典足够大时,可以近似看作

p(wkw1,...,wk1)count(w1,...,wk)count(w1,...,wk1)p(w_k | w_1,...,w_{k-1}) \approx \frac{count(w_1,...,w_k)}{count(w_1,...,w_{k-1})}

  • count(w1,...,wk)count(w_1, ..., w_k):表示 w1wkw_1-···-w_k 连续出现的次数(当 kk 很大时,计算 countcount 会变得很困难)

从贝叶斯公式的链式分解可以看出,一个词出现的概率与它前面的所有词都相关。如果假定,一个词出现的概率只与它前面固定数目的词相关呢?
这就是 NgramN-gram 模型的基本思想,认为

p(wkw1,...,wk1)p(wkwkn+1,...,wk1)p(w_k | w_1,...,w_{k-1}) \approx p(w_k | w_{k-n+1},...,w_{k-1})

通过这样的简化,统计变得容易,模型参数量参考如下(假定词典大小为 N=2×105N=2 \times 10^5),模型的量级是 O(Nn)O(N^{n}),在实际应用中,一般取 n=3n = 3 的三元模型

nn模型参数量
112×1052 \times 10^5
224 \times 10^
338 \times 10^
4416 \times 10^

但是 ngramn-gram 模型还需要平滑化,因为

  • count(wkn+1,...,wk)=0count(w_{k-n+1},...,w_k)=0 时,并不能认为 p(wkw1,...,wk1)=0p(w_k | w_1,...,w_{k-1})=0
  • count(wkn+1,...,wk)=count(wkn+1,...,wk1)count(w_{k-n+1},...,w_k)=count(w_{k-n+1},...,w_{k-1}) 时,也不能认为 p(wkw1,...,wk1)=1p(w_k | w_1,...,w_{k-1})=1

# 神经概率语言模型(NNLM)

对于统计语言模型的训练而言,利用最大似然,目标函数可以设为

wCp(wContext(w))\prod_{w \in C} p(w \mid Context(w))

  • CC:语料库(CorpusCorpus),即所有文本数据的集合
  • ww:语料库中的当前词(wordword
  • Context(w)Context(w):词 ww 的上下文,即 ww 周边相关词的集合

我们的目的就是让这个值最大,上述是学习语言规律的描述,实际时,通常使用最大对数似然

L=wClog(p(wContext(w)))L=\sum_{w \in C} \log(p(w \mid Context(w)))

通过训练,得到最优参数集 θ\theta^{*}p(wContext(w))=F(w,Context(w),θ)p(w \mid Context(w)) = F(w, Context(w), \theta^{*})
相较 ngarmn-garm,参数更小,可以直接通过计算来获取概率,而不需要通过事先保存概率值


神经网络分为三层

  1. 映射层:将 nn 个单词映射为对应 wordembeddingsword~embeddings 的拼接(这一层就是 MLPMLP 多层感知机 的输入层)
  2. 隐藏层:激活函数用 tanhtanh 双曲正切函数
  3. 输出层:需要根据前 nn 个单词预测下一个单词,所以是一个多分类器,用 SoftmaxSoftmax

整个模型的最大计算量集中在最后一层中,因为一般来说,词汇表很大,需要算每一个词的条件概率

# NNLM 的局限性

  • SoftmaxSoftmax 计算效率低(后续改进:负采样...)
  • 上下文窗口长度固定为 n1n-1 个词,针对可变长上下文无法建模(后续改进:RNN/LSTM/TransformerRNN/LSTM/Transformer
  • 只有一个隐藏层,特征提取能力有限

# NNLM 相较 n-garm 的优势

因为 NNLMNNLM 建模时,词语间的相似性可以通过词向量来体现,例如下面的
s1 = Lxy is Study 在文章中出现过 1000000010000000 次,而 s2 = Zmc is study 只出现一次
那么 ngramn-gram 计算的结果,p(s1)>>p(s2)p(s_1) >> p(s_2),但 s1s1s2s_2 的唯一区别就是 ZmcLxyp(s1)p(s_1)p(s2)p(s_2) 应该很接近才是,但 ngarmn-garm 就不好处理这样的情况

# Word2Vec 的网络结构

Word2VecWord2Vec 是轻量级的神经网络,其模型仅包含输入层、隐藏层和输出层。根据输入输出的不同,主要包括

  • CBOWCBOW
    • 在知道 wt2,wt1,wt+1,wt+2w_{t-2},w_{t-1},w_{t+1},w_{t+2} 的情况下,预测 wtw_t
  • SkipgramSkip-gram
    • 在知道 wtw_t 的情况下,预测 w_{t-2},w_{t-1},w_{t+1},w_

# CBOW

# Simple CBOW Model

输入一组上下文词,预测一个词。这个模型,表面看似是找到预测词,但模型的真正目的是找到

  • 输入权重 WinW_{in}:将 OnehotOne-hot 词映射为稠密向量
  • 输出权重 WoutW_{out}:将向量映射回词的概率

  • 输入层
    • 输入中心词周围的前后 nn 个词,每个词用 OneHotOne-Hot 编码表示
  • 投影层
    • 权重矩阵 WinW_{in}:输入层到隐藏层的权重矩阵,维度是 V×DV \times DDD 是词向量的维度,通常远小于 VV
    • 对上下文所有词向量求平均,得到一个 DD 维向量作为隐藏层的输出 h=1Cc=1CWinTxch = \frac{1}{C}\sum\limits_{c = 1}^{C}W^{T}_{in}·x_c
      • 其中,CC 是上下文数量;xcx_c 是上下文词的 OneHotOne-Hot 向量
  • 输出层
    • 权重矩阵 WoutW_{out}:隐藏层到输出层的权重矩阵,维度为 D×VD \times V
    • 将隐藏层输出 hhWoutW_{out} 相乘,得到未归一化的得分向量
    • 利用 SoftmaxSoftmax 将得分转换为概率分布

# CBOW Multi-Word Context Model

SimpleCBOWModelSimple~CBOW~Model 类似,只不过输入输出改为了多个上下文窗口,可以通过多个窗口联合优化,适用于大规模数据

# Skip-gram Model

  • 输入层
    • 输入中心词的 OneHotOne-Hot 编码(假设维度是 VV,记为 xx
  • 投影层
    • 权重矩阵 WinW_{in}:将 OneHotOne-Hot 输入映射为 DD词向量 v=WinTxv = W^{T}_{in} · x,维度 V×DV \times D
  • 输出层
    • 权重矩阵 WoutW_{out}:将词向量映射到上下文词的概率分布 res=Woutvres = W_{out} · v,维度 D×VD \times V

注意SkipgramModelSkip-gram~Model词向量学习工具,并非序列预测模型,也就是说,最后输出的是 VV 维向量,只是表示了上下文中,各词出现的概率,而并不会预测词的位置,顺序

# CBOW 和 SG 的对比

# 训练效率与计算成本

特性CBOWSkip-gram
计算速度更快(一次预测一个词)较慢(一次预测多个词)
内存占用较低(隐藏层是上下文词的平均)较高(需处理多个上下文词输出)
优化技巧负采样、层次化 SoftmaxSoftmaxCBOWCBOW

# 数据需求与词频敏感性

特性CBOWSkip-gram
低频词表现较差(上下文平均稀释信息)更好(每个中心词独立训练)
高频词偏好容易过度平滑高频词对高频词捕捉更细致
小数据集表现更优(训练目标更简单)较差(需更多数据覆盖多样性)

# 语义捕捉能力

特性CBOWSkip-gram
词向量质量更平滑,适合通用语义更精细,适合复杂语义关系
类比任务表现一般(如 "king - man + woman")更优(显式建模中心词与上下文)
长距离依赖较弱(上下文平均削弱位置信息)稍强(独立预测每个上下文词)

# 典型应用场景

场景CBOWSkip-gram
小规模数据✅ 推荐(计算高效)❌ 需更多数据
高频词主导任务✅ 如主题分类❌ 可能过度拟合高频词
低频词或细粒度语义❌ 效果一般✅ 如医疗术语、罕见词挖掘
词类比任务❌ 表现中等✅ 如 "巴黎 - 法国 + 中国 ≈ 北京"

# Hierarchical Softmax 与 负采样

# Hierarchical Softmax(层次化 Softmax)

主要用于解决大词汇表,如 V=105V = 10^5 时的计算瓶颈问题,核心思路是:
将词汇表中的所有词,组织成一棵哈夫曼树,预测路径转换为从根节点到目标叶子结点的路径概率运算。计算量从 O(V)O(V) 降至 O(logV)O(log V)

# 负采样

主要用于解决大词汇表下的计算瓶颈问题,核心思路是:
将多分类问题(从 VV 个词中选 11 个正确词)转化为二分类问题(区分正样本和噪声样本)

  • 传统 SoftmaxSoftmax,需要计算所有的概率,然后找出最高的几个;用了负采样之后,只要判断,某个词的得分是否高于 kk 个随机词即可。时间复杂度取决于 kk 的取值

低频词在负采样中,会表现较好