【NLP】18. Encoder 和 Decoder
1. Encoder 和 Decoder 概述
在序列到序列(sequence-to-sequence,简称 seq2seq)的模型中,整个系统通常分为两大部分:Encoder(编码器)和 Decoder(解码器)。
- Encoder(编码器):
输入一段序列(例如一句话),经过编码器(一般使用 RNN、LSTM、GRU 或者 Transformer Encoder)后,将整个序列的信息压缩成一个(或多个)固定维度的向量表示,这个向量通常被认为是整个输入序列的语义表示。 - Decoder(解码器):
解码器接收 Encoder 输出的向量信息(可以是单个向量,也可以是多个隐藏状态组成的序列),再利用另一个 RNN(或其他结构)生成目标序列。例如,对于机器翻译任务,Decoder 会利用编码得到的源语言表示生成目标语言句子。
这种 Encoder-Decoder 结构最初由 Sutskever 等人(2014)的 seq2seq 模型成功应用于机器翻译任务,开创了自然语言生成新纪元。
2. Encoder 部分详细说明
2.1 Encoder 的基本角色
Encoder 的任务是将输入序列(如一整句话、一个段落或整个文档)转换成一个紧凑的向量表示。这一步骤通常有以下特点:
- 信息汇聚:
Encoder 通常会逐步处理输入序列(例如使用 RNN 从左到右遍历),在每一步都更新隐藏状态,最终在序列结束时获得一个包含全局信息的向量(或一组向量)。 - 使用最后的隐藏状态或全序列:
有时,简单的做法是取 RNN 在最后一个时刻的隐藏状态作为整个序列的表示(此时称为“accepter”,即仅用最后一个状态来生成预测)。但更复杂的 Encoder 会输出整个隐藏状态序列,并将其提供给 Decoder,在解码过程中每一步都可利用(见第 5 部分)。
2.2 双向 Encoder 和多层结构
- 双向 RNN:
为了更全面地捕捉输入句子的上下文信息,Encoder 常常使用双向 RNN(BiRNN),即同时利用从左到右的(正向)和从右到左的(反向)信息,最后将两边隐藏状态拼接或加权融合,得到更为丰富的文本表示。 - 多层模型:
为了提高表示能力,还会采用多层(堆叠)RNN,每一层可以捕捉不同层次(如语法、语义)的信息。实际系统中可能会有 2 层、甚至更多层的 Encoder。
例如,机器翻译中常见的设置包括 2 个 Encoder 层(甚至可以把双向 RNN 作为第一层,后面再堆叠一层单向或双向 RNN),以确保充分捕捉输入句子的细节信息。
3. Decoder 部分详细说明
3.1 Decoder 的基本角色与架构
Decoder 的任务是生成一个序列(例如翻译句子、摘要、对话回复或代码),其工作流程如下:
- 接收 Encoder 的输出:
Decoder 通常接收 Encoder 输出的向量表示(可能是单个向量,也可能是整个隐藏状态序列),然后将其作为生成目标序列的初始信息或在每一步的条件输入。 - RNN 解码器:
最常见的 Decoder 是基于 RNN(或其变种,如 LSTM、GRU),每一步输出一个 token,并更新自身状态,然后继续生成下一个 token。
3.2 解码时如何决定停止
生成序列时需要一个停止条件来决定何时结束输出。常用的策略有两种:
- 固定长度输出:
预先设定生成的 token 数量,例如固定生成 10 个词。这种方法简单但缺乏灵活性。 - 特殊停止符( <EOS> 或 “stop”)输出:
在训练时设置一个特殊的停止标记,当 Decoder 生成这个标记时,认为序列结束。这种方法更灵活,适应于长度可变的任务,如机器翻译和对话生成。
实际模型往往采用后者,即在输出词汇表中包含一个停止符,解码过程持续直到生成停止符。
3.3 Teacher Forcing (教师强制)
- 定义:
教师强制是一种训练技巧,在训练 Decoder 时,将真实的目标 token 作为下一步的输入(而不是使用 Decoder 自己生成的 token),以加速训练收敛并稳定训练过程。 - 作用:
通过教师强制,Decoder 在初期训练阶段可以直接获得正确的上下文信息,提高生成序列的质量;同时,训练过程中可以逐渐减少教师强制的比例,逼迫模型在推断时依赖自身生成的序列。
3.4 Beam Search 与评分调整
在测试时,为了生成高质量的输出序列,常用的方法是 Beam Search:
- Beam Search:
在每一步解码时,保留概率最高的 N 个候选序列而非仅选取最优的一个。这样可以在后续生成过程中通过搜索多个候选序列来避免局部最优。 - 长度归一化:
由于较长的序列总的概率(对数和)较小,实际评分时通常会调整为每个词的平均概率(例如 1 ∣ w o r d s ∣ ∑ log P ( w o r d ∣ c o n t e x t ) ∣ w o r d s ∣ \frac{1}{|words|}\sum \log P(word|context)∣words∣ ∣words∣1∑logP(word∣context)∣words∣这样能避免偏好生成太短的序列,从而获得更符合人类语言习惯的输出。
4. 典型应用场景
Encoder-Decoder 架构被广泛应用于各类 NLP 任务,以下是几个典型案例:
4.1 机器翻译(第一个成功案例)
- 过程:
Encoder 将源语言句子转换成向量表示,Decoder 利用该表示生成目标语言句子。 - 成功案例:
Google 的 Neural Machine Translation(NMT)系统就是基于 Encoder-Decoder 架构实现的。
4.2 文本摘要Summarisation
- 过程:
输入为长文档,通过 Encoder 编码,Decoder 生成该文档的简短摘要,保留关键信息。
4.3 对话生成Dialogue(如 GPT)
- 过程:
模型接收对话历史(作为上下文输入),Decoder 生成下一句回复。这里往往采用较深的 Decoder 和大规模预训练方法。
4.4 代码生成Code Generation
- 过程:
将自然语言的需求描述(request)经过 Encoder 得到语义表示,Decoder 根据该表示生成对应的代码。
5. 模型设计中的补充细节
5.1 Encoder 与 Decoder 的信息传递
最初的 Encoder-Decoder 模型存在“瓶颈”问题,即所有信息必须通过 Encoder 输出的那个固定向量传递,这往往导致信息不足。为了解决这一问题,后续改进方法包括:
- 注意力机制(Attention):
在每一步解码时,Decoder 不仅使用最后的编码向量,而是通过注意力机制对 Encoder 的所有输出进行加权求和,动态获取对当前生成最有帮助的信息。这样大大缓解了信息瓶颈问题,也使得模型能够更好地处理长序列。
5.2 多层和混合结构
- 多层 Encoder-Decoder:
可以使用多层(例如2层 Encoder 与 1层 Decoder、甚至 Encoder 与 Decoder 都为多层)提高模型表达能力,每一层可以处理不同层次的语言信息。 - 双向 Encoder:
尤其在 Encoder 部分,使用双向 RNN 可以更全面捕捉上下文;而 Decoder 部分通常采用单向生成,但可在输入(通过注意力)中引入 Encoder 输出的双向信息。
5.3 训练与推理的差异
- 训练阶段:
采用教师强制,使用真实的 token 作为 Decoder 的输入,可以快速收敛。 - 推断阶段:
则完全依赖模型自身生成的 token,由于前后依赖性强,每一步必须依据前一步的输出,导致难以并行计算。为此使用 Beam Search 等解码策略,但推断效率相对较低,是目前 Encoder-Decoder 模型在实际应用中常见的计算瓶颈问题。
6. 模型存在的问题与改进挑战
6.1 瓶颈问题
如前所述,Encoder-Decoder 模型要求 Encoder 将所有输入信息压缩到一个固定大小的向量中,这往往造成信息丢失。注意力机制、记忆网络以及使用层次化编码器都被提出用以缓解这一问题。
6.2 推理过程难以并行化
由于 Decoder 每一步生成都依赖前一步的输出(自回归),解码过程是串行的,因此难以利用现代硬件(如 GPU)的并行能力进行快速推理。Transformer 模型的设计在一定程度上可以并行化编码部分,但解码依旧存在自回归问题。
6.3 训练难度和解码策略
教师强制虽然加速了训练,但可能导致训练期间与推断期间的分布不匹配;同时,为了生成较优解码序列需要精心设计 Beam Search 的参数(如 beam width、长度归一化策略),这也增加了系统的复杂性与调优成本。
7. 实际案例演示(以机器翻译为例)
以机器翻译为例,我们可以看到 Encoder-Decoder 模型如何工作:
- Encoder 部分:
– 输入:英文句子 “I love natural language processing.”
– 使用双向 LSTM 将整句话编码成一组隐藏状态(或经过注意力整合为一个上下文向量)。 - Decoder 部分:
– 接收 Encoder 输出,开始生成目标语言句子(例如中文翻译)。 – 采用教师强制在训练中,指导模型在每一步预测正确的中文词汇。 – 在推断时,使用 Beam Search 选择多个候选词,直到生成特殊的结束符 “”。 - 训练与推断:
– 训练中计算损失函数时通常采用交叉熵损失,对每个生成词的概率取对数后求和再求平均。
– 在 Beam Search 时,对候选序列的总分调整为平均每个词的对数概率,以防短序列得分偏高。
这种完整的流程是机器翻译的早期成功案例,也为后来的对话生成、文本摘要等任务提供了模型框架。
相关文章:
【NLP】18. Encoder 和 Decoder
1. Encoder 和 Decoder 概述 在序列到序列(sequence-to-sequence,简称 seq2seq)的模型中,整个系统通常分为两大部分:Encoder(编码器)和 Decoder(解码器)。 Encoder&…...
Npfs!NpFsdCreate函数分析之从NpCreateClientEnd函数分析到Npfs!NpSetConnectedPipeState
第一部分: 1: kd> g Breakpoint 5 hit Npfs!NpFsdCreate: baaecba6 55 push ebp 1: kd> kc # 00 Npfs!NpFsdCreate 01 nt!IofCallDriver 02 nt!IopParseDevice 03 nt!ObpLookupObjectName 04 nt!ObOpenObjectByName 05 nt!IopCreateFile 06…...
基于PySide6与pycatia的CATIA绘图比例智能调节工具开发全解析
引言:工程图纸自动化处理的技术革新 在机械设计领域,CATIA图纸的比例调整是高频且重复性极强的操作。传统手动调整方式效率低下且易出错。本文基于PySide6+pycatia技术栈,提出一种支持智能比例匹配、实时视图控制、异常自处理的图纸批处理方案,其核心突破体现在: 操作效…...
STM32硬件IIC+DMA驱动OLED显示——释放CPU资源,提升实时性
目录 前言 一、软件IIC与硬件IIC 1、软件IIC 2、硬件IIC 二、STM32CubeMX配置KEIL配置 三、OLED驱动示例 1、0.96寸OLED 2、OLED驱动程序 3、运用示例 4、效果展示 总结 前言 0.96寸OLED屏是一个很常见的显示模块,其驱动方式在用采IIC通讯时,常用软件IIC…...
Spring Bean的创建过程与三级缓存的关系详解
以下以 Bean A 和 Bean B 互相依赖为例,结合源码和流程图,详细说明 Bean 的创建过程与三级缓存的交互。 1. Bean 的完整生命周期(简化版) #mermaid-svg-uwqaB5dgOFDQ97Yd {font-family:"trebuchet ms",verdana,arial,sa…...
IDEA 调用 Generate 生成 Getter/Setter 快捷键
快捷键不会用? 快捷键:AltInsert 全选键:CtrlA IDEA 调用 Generate 生成 Getter/Setter 快捷键 - 爱吃西瓜的番茄酱 - 博客园...
泛型的二三事
泛型(Generics)是Java语言的一个重要特性,它允许在定义类、接口和方法时使用类型参数(Type Parameters),从而实现类型安全的代码重用。泛型在Java 5中被引入,极大地增强了代码的灵活性和安全性。…...
编程思想——FP、OOP、FRP、AOP、IOC、DI、MVC、DTO、DAO
个人简介 👀个人主页: 前端杂货铺 🙋♂️学习方向: 主攻前端方向,正逐渐往全干发展 📃个人状态: 研发工程师,现效力于中国工业软件事业 🚀人生格言: 积跬步…...
实现一个动态验证码生成器:Canvas与JavaScript的完美结合
验证码(CAPTCHA)是现代网站中常见的安全机制,用于区分人类用户和自动化程序。本文将详细介绍如何使用HTML5 Canvas和JavaScript创建一个美观且功能完整的验证码生成器。 一、核心功能概述 这个验证码生成器具有以下特点: 随机生…...
python中 “with” 关键字的取舍问题
自动管理资源(自动关闭文件) 当你使用 with 打开文件时,文件会在 with 代码块结束后自动关闭,无论是否发生异常。这意味着你不需要显式地调用 f.close() 来关闭文件 示例: with open("words.txt", "r…...
【区块链安全 | 第三十九篇】合约审计之delegatecall(一)
文章目录 外部调用函数calldelegatecallcall 与 delegatecall 的区别示例部署后初始状态调用B.testCall()函数调用B.testDelegatecall()函数区别总结漏洞代码代码审计攻击代码攻击原理解析攻击流程修复建议审计思路外部调用函数 在 Solidity 中,常见的两种底层外部函数调用方…...
Nginx部署spa单页面的小bug
没部署过,都是给后端干的,自己尝试部署了一个下午终于成功了 我遇到的最大的bug是进入后只有首页正常显示 其他页面全是404,于是问问问才知道,需要这个 location / { try_files $uri $uri/ /index.html; } 让…...
linux多线(进)程编程——(6)共享内存
前言 话说进程君的儿子经过父亲点播后就开始闭关,它想要开发出一种全新的传音神通。他想,如果两个人的大脑生长到了一起,那不是就可以直接知道对方在想什么了吗,这样不是可以避免通过语言传递照成的浪费吗? 下面就是它…...
【愚公系列】《Python网络爬虫从入门到精通》050-搭建 Scrapy 爬虫框架
🌟【技术大咖愚公搬代码:全栈专家的成长之路,你关注的宝藏博主在这里!】🌟 📣开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主! 👉 江湖人称"愚公搬代码",用七年如一日的精神深耕技术领域,以"…...
信息安全管理与评估2021年国赛正式卷答案截图以及十套国赛卷
2021年全国职业院校技能大赛高职组 “信息安全管理与评估”赛项 任务书1 赛项时间 共计X小时。 赛项信息 赛项内容 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 第一阶段 平台搭建与安全设备配置防护 任务1 网络平台搭建 任务2 网络安全设备配置与防护 第二…...
讲解贪心算法
贪心算法是一种常用的算法思想,其在解决问题时每一步都做出在当前状态下看起来最优的选择,从而希望最终能够获得全局最优解。C作为一种流行的编程语言,可以很好地应用于贪心算法的实现。下面我们来讲一篇关于C贪心算法的文章。 目录 贪心算法…...
高并发秒杀系统设计:关键技术解析与典型陷阱规避
电商、在线票务等众多互联网业务场景中,高并发秒杀活动屡见不鲜。这类活动往往在短时间内会涌入海量的用户请求,对系统架构的性能、稳定性和可用性提出了极高的挑战。曾经,高并发秒杀架构设计让许多开发者望而生畏,然而࿰…...
微信小程序实战案例 - 餐馆点餐系统 阶段 2 – 购物车
阶段 2 – 购物车(超详细版) 目标 把“加入购物车”做成 全局状态,任何页面都能读写在本地 持久化(关闭小程序后购物车仍在)新建 购物车页:数量增减、总价实时计算、去结算入口打 Git Tag v2.0‑cart 1. …...
Qt 元对象系统探秘:从 Q_OBJECT 到反射编程的魔法之旅
背景说明:Qt 背后的「魔法引擎」 如果你曾用 Qt 写过信号槽,或是在设计器里拖过控件改属性,一定对这个框架的“动态性”印象深刻: 无需手动调用,信号能自动连接到槽函数;无需编译重启,界面上修…...
sql 向Java的映射
优化建议,可以在SQL中控制它的类型 在 MyBatis 中,如果返回值类型设置为 java.util.Map,默认情况下可以返回 多行多列的数据...
Visual Studio未能加载相应的Package包弹窗报错
环境介绍: visulal studio 2019 问题描述: 起因:安装vs扩展插件后,重新打开Visual Studio,报了一些列如下的弹窗错误,即使选择不继续显示该错误,再次打开后任然报错; 解决思路&am…...
【HD-RK3576-PI】Docker搭建与使用
硬件:HD-RK3576-PI 软件:Linux6.1Ubuntu22.04 1.Docker 简介 Docker 是一个开源的应用容器引擎,基于 Go 语言开发,遵循 Apache 2.0 协议。它可以让开发者将应用程序及其依赖项打包到一个轻量级、可移植的容器中,并在任…...
C语言实现用户管理系统
以下是一个简单的C语言用户管理系统示例,它实现了用户信息的添加、删除、修改和查询功能。代码中包含了详细的注释和解释,帮助你理解每个部分的作用。 #include <stdio.h> #include <stdlib.h> #include <string.h>#define MAX_USERS…...
【websocket】使用案例( JSR 356 标准)
目录 一、JSR 356方式:简单示例 1、引入依赖 2、注册端点扫描器 3、编写通过注解处理生命周期和消息 4、细节解读 5、总结 二、聊天室案例 方案流程 1、引入依赖 2、注册端点扫描器 3、编写一个配置类,读取httpsession 4、编写通过注解处理生…...
tcpdump`是一个非常强大的命令行工具,用于在网络上捕获并分析数据包
通过 tcpdump,你可以抓取网络流量,诊断网络问题,或分析通信协议的细节。下面是如何在 Linux 上使用 tcpdump 进行抓包的详细步骤。 1. 安装 tcpdump 在大多数 Linux 发行版中,tcpdump 是默认安装的。如果没有安装,可…...
IS-IS中特殊字段——OL过载
文章目录 OL 过载位 🏡作者主页:点击! 🤖Datacom专栏:点击! ⏰️创作时间:2025年04月13日20点12分 OL 过载位 路由过载 使用 IS-IS 的过载标记来标识过载状态 对设备设置过载标记后ÿ…...
【时频谱分析】快速谱峭度
算法配置页面,也可以一键导出结果数据 报表自定义绘制 获取和下载【PHM学习软件PHM源码】的方式 获取方式:Docshttps://jcn362s9p4t8.feishu.cn/wiki/A0NXwPxY3ie1cGkOy08cru6vnvc...
Spring Boot 支持的内嵌服务器(Tomcat、Jetty、Undertow、Netty(用于 WebFlux 响应式应用))详解
Spring Boot 支持的内嵌服务器详解 1. 支持的内嵌服务器 Spring Boot 默认支持以下内嵌服务器: Tomcat(默认)JettyUndertowNetty(用于 WebFlux 响应式应用) 2. 各服务器使用示例 (1) Tomcat(默认…...
微软Exchange管理中心全球范围宕机
微软已确认Exchange管理中心(Exchange Admin Center,EAC)发生全球性服务中断,导致管理员无法访问关键管理工具。该故障被标记为关键服务事件(编号EX1051697),对依赖Exchange Online的企业造成广…...
基于AI的Web应用防火墙(AppWall)实战:漏洞拦截与威胁情报集成
摘要:针对Web应用面临的OWASP、CVE等漏洞攻击,本文结合群联AI云防护系统的AppWall模块,详解AI规则双引擎的防御原理,并提供漏洞拦截配置与威胁情报集成代码示例。 一、Web应用安全挑战与AppWall优势 传统WAF依赖规则库更新滞后&a…...
