【NLP251】意图识别 与 Seq2Seq

news2025/1/31 7:57:30

Seq2Seq模型作为从RNN演进到Transformer和Attention机制的关键中间阶段,它不仅承前启后,还为我们深入理解这些复杂的模型架构提供了重要的基础。接下来,我们将详细探讨Seq2Seq模型的原理及其在自然语言处理领域中的应用。

1. 原理及网络框架

1.1 自编码神经网络

自编码器作为一种深度学习领域无监督的算法,本质上是一种 数据压缩 算法,属于生成算法的一种。自编码器(AutoEncoder,AE)就是一种利用反向传播 使得输出值等于输入 的神经网络,它将输入压缩成潜在特征/高阶特征,然后将这种表征重构输出。
构建一个自编码器主要包括两部分: 编码器(Encoder) 解码器(Decoder) 。编码器将输入压缩为潜在空间特征,解码器将潜在空间特征重构输出。

 

1.2 Seq2Seq 

 

图中展示的是一个典型的序列到序列(Seq2Seq)模型,其中包含了编码器(Encoder)和解码器(Decoder)的RNN单元。下面将详细描述每个步骤的数学过程(数学过程理解一边就可以初学不必深究)。

编码器(Encoder)

  1. 输入序列:假设输入序列为 x1​,x2​,x3​,x4​。

  2. 隐藏状态更新

    • 初始隐藏状态 h0​ 通常初始化为零向量或通过某种方式得到。

    • 对于每个时间步 t,隐藏状态 ht​ 通过以下公式更新:

      其中,Wh​ 和 Wx​ 是权重矩阵,bh​ 是偏置项,f 是激活函数(如tanh或ReLU)。

  3. 最终上下文向量

    • 最终隐藏状态 h4​ 可以作为上下文向量 c,也可以通过某种方式(如取最后的状态或对所有隐藏状态进行加权求和)得到。

解码器(Decoder)

  1. 初始状态

    • 解码器的初始隐藏状态 h0′​ 通常设置为编码器的最终隐藏状态 h4​ 或上下文向量 c。

  2. 输出序列生成

    • 对于每个时间步 t,解码器生成输出 yt​ 和更新隐藏状态 ht′​:

      其中,Wh′​、Wc′​ 和 Wy′​ 是权重矩阵,bh′​ 和 by′​ 是偏置项,f 和 g 是激活函数(f 通常为tanh或ReLU,g 通常为softmax)。

  3. 输出生成

    • 输出 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)替换为自注意力机制。自注意力机制允许模型在序列中的任意位置间直接建立依赖关系,不受距离限制,这使得模型能够更有效地处理长距离依赖问题。

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

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

相关文章

(长期更新)《零基础入门 ArcGIS(ArcMap) 》实验六----流域综合处理(超超超详细!!!)

流域综合处理 流域综合治理是根据流域自然和社会经济状况及区域国民经济发展的要求,以流域水流失治理为中心,以提高生态经济效益和社会经济持续发展为目标,以基本农田优化结构和高效利用及植被建设为重点,建立具有水土保持兼高效生态经济功能的半山区流域综合治理模式。数字高程…

unity使用内置videoplayer打包到安卓手机进行视频播放

1.新建UI&#xff0c;新建RawImage在画布当作视频播放的显示载体 2.新建VideoPlayer 3.新建Render Texture作为连接播放器视频显示和幕布的渲染纹理 将Render Texture同时挂载在VideoPlayer播放器和RawImage上。这样就可以将显示的视频内容在RawImage上显示出来了。 问题在于&a…

WPS mathtype间距太大、显示不全、公式一键改格式/大小

1、间距太大 用mathtype后行距变大的原因 mathtype行距变大到底怎么解决-MathType中文网 段落设置固定值 2、显示不全 设置格式&#xff1a; 打开MathType编辑器点击菜单栏中的"格式(Format)"选择"间距(Spacing)"在弹出的对话框中调整"分数间距(F…

堆的存储(了解)

由于堆是⼀个完全⼆叉树&#xff0c;因此可以⽤⼀个数组来存储。&#xff08;如果不清楚大家可以回顾⼆叉树的存储&#xff08;上&#xff09;c文章里的顺序存储&#xff09; 结点下标为 i &#xff1a; 如果⽗存在&#xff0c;⽗下标为 i/2 &#xff1b; 如果左孩⼦存在&…

数据结构 前缀中缀后缀

目录 前言 一&#xff0c;前缀中缀后缀的基本概念 二&#xff0c;前缀与后缀表达式 三&#xff0c;使用栈实现后缀 四&#xff0c;由中缀到后缀 总结 前言 这里学习前缀中缀后缀为我们学习树和图做准备&#xff0c;这个主题主要是对于算术和逻辑表达式求值&#xff0c;这…

【RocketMQ 存储】- broker 端存储单条消息的逻辑

文章目录 1. 前言2. DefaultMessageStore#asyncPutMessage 添加单条消息2.1 DefaultMessageStore#checkStoreStatus 检查存储服务的状态2.2 DefaultMessageStore#checkMessage 校验消息长度是否合法2.3 CommitLog#asyncPutMessage 核心存储逻辑2.4 MappedFile#appendMessage2.5…

Linux文件原生操作

