赞
踩
刚接触NLP这块,有两个关于transformer的问题:
1)为什么要有decoder?如果encoder后面直接接全连接不可以吗?
2)为什么decoder要有mask?为什么要按时间步一个字一个字翻译?这样的话,是不是英语从句翻译成汉语就不可行,比如 He is a person who wears a red t-shirt. -> 他是一个穿红色t恤的人。
想了下应该是下面的原因:
1)decoder相当于有两个输入,一个是encoder编码的全局语义信息(使得decoder能够看到完整的上下文信息),一个是模型的前期翻译结果(这个信息对最终的翻译结果也很重要),根据这两个输入决定下一个输出。
2)根据这个逻辑,每一个输出依赖前面的结果,那么必须mask掉后面的内容,因为这时后面的内容还没有生成。decoder的输入是模型的前期翻译结果,也就是拿模型的前期翻译结果做一个Q去和encoder编码的全局语义信息生成的K、V做attention,相当于去找现有结果在全局语义信息里面的相关性,根据这个相关性去决定下一个翻译结果(比如翻译到“他是一个”的时候,去encoder给的信息里面算attention,发现接下来需要翻译的词跟“wears a red t-shirt”相关性很强,那么就给出翻译“穿红色T恤”,接下来才是翻译“person”,也就是“的人”)。正是因为有从句这种需要跳跃翻译的问题,才需要attention算全局相关性,要不然直接查表就完事了。
3)mask也保证了模型在训练的时候可以并行计算,因为训练的时候我们知道label,也就是完整的翻译结果,那么为了并行计算需要把label后面的信息掩盖,因为每次计算需要用到前面的label信息而不能输入label后面的信息。但在测试的时候,是串行输出的,每个位置的翻译结果只依赖前面的翻译结果,mask不重要。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。