加载真实情况和假设作为训练目标

Loading Ground Truth and Hypotheses as Training Target

在较早的问题 () 中,我希望教师机器翻译 (MT) 模型在学生语音翻译 (ST) 模型的训练过程中执行在线搜索,以便为每个目标生成多个目标学生的输入序列。

现在,为了加快速度,我想让老师离线进行搜索。所以,我让老师生成一个假设文件,里面包含它的ChoiceLayer.

的输出

我的计划是使用这些假设和基本事实作为学生的目标。因此,对于来自 source.train(.gz) 的每个输入序列,都有来自 target.train(.gz) 的真实目标和来自 teacher.train.hyp.

的一个或多个教师假设

在我的在线搜索配置中,我只是将老师的 Data 来自其 ChoiceLayer 注册为 extern_data。由于 Data 包含一个 SearchBeam,RETURNN 自动认为目标 Data 由多个序列组成(此功能是在 issue Targeting Beam as Training Target Causes Dimension Error #304 中添加的)。我想在我的离线搜索解决方案中实现类似的自动化。

我的问题是,RETURNN 是否已经有了可以实现我的计划的组件,或者我是否必须为此编写一个扩展?如果我必须为此扩展 RETURNN,有人对如何做有建议吗? (例如,我想写一个特殊的 TranslationDataset 子类)

编辑 (15.8.2020):

首先,让我回答 Albert 的问题,关于我的数据目前的样子(当然可能会发生变化):

目前,我不使用 HDF 文件或 HDFDataset。我使用 MetaDataset 组合 ExternSprintDatasetTranslationDataset 来为我的 ST 学生组合 ASR 和 MT(地面实况)数据,但我还没有到达加载点来自任何持久数据格式的教师假设。

然而,我通过简单地选择它的ChoiceLayer(解码器output)作为search_output_layer来抛弃老师的假设。然后,在搜索时,RETURNN 创建了一个文本文件(在我的例子中,我选择了 teacher.train.hyp),其中包含存储的每个输入序列的假设,基本上是一个字符串序列化的 Python-dict,如下所示:

{
'line-0': [
(-0.5233442, 'heute werde ich mit Ihnen über die letzten 30 Jahre der Archite@@ ktur@@ geschichte sprechen .'),
(-0.52996093, 'heute werde ich mit Ihnen über die letzten 30 Jahre der archite@@ kt@@ onischen Geschichte sprechen .'),
...
],
'line-1': [
(-0.68246835, 'das ist eine Menge , in 18 Minuten einzu@@ packen .'),
(-0.7289281, 'das ist eine Menge , um in 18 Minuten einzu@@ packen .'),
...
],
...
}

RETURNN 已经拥有所有 code/components 来支持它,但也许它目前不是很好。 RETURNN 当然不会知道,当你从 teacher.train.hyp 加载 hyps 时,这实际上是一个光束(或应该是一个光束)。你可以明确地告诉它,例如通过 EvalLayer(只是标识,但您会指定 out_type)。但这取决于您获取数据的方式。

我真的很想知道,它到底是如何存储在teacher.train.hyp中的?你是怎么保存的?您在搜索输出中使用了 HDFDumpLayer?那包括横梁,对吧?我刚刚检查了 HDFDumpLayer 代码,我认为它只会忽略光束。 IE。它有效地将每个序列(由 seq-tag 标识)存储 N 次。

如果是这种情况,当您加载该 HDF 文件时,它并不知道。我想知道,当你现在将它与 MetaDataset 组合时,它不会抱怨数据集没有相同数量的序列吗?但即使不是,它也可能会忽略 N-1 个序列,而只取其中一个。

所以有多个问题:

  • 您实际上希望如何存储序列?

    • 什么文件格式?高密度纤维板?或者搜索结果是什么,即您指定的 Python 格式?
    • 采用什么 (shape/logical) 格式?究竟如何?例如。将所有序列彼此压平?然后您还需要存储单独的 seq 镜头。或者怎么办?带衬垫?随便...
    • 我假设您希望它与 HDFDataset 兼容,对吗?
  • 你会如何加载序列?

    • 取决于文件格式:
      • 如果它与 HDFDataset 兼容,那么您可以将其用作 MetaDataset 的一部分。
      • 对于Python格式的搜索结果,目前没有可以load/read该数据的数据集。但是we/you当然可以实现这样的数据集。
    • 现在,根据 shape/logical 格式的不同,您需要撤消它(例如撤消扁平化,例如通过 UnflattenNdLayer)。
  • 如何告诉 RETURNN 将其用作光束。

最后一个问题实际上是所有问题中最琐碎的问题,并且在很大程度上取决于其他问题。例如。它可能看起来像这样:

"target_beam": {
  "class": "eval", "from": ..., "eval": "identity",
  "out_type": {"search_beam": SearchBeam(beam_size=12, name="targets")}}

(也许那时会出现一些小问题。我不确定是否有人尝试过这样做。但这将是您向 GitHub 问题跟踪器报告的问题。)

对于HDF 中的这个saving/storing,这一切都是可能的,但需要在您的配置中进行大量手动工作,因此非常复杂。最近在有关使 HDFDataset 更灵活以允许更多自定义格式的相关讨论 here 中提出了这一点,例如喜欢你的情况。所以这更像是一个功能请求,或者是关于 RETURNN 中实现的持续讨论,并且无法在 Whosebug 上真正得到回答。

对于实现一个新的数据集,这其实并不难。我认为拥有一个可以直接读取搜索结果输出的数据集会很有用。这应该很容易,因为它已经是 Python 格式,所以基本上它是一个 eval(open(...).read()),还有一些逻辑。 (这会将所有内容保存在内存中,一旦您将其放大,这可能不是最佳选择,但您可以稍后扩展实现。)那么问题还在于,您将以何种格式(形状)将数据呈现给 RETURNN。然后你结束了我上面解释的其他部分。


最好不要进一步扩展您的问题。这使得跟进讨论变得非常困难。 Whosebug 旨在提出非常具体、非常直接的问题,以便 simple/direct 可以给出答案。