好,闲话少说。关于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只考虑前面的,不考虑后面的,这点随意百度一下就可以了。
该文不保证完全正确,只做参考。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。