好,闲话少说。关于 self-attention 的训练阶段 http://jalammar.github.io/ill…,这篇文章写的已经很清楚,而且确实验证有效。那么今天扯一下该模型的预测是怎么做的。一. 预测流程及输入内容 1. 我们的 encode 的 input 是输入测试集编码(也就是和训练阶段输入一样),但 decode 的 input 是 0 向量(维度和训练时的输入相同)。2. 在预测时,encode 的 output 会传递到 decode 这边的 6 个 layer 作为其 k,v,随机 0 向量在第一步的时候作为 q 传入。(只在第一步作为 input 传入,然后开心训练)二. 但为什么传入的 q 为 0 矩阵,模型却能进行很好的预测呢。以我是中国人对应 i am a chinese 举例。1. 当 encode 训练好后,相对来说我是中国人对应的矩阵也就确定了,然后经过 encode 编码得到最终输入想 decode 的 output,也就是 k,v, 而在论文中 decode 这边一共有 6 层网络层(每层 3 个 sub-layer),这里的 kv 会输入到这 6 层的每一层,好,关键来了。模型怎么能够预测出我对应 i,这是最重要的一步也是最难理解的一步。在 decode 层,我们要弄清训练的什么,当我们训练好后的这些参数,其作用又是什么,实际上就是当我们传过来 kv 时,因为 kv 已知,是全局变量,我们能够看到,所以在 decode 中,i 的向量可以理解为当指定 kv 后,又知道训练好的参数矩阵,经过一系列编号,我们第一个的输出很大概率就是对应的 i 的向量,当输出为 i 向量时,即预测对了,然后预测 am,会把第一次 i 向量作为额外的 input 加到 q 上,继续进行预测。直到遇到结束向量。三. 问题思考 1. 论文里的 multi-head 为什么要这么做,事实上论文提出说因为发现多头效果更好,笔者认为因为每个头的参数是随机初始化,所以其学到的关于一句话关注的点就会不同,这样会加深对原句的学习能力,同时,8 头并行减少了训练时间。2. 为什么 position embedding 是 cos 和 sin,论文解释可以学到更长的序列关系,这点我还没弄懂。3.mask 是做什么用,使 decode 只考虑前面的,不考虑后面的,这点随意百度一下就可以了。该文不保证完全正确,只做参考。