本套笔记首先介绍了用于训练词向量的GloVe模型。接着,通过探讨词向量(也可称为词嵌入)的内在评估和外在评估方法,进一步拓展了相关讨论。在后续内容中,我们会以词语类比为例,介绍内在评估技术及其在优化词嵌入方法中的应用。然后,我们将讨论外在任务中模型权重/参数和词向量的训练。最后,我们阐述了人工神经网络作为一类适用于自然语言处理任务的模型的优势。

GloVe

到目前为止,我们已经研究了两类主要的词嵌入获取方法。第一类是基于计数的,依赖于矩阵分解(例如潜在语义分析、高维联想记忆)。虽然这些方法能有效利用全局统计信息,但它们主要用于捕捉词语相似度,在词语类比等任务上表现不佳,这表明其向量空间结构并非最优。另一类方法是基于浅层窗口的(例如Skipgram模型),它们通过在局部上下文窗口中进行预测来学习词嵌入。这些模型能够捕捉除词语相似度之外的复杂语言模式,但无法利用全局共现统计信息。

相比之下,GloVe由一个加权最小二乘模型构成,该模型以全局词-词共现计数为训练数据,因此能高效利用统计信息。(具有共现矩阵的优势) 此模型生成的词向量空间具有有意义的子结构。(具有浅层窗口的优势)。 它在词语类比任务上展现出最先进的性能,并且在多个词语相似度任务上优于其他现有方法。

Co-occurrence Matrix

Least Squares Objective

Skip-gram 模型通过softmax 函数计算 “词j出现在词i语境中” 的概率,公式为:

Q_{i j}=\frac{exp \left(\vec{u}_{j}^{T} \vec{v}_{i}\right)}{\sum_{w=1}^{W} exp \left(\vec{u}_{w}^{T} \vec{v}_{i}\right)}

其中,uj和vi分别是词j和词i的向量,分母是对整个词汇表(大小为W)的求和,目的是将概率归一化到 [0,1] 区间内1。

在训练层面,Skip-gram 采用在线随机训练方式,但其隐含的全局交叉熵损失可表示为:

J=-\sum_{i \in corpus } \sum_{j \in context(i)} log Q_{i j}

该公式的含义是,对语料库中每个中心词i及其语境中的每个词j,计算logQij并取负求和 —— 损失越小,说明模型预测的 “词j在词i语境中出现” 的概率越接近真实情况

由于同一对词(i,j)可能在语料库中多次共现,直接遍历每个共现实例计算损失效率较低。因此,可利用共现矩阵X(Xi,j表示词i和词j的共现频率)将损失改写为按 “词对” 分组的形式:

J=-\sum_{i=1}^{W} \sum_{j=1}^{W} X_{i j} log Q_{i j}

这种改写通过 “共现频率Xi,j加权”,避免了对重复共现实例的冗余计算,提升了效率

交叉熵损失存在一个关键缺陷:它要求概率分布Q必须被正确归一化(即分母需对整个词汇表求和)。而当词汇表规模极大(如百万级)时,这个 “全词汇表求和” 的计算成本极高,成为模型训练的瓶颈。

为解决这一问题,GloVe 放弃了交叉熵损失,转而采用最小二乘目标函数,并直接舍弃了分布P(真实共现分布)和Q(模型预测分布)中的归一化因子。此时的目标函数为:

\hat{J}=\sum_{i=1}^{W} \sum_{j=1}^{W} X_{i}\left(\hat{P}_{i j}-\hat{Q}_{i j}\right)^{2}
\hat{P}_{ij} = X_{ij}  (未归一化的真实共现 “计数”,而非概率);
\hat{Q}_{ij} = exp(\vec{u}_j^T \vec{v}_i ) (未归一化的模型预测值,对应 Skip-gram 中Q_{ij}的分子);
X_i = \sum_k X_{ik}(中心词i的总语境词数,作为加权因子)。

