transformer在以前就是self attention搭建的,就是考虑一排的输入然后输出一排的向量,好处是能增加数据的并行性,不用等前面的输入再去算后面的输出。
seq2seq 一堆向量输出不一样数量的向量。
输入某种语言的信号,输出的是另一种语音的文字
直接将数据采集下来,然后输入模型里面直接开始train,是有可能输出答案的,但存在很多问题,比如语序什么的,是不知道的,比如吃什么呢今天晚上 正常的语序应该是今天晚上吃什么呢
Decoder
decoder这个黑盒会根据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。
完全没看懂怎么推的。。。。
最后来个总结吧。。。