Bert基础(四)--解码器(上)

news2025/1/12 5:54:46

1 理解解码器

假设我们想把英语句子I am good(原句)翻译成法语句子Je vais bien(目标句)。首先,将原句I am good送入编码器,使编码器学习原句,并计算特征值。在前文中,我们学习了编码器是如何计算原句的特征值的。然后,我们把从编码器求得的特征值送入解码器。解码器将特征值作为输入,并生成目标句Je vais bien,如下图所示。

Transformer的编码器和解码器
在编码器部分,我们了解到可以叠加N个编码器。同理,解码器也可以有N个叠加在一起。为简化说明,我们设定N=2。如图所示,一个解码器的输出会被作为输入传入下一个解码器。我们还可以看到,编码器将原句的特征值(编码器的输出)作为输入传给所有解码器,而非只给第一个解码器。因此,一个解码器(第一个除外)将有两个输入:一个是来自前一个解码器的输出,另一个是编码器输出的特征值。
在这里插入图片描述

2 工作步骤

接下来,我们学习解码器究竟是如何生成目标句的。当 t = 1 t=1 t=1时(t表示时间步),解码器的输入是<sos>,这表示句子的开始。解码器收到<sos>作为输入,生成目标句中的第一个词,即Je,如图所示。

在这里插入图片描述
t = 2 t=2 t=2时,解码器使用当前的输入和在上一步( t = 1 t=1 t=1)生成的单词,预测句子中的下一个单词。在本例中,解码器将<sos>和Je(来自上一步)作为输入,并试图生成目标句中的下一个单词,如图所示。
在这里插入图片描述
同理,可以推断出解码器在 t = 3 t=3 t=3时的预测结果。此时,解码器将<sos>、Je和vais(来自上一步)作为输入,并试图生成句子中的下一个单词,如图所示
在这里插入图片描述
在每一步中,解码器都将上一步新生成的单词与输入的词结合起来,并预测下一个单词。因此,在最后一步( t = 4 t=4 t=4),解码器将<sos>、Je、vais和bien作为输入,并试图生成句子中的下一个单词,如图所示。
在这里插入图片描述
从上图中可以看到,一旦生成表示句子结束的<eos>标记,就意味着解码器已经完成了对目标句的生成工作。

3 位置编码

在编码器部分,我们将输入转换为嵌入矩阵,并将位置编码添加到其中,然后将其作为输入送入编码器。同理,我们也不是将输入直接送入解码器,而是将其转换为嵌入矩阵,为其添加位置编码,然后再送入解码器。

如下图所示,假设在时间步 t = 2 t=2 t=2,我们将输入转换为嵌入(我们称之为嵌入值输出,因为这里计算的是解码器在以前的步骤中生成的词的嵌入),将位置编码加入其中,然后将其送入解码器。
在这里插入图片描述
接下来,让我们深入了解解码器的工作原理。一个解码器模块及其所有的组件如图:
在这里插入图片描述
从图中可以看到,解码器内部有3个子层。

  • 带掩码的多头注意力层
  • 多头注意力层
  • 前馈网络层

与编码器模块相似,解码器模块也有多头注意力层和前馈网络层,但多了带掩码的多头注意力层。现在,我们对解码器有了基本的认识。接下来,让我们先详细了解解码器的每个组成部分,然后从整体上了解它的工作原理。

4 带掩码的多头注意力层

以英法翻译任务为例,假设训练数据集样本如图所示
在这里插入图片描述
数据集由两部分组成:原句和目标句。在前面,我们学习了解码器在测试期间是如何在每个步骤中逐字预测目标句的。

在训练期间,由于有正确的目标句,解码器可以直接将整个目标句稍作修改作为输入。解码器将输入的<sos>作为第一个标记,并在每一步将下一个预测词与输入结合起来,以预测目标句,直到遇到<eos>标记为止。因此,我们只需将<sos>标记添加到目标句的开头,再将整体作为输入发送给解码器。

比如要把英语句子I am good转换成法语句子Je vais bien。我们只需在目标句的开头加上<sos>标记,并将<sos>Je vais bien作为输入发送给解码器。解码器将预测输出为Je vais bien<eos>,如图所示。
在这里插入图片描述
为什么我们需要输入整个目标句,让解码器预测位移后的目标句呢?下面来解答。

