Transformer
z

Attention Is All Your Need


What is Transformer?

Transformer中抛弃了传统的CNN和RNN,由且仅由self-AttenionFeed Forward Neural Network组成。

$$
test \frac{1}{2}
$$

Why Transformer?

一些序列的模型(RNN, LSTM,GRU等),他们的计算都是一个线性的计算,即,第$t$时刻的的计算依赖于$t-1$时刻。限制了并行能力。同时,存在一些长期依赖的信息丢失问题。

Transformer并不是一个序列模型,因此能够并行计算。同时序列中任意两个位置的距离被缩小成了一个常量。

What is the construction of Transformer?

Transformer的basic block是一个Encoder-Decoder结构:

image-20200812212102507

论文中,整个模型是由6个这样的basic block组成:

image-20200812212229494

Encoder和Decoder的结构又是怎样的?

Encoder由两部分组成:

  • Self-Attention

    可以得到一个加权的特征向量$Z$:
    $$
    Z = \operatorname{Attention}(Q, K, V)=\operatorname{softmax}\left(\frac{Q K^{T}}{\sqrt{d_{k}}}\right) V
    $$

  • Feed Forward Neural Network

    两层的全联接层:
    $$
    \operatorname{FFN}(Z)=\max \left(0, Z W_{1}+b_{1}\right) W_{2}+b_{2}
    $$

Decoder包含三部分:

  • Self-Attention

    这个self-Attention可以理解为”当前的翻译和已经翻译的内容之间的关系”

  • Encoder-Decoder Attention

    可以理解为当前翻译和编码的特征向量的关系

  • Feed Forward Neural Network

image-20200812220930892

Transformer的输入是什么?

通过word2vector将输入的语聊转换为特征向量。论文中是512维的向量 $$d_{\text {model}}=512$$。

Self-Attention是什么?

Self-Attention的核心是维输入向量的每一个单词,学习一个权重。

举个🌰:

1
The animal didn't cross the street because it was too tired

中,it到底代表的是什么呢?

通过Self-Attention,我们就能够通过it和其他单词间的权重,来进行判断。

在Self-Attention中,每一个输入的词向量$x \in \mathbf{R}^{512}$,能够得到三个不同的向量:$q$、$k$ 和 $v \in \mathbf{R}^{64}$。这三个向量的获得,是通过三个不同的矩阵:$W^{Q}$、$W^{K}$ 和 $W^{V} \in \mathbf{R}^{512 \times 64}$ 获得的。$q$ 代表着 Query,$k$ 代表着 key,$v$ 代表着 value。

整个Self-Attention的计算如下:

  1. 将输入的词向量$x$和矩阵$W^{Q}$、$W^{K}$ 和 $W^{V}$ 相乘,得到对应的$q$、$k$ 和 $v$。

  2. 计算$s = qk$ (query和key的乘)

  3. 对$s$进行归一化:$s = s/ \sqrt{d_k}$, 这里的$d_k$ 指的是$k$ 的维度,这里$d_k$ 就是64,那么$s = s/8$

  4. 对归一化之后的$s$进行softmax激活。

  5. 随后,将4得到的数值乘以向量$v$,得到加权的输入向量的得分。

  6. $z = \sum{v}$

    image-20200812231535512

除此之外,self-attention还包含有residual short connection,来是的网络的优化更稳定。

Multi-Head Attention

就是将Self-Attention进行堆叠,每一个输入向量$x$会被输入到$h$个不同的self-attention模块中。将得到的加权向量concate后,进行一个全联接操作降维。

image-20200812235405611

位置编码

image-20200813000129418

输入的词向量,并没有保留他的位置信息。对于位置的编码,一般有两种做法,一种是根据数据学习,另外一种是自己设计一种规则来编码。

这里,作者设计了一种位置编码:
$$
\begin{array}{c}
P E(\text {pos}, 2 i)=\sin \left(\frac{p o s}{10000^{\frac{2 i}{d_{\text {madd} l}}}}\right) \ \
P E(\text {pos}, 2 i+1)=\cos \left(\frac{p o s}{10000^{\frac{2 i}{d_{\text {modd} l}}}}\right)
\end{array}
$$

作者这么设计的原因是考虑到在NLP任务重,除了单词的绝对位置,单词的相对位置也非常重要。