Dat 27 Transformer

我们先来回顾一下,我们之前介绍了 RNN ,而它的架构就是输入一个序列,得到另一个序列。但是它有些致命的缺陷,例如梯度消失、梯度爆炸和过度依赖等。因此後来人们提出了 LSTM 来进行改善,然而 RNN 本身的设计结构在处理序列资料时必须一个一个处理,无法进行平行运算,大幅度拉长了运算时间。

由於 RNN 的结构难以进行平行运算,因此 Google 在2017年发表了一篇论文 Attention Is All You Need,在该篇论文中 Google 提出了一种不使用 RNN、CNN,而是使用自注意力机制 (self-attention mechanism) 的网路架构 — Transformer。不是变形金刚

接下来我们介绍的内容有不少都是参考自台大李宏毅教授的网路教学,因为真的讲的很好,所以如果你有兴趣的话建议还是听完全程喔!

介绍

Transformer 是一个 Seq2Seq(Sequence to Sequence) 模型,并采用 Encoder - Decoder 的框架,以下是一张简单的示意图:


图片来源:https://ai.googleblog.com/2016/09/a-neural-network-for-machine.html

Encoder 跟 Decoder 之间的线条代表注意力(Attention),线条越粗代表下面的 Decoder 在生成某英文字时越关注上方的某些中文字。

结构

以下是 Transformer 的模型结构:

图中左方的部份为 Encoder,右方的部份为 Decoder。可以注意到左右两方的架构其实颇为相似,详细的差异我们之後再做介绍。
在 Encoder 及 Decoder 内通常都包含了许多层结构相同的 blocks,里头每层都会有 multi-head attention 以及 Feed Forward Network。

首先我们来看 Encoder 的部份:

我们刚才提到 Encoder 里面会分成很多的 block ,我们会先将一整排输入的序列资料转换成一整排向量(vector),接着每一个 block 的处理步骤如下:

  1. 首先将输入的 vector 透过 self-attention 考虑所有的输入资讯後,输出一排 vector。(关於 self-attention 是怎麽考虑所有输入资讯的之後再介绍)
  2. 将这一排 vector 丢到 Fully Connected(FC) 的 feed forward network 里面。
  3. 最後输出的 vector 就是 block 的输出。

然而在原来的 Transformer 里面 block 做的事情是更复杂的,详情如下:

假设我们将按照刚才的方法,将输入的 vector 经过 self-attention 後输出的结果称为 a ;我们还要将原本的输入(我们先称呼它为 b )拉过来与 a 相加得到 a+b 。这样子的网路架构叫做 residual connection。

之後我们会将 a+b 的结果去做 layer normalization。它会把输入的这个向量计算它的平均值$m$(mean)跟标准差$\sigma$(standard deviation),算出来後再根据公式:将输入减去平均值$m$除以标准差$\sigma$。到这里我们才真正得到了FC network 的输入。

而 FC network 这边也有 residual 的架构,所以我们会把 FC network 的 input 跟它的 output 加起来得到新的输出,然後再做一次 layer normalization。这个才是 Transformer Encoder 里面一个 block 真正的输出。

现在,让我们看回 Encoder 的结构图:

首先在 input 的地方,透过 Embedding 将输入转化为向量,然後加上 positional encoding (因为如果只用 self-attention 会缺乏未知资讯 )

接下来我们看到 Multi-Head Attention,这个就是 self-attention 的 block ;而 Add&Norm 就是 residual 加上layer normalization 的意思。

最後,经过 FC 的 feed forward network 後再做一次 Add&Norm 才是整块 block 的输出,而这个 block 会重复 n 次。

接着再让我们看向 Decoder:

输入前一个时间得到的序列,然後同样进行 Embedding 与 Positional Encoding 後进入进入重复 N 次的 block。
不一样的是我们刚进去时的 Multi-Head Attention 多了一个 "Masked" (注意红框部份),什麽意思呢?

Masked 的意思就是,模型只会关注他已经产生出来的部分,不会不小心关注未来产生的词。由於 Decoder 的输出是一个一个产生的,所以它没有办法考虑它未来的输入。这样讲似乎好像有点模糊,之後讲到 self-attention 时会再讲清楚一点。

重复 N 次 block 後,经过 Linear Layer 与 Softmax ,就可以得到我们要的输出机率分布,我们就可以依据这个分布抽样或是取机率最大的值,来得到输出的序列了。

今天说了不少,但是还有一个最关键的 self-attention 机制没有详细说明,明天再来好好介绍一下它是怎麽关注到所有输入的 Sequence 并进行平行处理吧!

reference

https://medium.com/ching-i/transformer-attention-is-all-you-need-c7967f38af14
https://leemeng.tw/neural-machine-translation-with-transformer-and-tensorflow2.html
https://easyai.tech/ai-definition/encoder-decoder-seq2seq/
台大李宏毅教授的网路教程


<<:  Day27 Let's ODOO: Backup

>>:  Day 30 - 故事的最後不是句点,是开始

Day02:空间复杂度

今天来聊聊,空间复杂度(Space Complexity) 空间复杂度,空间指的是在执行程序码时所耗...

Spring Framework X Kotlin Day 20 Security

GitHub Repo https://github.com/b2etw/Spring-Kotlin...

深入浅出 Computed

Vue.js 的自我介绍中,只有说自己接近 MVVM 但不是严格的 MVVM。 我觉得只要会「自动更...

TailWind CSS 使用套件还是可以轻松客制化样式

这次2021 iThome铁人赛得奖名单出炉啦,看了 @搋兔 写的排版神器 Tailwind CSS...

铁人赛28天 VScode Live Sass设定

这几天确定真的都没梗,极度没有营养的内容,所以今天把之前liveSass设定贴上来做为用记录,不过现...