加载真实情况和假设作为训练目标
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
组合 ExternSprintDataset
和 TranslationDataset
来为我的 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 可以给出答案。
在较早的问题 (
现在,为了加快速度,我想让老师离线进行搜索。所以,我让老师生成一个假设文件,里面包含它的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
组合 ExternSprintDataset
和 TranslationDataset
来为我的 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 可以给出答案。