该目标函数的核心逻辑是:通过最小化 “未归一化的真实共现计数\hatPi.j” 与 “未归一化的模型预测值\hatQi,j” 的平方差,来优化词向量 —— 平方差越小,模型预测与真实共现情况越吻合.

上述最小二乘目标函数虽解决了计算效率问题,但新的问题随之出现:Xi,j(共现频率)往往取值极大(如高频词对可能共现数万次),会导致优化过程中梯度不稳定,难以收敛。

为缓解这一问题,GloVe 将 “真实值与预测值的平方差” 改为 “两者对数的平方差”,目标函数调整为:

\begin{aligned} \hat{J} & =\sum_{i=1}^{W} \sum_{j=1}^{W} X_{i}\left(log (\hat{P})_{i j}-log \left(\hat{Q}_{i j}\right)\right)^{2} \\ & =\sum_{i=1}^{W} \sum_{j=1}^{W} X_{i}\left(\vec{u}_{j}^{T} \vec{v}_{i}-log X_{i j}\right)^{2} \end{aligned}

这一修改的本质是 “压缩数值范围”:对数运算能将极大的Xi,j转化为更平缓的数值,避免极端值对优化的干扰;

此外,初始目标函数中使用的加权因子Xi(中心词i的总语境词数)并非最优选择 —— 它仅与中心词i相关,未考虑语境词j的特性。因此,GloVe 引入了更通用的加权函数f(Xi,j),允许权重同时依赖于中心词i和语境词j(通过共现频率Xi,j体现),最终目标函数为:

\hat{J}=\sum_{i=1}^{W} \sum_{j=1}^{W} f\left(X_{i j}\right)\left(\vec{u}_{j}^{T} \vec{v}_{i}-log X_{i j}\right)^{2}

加权函数f(Xi,j)的核心作用是:对低频共现词对(Xi,j小)赋予较低权重(避免噪声干扰),对高频共现词对(Xi,j大)赋予合适权重(避免过度影响),从而进一步提升模型的稳定性和性能

总之,GloVe模型通过仅在词语共现矩阵中的非零元素上进行训练,有效地利用了全局统计信息,并生成了具有有意义子结构的向量空间。在相同的语料库、词汇表、窗口大小和训练时间下,它在词语类比任务上的表现始终优于word2vec。它能更快地取得更好的结果,而且无论速度如何,都能获得最佳结果。

歧义处理

人们可能会好奇,我们如何处理在自然语言中想为同一个词的不同用法赋予不同向量的情况。例如,“run”既可以作名词也可以作动词,其用法和释义会根据语境而有所不同。《Improving Word Representations Via Global Context And Multi-ple Word Prototypes》(Huang等人,2012)阐述了在自然语言处理中如何应对这类情况。该方法的核心如下:

1. 收集该单词所有出现处的固定大小上下文窗口(例如,前后各5个词)

2. 每个语境都由语境词向量的加权平均值表示(使用逆文档频率加权)

3. 应用球面k均值算法对这些上下文表示进行聚类。

3. 应用球面k均值算法对这些上下文表示进行聚类。

窗口分类

该部分针对 “单一词向量无法解决词汇歧义” 的问题,提出 “结合语境窗口的分类思路”,核心是利用上下文信息优化词向量的语义表达。

·

外在任务训练

多数 NLP 外在任务可统一表述为分类任务,这是因为任务目标本质是 “为输入分配预设标签”,具体包含以下关键点:

  1. 任务示例
    • 情感分类:输入一句话(如 “这部电影很精彩”),输出 “积极”“消极” 或 “中性” 的情感标签;
    • 命名实体识别(NER):输入含中心词的语境(如 “Jim bought 300 shares of Acme Corp. in 2006”),为中心词分配 “人物(Person)”“机构(Organization)”“时间(Time)” 等实体标签,最终输出标注结果 “[Jim] Person bought 300 shares of [Acme Corp.] Organization in [2006] Time”。

核心思想: 在 NLP 外在任务中,输入词向量本身也可被重新训练

 词向量再训练:

