在 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 计算的。
有谁知道在 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 计算的。