神经机器翻译任务中的句子指示
Sentence Indicating in Neural Machine Translation Tasks
我见过很多人在做神经机器翻译。通常,在训练网络之前,他们在 <BOS><EOS>
、<START><END>
等标签之间表示他们的句子。当然,指定句子的开头和结尾是合乎逻辑的解决方案,但我想知道神经网络如何理解字符串 <END>
(或其他)表示句子的结尾?
没有。
在推理时,有一个硬编码规则,如果生成该标记,则序列完成,并且不再要求底层神经模型提供下一个标记。
source_seq = tokenize('This is not a test.')
print(source_seq)
此时你会得到类似的东西:
[ '<BOS>', 'Thi###', ... , '###t', '.' , '<EOS>' ]
现在我们构建具有相同格式的目标序列:
target_seq = [ '<BOS>' ]
while true:
token = model.generate_next_token(source_seq, target_seq)
if token == '<EOS>':
break
seq.append(token)
模型本身仅预测最有可能给出当前状态(到目前为止的输入序列和输出序列)的下一个标记。
它无法退出循环,就像它无法将您机器的插头从墙上拔出一样。
请注意,这不是此处唯一的硬编码规定。另一个是决定从第一个标记开始,并且只添加 - 从不添加,从不删除...... - 就像人类说话一样。
我见过很多人在做神经机器翻译。通常,在训练网络之前,他们在 <BOS><EOS>
、<START><END>
等标签之间表示他们的句子。当然,指定句子的开头和结尾是合乎逻辑的解决方案,但我想知道神经网络如何理解字符串 <END>
(或其他)表示句子的结尾?
没有。
在推理时,有一个硬编码规则,如果生成该标记,则序列完成,并且不再要求底层神经模型提供下一个标记。
source_seq = tokenize('This is not a test.')
print(source_seq)
此时你会得到类似的东西:
[ '<BOS>', 'Thi###', ... , '###t', '.' , '<EOS>' ]
现在我们构建具有相同格式的目标序列:
target_seq = [ '<BOS>' ]
while true:
token = model.generate_next_token(source_seq, target_seq)
if token == '<EOS>':
break
seq.append(token)
模型本身仅预测最有可能给出当前状态(到目前为止的输入序列和输出序列)的下一个标记。
它无法退出循环,就像它无法将您机器的插头从墙上拔出一样。
请注意,这不是此处唯一的硬编码规定。另一个是决定从第一个标记开始,并且只添加 - 从不添加,从不删除...... - 就像人类说话一样。