何时该调整预训练词向量?

  1. 预训练词向量的定位:用于外在任务的词向量,最初是在内在任务(如词类比)上优化得到的预训练结果。这些预训练向量通常已具备基础语义关联(如 “国王” 与 “女王” 接近),可作为外在任务的 “初始良好特征”,多数情况下能直接满足任务需求。
  2. 再训练的必要性与风险
    • 必要性:若外在任务的语义需求与内在任务存在差异(如情感分类需突出 “积极 / 消极” 关联,而词类比更关注 “词性 / 语义类比”),通过外在任务数据再训练词向量,可让向量更贴合当前任务的语义偏好,从而提升性能;
    • 核心风险:再训练的前提是外在任务训练集足够大,能覆盖词汇表中多数词汇。这是因为 Word2Vec、GloVe 等模型的核心特性是 “语义相关词在向量空间中聚集”(如 “Telly”“TV”“Television” 因均表示 “电视” 而靠近)。若训练集过小,仅能覆盖少数词汇,再训练时这些词汇的向量会在空间中偏移,破坏原有语义关联 —— 例如,预训练时 “Telly”“TV”“Television” 均能正确分类,但再训练仅覆盖前两者后,未被覆盖的 “Television” 会因向量空间偏移而误分类(如图 6、图 7 所示)。
  3. 结论
    • 训练集大 → 可再训练,大概率提升性能;
    • 训练集小 → 禁止再训练,否则会导致性能下降。

softmax分类

将word vector 转化为概率

Softmax 函数的核心作用是把 “词向量与模型权重的内积结果” 转化为合法的类别概率(即概率值在 [0,1] 区间,且所有类别概率之和为 1),公式为:

p(y_j = 1|x) = \frac{exp(W_j \cdot x)}{\sum_{c=1}^{C} exp(W_c \cdot x)}

交叉熵损失函数:量化模型预测误差

损失函数的目的是衡量 “模型预测结果” 与 “真实标签” 的差异,交叉熵是分类任务中适配 Softmax 输出的经典选择,具体推导与简化过程如下:

单个训练样本的损失
原始交叉熵损失公式为:

-\sum_{j=1}^{C} y_j \cdot log\left(p(y_j = 1|x)\right) = -\sum_{j=1}^{C} y_j \cdot log\left(\frac{exp(W_j \cdot x)}{\sum_{c=1}^{C} exp(W_c \cdot x)}\right)

其中yj是真实标签的C维独热向量(仅 “真实类别k” 对应的yk=1,其余类别yj=0)。因此,上述求和式中仅有 “真实类别k” 的项非零,其余C-1项均为 0,损失可简化为:

-\text{log}\left(\frac{exp(W_k \cdot x)}{\sum_{c=1}^{C} exp(W_c \cdot x)}\right)

该式直观含义为:若模型对 “真实类别k” 的预测概率越高(分子大、分母相对小),log值越接近 0,损失越小,模型预测越准确;反之则损失越大。

数据集的总损失

将单个样本损失扩展到含N个样本的数据集,总损失为所有样本损失之和:

-\sum_{i=1}^{N} \text{log}\left(\frac{exp(W_{k(i)} \cdot x^{(i)})}{\sum_{c=1}^{C} exp(W_c \cdot x^{(i)})}\right)

其中k(i)是 “第i个样本x(i)对应的真实类别索引”,总损失越小,模型在训练集上的整体预测误差越小。

正则化

为降低过拟合风险,引入L2 正则化项,其核心思想基于贝叶斯信念:“模型参数应尽可能小(接近 0)”,避免参数因过度适配训练数据而取值极端。最终的总成本函数为:

-\sum_{i=1}^{N} \text{log}\left(\frac{exp(W_{k(i)} \cdot x^{(i)})}{\sum_{c=1}^{C} exp(W_c \cdot x^{(i)})}\right) + \lambda \sum_{k=1}^{C \cdot d + |V| \cdot d} \theta_k^2

一个努力学习的憨憨
最后更新于 2025-10-01