transformer在以前就是self attention搭建的就是考虑一排的输入然后输出一排的向量好处是能增加数据的并行性不用等前面的输入再去算后面的输出。seq2seq 一堆向量输出不一样数量的向量。输入某种语言的信号输出的是另一种语音的文字直接将数据采集下来然后输入模型里面直接开始train是有可能输出答案的但存在很多问题比如语序什么的是不知道的比如吃什么呢今天晚上 正常的语序应该是今天晚上吃什么呢Decoderdecoder这个黑盒会根据encoder里面的输出在一开始考虑begin和encoder输出的向量输出一个字典当我们研究的是汉字的时候可能是所有的字是英文的时候可能是所有的英文单词里面会有每个字的概率之后将max的答案输出。输出下一个的时候会考虑上一个输出的字典向量将其作为当前的输入以此往后不断输出。并且decoder如果不添加一个东西就会无穷无尽产生出根据前面输出的向量。为了使得让机器有能够决定输出向量数量的能力可以添加一个end字段来控制输出。end也是放在字典里面。所以当输出end的时候是end的概率最大的时候teacher forcing 就是在训练的时候给正确答案比如下面在有begin的时候输出机有begin,机的时候输出器。就是将正确答案输入给decoder现在制作的机器都是通过学习到的知识然后往后推出答案是已经有的数据库训练出来的如果有些话并不是出现在数据库里面机器并没有学习到过并且是可以被机器重复使用的就需要使用copy mechansim。guided attention控制看的顺序要按一定的顺序去看不能东看一个西看一个在self-attention是没有触及到位置的每个位置都是等同的。在现在的decoder设计里面是贪心设计的每次都是选最大的。但是其实这样不见得输出的答案是好的(具体要看自己的任务比如问题的答案是只有一个那么max是最好的如果是开放式可能不见得是最好)可能会有更好的情况是前面的值小后面的值才是大这种情况爆搜所有情况输出答案。但爆搜不现实所以引出beam search。decoder在训练的时候是看到的都是正确的答案那么在测试的时候产生一些错误的知识就可能导致步步错那么在训练的时候可以添加一些错误的答案。self attention在N就是序列的长度很长的时候是比较影响计算时间的所以优化self attention就很有用。比如处理一张图片是序列是很长的所以优化显得比较重要。忽略掉softmax那么计算就是如下图所示第一种方法运算和第二种方法运算两者的计算时间是不一样的下面的计算速度会快一点。引出了local attention只看邻居、stride attention跳几格和某个计算这些方法但这些方法有弊端就是只关注一个较小的点没有看全部的sequence。还有一种方法是比较重要的就是global attention,对一些比较重要的位置可以设置成special这个位置会和其他位置都计算value。在前面知道self attention是有多个头的那么我们就可以将这三种方式的attention应用到各个头里面计算。上面优化的方式都是非常固定的接下来的方法是确定哪些query和key是值得计算的那么就需要clustering。clustering就会将相近的分成一类然后两者计算答案。还有一种方式是让机器自己学出哪些是需要计算的则需要另外一个network来计算。或是直接改变N*N的矩阵变成N*K的矩阵选出比较重要的K个key和K个value然后求出答案。为什么不改变query的值呢因为这样会改变输出的答案数量。如何选出K个key呢一种是用cnn一种是用matual。完全没看懂怎么推的。。。。最后来个总结吧。。。