上一篇文章里介绍了Encoder,本篇文章来介绍Decoder
以语音辨识问题为例。
一种典型的Decoder结构是Autoregressive(自回归)的Decoder。即每一步的输出依赖于之前的所有输出。
有了Encoder的输出以后,将其一次性输入Decoder,并且伴随一个起始标识,Decoder的直接输出的是一个概率分布,例如如果是语音转中文辨识问题,会给出一组中文字表(这个中文字表需要事先人为设定)以及其对应的概率分布,然后将最大概率对应的字作为输出;有了第一个输出,Decoder会把这个输出连带之前的输入一起作为新的输入,再得到新的概率分布,再找到对应的中文字,然后重复上述过程。
Decoder的内部结构如下:
可以将其和Encoder做一个对比:
比较重要的几个点:这里的Multi-Head Attention机制增加了Masked操作。
完整的Self-Attention机制如上,我们知道Self-Attention机制就是结合上下文机制,即每一个输入向量分量要考虑其它所有分量的相关度。
而增加了Masked以后,其表示图如下:
其实是每一个输入向量分量在计算相关度时,只能考虑在它之前出现过的分量,而不能考虑在它之后出现过的分量。
Decoder在上述语音辨识问题中还要遇到一个问题,就是判断输出何时停止。那么这时需要在前面提到的中文字表中添加一个“end”即停止标识。
Encoder和Decoder交互的地方实际如下图(Cross attention部分):
其详细作用过程如下:
给Encoder输入语音序列,在经过Encoder的多block处理后,得到一排向量。首先将begin向量作为Mask Self-attention层的输入,得到第一个输出向量,计算该向量的q向量,利用self-attention中的k、v向量生成机制计算出Encoder每个输出向量的k、v向量,将其组合产生输出向量,通过全链接神经网络,最终得到一个输出词;将这个输出词作为新的输入交给Mask Self-attention层,计算和之前的所有输入向量的相关度继续得到新的输出,然后继续和Encoder的输出进行self-attention操作,然后循环此操作。
将Mask Self-Attention的输出向量和Encoder的输出向量进行Self-Attention操作称之为Cross attention计算。
下面介绍Transformer如何训练。
以中文语音辨识为例,显然数据集格式应该为:输入(语音),输出(文字序列)
我们知道Decoder直接输出每个向量是一组概率分布,如第一个输出:{机(0.8)器(0.1)学(0.1)习(0)}
而实际上第一个输出向量标签为“机”,转化成独热码形式应该是:{机(1)器(0)学(0)习(0)}
显然这类似一个多分类问题,可以用交叉熵作为损失函数,
,在第一个输出向量中,
。
这里需要特别提醒的是,在训练阶段,Decoder的输入是人为给定正确答案,而不是用其自己根据起始Begin向量生成的向量通过cross attention生成的输出向量作为输入再做mask self-attention。