【NLP251】意图识别 与 Seq2Seq
Seq2Seq模型作为从RNN演进到Transformer和Attention机制的关键中间阶段,它不仅承前启后,还为我们深入理解这些复杂的模型架构提供了重要的基础。接下来,我们将详细探讨Seq2Seq模型的原理及其在自然语言处理领域中的应用。
1. 原理及网络框架
1.1 自编码神经网络
1.2 Seq2Seq

图中展示的是一个典型的序列到序列(Seq2Seq)模型,其中包含了编码器(Encoder)和解码器(Decoder)的RNN单元。下面将详细描述每个步骤的数学过程(数学过程理解一边就可以初学不必深究)。
编码器(Encoder)
-
输入序列:假设输入序列为 x1,x2,x3,x4。
-
隐藏状态更新:
-
初始隐藏状态 h0 通常初始化为零向量或通过某种方式得到。
-
对于每个时间步 t,隐藏状态 ht 通过以下公式更新:
其中,Wh 和 Wx 是权重矩阵,bh 是偏置项,f 是激活函数(如tanh或ReLU)。
-
-
最终上下文向量:
-
最终隐藏状态 h4 可以作为上下文向量 c,也可以通过某种方式(如取最后的状态或对所有隐藏状态进行加权求和)得到。
-
解码器(Decoder)
-
初始状态:
-
解码器的初始隐藏状态 h0′ 通常设置为编码器的最终隐藏状态 h4 或上下文向量 c。
-
-
输出序列生成:
-
对于每个时间步 t,解码器生成输出 yt 和更新隐藏状态 ht′:
其中,Wh′、Wc′ 和 Wy′ 是权重矩阵,bh′ 和 by′ 是偏置项,f 和 g 是激活函数(f 通常为tanh或ReLU,g 通常为softmax)。
-
-
输出生成:
-
输出 yt 可以是词汇表中每个词的概率分布,通常通过softmax函数得到:

-
我们可以将上述过程简化为如下图所示流程,其中在输入序列的最后一个元素“C”之后,添加了一个特殊的结束标记“<EOS>”,表示输入序列的结束或输出出序列的开始标识符。当解码器生成一个特殊的结束标记“<EOS>”时,表示输出序列的结束。
2. 代码实现
通过自定义编码器、解码器输入及目标标签,深度理解输入输出出结构(下图与整体代码框架无关,仅为理解提供方便,实际代码输入输出通过 torch.randn实现,例:encoder_input_x = torch.randn(3, 5, 8) decoder_input_x = torch.randn(3, 4, 8))
编码器:3个样本,每个样本5个token,每个token对应8维的向量
解码器:3个样本,每个样本4个token(3+1), 每个token对应8维度的向量
其中,2和3分别代表开始标识和结束标识
网络执行过程与测试代码实现从这里开始
将上图Seq2Seq网络框架通过代码实现
定义编码器、解码器
实现网络执行过程
附 可编辑代码实现:
vocab_size = 100
encoder_rnn = nn.RNN(input_size=8, hidden_size=8, batch_first=True)
decoder_rnn = nn.RNN(input_size=8, hidden_size=8, batch_first=True)
deocder_output_fc = nn.Sequential(nn.Linear(8, vocab_size)
)#定义一个简单的全连接层,它将解码器的输出维度从8转换为词汇表大小(vocab_size)# 3个样本,每个样本5个token,每个token对应8维的向量
encoder_input_x = torch.randn(3, 5, 8)
# encoder_output: [N,T,E] 每个时刻的输出特征向量
# encoder_ht: [1,N,E] 最后一个时刻提取的状态信息/特征向量
encoder_output, encoder_ht = encoder_rnn(encoder_input_x)
print(encoder_ht.shape)# 将编码器的状态转换为中间向量
c = encoder_ht
decoder_h0 = c# 调用解码器
# 3个样本,每个样本4个token(3+1), 每个token对应8维度的向量
decoder_input_x = torch.randn(3, 4, 8)
# decoder_output: [N,T,E] 每个时刻的输出特征向量
# decoder_ht: [1,N,E] 最后一个时刻提取的状态信息/特征向量
decoder_output, decoder_ht = decoder_rnn(decoder_input_x, hx=decoder_h0)print(decoder_output.shape)# 预测的置信度
z = deocder_output_fc(decoder_output) # [N,T,E] * [E,vocab_size] --> [N, T, vocab_size]print(z.shape)
3.在实际应用场景中理解Seq2Seq执行过程
在左侧的图中,“小明喜欢吃苹果”这一输入序列首先通过词嵌入层被转换为向量表示。每个词被转换成一个向量后,输入到编码器中进行处理,生成一系列隐藏状态 h1、h2、h3。编码器的输出可以是最后一个隐藏状态,也可以是通过对隐藏状态进行聚合得到的上下文向量 c,例如通过取最后一个状态、平均或使用 Attention 机制得到。
解码器的初始状态通常设置为编码器的最终隐藏状态或上下文向量 c。它接收一个起始符号(如 ),并开始生成输出序列。在每一步解码过程中,解码器生成一个输出 Oi,这个输出是基于前一时刻的隐藏状态和输出。解码器的输出 Oi 通过一个 softmax 层(或其他激活函数)转换为概率分布,然后选择概率最高的词作为输出 Yi。这一过程不断重复,直到生成结束符号(如 ),从而完成整个序列的生成。

