在 OpenNMT-py 的翻译过程中获得 alignment/attention

Getting alignment/attention during translation in OpenNMT-py

有谁知道在 Opennmt-py 中翻译时如何获得对齐权重?通常唯一的输出是结果句子,我试图为注意力权重找到一个调试标志或类似的东西。到目前为止,我一直没有成功。

您可以获得注意力矩阵。请注意,它与 alignment 不同,后者是统计(非神经)机器翻译中的一个术语。

a thread on github 正在讨论。这是讨论的一个片段。当您从模式中获取翻译时,注意事项在 attn 字段中。

import onmt
import onmt.io
import onmt.translate
import onmt.ModelConstructor
from collections import namedtuple

# Load the model.
Opt = namedtuple('Opt', ['model', 'data_type', 'reuse_copy_attn', "gpu"])

opt = Opt("PATH_TO_SAVED_MODEL", "text", False, 0)
fields, model, model_opt =  onmt.ModelConstructor.load_test_model(
    opt, {"reuse_copy_attn" : False})

# Test data
data = onmt.io.build_dataset(
    fields, "text", "PATH_TO_DATA", None, use_filter_pred=False)
data_iter = onmt.io.OrderedIterator(
    dataset=data, device=0,
    batch_size=1, train=False, sort=False,
    sort_within_batch=True, shuffle=False)

# Translator
translator = onmt.translate.Translator(
    model, fields, beam_size=5, n_best=1,
    global_scorer=None, cuda=True)

builder = onmt.translate.TranslationBuilder(
   data, translator.fields, 1, False, None)

batch = next(data_iter)
batch_data = translator.translate_batch(batch, data)
translations = builder.from_batch(batch_data)
translations[0].attn # <--- here are the attentions

我不确定这是否是一个新功能,因为几个月前我在寻找对齐时没有遇到这个,但是 onmt 似乎添加了一个标志 -report_align 来输出单词对齐连同翻译。

https://opennmt.net/OpenNMT-py/FAQ.html#raw-alignments-from-averaging-transformer-attention-heads

摘自opennnmt.net -

目前,我们支持在翻译基于 Transformer 的模型时生成单词对齐。在调用 translate.py 时使用 -report_align 将以 Pharaoh 格式输出推断的对齐方式。这些对齐是根据倒数第二个解码器层的注意力头的平均值的 argmax 计算的。