师生系统:用每个输入序列的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"
)。
可能这正是您遇到的问题。
此问题与
我想配置一个师生系统,其中一个教师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"
)。
可能这正是您遇到的问题。