其中,argmax过程是一个多分类过程,选择概率较高的单词id作为输出

Seq2Seq的应用场景不仅涵盖了传统的机器翻译、文本摘要和对话生成,还包括了一些别出心裁的应用,如根据数学公式的图片生成LaTeX代码,以及自动生成提交信息等。自然语言生成(NLG)作为一个极具吸引力和前景的研究领域,其核心在于解决条件概率p(output|context)的建模问题,即基于给定的上下文生成相应的输出。这里的上下文可以是多种多样的,研究人员利用深度学习模型对这一条件概率进行建模,结合海量训练数据和无穷的想象力,实现了众多令人惊叹的应用。Seq2Seq框架因其简洁易用而备受青睐,相应的开源实现也层出不穷,但这并不意味着可以机械地照搬照套,而是需要针对具体问题进行具体分析。此外,如何控制生成内容,即解码部分的研究,也是当前NLG领域一个非常有趣的方向,包括如何调控生成文本的长度、多样性、信息量大小以及情感等。
Seq2Seq向Transformer的演进
Transformer模型和传统的Seq2Seq模型,两种模型都采用编码器-解码器架构,用于将输入序列转换为输出序列。
传统Seq2Seq模型通常使用循环神经网络(RNN)或长短时记忆网络(LSTM)来处理序列数据。在处理长序列时,这些模型可能会遇到梯度消失或梯度爆炸的问题,导致难以捕捉长距离依赖关系。
Transformer模型则是将Seq2Seq中的RNN(或LSTM)替换为自注意力机制。自注意力机制允许模型在序列中的任意位置间直接建立依赖关系,不受距离限制,这使得模型能够更有效地处理长距离依赖问题。
相关文章:
【NLP251】意图识别 与 Seq2Seq
Seq2Seq模型作为从RNN演进到Transformer和Attention机制的关键中间阶段,它不仅承前启后,还为我们深入理解这些复杂的模型架构提供了重要的基础。接下来,我们将详细探讨Seq2Seq模型的原理及其在自然语言处理领域中的应用。 1. 原理及网络框架 …...
(长期更新)《零基础入门 ArcGIS(ArcMap) 》实验六----流域综合处理(超超超详细!!!)
流域综合处理 流域综合治理是根据流域自然和社会经济状况及区域国民经济发展的要求,以流域水流失治理为中心,以提高生态经济效益和社会经济持续发展为目标,以基本农田优化结构和高效利用及植被建设为重点,建立具有水土保持兼高效生态经济功能的半山区流域综合治理模式。数字高程…...
单片机串口打印printf函数显示内容(固件库开发)
1.hal_usart.c 文件 #include <stdio.h> #include "hal_usart.h" #include "stm32F10x.h"//**要根据 使用的是哪个串口 对应修改 串口号 eg:USART1** void USART_PUTC(char ch) {/* 等待数据寄存器为空 */while((USART1->SR & …...
SystemVUE安装与入门
安装参考Keysight PathWave SystemVue 2023 软件下载与安装教程 – 吴川斌的博客 初步使用参考SystemVue软件详解与安装-CSDN博客,除了“在窗口右边下面切换到Workspace Variables面板中可以验证Equation1确实能够读取到Data Flow Analysis的变量”步骤没有实现外&…...
unity使用内置videoplayer打包到安卓手机进行视频播放
1.新建UI,新建RawImage在画布当作视频播放的显示载体 2.新建VideoPlayer 3.新建Render Texture作为连接播放器视频显示和幕布的渲染纹理 将Render Texture同时挂载在VideoPlayer播放器和RawImage上。这样就可以将显示的视频内容在RawImage上显示出来了。 问题在于&a…...
WPS mathtype间距太大、显示不全、公式一键改格式/大小
1、间距太大 用mathtype后行距变大的原因 mathtype行距变大到底怎么解决-MathType中文网 段落设置固定值 2、显示不全 设置格式: 打开MathType编辑器点击菜单栏中的"格式(Format)"选择"间距(Spacing)"在弹出的对话框中调整"分数间距(F…...
堆的存储(了解)
由于堆是⼀个完全⼆叉树,因此可以⽤⼀个数组来存储。(如果不清楚大家可以回顾⼆叉树的存储(上)c文章里的顺序存储) 结点下标为 i : 如果⽗存在,⽗下标为 i/2 ; 如果左孩⼦存在&…...
AIGC时代的Vue或React前端开发
在AIGC(人工智能生成内容)时代,Vue开发正经历着深刻的变革。以下是对AIGC时代Vue开发的详细分析: 一、AIGC技术对Vue开发的影响 代码生成与自动化 AIGC技术使得开发者能够借助智能工具快速生成和优化Vue代码。例如,通…...
数据结构 前缀中缀后缀
目录 前言 一,前缀中缀后缀的基本概念 二,前缀与后缀表达式 三,使用栈实现后缀 四,由中缀到后缀 总结 前言 这里学习前缀中缀后缀为我们学习树和图做准备,这个主题主要是对于算术和逻辑表达式求值,这…...
【RocketMQ 存储】- broker 端存储单条消息的逻辑
文章目录 1. 前言2. DefaultMessageStore#asyncPutMessage 添加单条消息2.1 DefaultMessageStore#checkStoreStatus 检查存储服务的状态2.2 DefaultMessageStore#checkMessage 校验消息长度是否合法2.3 CommitLog#asyncPutMessage 核心存储逻辑2.4 MappedFile#appendMessage2.5…...
.Net / C# 分析文件编码 并将 各种编码格式 转为 另一个编码格式 ( 比如: GB2312→UTF-8, UTF-8→GB2312)
相关库 .Net 8 编码识别: github.com/CharsetDetector/UTF-unknown <PackageReference Include"UTF.Unknown" Version"2.5.1" />代码 using UtfUnknown;var dir_path "D:\\Desktop\\新建文件夹2\\新建文件夹"; var dir_new_path &quo…...
Linux文件原生操作
Linux 中一切皆文件,那么 Linux 文件是什么? 在 Linux 中的文件 可以是:传统意义上的有序数据集合,即:文件系统中的物理文件 也可以是:设备,管道,内存。。。(Linux 管理的一切对象…...
(undone) MIT6.S081 2023 学习笔记 (Day7: LAB6 Multithreading)
网页:https://pdos.csail.mit.edu/6.S081/2023/labs/thread.html 任务1:Uthread: switching between threads (moderate) (doing) 在这个练习中,你将设计一个用户级线程系统中的上下文切换机制,并实现它。为了帮助你开始…...
doris:导入时实现数据转换
Doris 在数据导入时提供了强大的数据转换能力,可以简化部分数据处理流程,减少对额外 ETL 工具的依赖。主要支持以下四种转换方式: 列映射:将源数据列映射到目标表的不同列。 列变换:使用函数和表达式对源数据进行实时…...
2021版小程序开发4——基础加强
2021版小程序开发4——基础加强 学习笔记 2025 自定义组件组件中behaviors的作用安装和使用vant-weapp组件库使用MobX实现全局数据共享对小程序的API进行Promise化 具体的内容还包括:使用npm包、全局数据共享、分包和自定义tabBar的案例; 1 自定义组件 …...
Zookeeper入门部署(单点与集群)
本篇文章基于docker方式部署zookeeper集群,请先安装docker 目录 1. docker初期准备 2.启动zookeeper 2.1 单点部署 2.2 集群部署 3. Linux脚本实现快速切换启动关闭 1. docker初期准备 拉取zookeeper镜像 docker pull zookeeper:3.5.6 如果拉取时间过长…...
【AI非常道】二零二五年一月(二),AI非常道
经常在社区看到一些非常有启发或者有收获的话语,但是,往往看过就成为过眼云烟,有时再想去找又找不到。索性,今年开始,看到好的言语,就记录下来,一月一发布,亦供大家参考。 有关AI非…...
jQuery小游戏(二)
jQuery小游戏(二) 今天是新年的第二天,本人在这里祝大家,新年快乐,万事胜意💕 紧接jQuery小游戏(一)的内容,我们开始继续往下咯😜 游戏中使用到的方法 key…...
【硬件测试】基于FPGA的QPSK+帧同步系统开发与硬件片内测试,包含高斯信道,误码统计,可设置SNR
目录 1.算法仿真效果 2.算法涉及理论知识概要 2.1QPSK 2.2 帧同步 3.Verilog核心程序 4.开发板使用说明和如何移植不同的开发板 5.完整算法代码文件获得 1.算法仿真效果 本文是之前写的文章 《基于FPGA的QPSK帧同步系统verilog开发,包含testbench,高斯信道,误码统计,可…...
NVIDIA GPU介绍:概念、序列、核心、A100、H100
概述 入职一家大模型领域创业公司,恶补相关知识。 概念 一些概念: HPC:High Performance Computing,高性能计算SoC:System on Chip,单片系统FLOPS:Floating Point Operations Per Second&am…...
LINUX部署微服务项目步骤
项目简介技术栈 主体技术:SpringCloud,SpringBoot,VUE2, 中间件:RabbitMQ、Redis 创建用户 在linux服务器home下创建用户qshh,用于后续本项目需要的环境进行安装配置 #创建用户 useradd 用户名 #设置登录密…...
C++ list 容器用法
C list 容器用法 C 标准库提供了丰富的功能,其中 <list> 是一个非常重要的容器类,用于存储元素集合,支持双向迭代器。<list> 是 C 标准模板库(STL)中的一个序列容器,它允许在容器的任意位置快速…...
解密全同态加密中的自举(Bootstrapping)
摘要 自举(Bootstrapping)是全同态加密(Fully Homomorphic Encryption, FHE)中经常使用的术语。熟悉 FHE 的人都知道,自举是 FHE 方案中最复杂且计算密集的部分。然而,只有极少数非 FHE 专家真正理解自举操…...
C#方法(练习)
1.定义一个函数,输入三个值,找出三个数中的最小值 2.定义一个函数,输入三个值,找出三个数中的最大值 3.定义一个函数,输入三个值,找出三个数中的平均值 4.定义一个函数,计算一个数的 N 次方 Pow(2, 3)返回8 5.传入十一…...
显示当前绑定变量
来自v$sql中的信息 测试两个变量的情况(实际可以看6个,可根据需要修改) DROP TABLE T1 PURGE; CREATE TABLE T1 AS SELECT A.*,SYSDATE RIQI FROM DBA_USERS A ORDER BY 1;var mc char(3); var id number; exec :mc:SYS; exec :id:50;set li…...
随机森林例子
完整代码: # 导入必要的库 from sklearn.datasets import load_iris from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score import numpy as np# 加载鸢尾花数…...
2025年1月个人工作生活总结
本文为 2025年1月工作生活总结。 研发编码 使用sqlite3命令行查询表数据 可以直接使用sqlite3查询数据表,不需进入命令行模式。示例如下: sqlite3 database_name.db "SELECT * FROM table_name;"linux shell使用read超时一例 先前有个编译…...
arm-linux-gnueabihf安装
Linaro Releases windows下打开wsl2中的ubuntu,资源管理器中输入: \\wsl$gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz 复制到/home/ark01/tool 在 Ubuntu 中创建目录: /usr/local/arm,命令如下: …...
vscode和pycharm的区别
VSCode(Visual Studio Code)和 PyCharm 是两款常用的 Python 开发工具,它们在功能和使用体验上有一些关键区别: 1. 核心定位 VSCode:轻量级、多语言支持的代码编辑器,依靠插件扩展 Python 开发能力。PyCh…...
宝塔面板SSL加密访问设置教程
参考:https://www.bt.cn/bbs/thread-117246-1-1.html 如何快速使用证书加密访问面板 因早期默认未开启https访问所以没有相关的风险提醒,现面板默认已开启https加密访问、提升安全性 由于采用的是服务器内部本身签发证书,不被公网浏览器信任请参考以下步…...

