You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

word2vec词汇表中[UNK]置于首位的原因及非高频场景下的位置调整与负采样问题咨询

这问题问到点子上了,我来给你捋清楚这几个关键点:

为什么[UNK]常被放在word2vec词汇表的首位?

这更多是工程实现上的约定俗成,而非严格绑定词频的规则:

  • 一是方便统一处理未知词:多数NLP框架会默认把索引0(或1,当存在[PAD]这类特殊token时)预留出来给特殊标识,[UNK]作为最常用的未知词标识,自然就占了这个位置。这样代码里可以快速通过token_id == 0判断是否是未知词,不用额外做查表逻辑。
  • 二是历史传承的习惯:早期word2vec原始实现并没有强制要求,但后续的NLP工具为了统一特殊token的处理逻辑,逐渐形成了把[UNK]、[PAD]这类特殊token放在词汇表最前面的惯例,不管它们的实际词频高低。
若[UNK]并非最高频词,要不要按实际词频调整它的位置?

得分具体场景来看:

  • 如果你的训练逻辑直接依赖词汇表索引顺序来做采样或权重计算(比如你提到的tf.random.log_uniform_candidate_sampler),那确实需要调整。因为这个函数的采样逻辑是索引越小,被选中的概率越高——要是[UNK]实际词频很低却占了索引0,就会被过度采样成负样本,干扰模型对真实高频词汇的学习。
  • 如果你的训练流程完全基于自定义的词频权重来计算采样概率(而非依赖索引顺序),那[UNK]的位置就无所谓,保持首位的惯例反而更利于代码维护,毕竟大家都默认这个位置是特殊token。
针对TensorFlow word2vec教程里的负采样问题,该怎么处理?

如果发现[UNK]被过度采样且实际词频不高,可以试试这几个办法:

  • 重构词汇表:把[UNK](以及[PAD]这类特殊token)移到词汇表末尾,然后把真实词汇按词频从高到低排列在前面。这样索引小的都是真正的高频词,负采样时就会优先采样这些符合预期的词汇。
  • 自定义采样权重:不使用tf.random.log_uniform_candidate_sampler默认的索引采样逻辑,而是传入基于实际词频计算的权重参数。这样不管[UNK]在哪个位置,采样概率都由它的真实词频决定,不会被索引位置干扰。
  • 特殊处理[UNK]:如果不想调整词汇表顺序,可以在负采样时手动调低[UNK]的采样概率,或者直接把它排除在负样本候选之外(不过这得看任务需求,有些场景下[UNK]作为负样本也是合理的)。

内容的提问来源于stack exchange,提问作者Ricardo

火山引擎 最新活动