真实面经题目 · 原创解析
Word2Vec 负采样为什么能加速训练,训练目标如何理解?
这道题考察 Word2Vec 训练目标的本质。负采样不是简单少算几个词,而是把 full softmax 的大词表多分类问题改成真实共现与噪声共现的二分类学习,每个正样本只更新少量负例,从而把复杂度从 O(|V|) 降到 O(K),同时学到可用于相似性和共现关系的 embedding。
真实面经题目 · 原创解析
这道题考察 Word2Vec 训练目标的本质。负采样不是简单少算几个词,而是把 full softmax 的大词表多分类问题改成真实共现与噪声共现的二分类学习,每个正样本只更新少量负例,从而把复杂度从 O(|V|) 降到 O(K),同时学到可用于相似性和共现关系的 embedding。
Skip-gram 原目标是给定中心词预测上下文词,如果用 full softmax,每次都要对整个词表归一化,词表大时很慢。负采样把它改成二分类:对真实共现的 (w, c),希望 v_w 和 v_c 内积大;再采 K 个噪声词 n,希望 v_w 和 v_n 内积小。典型目标是 log sigmoid(v_c·v_w) + sum log sigmoid(-v_n·v_w)。这样每个样本只更新 1 个正例和 K 个负例,K 远小于词表大小。它学到的不是校准的 P(context|word),而是区分真实共现和随机噪声的向量空间,内积可理解为共现强度的相对信号。
Skip-gram 用中心词预测上下文。full softmax 需要计算所有词的得分和归一化分母,复杂度和词表大小相关。百万级词表或 item 表下,每个样本更新全词表不可接受。
负采样为一个真实共现 pair 构造 K 个噪声 pair,把问题改成判断 pair 是否来自真实语料。正例希望 sigmoid(v_c·v_w) 接近 1,负例希望 sigmoid(v_n·v_w) 接近 0。
每次只访问中心词、一个上下文词和 K 个负样本的向量,不需要遍历整个词表。训练复杂度从 O(|V|) 变成 O(K),K 常见为 5 到 20 量级,取决于数据规模和质量要求。
负样本通常不是均匀抽样,而是按 unigram 频率的 3/4 次方采样。这样既不会让高频词完全支配训练,也不会让低频词过度出现。高频词还常配合 subsampling 降低低信息 token 的影响。
负采样更像噪声对比学习,学到的是真实共现和随机共现的区分边界。在一定假设下,向量内积和 PMI 有关系,但不能把内积直接当成标准 softmax 概率。
在推荐场景中,可以把 item 当词、用户行为序列当句子。窗口、行为类型、时间衰减、负样本分布和时间切分决定 embedding 学到的是相似、互补还是热门偏置。
hierarchical softmax 用树结构把 full softmax 降到路径上的 O(log |V|),更接近概率建模;负采样是二分类噪声对比,每步 O(K),实现简单,常用于学习高质量 embedding。
它降低极高频词的支配性,同时保留一定高频词概率。均匀采样会过多采到低频无关词,原始词频采样又会让高频词出现过多。3/4 是经验上较稳的折中。
窗口太小只学局部相似,窗口太大容易把同一用户长期但无关的兴趣拉近。通常按 session、时间间隔和行为类型设窗口,并通过 Recall@K、近邻解释和线上 A/B 调参。
统计每个 item 出现在别人 TopK 近邻里的次数、embedding norm、热门集中度和长尾覆盖。如果少数热门 item 成为大量近邻,要调采样、subsampling、去热门或加入多样性约束。