有谁知道在 Opennmt-py 中翻译时如何获得对齐权重?通常唯一的输出是结果句子,我试图找到一个调试标志或类似的注意力权重。到目前为止,我一直没有成功。
问问题
516 次
2 回答
2
我不确定这是否是一个新功能,因为几个月前我在寻找对齐时没有遇到这个,但是 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 计算的。
于 2020-02-11T10:14:31.920 回答
0
你可以得到注意力矩阵。请注意,它与来自统计(非神经)机器翻译的术语对齐不同。
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
于 2019-06-04T09:15:47.967 回答