解码器会接受编码器生成的词向量(图片向量,视频向量),然后通过这个词向量去生成翻译的结果。
解码器的self-attention在编码已经生成的单词
假如目标词“我是一个学生”---》masked
训练阶段:目标词“我是一个学生”是已知的,然后self-attention是对“我是一个学生”做计算
如果不做masked,每次训练阶段,都会获得所有的信息
测试阶段:
1.目标词未知,假设目标词是“我是一个老师”,self-attention第一次对“我”做计算
2.第二次对“我是”做计算
3.·····
(总结下:就是decoder的self-attention,用的是masked self-attention,同步)
问题一:为什么Decoder需要做mask
为了解决训练阶段和测试阶段的gap(不匹配)
训练阶段:(训练阶段主要是想寻找更好的参数,答案都是已知的,测试阶段答案是未知的,是要用参数来寻找答案)
机器翻译:源语句,(我爱中国),目标语句( I love China)
训练阶段中,解码器会有输入,这个输入是目标语句,就是I love China,通过已经生成的词,去让解码器更好的生成(每一次都会把所有信息告诉解码器)
测试阶段:解码器也会有输入,但是此时,测试的时候是不知道目标语句是什么的,这个时候,你每生成一个词,就会有多一个词放入目标语句中,每次生成的时候,都是已经生成的词(测试阶段只会把已经生成的词告诉解码器)(做测试要是能知道后面的那不就相当于玩赖了吗)
为了匹配,为了解决这个gap,masked self-attention就登场了,生成I 之前是编码器输入的k和v加上解码器输入的语句起始符,一般为<eop>,解码出第一个I。
掩码矩阵是作用在训练阶段的,目的就是让训练阶段和测试阶段生成的目标词匹配。
问题二:为什么Encoders给予decoders的是K、V矩阵?
Q来源解码器,K=V来源于编码器,
Q是查询变量,Q是已经生成的词
K=V是源语句
当我们生成这个词的时候,通过已经生成的词和源语句做自注意力,就是确定源语句中哪些词对接下来的词的生成更有作用。
通过部分(生成的词)去所有的(源语句)里面挑重点。
encoder给decoder的encoder-decoder attention层的是K、V矩阵,不是新的词向量。
然后decoder通过masked self-attention求出新的Q矩阵。再用那个softmax公式得出概率值。
decoder将生成的词作为输入,而第一个词生成的过程是通过decoder初始化的Q来进行生成的,如果第一个词生成错了,后面生成的词会不会都有错误?
一个词生成对了,第二个词也会生成错误,这就是一个学习的过程,而且第二个词的生成不是完全取决于第一个词生成的正确性,还有编码器。
输入因任务不同会有不同。但是训练阶段,不做掩码就会把所有信息告诉解码器,做了掩码就不会了,