从self-attention到transformer之transformer
在看这篇笔记之前你最好确保自己了解了self-attention的内容,这里附上关于self-attention的笔记连接供参考:
https://blog.csdn.net/weixin_42254244/article/details/116572402
1. Seq2Seq模型:
今天来介绍transformer模型,也跟后来产生的BERT有着紧密的联系,transformer也是Seq2Seq中的一个。Seq2Seq模型一般都有Encoder和Decoder两个结构,由Encoder来处理input sequence然后交给Decoder来决定要什么样的output sequence。如下图所示:
2. Encoder:
首先来介绍transformer的Encoder的部分,Encoder要做的事情说白了就是输入一个序列的向量然后经过处理在输出另一个序列的向量(同样长度)。就针对Encoder这件事情来说,不仅仅是self-attention,还有RNN,LSTM都可以做同样的事情。
那transformer模型中的Encoder的主要部分就是self-attention来做的。下图就是transformer论文中的Encoder的原始架构。
看起来可能会非常复杂,下面分别用几张图片来拆开讲解transformer的Encoder的架构:
先看左半部分,Encoder是由好几个block连接而成,每一个block都是输入一个序列的向量然后经过处理在输出相同长度的向量再作为输入传给下一个block。(这里之所以叫block而不叫layer是因为每一个block其实都多了好几个layer的事情)
每一个block里面所做的事情就像右半图画的一样,输入一个序列先通过一个self-attention结构,然后再通过一个fully-connected neural network得到输出的序列。
然而实际上,真实的block做的还不止这么多,还要把经过self-attention前后的对应位置的输入a和输出b加在一起的a+b当作是self-attention的新的输出。这种把输入和输出加在一起的做法叫residual connection(残差连接),这种做法在CV领域还是用的很广泛的,这里就不做详细的介绍。(其实是博主本人没有详细了解)
经过了residual connection之后还没有结束,还要把新的输出a+b做一次normalization。这里用的不是batch-normalization而是layer-normalization,layer-normalization其实还要逼batch-normalization更简单一些。不需要考虑序列的其他位置,只是