编码器-解码器 | 基于 Transformers 的编码器-解码器模型

news2024/12/24 3:13:03

基于 transformer 的编码器-解码器模型是 表征学习模型架构 这两个领域多年研究成果的结晶。本文简要介绍了神经编码器-解码器模型的历史,更多背景知识,建议读者阅读由 Sebastion Ruder 撰写的这篇精彩 博文。此外,建议读者对 自注意力 (self-attention) 架构 有一个基本了解,可以阅读 Jay Alammar 的 这篇博文 复习一下原始 transformer 模型。

本文分 4 个部分:

  • 背景 - 简要回顾了神经编码器-解码器模型的历史,重点关注基于 RNN 的模型。

  • 编码器-解码器 - 阐述基于 transformer 的编码器-解码器模型,并阐述如何使用该模型进行推理。

  • 编码器 - 阐述模型的编码器部分。

  • 解码器 - 阐述模型的解码器部分。

每个部分都建立在前一部分的基础上,但也可以单独阅读。这篇分享是第二部分 编码器-解码器。如果你还没有看过 第一部分 背景,可以先读一读。

编码器-解码器

2017 年,Vaswani 等人引入了 transformer 架构,从而催生了 基于 transformer 的编码器-解码器模型。

与基于 RNN 的编码器-解码器模型类似,基于 transformer 的编码器-解码器模型由一个编码器和一个解码器组成,且其编码器和解码器均由 残差注意力模块 (residual attention blocks) 堆叠而成。基于 transformer 的编码器-解码器模型的关键创新在于: 残差注意力模块无需使用循环结构即可处理长度 可变的输入序列 。不依赖循环结构使得基于 transformer 的编码器-解码器可以高度并行化,这使得模型在现代硬件上的计算效率比基于 RNN 的编码器-解码器模型高出几个数量级。

回忆一下,要解决 序列到序列 问题,我们需要找到输入序列 到变长输出序列 的映射。我们看看如何使用基于 transformer 的编码器-解码器模型来找到这样的映射。

与基于 RNN 的编码器-解码器模型类似,基于 transformer 的编码器-解码器模型定义了在给定输入序列 条件下目标序列 的条件分布:

基于 transformer 的编码器部分将输入序列 编码为 隐含状态序列 ,即:

然后,基于 transformer 的解码器负责建模在给定隐含状态序列 的条件下目标向量序列 的概率分布:

根据贝叶斯法则,该序列分布可被分解为每个目标向量 在给定隐含状态 和其所有前驱目标向量 时的条件概率之积:

因此,在生成 时,基于 transformer 的解码器将隐含状态序列 及其所有前驱目标向量 映射到 logit 向量 。然后经由 softmax 运算对 logit 向量 进行处理,从而生成条件分布 。这个流程跟基于 RNN 的解码器是一样的。然而,与基于 RNN 的解码器不同的是,在这里,目标向量 的分布是 显式 (或直接) 地以其所有前驱目标向量 为条件的,稍后我们将详细介绍。此处第 0 个目标向量 仍表示为 向量。有了条件分布 ,我们就可以  自回归 生成输出了。至此,我们定义了可用于推理的从输入序列 到输出序列 的映射。

我们可视化一下使用 基于 transformer 的编码器-解码器模型 _自回归_地生成序列的完整过程。

1e790bc81b814f169e5056026418f66c.png

上图中,绿色为基于 transformer 的编码器,红色为基于 transformer 的解码器。与上一节一样,我们展示了如何将表示为 ,,,,,, 的英语句子 “I want to buy a car” 翻译成表示为 ,,,,,, 的德语句子 “Ich will ein Auto kaufen”。

首先,编码器将完整的输入序列 = “I want to buy a car” (由浅绿色向量表示) 处理为上下文相关的编码序列 。这里上下文相关的意思是, 举个例子 , 的编码不仅取决于输入 = “buy”,还与所有其他词 “I”、“want”、“to”、“a”、“car” 及 “EOS” 相关,这些词即该词的 上下文

