t5模型中encoder与decoder内容不同
关于transformers整体结构的解答可以查看相应的解析:解析网站
本质上t5使用的是编码和解码的操作,transformers的网络结构如下:
首先需要理解这个transformer对应的结构图,比如我们要想通过输入我爱中国得到输出I love China,那么Inputs输入永远是我爱中国,而Outputs刚开始为+position encoding,接下来产生预测I了之后,继续将Outputs(shifted right)变为(起始符)+I+position encoding,然后产生预测love之后,继续将Outputs(shifted right)变为(起始符)+I+love+positional encoding,以此类推。
由此可见,Inputs的部分始终不变,Outputs(shifted right)部分在不断地变化,从而引起预测结果不断地改变。
此外这种encoder-decoder结构还引出了一种attention的变化,也就是说在t5模型之中,encoder部分的attention与decoder中第二个部分的attention结构一致,decoder attention中第一个部分的attention加入了mask掩码的内容,这与bert4keras中的代码保持一致。
查看transformers库之中的encoder和decoder部分内容的不同
仔细观察发现,t5selfattention和t5crossattention的区别在于t5crossattention之中多加入了两个参数
t5selfattention的内容
self_attention_outputs = self.layer[0](
hidden_states,
attention_mask=attention_mask,
position_bias=position_bias,
layer_head_mask=layer_head_mask,
past_key_value=self_attn_past_key_value,
use_cache=use_cache,
output_attentions=output_attentions,
)
t5crossattention的内容
cross_attention_outputs = self.layer[1](
hidden_states,
key_value_states=encoder_hidden_states,
attention_mask=encoder_attention_mask,
position_bias=encoder_decoder_position_bias,
layer_head_mask=cross_attn_layer_head_mask,
past_key_value=cross_attn_past_key_value,
query_length=query_length,
use_cache=use_cache,
output_attentions=output_attentions