一、通俗总结

Seq2Seq 就像一个 “序列转换器”:先把输入的一段话 “压缩成一个核心意思”,再根据这个意思 “一句句生成另一段话”,能搞定翻译、听写这类 “输入输出不一样长” 的任务,但太长的内容可能记不全,还容易越错越离谱。

二、拆解知识步骤

1. 由来的背景

传统序列模型(如 RNN)只能处理 “输入输出长度固定” 或 “等长” 的任务(如文本分类、情感分析),但现实中很多任务需要 “不等长序列转换”:

  • 机器翻译:输入中文句子(长度 5)→ 输出英文句子(长度 7)
  • 语音转文字:输入音频序列(时长 3 秒)→ 输出文字序列(长度 10)
  • 问答系统:输入问题(长度 8)→ 输出答案(长度 5)
    这些场景下,需要一种能 “吃进一个序列,吐出另一个长度不同的序列” 的模型,Seq2Seq 由此被提出(2014 年由 Google 团队提出)。

2. 目标及解决的问题

  • 目标:实现 “任意长度输入序列→任意长度输出序列” 的端到端转换,无需人工设计特征。
  • 解决的问题:
    • 解决 “输入输出长度不固定” 的问题:突破传统模型对序列长度的限制。
    • 解决 “序列依赖捕捉” 的问题:通过编码器逐词处理输入,捕捉词与词的时序关系(如 “机器学习” 中 “机器” 和 “学习” 的关联)。
    • 解决 “跨模态转换” 的问题:支持文本→文本(翻译)、语音→文本(听写)、文本→语音(合成)等跨类型序列转换。

3. 怎么实现的

我们看seq2seq做了干了什么事情? seq2seq模型的输入可以是一个 (单词、字母或者图像特征) 序列, 输出是另外一个(单词、字母或者图像特征) 序列, 一个训练好的seq2seq模型如下图所示 :

如下图所示,以NLP中的机器翻译任务为例, 序列指的是一连串的单词, 输出也是一连串的单词

将上图蓝色的模型进行拆解, 如下图所示: seq2seq模型由编码器(Encoder) 和解码器(Decoder) 组成。绿色的编码器会处理输入序列中的每个元素并获得输入信息,这些信息会被转换成为一个黄色的向量(称为context向量)。当我们处理完整个输入序列后,编码器把 context向量 发送给紫色的解码器,解码器通过context向量中的信息,逐个元素输出新的序列。

在机器翻译任务中,seq2seq模型实现翻译的过程如下图所示。seq2seq模型中的编码器和解码器一般采用的是循环神经网络RNN,编码器将输入的法语单词序列编码成context向量(在绿色encoder和紫色decoder中间出现),然后解码器根据context向量解码出英语单词序列

我们来看一下黄色的context向量是什么?本质上是一组浮点数。而这个context的数组长度是基于编码器RNN的隐藏层神经元数量的。下图展示了长度为4的context向量,但在实际应用中,context向量的长度是自定义的,比如可能是256,512或者1024.

我们再找个生活中的案例做对比, “翻译官工作流程”:

阶段 1:编码器(理解输入)
  • 角色:像 “翻译官听原文”,逐词 “阅读” 输入序列(如中文句子),每一步记住当前词和之前的内容,最终把整段话的意思压缩成一个 “核心记忆”(上下文向量c)。
  • 工具:常用 LSTM/GRU(带门控机制的 RNN),避免长序列信息丢失(比普通 RNN 更擅长记住早期内容)。
阶段 2:解码器(生成输出)
  • 角色:像 “翻译官说译文”,基于编码器的 “核心记忆”(c),从第一个词开始,结合已说的内容,逐词生成输出序列(如英文句子)。
  • 逻辑:生成每个词时,既要参考 “核心记忆”(确保不偏离原文意思),又要参考已生成的词(确保句子通顺,如生成 “love” 后,更可能接 “machine learning” 而非 “cat”)。