接下来,输入编码 与 BOS 向量 ( ) 被一起馈送到解码器。解码器将输入 和   变换为第一个 logit (图中以深红色显示),从而得到第一个目标向量 的条件分布:

然后,从该分布中采样出第一个目标向量 = (由灰色箭头表示),得到第一个输出后,我们会并将其继续馈送到解码器。现在,解码器开始以 = “BOS” 和   = “Ich” 为条件来定义第二个目标向量的条件分布 :

再采样一次,生成目标向量 = “will”。重复该自回归过程,直到第 6 步从条件分布中采样到 EOS:

这里有一点比较重要,我们仅在第一次前向传播时用编码器将 映射到 。从第二次前向传播开始,解码器可以直接使用之前算得的编码 。为清楚起见,下图画出了上例中第一次和第二次前向传播所需要做的操作。

4b342372ac6807731d67ec0f9326cb51.png

可以看出,仅在步骤 时,我们才需要将 “I want to buy a car EOS” 编码为 。从 开始,解码器只是简单地复用了已生成的编码。

在 🤗 transformers 库中,这一自回归生成过程是在调用 .generate() 方法时在后台完成的。我们用一个翻译模型来实际体验一下。

from transformers import MarianMTModel, MarianTokenizer

tokenizer = MarianTokenizer.from_pretrained("Helsinki-NLP/opus-mt-en-de")
model = MarianMTModel.from_pretrained("Helsinki-NLP/opus-mt-en-de")

# create ids of encoded input vectors
input_ids = tokenizer("I want to buy a car", return_tensors="pt").input_ids

# translate example
output_ids = model.generate(input_ids)[0]

# decode and print
print(tokenizer.decode(output_ids))

输出:

<pad> Ich will ein Auto kaufen

.generate() 接口做了很多事情。首先,它将 input_ids 传递给编码器。然后,它将一个预定义的标记连同已编码的 input_ids 一起传递给解码器 (在使用 MarianMTModel 的情况下,该预定义标记为 )。接着,它使用波束搜索解码机制根据最新的解码器输出的概率分布 自回归地采样下一个输出词。更多有关波束搜索解码工作原理的详细信息,建议阅读 这篇博文。

我们在附录中加入了一个代码片段,展示了如何“从头开始”实现一个简单的生成方法。如果你想要完全了解 自回归 生成的幕后工作原理,强烈建议阅读附录。

总结一下:

  • 基于 transformer 的编码器实现了从输入序列 到上下文相关的编码序列 之间的映射。

  • 基于 transformer 的解码器定义了条件分布 。

  • 给定适当的解码机制,可以自回归地从 中采样出输出序列 。

太好了,现在我们已经大致了解了 基于 transformer 的 编码器-解码器模型的工作原理。下面的部分,我们将更深入地研究模型的编码器和解码器部分。更具体地说,我们将确切地看到编码器如何利用自注意力层来产生一系列上下文相关的向量编码,以及自注意力层如何实现高效并行化。然后,我们将详细解释自注意力层在解码器模型中的工作原理,以及解码器如何通过 交叉注意力 层以编码器输出为条件来定义分布 。在此过程中,基于 transformer 的编码器-解码器模型如何解决基于 RNN 的编码器-解码器模型的长程依赖问题的答案将变得显而易见。


可以从 此处 获取 "Helsinki-NLP/opus-mt-en-de" 的解码参数。可以看到,其使用了 num_beams=6 的波束搜索。

敬请关注其余部分的文章。


英文原文: https://hf.co/blog/encoder-decoder

原文作者: Patrick von Platen

译者: Matrix Yao (姚伟峰),英特尔深度学习工程师,工作方向为 transformer-family 模型在各模态数据上的应用及大规模模型的训练推理。

审校/排版: zhongdongy (阿东)

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

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

相关文章

PYtriton:从Python提供的Triton Inference Server

env sudo docker run -it --shm-size 8gb --rm --gpusall -p 8126:8000 -v ${PWD}:/test nvcr.io/nvidia/pytorch:23.04-py3 bash sudo docker run -it --shm-size 8gb --rm --gpusall -v ${PWD}:/test nvcr.io/nvidia/pytorch:23.04-py3 bash 服务端Docker : sudo docker ru…

