我已经有两年 ML 经历,这系列课主要用来查缺补漏,会记录一些细节的、自己不知道的东西。

已经有人记了笔记(很用心,强烈推荐):https://github.com/Sakura-gh/ML-notes

本节对应笔记:无

本节内容综述

  1. Transformer是一种 Seq2seq model with “Self-attention”,BERT就是基于这种技术;
  2. 一般想到处理序列,我们首先想到的就是RNN,但是RNN Hard to parallel,需要按序列输入;
  3. 于是有人提出,使用CNN来代替RNN,可以以一段作为输入,其输出是一段序列。此外,CNN can parallel,几段序列可以一起输入。
  4. 但是 CNN 的每个filter只能接收小部分的信息,也存在局限性;于是提出了 Transformer。用 self-attention 取代 RNN
  5. Attention is all you need. 其运算见小细节。此外,还通过矩阵运算,进一步讲解如何做“平行化”运算(可以用GPU加速)。
  6. 接下来,讲解了 Multi-head Self-attention,见[小细节](#Multi-head Self-attention)
  7. 对于 self-attention 而言,其输入顺序并不重要。因此,如何把“顺序”考虑进去呢?原始论文提及了Positional Encoding,人手动(不是靠学习得出)规定了一个 Positional Encoding ,参与运算。见小细节。
  8. Seq2seq with Attention,原来的RNN都可以用Self-Attention Layer 来替代。这里详细讲了 Transformer的模型具体细节。见小细节。

小细节

Self-attention

【李宏毅2020 ML/DL】P23 Transformer | Self-attention, Multi-head Self-attention
如上图,在 self-attention layer 里,每一个 input 都乘上3个不同的 transformation (不同的 matrix),产生三个不同量:qqkkvv

得到了qqkkvv后,就拿每个 query q 去对每个 key k 做 attention 。 如下图。

【李宏毅2020 ML/DL】P23 Transformer | Self-attention, Multi-head Self-attention

Scaled Dot-Product Attention:
α1,i=q1ki/d\alpha_{1,i} = q^1 \cdot k^i / \sqrt{d}

【李宏毅2020 ML/DL】P23 Transformer | Self-attention, Multi-head Self-attention

如上图,接下来对 α\alpha 做 softmax 处理,得到 α^\hat{\alpha}
α^1,i=exp(α1,i)/jexp(α1,j)\hat{\alpha}_{1,i} = \exp{(\alpha_{1,i})}/\sum_{j}\exp (\alpha_{1,j})

【李宏毅2020 ML/DL】P23 Transformer | Self-attention, Multi-head Self-attention
如上,再通过如下运算,可得到考虑了全局信息的序列(中的第一个元素)。

b1=iα^1,ivib^1 = \sum_i \hat{\alpha}_{1,i}v^i

如果让b1b^1只考虑前三个输入的影响,如何做呢?很简单,让其余的α^\hat{\alpha}在运算时为0即可。

b1,b2,..b_1,b_2,..这些可以同时计算(Can be parallell computed)。

以下是矩阵部分。

【李宏毅2020 ML/DL】P23 Transformer | Self-attention, Multi-head Self-attention
如上,用大写符号QQKKVVII代表变量叠加后的矩阵。

【李宏毅2020 ML/DL】P23 Transformer | Self-attention, Multi-head Self-attention

如上,可以将kqk \cdot q这个过程并行,放在一个矩阵中。

【李宏毅2020 ML/DL】P23 Transformer | Self-attention, Multi-head Self-attention

如上,可以通过矩阵运算得到 α\alpha 的矩阵。

A=KTQA = K^T Q

Asoftmax  columnA^A \rightarrow softmax \; column \rightarrow \hat{A}

【李宏毅2020 ML/DL】P23 Transformer | Self-attention, Multi-head Self-attention

如上,再次进行矩阵运算,得到输出的序列。

O=VA^O = V \hat{A}

因此,整个的 self-attention 就是一堆矩阵运算,可以用GPU来加速。

Multi-head Self-attention

【李宏毅2020 ML/DL】P23 Transformer | Self-attention, Multi-head Self-attention
如上,使用 2 个 head 进行举例。得到了两个 bib^i

【李宏毅2020 ML/DL】P23 Transformer | Self-attention, Multi-head Self-attention
最后,可以再对两个 head 进行如上操作。

之所以用 Multi-head ,是希望每个 head 的关注点不同:有些看长时间的,有些看短期内的。

Positional Encoding

原论文中,介绍了将位置特征向量与aa相加。这是会有问题:为什么不是concat,而是相加?

李老师提供了一种讲法,先讲 concat ,最后达到了与原论文相同的效果(转化回原论文的式子ei+aie^i+a^i)。

【李宏毅2020 ML/DL】P23 Transformer | Self-attention, Multi-head Self-attention
如上,轻易论证了二者相加与concat的同理性。

论文的WPW^P是人手动设定的,长得样子如下。

【李宏毅2020 ML/DL】P23 Transformer | Self-attention, Multi-head Self-attention

Seq2seq with Attention

【李宏毅2020 ML/DL】P23 Transformer | Self-attention, Multi-head Self-attention
【李宏毅2020 ML/DL】P23 Transformer | Self-attention, Multi-head Self-attention
如上,谷歌做了一个动图:

  • 首先是3层attention;
  • 接下来是decoding,不止会考虑到input,还会考虑之前输出的部分。

【李宏毅2020 ML/DL】P23 Transformer | Self-attention, Multi-head Self-attention

如上,一个典型的 Transformer 。

【李宏毅2020 ML/DL】P23 Transformer | Self-attention, Multi-head Self-attention

如上:

  • 处理前先加上位置编码;
  • 首先进行注意力层的处理;
  • 之后进行一个 Add ,就是将注意力层的输入加上对应的输出;
  • 然后经过 Layer Normalization ;
  • 右半部分中,输入为之前输出的值;
  • 其中 Masked 表示:在做 self-attention 时,会将自己的内容 attend 到已经产生的序列上。

Result

【李宏毅2020 ML/DL】P23 Transformer | Self-attention, Multi-head Self-attention
如上,仅仅将句子中的 tired 改成 wide ,it就可以自动地改变其“理解”,从 animal 改为指向了 street 。

【李宏毅2020 ML/DL】P23 Transformer | Self-attention, Multi-head Self-attention

如上,Multi-head起到了关注点不同的效果。

【李宏毅2020 ML/DL】P23 Transformer | Self-attention, Multi-head Self-attention

如上,用维基百科作为输出(句子长度长达10e2到10e6),神经网络还能不混乱,足以见到 Transformer 之强。

Universal Transformer

【李宏毅2020 ML/DL】P23 Transformer | Self-attention, Multi-head Self-attention

在深度上,类似 RNN ,不断使用同一 transformer 。

此外,还有人做了在CV上的拓展。

相关文章:

  • 2021-06-12
  • 2022-12-23
  • 2021-05-24
  • 2021-06-29
  • 2021-10-11
  • 2021-10-11
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-04-05
  • 2022-02-21
  • 2021-06-10
  • 2021-04-15
  • 2022-12-23
  • 2021-09-05
相关资源
相似解决方案