4. 局限性

  • 信息瓶颈:上下文向量c是固定长度(如 512 维),当输入序列过长(如 100 词以上),早期信息会被 “压缩丢失”(类似翻译官记不住长句子的开头)。
  • 累积错误:解码器生成依赖上一个词,若某一步错了(如把 “机器学习” 译成 “machine study”),后续会跟着错(类似翻译错一个词,后面全跑偏)。
  • 无法并行:编码器和解码器都是 “逐词处理”(时序依赖),训练速度慢(比 Transformer 慢 8-10 倍)。
  • 双向信息缺失:编码器虽能看全输入,但解码器生成时只能看已生成的词(单向),难以修正全局错误(如翻译 “我不吃肉”,先译 “I don't eat”,后面很难再补 “meat” 而非 “fish”)。

三、数学表达式及含义

四、Attention的引入

引入注意力机制前, 看看前文说的局限性后, 再思考两个问题:

  • 1、 seq2seq模型处理长文本序列有哪些难点?
  • 2、 基于RNN的seq2seq模型如何结合attention来解决问题1 并提升模型效果?

基于RNN的seq2seq模型编码器所有信息都编码到了一个context向量中,便是这类模型的瓶颈。一方面单个向量很难包含所有文本序列的信息,另一方面RNN递归地编码文本序列使得模型在处理长文本时面临非常大的挑战(比如RNN处理到第500个单词的时候,很难再包含1-499个单词中的所有信息了)。

面对上面的问题, Bahdanau等2014发布的Neural Machine Translation by Jointly Learning to Align and Translate 和 Luong等2015年发布的Effective Approaches to Attention-based Neural Machine Translation 两篇论文中提出了一种叫做注意力attetion的技术。通过attention技术,seq2seq模型极大地提高了机器翻译的质量。归其原因是:attention注意力机制,使得seq2seq模型可以有区分度、有重点地关注输入序列。


让我们继续来理解带有注意力的seq2seq模型:一个注意力模型与经典的seq2seq模型主要有2点不同:

1、首先,编码器会把更多的数据传递给解码器。编码器把所有时间步的hidden state(隐藏层状态)传递给解码器,而不是只传递最后一个hidden state(隐藏层状态),如下面的动态图所示:

2、注意力模型的解码器在产生输出之前,做了一个额外的attention处理。如下图所示,具体为:

  1. 由于编码器中每个hidden state(隐藏层状态)都对应到输入句子中一个单词,那么解码器要查看所有接收到的编码器的hidden state(隐藏层状态)。
  2. 给每个hidden state(隐藏层状态)计算出一个分数(我们先忽略这个分数的计算过程)。
  3. 所有hidden state(隐藏层状态)的分数经过softmax进行归一化。
  4. 将每个hidden state(隐藏层状态)乘以所对应的分数,从而能够让高分对应的 hidden state(隐藏层状态)会被放大,而低分对应的hidden state(隐藏层状态)会被缩小。
  5. 将所有hidden state根据对应分数进行加权求和,得到对应时间步的context向量。

所以,attention可以简单理解为:一种有效的加权求和技术,其艺术在于如何获得权重。


现在,让我们把所有内容都融合到下面的图中,来看看结合注意力的seq2seq模型解码器全流程,动态图展示的是第4个时间步:

  1. 注意力模型的解码器 RNN 的输入包括:一个word embedding 向量,和一个初始化好的解码器 hidden state,图中是 h_init 。
  2. RNN 处理上述的 2 个输入,产生一个输出和一个新的 hidden state,图中为 h_4 。
  3. 注意力的步骤:我们使用编码器的所有 hidden state向量和 h_4 向量来计算这个时间步的context向量( C_4 )。
  4. 再把 h_4 和 C_4 拼接起来,得到一个橙色向量。
  5. 我们把这个橙色向量输入一个前馈神经网络(这个网络是和整个模型一起训练的)。
  6. 根据前馈神经网络的输出向量得到输出单词:假设输出序列可能的单词有 N 个,那么这个前馈神经网络的输出向量通常是 N 维的,每个维度的下标对应一个输出单词,每个维度的数值对应的是该单词的输出概率。
  7. 在下一个时间步重复1-6步骤。

最后,我们可视化一下注意力机制,看看在解码器在每个时间步关注了输入序列的哪些部分

需要注意的是:注意力模型不是无意识地把输出的第一个单词对应到输入的第一个单词,它是在训练阶段学习到如何对两种语言的单词进行对应(在本文的例子中,是法语和英语)

该知识点的学习为我们后续学习Transformer打下坚实的基础

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring MVC BOOT 中体现的设计模式

Spring:创建型:单例模式:Bean默认就是单例的,是饿汉模式的,但是可以通过Lazy设置为懒汉工厂模式:可自定义FactroyBean,实现Bean自己的生产工厂结构型:代理模式:AOP就是典型的动态代理,有jdk和cglib两种实现…

Chrome浏览器调用ActiveX控件之allWebOffice在线编辑控件

背景 allWebOffice控件能够实现在浏览器窗口中在线操作文档的应用(阅读、编辑、保存等),支持编辑文档时保留修改痕迹,支持书签位置内容动态填充,支持公文套红,支持文档保护控制等诸多办公功能,本…

嵌入式 - 硬件:51单片机

本节重点1. MCU、CPU、GPU、NPU、SOC、MPU、FPU2. 内存、外存的区别3. RAM和ROM的区别,单片机RAM大小4. 三大总线及其特点5. 发光二极管分类及其特点6. 数码管显示原理一、嵌入式以应用为中心,以计算机技术为基础,软硬件可裁剪的专用计算机系…

Java Spring Boot 中 Redis 缓存穿透问题排查与解决方案

前言 作为一名普通的 Java 程序开发者,日常开发中难免会遇到一些看似简单但实际排查起来非常棘手的问题。在最近的一个项目中,我遇到了一个 Redis 缓存穿透的问题,导致系统在高并发下性能急剧下降,甚至出现服务响应超时的情况。这…

Ubuntu下配置并远程连接MySQL

1、安装mysql-serverapt update apt install mysql-server2、修改配置文件/etc/mysql/mysql.conf.d/mysqld.cnfbind-address 0.0.0.0 mysqlx-bind-address 0.0.0.03、启动并设置服务为开机自启动systemctl enable mysql.service --now4、查看服务状态systemct…

开源 C++ QT Widget 开发(九)图表--仪表盘

文章的目的为了记录使用C 进行QT Widget 开发学习的经历。临时学习,完成app的开发。开发流程和要点有些记忆模糊,赶紧记录,防止忘记。 相关链接: 开源 C QT Widget 开发(一)工程文件结构-CSDN博客 开源…

怎么为服务器设置或重置服务器密码?

创建服务器后,您可以设置服务器的登录密码,如果你忘记了密码,可以重新设置实例的密码。本文讲一下如何重置阿里云服务器密码。使用限制:离线重置密码仅支持在控制台设置或重置服务器管理员账号的密码。•Windows 实例的默认用户名…

【线性代数入门 | 那忘算8】洛谷P3389 高斯消元(内附行列式教学)

想了想还是单开了一篇,数学王子值得! 专栏指路:《再来一遍一定记住的算法(那些你可能忘记了的算法)》 前置知识: 矩阵:数的集合,一般是方程的系数。 题面: 洛谷P3389 …

GEM5学习(3):如何快速创建一个组件

通过一个图并行计算的测试用例,来学习如何快速构建一个目标组件 其核心思想是通过继承现有组件再拓展自定义参数 创建脚本 如何创建脚本,具体还可以看官方说明:gem5: Adding cache to configuration script mkdir configs/tutorial/part1/…

数据血缘中的图数据库如何选择

Neo4j 和 ArangoDB 都是非常优秀的图数据库,但它们的设计哲学、核心架构和适用场景有显著的区别。 简单来说,核心区别在于: Neo4j 是原生图数据库,专为处理图数据和图查询而设计和优化。ArangoDB 是多模型数据库,同时支…

第27章学习笔记|学无止境:从“会用命令”到“会做工具”的进阶路线

第27章学习笔记|学无止境:从“会用命令”到“会做工具”的进阶路线 你已经能用 PowerShell 解决很多日常问题了。接下来最重要的,就是把零散命令升级为可复用的工具,并在真实场景中不断打磨。 一、为什么下一步是“工具化(Toolmaking)” 当任务开始“重复、多人用、可移…

C++编程语言:标准库:第37章——正则表达式(Bjarne Stroustrup)

第 37章 正则表达式(Regular Expressions) 目录 37.1 正则表达式(规范表达式)(Regular Expressions) 37.1.1 正则表达式相关符号(Regular Express Notation) 37.2 regex 37.2.1 匹配结果(Match Results) 37.2.2 格式化(Formatting) 37.3 正则表达式函数 37.3.1 …

sciml包scixgboost函数发布,轻松完成机器学习xgboost分析

Xgboost是Boosting算法的其中一种,Boosting算法的思想是将许多弱分类器集成在一起,形成一个强分类器。因为Xgboost是一种提升树模型,所以它是将许多树模型集成在一起,形成一个很强的分类器。 我目前整合了多个R包,编写…

Ubuntu中配置JMmeter工具

1、检查是否已安装Java 环境java -version若未安装,执行以下命令安装 OpenJDKsudo apt update sudo apt install openjdk-11-jdk # 或 openjdk-17-jdk2、用wget直接下载JMeter压缩包wget https://dlcdn.apache.org/jmeter/binaries/apache-jmeter-5.6.3.tgz将下载的…

LeetCode 925.长按键入

你的朋友正在使用键盘输入他的名字 name。偶尔,在键入字符 c 时,按键可能会被长按,而字符可能被输入 1 次或多次。 你将会检查键盘输入的字符 typed。如果它对应的可能是你的朋友的名字(其中一些字符可能被长按)&#…

9.3 模拟

lc190 颠倒二进制ret (ret << 1) (n >> i & 1);class Solution { public:uint32_t reverseBits(uint32_t n) {uint32_t ret 0;for (int i 0; i < 32; i)ret (ret << 1) (n >> i & 1);return ret;} };lc14 flag checkclass Solution {…

esp32小智ai对话机器人

ESP-IDF 环境搭建与问题解决 下载与安装 ESP-IDF 官方下载地址&#xff1a;https://dl.espressif.com/dl/esp-idf建议使用稳定版本&#xff0c;避免开发版可能存在的兼容性问题 中文编码问题解决方案 $env:PYTHONIOENCODING "utf-8" $env:PYTHONUTF8 "1&q…

11.类与对象

目录 1. 创建类与对象示例 1.1 __init__ 初始化器: 1.2 __new__构造器 1.3 什么时候需要重写 __new__? 1.4 init和new对比 2. 属性 2.1 实例属性 2.2 类属性 3. 作用域命名约定 3.1 非公共属性 3.2 公共属性 3.3 名称修饰 3.4 一眼看懂三种“可见性” 4. 方法 …

【js】Promise.try VS try-catch

前言JavaScript 正为 Promise 添加一个新的方法&#xff0c;使得处理异步函数更加清晰和安全。Promise.try 允许将任何函数包装在 Promise 中&#xff0c;无论它是否异步。使用 Promise.try 可避免传统 try/catch 结构与 Promise 链的混合使用&#xff0c;代码更简洁。try-catc…

MySQL-表的约束(上)

表的约束在 MySQL 中&#xff0c;表的约束&#xff08;Constraints&#xff09;用于确保数据库中数据的完整性和一致性。它们定义了对表中数据的规则和限制&#xff0c;防止无效或不一致的数据被插入、更新或删除。常见的 MySQL 表约束包括主键约束&#xff08;PRIMARY KEY&…