首先,我们不是将输入直接送入解码器,而是将其转换为嵌入矩阵(输出嵌入矩阵)并添加位置编码,然后再送入解码器。假设添加输出嵌入矩阵和位置编码后得到图所示的矩阵X。

在这里插入图片描述
然后,将矩阵X送入解码器。解码器中的第一层是带掩码的多头注意力层。这与编码器中的多头注意力层的工作原理相似,但有一点不同。

为了运行自注意力机制,我们需要创建三个新矩阵,即查询矩阵Q、键矩阵K和值矩阵V。由于使用多头注意力层,因此我们创建了h个查询矩阵、键矩阵和值矩阵。对于注意力头 i i i的查询矩阵 Q i Q_i Qi、键矩阵 K i K_i Ki和值矩阵 V i V_i Vi,可以通过将X分别乘以权重矩阵 W i Q , W i K , W i V W_i^Q, W_i^K, W_i^V WiQ,WiK,WiV而得。

下面,让我们看看带掩码的多头注意力层是如何工作的。假设传给解码器的输入句是<sos>Je vais bien。我们知道,自注意力机制将一个单词与句子中的所有单词联系起来,从而提取每个词的更多信息。但这里有一个小问题。在测试期间,解码器只将上一步生成的词作为输入。

比如,在测试期间,当 t = 2 t=2 t=2时,解码器的输入中只有[<sos>, Je],并没有任何其他词。因此,我们也需要以同样的方式来训练模型。模型的注意力机制应该只与该词之前的单词有关,而不是其后的单词。要做到这一点,我们可以掩盖后边所有还没有被模型预测的词。

比如,我们想预测与<sos>相邻的单词。在这种情况下,模型应该只看到<sos>,所以我们应该掩盖<sos>后边的所有词。再比如,我们想预测Je后边的词。在这种情况下,模型应该只看到Je之前的词,所以我们应该掩盖Je后边的所有词。其他行同理,如图所示。
在这里插入图片描述
像这样的掩码有助于自注意力机制只注意模型在测试期间可以使用的词。但我们究竟如何才能实现掩码呢?我们学习过对于一个注意力头 Z 1 Z_1 Z1的注意力矩阵[插图]的计算方法,公式如下。
Z i = s o f t m a x ( Q i ⋅ K i T d k ) V i Z_i = softmax(\frac{Q_i·K_i^T}{\sqrt{d_k}})V_i Zi=softmax(dk QiKiT)Vi

计算注意力矩阵的第1步是计算查询矩阵与键矩阵的点积。下图显示了点积结果。需要注意的是,这里使用的数值是随机的,只是为了方便理解。

在这里插入图片描述
第二步是将 Q i ⋅ K i T Q_i·K_i^T QiKiT矩阵除以键向量维度的平方根 d k \sqrt{d_k} dk 。假设下图是 Q i ⋅ K i T / d k Q_i·K_i^T/\sqrt{d_k} QiKiT/dk 的结果。
在这里插入图片描述
第3步,我们对上图所得的矩阵应用softmax函数,并将分值归一化。但在应用softmax函数之前,我们需要对数值进行掩码转换。以矩阵的第1行为例,为了预测<sos>后边的词,模型不应该知道<sos>右边的所有词(因为在测试时不会有这些词)。因此,我们可以用 − ∞ - \infty 掩盖<sos>右边的所有词,如图所示。
在这里插入图片描述
接下来,让我们看矩阵的第2行。为了预测Je后边的词,模型不应该知道Je右边的所有词(因为在测试时不会有这些词)。因此,我们可以用 − ∞ - \infty 掩盖Je右边的所有词,如图所示。
在这里插入图片描述
同理,我们可以用 − ∞ - \infty 掩盖vais右边的所有词,如图所示。
在这里插入图片描述
现在,我们可以将softmax函数应用于前面的矩阵,并将结果与值矩阵 V i V_i Vi相乘,得到最终的注意力矩阵 Z i Z_i Zi。同样,我们可以计算h个注意力矩阵,将它们串联起来,并将结果乘以新的权重矩阵 W 0 W_0 W0,即可得到最终的注意力矩阵M,如下所示
M = C o n c a t e n a t e ( Z 1 , Z 2 , … … , Z h ) W 0 M = Concatenate(Z_1, Z_2,……,Z_h)W_0 M=Concatenate(Z1,Z2,……,Zh)W0