chatgpt赋能python:Python关闭应用程序:如何安全、有效地终止进程

Python关闭应用程序&#xff1a;如何安全、有效地终止进程 Python是一种流行的编程语言&#xff0c;广泛应用于各种领域和行业。在实际的开发工作中&#xff0c;我们常常需要处理进程的启动和终止问题。无论是在测试环境还是在生产环境中&#xff0c;安全有效地终止进程都是至…

一个job问题引出的Oracle官方文档的差错

同事提了个问题&#xff0c;PLSQL Developer连接Oracle 11g创建编辑job都正常&#xff0c;但是相同的PLSQL Developer连接Oracle 19c能创建job&#xff0c;但是选择编辑&#xff0c;就会提示如下日期格式错误&#xff0c; 看了一些资料&#xff0c;有的说是操作系统和Oracle的日…

【实用篇】RabbitMQ

文章目录 RabbitMQ1.初识MQ1.1.同步和异步通讯1.1.1.同步通讯1.1.2.异步通讯 1.2.技术对比&#xff1a; 2.快速入门2.1.安装RabbitMQ2.1.1.单机部署下载镜像安装MQ 2.2.RabbitMQ消息模型2.3.导入Demo工程2.4.入门案例2.4.1.publisher实现2.4.2.consumer实现 2.5.总结 3.SpringA…

【服务器】树洞外链搭建图床操作系统

文章目录 1.前言2. 树洞外链网站搭建2.1. 树洞外链下载和安装2.2 树洞外链网页测试2.3 cpolar的安装和注册 3. 本地网页发布3.1 Cpolar临时数据隧道3.2 Cpolar稳定隧道&#xff08;云端设置&#xff09;3.3 Cpolar稳定隧道&#xff08;本地设置&#xff09; 4. 公网访问测试5. …

Java on VS Code 5月更新|性能、用户体验改进以及 Spring Boot 集成

作者&#xff1a;Nick Zhu - Senior Program Manager, Developer Division at Microsoft 排版&#xff1a;Alan Wang 大家好&#xff0c;欢迎来到 Visual Studio Code Java 的 5 月更新&#xff01;在本月的博客中&#xff0c;我们有大量新功能&#xff0c;涵盖性能改进、用户体…

完成MQTT客户端,前几年的欠债还上了

最近有点儿忙&#xff0c;努力方向很重要&#xff0c;最近VFP硬件开发课已完结&#xff0c;顺便补一下前面欠的MQTT完整客户端&#xff0c;支持QOS0,OQS1,LAST WILLMSG. QOS2的支持看有需求再说了。 猫猫的心里话 加菲猫的VFP|狐友会社群接收投稿啦 加菲猫的VFP&#xff0c;用…

Python Playwright API使用实例详解

下方查看历史精选文章 重磅发布 - 自动化框架基础指南pdfv1.1大数据测试过程、策略及挑战 测试框架原理&#xff0c;构建成功的基石 在自动化测试工作之前&#xff0c;你应该知道的10条建议 在自动化测试中&#xff0c;重要的不是工具 什么是 Playwright Playwright 是一个 Nod…

38从零开始学Java之封装到底是咋回事?

作者&#xff1a;孙玉昌&#xff0c;昵称【一一哥】&#xff0c;另外【壹壹哥】也是我哦 千锋教育高级教研员、CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者 前言 我们知道&#xff0c;Java是面向对象的编程语言。关于面向对象的概念&#xff0c;壹哥在之前的文章中…

【linux】进程: systemd、systemctl

状态 R —— 运行S&#xff08;TASK_INTERRUPTIBLE&#xff09; —— 等待&#xff0c;可中断&#xff0c;IOD&#xff08;TASK_UNINTERRUPTIBLE&#xff09; —— 等待&#xff0c;不可中断K&#xff08;TASK_KILLABLE&#xff09; —— 等待&#xff0c;可删除&#xff0c;I…

chatgpt赋能python:Python内置函数大全表

