前情回顾
-
首先通过前两篇文章你应该已经知道 Transformer 中 attention 的工作机制以及 Encoder 端不同时期的维度变化过程及数学表达:
-
这个部分我想聊一聊 Decoder 端的 attention 与 Encoder 端的不同,以及为什么 Decoder 端一定要使用 Mask 机制
-
还有就是 Decoder 端到底是如何实现解码过程的,他怎么知道解多少个之后停止呢?
-
在进行下面的内容之前,我想再强调一遍:Transformer 中的 attention 的作用是构建当前输入的这个句子中每个 token 和其他 token 之间的关系。这些关系最终被编码到一个张量中,因此 attention 层的输出其实我们其实可以叫它 关系张量也就是建立 token 与 token 之间关系的过程。
Decoder 的 Masked Attention
-
我尝试用一个更加形象的例子来解释 Transformer 的训练过程:
小明的妈妈在家里陪小明学英语,小明负责将汉语翻译成英语,但小明是个小学生,他有的时候会说出 “我妈妈和买菜一起去” 这种蹩脚的汉语(没有经过 encoder 端的 attention 学习到单词之间的关系”。
- 明妈:“小明,你先看两遍汉语,等会我考你把他翻译成英语” ( encoder 端把汉语的句子结构和词语间关系弄明白)
- 小明看了一会汉语书,好歹把汉语之间的句子关系弄明白了 (encoder 端的 attention 参数训练好了)
- 妈妈开始提问:“我爱妈妈” 用英语怎么说?(encoder 端的 input 已经完成,小明大脑飞速运转,在大脑中已经深刻理解了这句话,但是奈何他的解码器一点也没训练,所以他一个字也蹦不出来)
- 小明:“No?” (妈妈对于小明解码的这个词非常不满意,因为很显然这是个错误答案,但是没关系,幸亏妈妈手里有正确答案,所以即使小明不会,妈妈也可以直接教他正确的,这就叫 teacher forcing;小明输出的 “No” 就是第一次的输出 output)
- 明妈:“不对不对,我给你点提示,第一个词应该是 I ”
- 小明:“哦,对对对,应该是 I, 你再给我多提示点呗。”
- 明妈:“不给,到底是你翻译还是我翻译?快点说下一个词” (这就是 mask 的作用,小明能够利用的信息只有在之前妈妈公布答案的几个回合的解码信息,所以他只能通过自己的 attention 去建立这些解码端 token 之间的关系)
- 小明:“我不会啊,我就知道个 I,我只能再瞎猜一次了,‘Yes?’” (解码的时候的可参考和可整合信息只有第一次 output 的结果)
- 明妈:“我的亲儿子啊,笨死了,直接告诉你吧,I 后面应该是 love”
- 小明:“哦哦哦,对对, 是 I love” (解码的时候可用的信息现在扩充成了前两次 output 的结果)
- 明妈:“继续说啊,然后呢?”
- 小明:“还没说完啊?那我再猜一个 “mami” ” (解码器每次解码一个单词,但是不知道何时终止)
- 明妈:“哎哟,我儿子出息了,最后一个词猜对了!” (等 transformer 解码的时候遇到 <结束符> 才会结束这句话的翻译)
-
对上面的几点做一下说明:那就是文中小明先自己去看汉语这个过程并不是 Transformer 的训练过程,真正的训练过程中 Transformer 的编码器和解码器是同时训练的。
-
而且上面的过程看上去仿佛是个线性的串行过程,那就是每次妈妈都只会给小明暴露一个词,然后小明再尝试给出结果,但真实训练的时候其实不会,Transformer 的训练是并行的。会每次在解码端输入一个张量,张量的结构是这样的
- 小明第一次尝试解码的时候,decoder 端的输入是没有任何内容的
- 随着尝试的不断增加,decoder 的输入相当于放开了越来越多的内容
- 而且我们只要构造这个张量,小明就可以并行地完成这个过程。
- 所以这就是为什么解码端一定要使用 mask 来进行遮挡
- 而那些没有被 mask 遮挡的信息,小明才能拿来建立他们之间的关系(使用 attention)而随着次数的增多,小明必然会获得所有的 English 句法和 token 之间的关系。小明预测的结果也会越来越接近妈妈手里的正确答案。
- 在 Transformer 的训练过程中,Decoder 端的 output 输入一直都是妈妈提供的正确标签,作用是:无论小明给的解码结果多离谱,都能用正确答案告诉小明如何正确的解码(Teacher Forcing)