最后,我们把注意力矩阵M送到解码器的下一个子层,也就是另一个多头注意力层。

待更。。。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1471344.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring Boo项目中方法参数对象中字段上存在的自定义注解如何进行拦截解析

一、前言 在Spring Boot项目开发过程中&#xff0c;我们经常会使用到自定义注解的方式进行业务逻辑开发&#xff0c;此时注解我们一般是放在方法或者类上面&#xff0c;通过AOP切面拦截的方式进行自定义业务逻辑填充。但是如果自定义注解放在类的字段上&#xff0c;此时应该如…

Power Apps-组件使用全局变量

组件并不可以直接使用全局变量&#xff0c;若想使用全局变量可以使用如下方法&#xff1a; 首先点击整个组件&#xff0c;在右侧边栏中找到自定义属性&#xff0c;点击添加新的自定义属性 填写相关信息&#xff0c;显示名称和名称填写全局变量名称&#xff0c;说明随意编辑 再…

MATLAB环境下基于距离正则化水平集演化方法的图像分割

水平集图像分割方法实际上是基于曲线演化理论的一种数学方法在图像上的表示&#xff0c;能够处理曲线的拓扑结构变化&#xff0c;而且其数值实现的稳定性高,医学超声图像由于其成像原理一般会具有较高的斑点噪声并且一些区域存在对比度低的情况。传统的图像分割算法并不能在医学…

租赁小程序|租赁系统|租赁软件开发带来高效运营

随着社会的不断发展和科技的不断进步&#xff0c;越来越多的企业开始关注设备租赁业务。设备租赁作为一种短期使用设备的方式&#xff0c;为企业提供了灵活和成本节约的优势。针对设备租赁业务的管理和提升企业竞争力的需求&#xff0c;很多企业选择定制开发设备租赁系统。本文…

【每日一题】938. 二叉搜索树的范围和-2024.2.26

题目&#xff1a; 938. 二叉搜索树的范围和 给定二叉搜索树的根结点 root&#xff0c;返回值位于范围 [low, high] 之间的所有结点的值的和。 示例 1&#xff1a; 输入&#xff1a;root [10,5,15,3,7,null,18], low 7, high 15 输出&#xff1a;32示例 2&#xff1a; 输入…

ESP32(VSCode+PlatformIO)开发环境搭建教程(2024版)

目录 一、安装vscode&#xff1a;[点击下载](https://code.visualstudio.com/Download)二、安装Python环境三、安装VSCode platformio插件四、使用PlatformIO创建项目五、编译下载 一、安装vscode&#xff1a;点击下载 二、安装Python环境 本文以Win11系统做演示&#xff0c;其…

Unity(第六部)向量的理解和算法

标量:只有大小的量。185 888 999 &#xff08;类似坐标&#xff09; 向量:既有大小&#xff0c;也有方向。&#xff08;类似以个体为主体的方向&#xff0c;前方一百米&#xff09; 向量的模:向量的大小。&#xff08;类似以个体为主体的方向&#xff0c;前方一百米、只取一百米…

配置用户自动获取IPv6地址的案例

知识改变命运&#xff0c;技术就是要分享&#xff0c;有问题随时联系&#xff0c;免费答疑&#xff0c;欢迎联系&#xff01; ​​​​​​https://www.xmws.cn华为认证\华为HCIA-Datacom\华为HCIP-Datacom\华为HCIE-DatacomLinux\RHCE\RHCE 9.0\RHCA\ Oracle OCP\CKA\K8S\ CIS…

蓝桥杯-最小砝码

知识点&#xff1a;本题主要考察任何一个物体都可以用 3进制表示。 #include <iostream> #include<cmath> using namespace std; //知识点:任何一个物体都可以用 3进制表示 int main() { int n; cin >> n; int sum 0; for (int i 0;; i)…

初学学习408之数据结构--数据结构基本概念

