transformer
大致结构。每个encoder结构相同,但彼此的参数独立训练。
左边encoder,右边是decoder。
encoder
输入部分分为2部分:
1.embedding
2.位置嵌入
上图是rnn的结构,可以看到字是一个一个输入的,有时间关系,但transformer是所有字并行输入的,就缺失了位置关系,所以需要使用位置编码。
比如爱这个字的向量的维度是512,对奇数位置的数字使用sin,对偶数位置的数字使用cos。
然后将位置编码后的与原来的单词向量相加。
注意力机制
婴儿就是一个query,就是上面公式里的q,key1即左上对应的向量,对应公式里的k,q和k做点乘,点乘可以反映两个向量之间的距离。
一个示例。s1是k1和q点乘之后的结果,
上图解释了q,k,v是怎么得来的,如q1与wq相乘就能得到q1。
计算的流程图。
残差
上图首先x1结构位置编码再和自身相加得到x1,然后经过注意力机制得到z1,再将x与z对位相加,即残差。然后feed forword,就是两层的全连接层。
layer nomalization
使用的是这个,不用bn,
decoder
可以看到,多了一个mask。
因为实际预测的时候到love时是看不到you,know的,所以这里就把love后面的遮盖了。
Ecoder的Q是embedding来的,是已知的,而Decoder输出的Q是预测的,也就是结果预测的词。encoder的k,v和每一个decoder的q做交互。
https://blog.csdn.net/qq_37541097/article/details/117691873
注意力机制
其中v是a当中提取到的信息。
利用右上角的公式处理q和k。得到aij,然后经过softmax。
之后将softmax之后的结果和v处理,得到b。
整体结构大致如上图。
multi head
如果是两个head的话,就把q分成两份。
同理,将所有的q、k、v进行拆分。
于是,分为了head1和head2。对每个head执行之前的一系列操作就能得到b。
之后再把每个head的内容进行拼接。
使用wo对数据进一步融合。