Transformer模型-decoder解码器,target mask目标掩码的简明介绍

本文主要是介绍Transformer模型-decoder解码器,target mask目标掩码的简明介绍,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 今天介绍transformer模型的decoder解码器,target mask目标掩码

背景


解码器层是对前面文章中提到的子层的包装器。它接受位置嵌入的目标序列,并将它们通过带掩码的多头注意力机制传递。使用掩码是为了防止解码器查看序列中的下一个标记。它迫使模型仅使用之前的标记作为上下文来预测下一个标记。然后,它再通过另一个多头注意力机制,该机制将编码器层的输出作为额外的输入。最后,它通过位置全连接前馈网络。在这些子层中的每一个之后,它都会执行残差相加和层归一化。

Transformer中的解码器层


如上所述,解码器层无非是对子层的包装器。它实现了两个多头注意力子层和一个位置全连接前馈网络,每个子层之后都跟着层归一化和残差相加。

参看 编码器encoder:

Transformer模型-encoder编码器,padding填充,source mask填充掩码的简明介绍-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/ank1983/article/details/137399110

为什么需要掩码?


目标掩码target mask

要理解为什么需要目标掩码,最好看一下解码器的输入和输出的示例。解码器的目标是在给定的编码源序列和目标序列的一部分的情况下,预测序列中的下一个标记。为了实现这一点,必须有一个“开始”标记来提示模型预测序列中的下一个标记。这就是上面图像中“<bos>”标记的用途。还需要注意的是,解码器的输入和输出的大小必须相同。

如果目标是将“Wie heißt du?”翻译为“What is your name?”,那么编码器将编码源序列的含义并将其传递给解码器。给定“<bos>”标记和编码的源序列,解码器应该预测出“What”。然后,将“What”附加到“<bos>”后面以创建新的输入,即“<bos> What”。这就是为什么解码器的输入被认为是“向右移动”的原因。这可以传递给解码器以预测What is。这个标记被附加到之前的输入上,以创建新的输入“<bos> What is”。这将被传递给解码器以预测“What is your”。这个过程会一直重复,直到模型预测出“<eos>”标记。

通过使用目标掩码,模型可以同时学习每个迭代的目标序列,例如“<bos> What is your name? <eos>”。

请记住,解码器的输入和输出长度必须相同。因此,在将目标序列传递给解码器之前,需要移除每个目标序列的最后一个标记。如果目标序列存储在trg中,那么解码器的输入将是trg[:, :-1],用于选择除最后一个标记之外的所有内容,这可以在上面的目标输入中看到。预期的输出将是trg[:, 1:],即除第一个标记之外的所有内容,这是上面看到的预期输出。

总结来说,与编码器层一样,解码器也需要对其输入进行掩码处理。虽然填充掩码对于输入是必要的,但目标序列也需要一个前视或后续掩码。在推理过程中,模型只会被提供一个开始标记,并必须基于它预测下一个标记。然后,给定两个标记,它必须预测第三个标记。这个过程会一直重复,直到预测出序列结束标记。这就是Transformer的自回归行为。换句话说,未来的标记只基于过去的标记和来自编码器的嵌入进行预测。

为了模拟这种行为,模型使用后续掩码同时学习所有这些迭代。

可以使用PyTorch的torch.tril函数来创建后续掩码。它将具有(trg_seq_length, trg_seq_length)的形状。

填充掩码&目标掩码

对于序列中的每个标记,概率分布只能考虑之前的标记。但是,由于目标序列也必须进行填充,因此填充掩码和后续掩码必须结合使用。

这可以通过使用 & 运算符轻松实现,该运算符仅在两个掩码都为1时才返回1。

这个最终的目标掩码必须为每个批次中的序列创建,这意味着它将具有(batch_size, 1, trg_seq_length, trg_seq_length)的形状。这个掩码将在每个头之间进行广播。

原文链接:https://medium.com/@hunter-j-phillips/the-decoder-8882c33de69a

这篇关于Transformer模型-decoder解码器,target mask目标掩码的简明介绍的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/899956

相关文章

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

python+opencv处理颜色之将目标颜色转换实例代码

《python+opencv处理颜色之将目标颜色转换实例代码》OpenCV是一个的跨平台计算机视觉库,可以运行在Linux、Windows和MacOS操作系统上,:本文主要介绍python+ope... 目录下面是代码+ 效果 + 解释转HSV: 关于颜色总是要转HSV的掩膜再标注总结 目标:将红色的部分滤

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应

MySQL中慢SQL优化的不同方式介绍

《MySQL中慢SQL优化的不同方式介绍》慢SQL的优化,主要从两个方面考虑,SQL语句本身的优化,以及数据库设计的优化,下面小编就来给大家介绍一下有哪些方式可以优化慢SQL吧... 目录避免不必要的列分页优化索引优化JOIN 的优化排序优化UNION 优化慢 SQL 的优化,主要从两个方面考虑,SQL 语

C++中函数模板与类模板的简单使用及区别介绍

《C++中函数模板与类模板的简单使用及区别介绍》这篇文章介绍了C++中的模板机制,包括函数模板和类模板的概念、语法和实际应用,函数模板通过类型参数实现泛型操作,而类模板允许创建可处理多种数据类型的类,... 目录一、函数模板定义语法真实示例二、类模板三、关键区别四、注意事项 ‌在C++中,模板是实现泛型编程

Python实现html转png的完美方案介绍

《Python实现html转png的完美方案介绍》这篇文章主要为大家详细介绍了如何使用Python实现html转png功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 1.增强稳定性与错误处理建议使用三层异常捕获结构:try: with sync_playwright(

Java使用多线程处理未知任务数的方案介绍

《Java使用多线程处理未知任务数的方案介绍》这篇文章主要为大家详细介绍了Java如何使用多线程实现处理未知任务数,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 知道任务个数,你可以定义好线程数规则,生成线程数去跑代码说明:1.虚拟线程池:使用 Executors.newVir

JAVA SE包装类和泛型详细介绍及说明方法

《JAVASE包装类和泛型详细介绍及说明方法》:本文主要介绍JAVASE包装类和泛型的相关资料,包括基本数据类型与包装类的对应关系,以及装箱和拆箱的概念,并重点讲解了自动装箱和自动拆箱的机制,文... 目录1. 包装类1.1 基本数据类型和对应的包装类1.2 装箱和拆箱1.3 自动装箱和自动拆箱2. 泛型2

C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)

《C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)》本文主要介绍了C#集成DeepSeek模型实现AI私有化的方法,包括搭建基础环境,如安装Ollama和下载DeepS... 目录前言搭建基础环境1、安装 Ollama2、下载 DeepSeek R1 模型客户端 ChatBo

SpringBoot快速接入OpenAI大模型的方法(JDK8)

《SpringBoot快速接入OpenAI大模型的方法(JDK8)》本文介绍了如何使用AI4J快速接入OpenAI大模型,并展示了如何实现流式与非流式的输出,以及对函数调用的使用,AI4J支持JDK8... 目录使用AI4J快速接入OpenAI大模型介绍AI4J-github快速使用创建SpringBoot