【问题标题】:How to interpret the P numbers that fairseq generate produces?如何解释 fairseq 生成的 P 数?
【发布时间】:2020-07-01 01:53:57
【问题描述】:

使用 fairseq-generate.py 和转换器架构,每次翻译都会产生一个像这样的部分:

Why is it rare to discover new marine mammal species?
S-0     Why is it rare to discover new marine mam@@ mal species ?
H-0     -0.0643349438905716     Pourquoi est-il rare de découvrir de nouvelles espèces de mammifères marins?
P-0     -0.0763 -0.1849 -0.0956 -0.0946 -0.0735 -0.1150 -0.1301 -0.0042 -0.0321 -0.0171 -0.0052 -0.0062 -0.0015

this explanation:

H 是假设以及平均对数似然; P 是每个标记位置的位置分数,包括句尾标记

我想知道是否可以合理地说 P 行中的低(绝对)数字意味着对该特定单词的更高信心?例如。 “Pourquoi”的-0.07是否意味着它比“est-il”的(-0.1849)更快乐?末尾的低 -0.0015 意味着它确实有信心句子应该在那里结束。

背景:我正在努力解决的问题是,我是否可以使用 H 数,或者以某种方式使用单个 P 数,来获得其翻译的置信度。我一直在根据 H 编号分析一些翻译,并没有注意到它与我对翻译质量的主观看法之间有太多的对应关系。但是我有一对我认为它特别差的地方-它错过了一些关键信息-最终的P值相对较高-0.6099-0.3091(最终的P值是-0.11左右他们中的大多数人。)

【问题讨论】:

    标签: python pytorch transformer


    【解决方案1】:

    问:我想知道是否可以合理地说 P 行中的低(绝对)数字意味着对该特定单词的更高置信度?

    • 是的。正如文档所说,“P 是每个标记位置的位置分数”。分数实际上是对数概率,因此越高(即绝对数越低)越“自信”。源代码可能不那么容易理解,但是分数是由SequenceScorer 生成的,在那里你可以看到分数被归一化(如果你使用single model,则包括logensemble)。而且,在打印分数的时候,他们convert them from base e to 2

      print('P-{}\t{}'.format(
          sample_id,
          ' '.join(map(
              lambda x: '{:.4f}'.format(x),
              # convert from base e to base 2
              hypo['positional_scores'].div_(math.log(2)).tolist(),
      ))
      

    问:我正在尝试解决的问题是,我是否可以使用 H 数,或者以某种方式使用单个 P 数,来获得其翻译的置信度度量。

    • 原来H值只是P值的平均值,如你所见here

      score_i = avg_probs_i.sum() / tgt_len
      

      还有converted to base 2。您可以在您的示例中进行检查:

      import numpy as np
      print(np.mean([-0.0763,-0.1849 ,-0.0956 ,-0.0946 ,-0.0735 ,-0.1150 ,-0.1301 ,-0.0042 ,-0.0321 ,-0.0171 ,-0.0052 ,-0.0062 ,-0.0015]))
      # >>> -0.06433076923076922
      

      另一个经常用于评估语言模型性能的度量是Perplexity。好在可以根据 P 值轻松计算出困惑度,如 fairseq 存储库的Language Model example 所示:

      # Compute perplexity for a sequence
      en_lm.score('Barack Obama is coming to Sydney and New Zealand')['positional_scores'].mean().neg().exp()
      # tensor(15.1474)
      

      我不是 NLP 方面的专家,所以我不能真正告诉你在你的情况下应该使用哪一个。

    【讨论】:

    • 谢谢 - 非常感谢源代码的链接。我所说的“(绝对)数字”是指“忽略减号,只看大小”;所以我认为我们在那里说的是同一件事。
    • @DarrenCook 当然。也许我读得太快了。对不起。我相应地更新了答案。
    猜你喜欢
    • 2014-11-08
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 2017-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多