李宏毅《机器学习》总结 - Transformer

前言

当时老师要求我做 transformer 和 self-attention 的 ppt,结果当时在训练 ACM 没大有时间,就弄了个质量不高的,不出意外的被喷了。。。现在回头看看当时做的整体没有大问题,但是由于知识没有连贯起来导致有些地方没有提到,也没有形成一个比较完整的架构。

Transformer 能做的任务是 seq2seq(即输出的长度不一定是输入的长度,而 self-attention 中输出长度等于输入长度),具体包含 encoder 和 decoder 两个部分
image

encoder

总的来说,包含 \(N\) 层,每层由一个 self-attention 和 一个 FC 组成:
image
在 encoder 中,self-attention 不是简单的得到 \(q,k,v\),相乘并 softmax 得到 \(\alpha'\),再和 \(v\) 做 weighted-sum,而是结合了 residual 和 normalization 的过程(简记为 add&norm)
具体地:
image
即:每一个向量先做 self-attention,再和原向量相加,这就是 residual 的过程,做 layer normalization(与 batch normalization 不同,BN 是对不同向量的同一个 feature 做 normalization,即“横着”,LN 是对一个向量的所有 feature 归一化,“竖着”),得到输出,再扔到 FC 中,做完 normalization 得到最终输出。这就是 "add&norm" 的含义。
至于为什么要做 residual,这其实是 resnet 的思想。大意就是更容易获得恒等变换,这样就避免了深层神经网络退化的问题。
image

另外,再简单介绍一下 encoder 和 decoder 都出现过的 embedding。主要分为两个部分:word embedding 和 positional encoding。
word embedding 就是将原本表示单词所用的 one-hot vector 转化为一个低维的向量,并且相似的词的距离应该较小。
在 RNN 中,由于顺序处理的关系,天然的考虑了句子中单词的顺序。而在 transformer 中,由于使用了 self-attention,并不能考虑单词的顺序,因此需要额外的对顺序进行考虑(实践中通常是加上代表顺序的向量),这就是positional encoding。通常可以直接套公式。

decoder

decoder 的整体结构:
image
可以简单描述一下流程,以声音转文字为例。encoder 读入一段声音讯号,经过 encoder 的处理得到相同长度的向量序列,在 decoder 的 cross attention 中发挥作用。首先输入 BOS,经过 decoder 之后得到一个分布,求出 cross entropy 的 argmax 为“机”。在输入“机”,经过相同操作得到“器”。以此类推。其中 decoder 的输入(即图中的“outputs”部分)是什么呢?一个比较直观的想法是将上一个位置的输出作为 decoder 的下一个输入。这样有个问题就是 error propagation(一步错、步步错),而且这是在训练,这样不利于训练。因此,可以采用 teacher forcing 的方法,直接把输入 right shifted 一下(相当于在声音讯号对应的正确的文字序列的最左边加上一个 BOS)

decoder 的运行示意图:
image
每一次,decoder 的输入是上一步的输出,每一步的输出是一个单字的 distribution,这个分布的 argmax 就是输出的字

回到第一个图中观察 decoder 的结构,发现如果盖住和 encoder 相连的部分的话,剩下的部分和 encoder 非常相似。唯一的区别在于原来多头注意力变成了 masked 了,这是因为 decoder 的输入只能看到前面的部分,不能看到后面的输出(这个过程是串行的)

如何判断输出的长度?在 distribution 中加一维 end,如果 end 的概率大就结束。

现在考虑之前被盖住的部分,也就是 decoder 接收 encoder 的输出的部分。会发现这里还是应用的 multi-head attention,只不过这里不是 self-attention,而是 cross attention。即,在普通的 self-attention 中,由向量序列中的 \(x_i\) 经过矩阵乘法(这个矩阵也是待学习的参数)得到 \(q_i, k_i, v_i\),均为向量。接着当前的 \(q_i\) 和全部的 \(k_j\) 做点乘,得到 \(\alpha_{i,j}\),和对应的 \(v_j\) 做加权和再 softmax,得到一个分布。而在 cross attention 中,\(v_i\) 仍然是由 decoder 的输出的向量序列中的 \(x_i\) 产生的,而 \(q_i\)\(k_i\) 则是由 encoder 的输出向量序列产生的。其余过程相近。

如何训练 decoder 呢?在训练集上,给出一段声音讯号,decoder 得到对应的翻译,和答案对应的翻译比对,decoder 每次得到的输出实际上是一个概率的分布,而答案的翻译是一个单字,是一个 one-hot vector(如果没有 word embedding 的话),分别做 cross entropy 并求和,要 minimize 这个和

一个训练方法是 teacher forcing,每次用正确答案当做输入(上面提到过,可以更充分的进行训练,避免了 error propagation 的问题)
image

beam search(未讲,待填)

posted @ 2024-01-31 14:28  SkyRainWind  阅读(17)  评论(0编辑  收藏  举报