图解自然言语处理Transformer模型(二)

图灵汇官网

点击上方关注,探索人工智能前沿!

接上文:[图解自然语言处理Transformer模型(一)]

残差连接

在深入探讨编码器架构之前,先介绍一个细节:每个编码器中的每个子层(如self-attention和ffnn)都嵌套在一个残差连接中,且伴随有一个归一化步骤。

更广泛地说,这种结构可以表示为: [广义表示]

这种结构同样适用于解码器的子层。假设我们有一个由两个编码器和两个解码器组成的Transformer,其整体结构如下所示: [整体结构]

解码器

已经介绍了编码器的基本概念,现在来了解解码器的组件及其工作方式。

编码器从处理输入序列的末端开始,将输入序列转换为一组关键向量K和值向量V,这些向量会被解码器在“编码器-解码器注意力”层中使用,帮助解码器关注输入序列的相关部分。

在编码过程完成后,解码过程开始。每个时间步,解码器输出翻译后的单词。

重复这一过程,直到遇到结束符号。每个时间步的输入都会反馈到下一层的解码器中,解码器将结果传递到上层。同样,位置编码被添加到解码器输入中以指示每个单词的位置。

解码器中的自注意力层与编码器中的自注意力层有所不同。在解码器中,自注意力层只能关注输入序列前面的部分。这是通过在自注意力计算的softmax步骤之前使用掩码来实现的,掩码将后续位置设置为负无穷大。

编码器-解码器注意力层的工作原理类似于多头自注意力层,只不过它从下面的网络层创建查询矩阵,并从编码器的输入中获取键矩阵和值矩阵。

最终的线性层和Softmax层

解码器栈的输入是一个浮点向量。如何将其转化为一个单词?这是通过一个最终的线性层和Softmax层实现的。

线性层是一个简单的全连接神经网络,它将解码器栈产生的向量映射到一个更高维度的向量(logits)上。

假设模型已从训练数据中学习到10,000个唯一的英语单词。因此,logits有10,000个维度,每个维度对应一个唯一单词的得分。

随后的Softmax层将这些得分转换为概率。选择概率最高的维度,并生成与之对应的单词作为当前时间步的输出。

损失函数

现在,让我们来看一下Transformer的整体前向传递过程。

假设输入词汇表只包含六个单词(“a”、“am”、“i”、“thanks”、“student”和“”)。一旦定义了输入词汇表,就可以用相同维度的向量表示每个单词。这被称为one-hot编码。例如,“am”可以用下面的向量表示: [向量表示]

使用一个简单的例子进行训练——将“merci”翻译成“thanks”。

期望的输出是一个表示“thanks”的概率分布。然而,由于模型尚未充分训练,目前还不能很好地完成任务。

由于模型参数是随机初始化的,在刚开始训练时,输出的概率分布也没有意义。通过与正确的翻译结果进行比较,利用反向传播更新模型的权重,使模型逐渐接近正确的翻译结果。

如何比较两个概率分布?只需将一个概率分布从另一个中减去。更多细节可参见交叉熵和KL散度。

然而,这只是一个简化的例子。实际上,我们将使用整个句子,而不仅仅是单个单词。例如,输入:“je suis étudiant”,期望输出:“i am a student”。这意味着期望的模型连续输出概率分布,其中: - 每个概率分布由一个维度等于词汇表大小的向量表示。 - 在例子中,第一个概率分布中概率最大的维度对应单词“i”的索引。 - 第一个概率分布中概率最大的维度对应单词“am”的索引。 - 这种模式一直持续到输入概率分布对应于“”符号。

目标概率分布作为监督信号来训练模型。

经过长时间的大数据集训练后,期望得到的概率分布如下: [最终概率分布]

现在,由于模型每次只产生一个输入,可以假设模型从概率分布中选择概率最大的单词,然后丢弃其他选项。这是一种方法(称为贪心解码)。另一种方法是前两个单词(比如“i”和“a”),然后在下一个时间步中运行模型两次:一次假设第一个输入是“i”这个词,另一次假设第一个输入是“a”这个词。哪种版本产生的错误更少,就保留哪个版本。这种方法称为“束搜索”,在本例中,束大小为2(因为比较了束1和束2的结果),顶部束大小也为2(因为保留了两个单词),这两个超参数都可以进行实验。

欢迎关注全平台AI自媒体“AI新视野”,第一时间获取人工智能学术、产业前沿动态!

本文来源: 图灵汇 文章作者: 每日经济新闻