初学学习408之数据结构我们先来了解一下数据结构的基本概念。 数据结构&#xff1a;是相互之间存在一种或多种特定关系的数据元素的集合。 本内容来源于参考书籍《大话数据结构》与《王道数据结构》。除去书籍中的内容&#xff0c;作为初学者的我会尽力详细直白地介绍数据结构的…

【Prometheus】概念和工作原理介绍

目录 一、概述 1.1 prometheus简介 1.2 prometheus特点 1.3 prometheus架构图 1.4 prometheus组件介绍 1、Prometheus Server 2、Client Library 3、pushgateway 4、Exporters 5、Service Discovery 6、Alertmanager 7、grafana 1.5 Prometheus 数据流向 1.6 Pro…

liunx前后端分离项目部署

文章目录 1、nginx的安装和自启动2.nginx负载均衡3.前后端项目部署-后端部署4.前后端项目部署-前端部署 1、nginx的安装和自启动 yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel1.安装我们nginx所需要的依赖 wget http://nginx.org/download/nginx-1.…

S32 Design Studio PE工具配置TMR

配置步骤 配置内容 生成的配置结构体如下&#xff0c;在Generated_Code路径下的lpTmr.c文件和lpTmr.h文件。 /*! lpTmr1 configuration structure */ const lptmr_config_t lpTmr1_config0 {.workMode LPTMR_WORKMODE_PULSECOUNTER,.dmaRequest false,.interruptEnable tr…

《高质量的C/C++编程规范》学习

目录 一、编程规范基础知识 1、头文件 2、程序的板式风格 3、命名规则 二、表达式和基本语句 1、运算符的优先级 2、复合表达式 3、if语句 4、循环语句的效率 5、for循环语句 6、switch语句 三、常量 1、#define和const比较 2、常量定义规则 四、函数设计 1、参…

npm i卡在 idealTree buildDeps没反应的解决方案

通过git clone拉下项目后&#xff0c;进行项目的初始化下包时&#xff0c;发现npm i 并没有反应&#xff08;如图&#xff09;&#xff1a; 关键点&#xff1a;IdealTree 1.网络问题 确保你的网络连接正常&#xff0c;能够正常访问 npm 仓库。有时网络问题可能导致包无法正确…

GitHub下载器,老司机懂的都懂!

有些老司机或者做项目的小伙伴对GitHub应该不陌生吧&#xff0c;然而GitHub的下载速度非常让人不忍直视&#xff01; 而GitHub高速下载器是一款专门用于加速在GitHub上下载资源的软件&#xff0c;解决了许多用户在下载GitHub资源时遭遇的速度慢和下载失败的问题。 本教程将详细…

代码随想录算法训练营第62天 | 739.每日温度 496.下一个更大元素I

每日温度 如果我们单纯的遍历数组&#xff0c;我们不知道当前元素是否比之前的元素大&#xff0c;所以需要维护一个容器来记录遍历过的元素。 什么时候用单调栈&#xff1f;通常是一维数组&#xff0c;要寻找任一个元素的右边或左边第一个比自己大或小的元素的位置。时间复杂度…

Connection管理类实现(模块六)

目录 类功能 类定义 类实现 编译 本文使用了自定的Any类 Any类的简单实现-CSDN博客 类功能 类定义 // DISCONECTED -- 连接关闭状态 CONNECTING -- 连接建立成功-待处理状态 // CONNECTED -- 连接建立完成,各种设置已完成,可以通信状态 DISCONNECTING -- 待关闭状态 t…

每日五道java面试题之spring篇(六)

目录&#xff1a; 第一题 ApplicationContext通常的实现是什么&#xff1f;第二题 什么是Spring的依赖注入&#xff1f;第三题 依赖注入的基本原则第四题 依赖注入有什么优势&#xff1f;第五题 有哪些不同类型的依赖注入实现方式&#xff1f; 第一题 ApplicationContext通常的…

基于频率增强的数据增广的视觉语言导航方法(VLN论文阅读)

基于频率增强的数据增广的视觉语言导航方法&#xff08;VLN论文阅读&#xff09; 摘要 视觉和语言导航&#xff08;VLN&#xff09;是一项具有挑战性的任务&#xff0c;它需要代理基于自然语言指令在复杂的环境中导航。 在视觉语言导航任务中&#xff0c;之前的研究主要是在空间…