【Day21】 Transformer 新手包 (一)

为什麽 Transformer ?

  • 回顾 LSTM 与 CNN ,在一开始处理 time-sequence 这类问题的时候,我们都知道要用 RNN 这类的模型来处理,也知道这样子做不好平行处理,通常都算很慢,於是就有人用 CNN 的方式来解决,让每一个 filter 输入当 sequence 的一小段,输出一个内积得到的值,不同的 filter 就是对应 sequence 中不同的部分,但是这样做的话变成每个 filter 的内容是有限的,所以你会常常看到有人再加大 fliter 增加 respective-filed 来试图解决这个问题,或是叠很多很多层来让整个模型可以考虑更多过去的讯息 (因为上层的 filter 会把下层的 filter 的输出当作输入),但这样子的做的话是必然要叠得很深才可以得到跟 RNN 一样的长的 sequence length ,比较容易出现一些问题,也较难训练。

於是这世界就出现了一个大能发明了 Transformer 这种可以有 RNN 的特性以及超快的训练速度与不输(甚至更好)的准度。

注意力机制

注意力机制的由来 - Seq2Seq 模型

  • Seq2Seq 模型这种模型包含两部分,Encoder 和 Decoder,最一开始是拿来做翻译的,比方说丢一句中文进去给 Encoder, Encoder 会把输入转换成机器能理解的 context vector,最後再透过 Decoder 转换成我们能理解的英文输出。

  • 在注意力机制出现之前,这种模型(Encoder 和 Decoder)几乎都是用 RNN 来实作的,你也可以从上图发现到如果要得到一段 context vector 给 Decoder 的话,你必须把整段 sequence 都看过一次才生的出来,可以很直觉想像的到,这样一段 context vector 并不能很完整的把原本的资讯给打包起来,尤其是当 sequence 很长的情况下更是如此,而解决这种问题的方法就称作注意力机制。

  • 注意力机制说白了就是把中间所有的 hidden_state 都提出来给 Decoder 看,然後让 Decoder 决定哪段需要多注意一点 (就是权重高一点),用注意力机制更改一下上面的图,它看起来应该会像这样。

该怎麽算注意力机制

数字跟英文我都懂,但凑起来怎摸就看不懂了

我们假设现在有办法取得各个 Encoder 跟 Decoder 的 hidden_state,其中:

Encoder 的 hidden_state 定义为 h_s
Decoder 的 hidden_state 定义为 h_t

前面有提到要让 Decoder 决定哪段需要多注意一点,具体的做法就是要算一个权重

  • Step_1:

    选一个 attention function 来计算当前 h_t 对每一个 h_s 的相关程度,这个 function 常见的算法像是 dot product,这边就先叫它 score(h_t,h_s)

  • Step_2:

    计算 attention weight,就是用 softmax 把 score 转成 probability distribution

  • Step_3:
    把上面的 alpha_ts 与加权平均所有的 h_s 结合成一个 "context vector"

  • Step_4:
    将 "context vector" 与 h_t 结合成一个 "attention vector" 并作为该时间点的输出

这个 "attention vector" 也会是下一个时间点的输入

而之所以被称为权重,是因为 "attention vector" 它是可以被训练的,训练过後的权重值可以让当下的 Decoder 知道哪个 Encoder 的 hidden_state 比较重要,并依此从它们身上取得上下文资讯。

注意力机制 VS "自"注意力机制

(Seq2Seq + 注意力机制) 看起来水平很高,但其实还是有地方可以更好,那就是我们需要平行运算才可以更快,而"自"注意力机制就克服了 RNN 不能平行运算的问题,比较下两个的差异。

注意力机制:

    Decoder 在生成输出时关注 Encoder 的输出,从中获得上下文资讯

"自"注意力机制:

    Encoder 在生成输入时关注"自己"序列中的其他元素,从中获得上下文资讯
    Decoder 在生成输出时关注"自己"序列中的其他元素,从中获得上下文资讯

下面做的事情,跟上面的概念上是一样的,最後 Attention Is All You Need 的论文作者们用 "自"注意力机制加上注意力机制打造了一个完全不用 RNN 的 Seq2Seq 模型,下面这张图就是一个非常简化的 Transformer,Encoder 跟 Decoder 各自利用"自"注意力机制关注自己处理的 sequence,变成是可以平行运算的。

最後我们的 Transformer 的真面目就是 (Seq2Seq + 注意力机制 +"自"注意力机制)

小结

今天我们简单的介绍了一部分的 Transformer,後面还有很多细节要说明 (努力理解中),最後祝大家中秋愉快 XD。

参考资料

浅谈神经机器翻译 & 用 Transformer 与 TensorFlow 2 英翻中

/images/emoticon/emoticon09.gif/images/emoticon/emoticon13.gif/images/emoticon/emoticon14.gif/images/emoticon/emoticon22.gif/images/emoticon/emoticon28.gif


<<:  DHT22 资料读取与输出

>>:  Day-06 说明类别(class)跟模组(module)的差别?

30天程序语言研究

今天是30天程序语言研究的第十九天,由於深度学习老师多让我们上了python的进阶课程里面包括之前没...

DAY7-EXCEL统计分析:统计学是什麽?

在我们学习统计学之前应该清楚理解何谓统计学,这样才能够学以致用,并有效利用excel等工具来帮助我们...

Day11_HTML语法8

标示超连结 < a>元素是用来标示超连结,常使用的属性为< href> &l...

Microsoft MO-300 转储 - 让 MO-300 考试成为无压力考试

Microsoft Office 专家 - MO-300 考试对您的职业生涯来说是一个非常显着的提升...

Day 15:Remove Duplicates from linked list

这题开始之前先来介绍一下Linked list(连结串列)的资料结构。 Linked list(连结...