师生系统:用每个输入序列的k个目标序列训练学生

Teacher-Student System: Training Student With k Target Sequences for Each Input Sequence

此问题与

相关

我想配置一个师生系统,其中一个教师seq2seq模型生成一个top-k个假设列表,用于训练一个学生seq2seq模型。

I select 来自老师ChoiceLayer(或输出层)的top-k假设列表:

"teacher_hypotheses": {
    "class": "copy", "from": ["extra.search:teacherMT_output"],
    "register_as_extern_data": "teacher_hypotheses_stack"
}

该层的输出 Data 的批处理轴长度 batch_size=k=输入长度的 4 倍 Data的批量轴长度(参见文档和代码:Data.copy_extend_with_beam, SearchChoices.translate_to_common_search_beam)。

teacher_hypotheses_stack被select编为学生的训练目标。但这会导致以下错误:

TensorFlow exception: assertion failed: [shape[0]:] [92] [!=] [dim:] [23]
     [[node studentMT_output/rec/subnet_base/check_seq_len_batch_size/check_input_dim/assert_equal_1/Assert/Assert (defined at home/philipp/Documents/bachelor-thesis/returnn/returnn-venv/lib/python3.7/site-packages/tensorflow_core/python/framework/ops.py:1748) ]]

我认为,由于学生的目标数据(假设列表)的批次轴长度 k=4 倍学生输入的 data/encoder 状态数据。

我需要做什么,才能使学生的解码器对每个输入序列具有 k 个不同的目标序列?

编辑(2020 年 6 月 12 日):我通过 TensorBoard 查看了 TensorFlow 图,以检查错误中提到的节点。在我看来,目标的批轴长度是根据学生的整体输入数据(即编码器输入数据)的批轴长度进行验证的。所以这个检查似乎与我输入学生解码器的内容无关。

编辑(2020 年 6 月 15 日):按照 Albert 的建议,我在 GitHub 上开了一个问题,与我的问题相关:Targeting Beam as Training Target Causes Dimension Error

这实际上可能是一个错误。通过register_as_extern_data,我不确定translate_to_common_search_beam的逻辑是否正确。我认为代码目前期望目标永远不会有光束。

所以,回答你的问题:我认为你已经做对了(所以我们可以关闭这个 Whosebug 问题)。

你应该打开一个关于这个的 GitHub 问题(然后 link 在这里)。想出一个简单的测试用例就好了:

  • 即有光束的地方(你甚至不需要 RecLayer,我认为只需要一个 ChoiceLayer 就足够了),
  • 然后register_as_extern_data
  • 然后是其他一些以某种方式使用此目标的层(例如仅使用 "loss": "ce")。

可能这正是您遇到的问题。