从Encoder的整体来看,红色部分是词编码,黄色部分是位置编码,绿色部分是encoder计算层。红色和黄色部分只进行一次,而对于绿色部分经过for循环列表会执行多次,也就是下图中的N。
本文接下来将对红色和黄色的部分进行分析:
整体结构如图:
1.词编码
nn.Embedding需要目标词库的长度,以及想要转换的维度。在实例化的forward使用中,输入的enc_inputs的维度是(2,6)也就是(batch_size,src_len)。也就是
[[1, 2, 3, 4, 0], [1, 2, 3, 5, 0]],代表着最原始的字母->编码。
在经过实例化的词编码后,编码的维度->(2,5,512)
2.位置编码
forward这里传入的是上一层词编码的输出,也就是(2,5,512)的维度,(batch_size,src_len,编码的输出维度[自己定义的维度]),但是进行了transpose,所以他的输入是(5,2,512)的维度。经过位置编码的维度是不变的,只不过给其加上了位置的信息。
总结:
在进入多头注意力的计算之前,原始数据从(2,5)->(2,5,512)->(2,5,512),经过了两次变换,第一次是进行词编码,第二次虽然维度没有变换但是增加了位置的信息。