1. 从零理解CBOW模型:词向量背后的数学原理
在自然语言处理领域,词向量技术就像是为词语构建的"数字身份证",让计算机能够理解词语之间的语义关系。Word2Vec作为最经典的词向量模型之一,其CBOW(连续词袋模型)架构通过上下文预测中心词的方式,将离散的词语映射到连续的向量空间。这种映射不是随机的,而是基于分布式假设:在相似上下文中出现的词语往往具有相似的语义。
1.1 CBOW模型的核心数学结构
CBOW模型的本质是一个三层的神经网络结构:
-
输入层:将上下文词语的one-hot编码作为输入。假设词汇表大小为V,每个词表示为V维的one-hot向量,其中只有对应词索引的位置为1,其余为0。
-
隐藏层(嵌入层):通过权重矩阵W(V×N维,N是词向量维度)将one-hot向量转换为稠密的词向量。数学上,这个过程实际上是简单的矩阵乘法:e = W^T x,其中x是one-hot向量。由于x只有一个位置为1,这个乘法实际上只是选取W矩阵的对应行。
-
输出层:另一个权重矩阵W'(N×V维)将隐藏层表示映射回词汇表空间,然后通过softmax函数计算每个词作为中心词的概率分布。
模型的训练目标是最小化预测分布与实际分布之间的交叉熵损失。通过反向传播算法,模型会不断调整两个权重矩阵W和W',最终得到的W矩阵就是我们需要的词向量集合。
1.2 上下文窗口与向量平均机制
CBOW处理上下文的一个关键操作是对多个上下文词向量进行平均。假设上下文窗口大小为C(左右各C个词),模型会:
- 将每个上下文词转换为对应的词向量e_i
- 计算这些向量的平均值:h = (1/C) * Σe_i
- 用这个平均向量h来预测中心词
这种平均操作具有以下特性:
- 对词序不敏感("猫 追 老鼠"和"老鼠 追 猫"会产生相同的h)
- 能够平滑掉不重要的上下文词的影响
- 计算简单高效,适合大规模语料训练
注意:在实际实现中,有时会用求和代替平均,这对模型效果影响不大,但会影响学习率的选择。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 数据预处理:构建训练样本的艺术
2.1 语料准备与词汇表构建
一个高质量的语料库是训练出好词向量的基础。我们使用的示例语料虽然很小,但已经包含了基本的语言结构:
python复制raw_text = """We are about to study the idea of a computational process.
Computational processes are abstract beings that inhabit computers.
As they evolve, processes manipulate other abstract things called data.
The evolution of a process is directed by a pattern of rules called a program.
People create programs to direct processes.
In effect,we conjure the spirits of the computer with our spells.""".split()
构建词汇表时需要注意:
- 统一大小写处理(是否区分"We"和"we")
- 是否保留标点符号(示例中去掉了标点)
- 如何处理数字、特殊符号等
python复制# 构建词汇表与映射关系
vocab = set(raw_text) # 去重得到词汇表
vocab_size = len(vocab)
word_to_idx = {word: i for i, word in enumerate(vocab)} # 词→索引
idx_to_word = {i: word for i, word in enumerate(vocab)} # 索引→词
2.2 训练样本生成策略
生成(上下文, 中心词)对时,需要考虑几个关键参数:
-
上下文窗口大小:决定使用多少个相邻词来预测中心词。窗口太小会丢失信息,太大会引入噪声。通常从2-5开始尝试。
-
滑动步长:如何在文本中移动窗口。示例中是逐词滑动,这会产生大量重叠样本,适合小语料。
-
边界处理:如何处理文本开头和结尾处的词。示例中直接跳过无法形成完整窗口的位置。
python复制CONTEXT_SIZE