Linux 中一切皆文件&#xff0c;那么 Linux 文件是什么&#xff1f; 在 Linux 中的文件 可以是&#xff1a;传统意义上的有序数据集合&#xff0c;即&#xff1a;文件系统中的物理文件 也可以是&#xff1a;设备&#xff0c;管道&#xff0c;内存。。。(Linux 管理的一切对象…

(undone) MIT6.S081 2023 学习笔记 (Day7: LAB6 Multithreading)

网页&#xff1a;https://pdos.csail.mit.edu/6.S081/2023/labs/thread.html 任务1&#xff1a;Uthread: switching between threads (moderate) (doing) 在这个练习中&#xff0c;你将设计一个用户级线程系统中的上下文切换机制&#xff0c;并实现它。为了帮助你开始&#xf…

Zookeeper入门部署(单点与集群)

本篇文章基于docker方式部署zookeeper集群&#xff0c;请先安装docker 目录 1. docker初期准备 2.启动zookeeper 2.1 单点部署 2.2 集群部署 3. Linux脚本实现快速切换启动关闭 1. docker初期准备 拉取zookeeper镜像 docker pull zookeeper:3.5.6 如果拉取时间过长&#xf…

【AI非常道】二零二五年一月(二),AI非常道

经常在社区看到一些非常有启发或者有收获的话语&#xff0c;但是&#xff0c;往往看过就成为过眼云烟&#xff0c;有时再想去找又找不到。索性&#xff0c;今年开始&#xff0c;看到好的言语&#xff0c;就记录下来&#xff0c;一月一发布&#xff0c;亦供大家参考。 有关AI非…

jQuery小游戏(二)

jQuery小游戏&#xff08;二&#xff09; 今天是新年的第二天&#xff0c;本人在这里祝大家&#xff0c;新年快乐&#xff0c;万事胜意&#x1f495; 紧接jQuery小游戏&#xff08;一&#xff09;的内容&#xff0c;我们开始继续往下咯&#x1f61c; 游戏中使用到的方法 key…

【硬件测试】基于FPGA的QPSK+帧同步系统开发与硬件片内测试,包含高斯信道,误码统计,可设置SNR

目录 1.算法仿真效果 2.算法涉及理论知识概要 2.1QPSK 2.2 帧同步 3.Verilog核心程序 4.开发板使用说明和如何移植不同的开发板 5.完整算法代码文件获得 1.算法仿真效果 本文是之前写的文章 《基于FPGA的QPSK帧同步系统verilog开发,包含testbench,高斯信道,误码统计,可…

NVIDIA GPU介绍:概念、序列、核心、A100、H100

概述 入职一家大模型领域创业公司&#xff0c;恶补相关知识。 概念 一些概念&#xff1a; HPC&#xff1a;High Performance Computing&#xff0c;高性能计算SoC&#xff1a;System on Chip&#xff0c;单片系统FLOPS&#xff1a;Floating Point Operations Per Second&am…

C++ list 容器用法

C list 容器用法 C 标准库提供了丰富的功能&#xff0c;其中 <list> 是一个非常重要的容器类&#xff0c;用于存储元素集合&#xff0c;支持双向迭代器。<list> 是 C 标准模板库&#xff08;STL&#xff09;中的一个序列容器&#xff0c;它允许在容器的任意位置快速…

解密全同态加密中的自举(Bootstrapping)

摘要 自举&#xff08;Bootstrapping&#xff09;是全同态加密&#xff08;Fully Homomorphic Encryption, FHE&#xff09;中经常使用的术语。熟悉 FHE 的人都知道&#xff0c;自举是 FHE 方案中最复杂且计算密集的部分。然而&#xff0c;只有极少数非 FHE 专家真正理解自举操…

显示当前绑定变量

来自v$sql中的信息 测试两个变量的情况&#xff08;实际可以看6个&#xff0c;可根据需要修改&#xff09; 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…

arm-linux-gnueabihf安装

Linaro Releases windows下打开wsl2中的ubuntu&#xff0c;资源管理器中输入&#xff1a; \\wsl$gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz 复制到/home/ark01/tool 在 Ubuntu 中创建目录&#xff1a; /usr/local/arm&#xff0c;命令如下&#xff1a; …

宝塔面板SSL加密访问设置教程

参考:https://www.bt.cn/bbs/thread-117246-1-1.html 如何快速使用证书加密访问面板 因早期默认未开启https访问所以没有相关的风险提醒&#xff0c;现面板默认已开启https加密访问、提升安全性 由于采用的是服务器内部本身签发证书&#xff0c;不被公网浏览器信任请参考以下步…

Baklib在知识管理创新中的价值体现与其他产品的优势比较分析

内容概要 在当前的数字化时代&#xff0c;知识管理成为企业成功的重要组成部分。有效的知识管理不仅有助于提升内部沟通效率&#xff0c;还能促进创新与决策的科学化。尤其是Baklib作为一种知识中台&#xff0c;具有独特的价值&#xff0c;它能够融合企业内外的知识资源&#…

机器学习周报-文献阅读

文章目录 摘要Abstract 1 相关知识1.1 WDN建模1.2 掩码操作&#xff08;Masking Operation&#xff09; 2 论文内容2.1 WDN信息的数据处理2.2 使用所收集的数据构造模型2.2.1 Gated graph neural network2.2.2 Masking operation2.2.3 Training loss2.2.4 Evaluation metrics 2…