Python 内置函数大全表 Python 是一种强大的编程语言&#xff0c;拥有许多有用的内置函数。这些函数可以在编写 Python 代码时大大简化开发人员的工作流程。本文提供了一张Python内置函数的大全表&#xff0c;以及每个函数的简要说明。 内置函数列表 以下是 Python 的内置函…

Elasticsearch:在 Elasticsearch 中使用 NLP 和矢量搜索增强聊天机器人功能

作者&#xff1a;Priscilla Parodi 会话界面已经存在了一段时间&#xff0c;并且作为协助各种任务&#xff08;例如客户服务、信息检索和任务自动化&#xff09;的一种方式而变得越来越流行。 通常通过语音助手或消息应用程序访问&#xff0c;这些界面模拟人类对话&#xff0c;…

众议院压倒性通过!

* * * 原创&#xff1a;刘教链 * * * 号外&#xff1a;今天在小号“刘教链Pro”发表了一篇《大V出货了》&#xff0c;欢迎关注“刘教链Pro”并阅读。 * * * 隔夜比特币回升至27k上方。 万众瞩目的美债危机到了千钧一发之际。继周日美国总统拜登和众议院议长麦卡锡初步达成口头…

618特辑 | 人到中年的品质生活,是我对自己的最大尊重

点击文末“阅读原文”即可参与节目互动 剪辑、音频 / 卷圈 运营 / SandLiu 卷圈 监制 / 姝琦 文案 / 粒粒 封面 / 姝琦midjourney 产品统筹 / bobo 场地支持 / 声湃轩北京录音间 不知从什么时候开始&#xff0c;我们开始高亮“实用主义”的生活态度&#xff0c;一切以…

FPGA PAL视频BT656解码Video Processing Subsystem去隔行 TW2867采集 提供工程源码和技术支持

目录 1、前言2、我这里已有的PAL视频解码方案3、模拟视频概述4、模拟视频颜色空间5、逐行与隔行6、BT656数据与解码BT656数据格式BT656数据解码 7、TW2867芯片解读与配置TW2867芯片解读TW2867芯片配置TW2867时序分析 8、设计思路与框架9、vivado工程详解Block Design设计SDK设计…

c++实现产品功能(简单基础功能)

通过c++实现公司产品功能,要求能在VS和CB上完美运行,实现的功能基础简单 #include <iostream> #include <string>// 摄像机类 class Camera { public:// 成员函数:拍摄照片void takePhoto() {std::cout << "Take a photo." << std::endl;…

六一儿童节,小灰给大家准备了特别的礼物!

大家好&#xff0c;我是程序员小灰。 熟悉小灰的朋友们都知道&#xff0c;小灰比较擅长写作&#xff0c;却并不善于口头表达。 但是&#xff0c;在2023年&#xff0c;小灰决定搞一件大事情&#xff0c;与我的团队成员共同组建《小灰AI共创汇》。我们这个共创汇的目标&#xff0…

鹅厂专家讲透AI文本生成解码策略与代码实现

&#x1f449;腾小云导读 本文以 huggingface-transformers 的文本生成解码代码为例&#xff0c;对文本生成常用的五种解码策略 greedy search、beam search、sample、sample and rank & beam sample、group beam search 进行逐行解读。每一小节首先会介绍对应解码策略的原…

JavaScript实现输入数字,通过数组方式将它们连接起来的代码

以下为实现输入数字&#xff0c;通过数组方式将它们连接起来的程序代码和运行截图 目录 前言 一、输入数字&#xff0c;通过数组方式将它们连接起来 1.1 运行流程及思想 1.2 代码段 1.3 JavaScript语句代码 1.4 运行截图 前言 1.若有选择&#xff0c;您可以在目录里进行…

JetBrains的.NET和ASP.NET集成开发环境Rider 2023版本在Win10系统的下载与安装配置教程

目录 前言一、Rider 安装二、使用配置总结 前言 Rider是一款专为.NET和ASP.NET开发人员设计的集成开发环境&#xff08;IDE&#xff09;。它提供了丰富的功能和工具&#xff0c;可以帮助开发人员更高效地编写、调试和部署.NET和ASP.NET应用程序。 Rider的主要特点&#xff1a…