SGNS 是 Skip-Gram with Negative Sampling,即带负采样的跳字模型。它从语料中提取中心词与上下文词,再学习区分这些词对与噪声分布生成的词对。训练完成后,词向量可以作为其他任务的输入或初始化,这就是这里所说的预训练。它是 Mikolov 等人在 2013 年提出的 word2vec 方法组合之一。(Mikolov et al., 2013)
从一句话得到训练词对
看一条已经分词的教学短句。
城市 / 道路 / 连接 / 社区
以“道路”为中心,左右窗口各取一个词,会得到正词对“道路—城市”和“道路—连接”。它们的标签表示在所定义的窗口中观察到了共现,不表示两个词是同义词。
对“道路—城市”这个正词对,可以再抽取“咖啡”和“街区”作为两个噪声上下文,组成负词对。负样本由采样机制决定,不保证语义无关,也不保证从未与中心词共现。 “街区”与“道路”很相关,但仍可能被抽中。实际实现可能过滤部分碰撞,这不等于获得了语义真值。
样本标签自动来自语料窗口与噪声采样,因此不需要人工给每个词对标注语义关系。
模型保存什么
设词表有 个词,向量维度为 。SGNS 通常学习两张 的表。
- 保存中心词向量,词 对应向量 。
- 保存上下文向量,词 对应向量 。
同一个词以不同角色出现时,可以查询两张表中的不同参数。词对分数为点积 ;训练结束后通常取中心词表作为词表示,也可以评估其他组合,但应明确所用约定。(Levy & Goldberg, 2014; Mikolov et al., 2013)
Sigmoid 函数 把分数变为 0 到 1 之间的判别输出。这里判别的是训练词对的数据或噪声来源,不是完整词表上的 ,也不是“语义正确”的概率。
一个正词对加两个负词对,怎样计算损失
沿用上面的三个词对。下表中的分数由教学设定给出,没有实际训练模型。
| 词对 | 采样标签 | 点积分数 | 对正确采样标签分配的概率 | 负对数损失 |
|---|---|---|---|---|
| 道路—城市 | 数据,1 | 2 | 0.127 | |
| 道路—咖啡 | 噪声,0 | −1 | 0.313 | |
| 道路—街区 | 噪声,0 | −2 | 0.127 |
负词对使用 作为噪声标签的概率。三个损失相加约为 0.567;如果三个分数都为 0,总损失为 。所有对数均取自然对数。
这个比较说明模型更符合当前采样标签,不说明它已经更准确地完成了某个下游分类任务。损失与任务指标的关系可接着读 NLL 与交叉熵。
从算例写出训练目标
对一个正词对 ,抽取 个噪声上下文 ,最小化
这里 独立地按噪声分布 抽取,抽样可重复; 是每个正词对的负样本数。全语料目标对所有实际产生的正词对累加,并反复重采样负词。上式是采样损失;把负项替换为对 的期望,就得到常见的期望目标。(Mikolov et al., 2013)
点积分数的一阶导数也能说明更新方向。若采样标签为 ,二分类损失对分数的导数是 。单独看这一项,梯度下降会提高正词对的分数、降低负词对的分数;参数被大量词对共享,实际某个点积不会保证每一步都单调变化。
实际训练先提取窗口词对并采样噪声,再查询两张向量表、计算损失,用随机梯度下降(SGD)等优化方法更新涉及的参数行。不断处理新的词对并重复遍历语料,便完成预训练;它不需要每次都更新词表中的所有向量。
为什么计算量能减少
朴素完整 Softmax 每个正词对需要处理约 个输出分数;维度为 时,其相关计算量为 。SGNS 只计算当前正词对和 个负词对,相关更新约为 。这比较的是单个正词对,不是整个训练的时间或内存。
两张词表的存储仍约为 。分词、提取窗口、抽样、访存和训练轮数也会影响实际耗时。SGNS 的代价降低伴随目标改变,不能将它说成“同一个 Softmax 概率的无损快速算法”。层次 Softmax、NCE 和 InfoNCE 的区别见 负采样与相关目标。
采样和预处理决定学到什么
常见噪声分布对词频作平滑。
是用于构造采样器的词频。分母把权重归一化为概率; 次幂相对直接按词频抽样,降低了高频词的相对优势。原论文采用这一选择,但它不是负采样的数学定义。
| 选择 | 改变的训练信息 |
|---|---|
| 分词与词表 | 哪些对象有独立参数,短语和罕见词怎样表示 |
| 窗口与距离权重 | 什么算上下文,近邻与较远共现的贡献 |
| 高频词下采样 | 哪些语料共现被保留;与抽取负词是两个步骤 |
| 与 | 哪些对照出现得多,数据与噪声的相对权重 |
| 维度与训练轮数 | 表示容量与优化预算,不保证越大越好 |
原文曾报告小训练集使用 5–20 个负样本、大训练集可使用 2–5 个的经验。这是特定实验条件下的经验范围,不能直接作为所有任务的最优值。(Mikolov et al., 2013)
怎样使用预训练结果
训练先产生词向量,后续任务再决定怎样利用。例如把文本中的词向量汇总后交给分类器,或者用它初始化下游模型的输入表。可以冻结向量,也可以用任务训练集继续更新;应分别评价这两种设置。
评估前需要分清预训练语料、调参数据与最终测试数据,报告未登录词比例、语料领域、窗口、维度、噪声分布和负样本数。比较相似方法时,保持数据、预算与评价口径可比,而不是只看一张漂亮的二维图。
它学到的相似性有什么边界
SGNS 直接约束中心词与上下文向量的点积。相似上下文可能使词表示接近,但不能据此保证每个语义相近的词都互为近邻;反义词也可能共享上下文。
它通常为每个词学习静态表示。“吃苹果”和“苹果发布产品”中的“苹果”不会因为当前句子不同就自动换一个基础词向量。数据稀疏、领域变化和词表外的新词也需要单独处理;fastText提供了共享字符片段参数的一条路线。
至于“SGNS 等价于 PMI 矩阵分解”,应保留噪声分布、理想自由点积与低秩约束等条件。完整推导和反例见 PMI、SVD 与 SGNS。
返回 词向量与表示学习专题。需要比较其他机制时,继续读 GloVe 或 图随机游走嵌入。