【Python机器学习】序列到序列建模和注意力机制——编码-解码架构

LSTM非常擅长处理序列,但我们需要一对而不是一个LSTM。我们将构建一个模块化的架构,称为编码-解码架构。

编码-解码架构的前半部分是序列编码器,该网络将序列(如自然语言文本)转换为较低维的表示形式(如思想向量),这样就已经构建了序列到序列模型的前半部分。

编码-解码架构的后半部分是序列解码器,序列解码器设计成将向量重新转换回人类可读的文本。

LSTM作为可变长度文本的编码器非常有效,构建它们是为了捕捉自然语言文本的语义和情感,LSTM通过内部表示(一个思想向量)捕获了这个含义。我们只需要从LSTM模型汇总的状态(记忆元胞)里提取该思想向量。可以在Keras的LSTM模型中设置return_state=True,以便输出包含隐藏层状态,这个状态向量称为编码器的输出和解码器的输入。

解码思想

假设要研发一个翻译模型将文本从英语翻译成德语,我们希望将字符序列或词序列映射到另一个字符序列或词序列。直接使用LSTM将一种语言映射到另一种语言会很容易遇到问题。对于单个LSTM,需要输入序列和输出序列具有相同的序列长度,而对于翻译任务这种情况往往很少。

上图展示了这个问题。英语和德语句子长度不同,这使得英语输入和预期输出之间的映射更加复杂。英语短语“is playing”(现在进行时)被翻译成德语的现在时态“spielt”。但是这里的“spielt”只能根据输入“is”进行预测,而我们在这个时刻还没有输入“playing”。下一步“playing”会被映射为“FuBball”。当然网络可以学习这些映射,但学到的表示只能针对特定的输入,这样会获得一个更通用的语言模型对我们来说就做不到了。

序列到序列网络架构,有时缩写为seq2seq,通过创建一个思想向量形式的输入表示来解除这个限制。然后,序列到序列模型使用该思想向量(有时称为上下文向量)作为第二个网络的起点,第二个网络接收不同的输入集来生成输出序列。

序列到序列网络由两个模块化的循环网络组成,它们之间有一个思想向量(如下图)。编码器在其输入序列的末尾输出一个思想向量。解码器接收这个向量并输出一个词条序列。

第一个网络称为编码器,将输入文本(如用户向聊天机器人发送的消息)转换为思想向量。思想向量有两部分,每一部分都是一个向量:编码器隐藏层的输出(经过了激活函数)和这个输入样本LSTM元胞的记忆状态。

然后思想向量成为第二个网络即解码器网络的输入。其生成的状态(思想向量)将作为解码器网络的初始状态。然后,第二个网络使用初始状态和一种特殊的输入:初始词条。有了这些信息,第二个网络就能学习生成目标序列的第一个元素(如字符和词)。

在这种特殊的结构中,训练阶段和推理阶段的处理是不同的。在训练期间,我们将初始文本传递给编码器,并将预期的文本作为输入传递给解码器。我们让解码器网络学习,在给定初始状态和“开始”按键的情况下,它就可以生成一系列词条。解码器的第一个输入是初始词条,第二个输入应该是第一个预期的或要被预测的词条,它会反过来促使网络生成第二个预期的词条。

然而在推理阶段,我们没有预期的文本,那么除状态之外,可以使用通用的初始词条,然后使用第一个生成的元素,该元素将在下一时刻成为解码器的输入,以生成下一个元素,以此类推。这个过程重复进行,直到达到序列元素的最大数量,或者生成一个终止词条。

通过这种端到端(end-to-end)训练,解码器将把一个思想向量转换为对初始输入序列(如用户问题)的全解码回复。将解决方案分割成两个网络,其中思想向量作为结合组件(绑定两个网络),允许我们将输入序列映射到不同长度的输出序列:

编码-解码方法

自编码器对学习神经网络而言是一种常见的编码-解码结构,它们是一种重复博弈的神经网络,经过训练,能够将输入信息反刍出来出来,这使得寻找训练数据变得很容易,几乎任何一组高维张量、向量或序列都可以。

与任何编码-解码结构一样,自编码器在编码器和解码器之间存在信息瓶颈,这里将其用作输入数据的低维表示。任何具有信息瓶颈的网络都可以在编码-解码架构中用作编码器,即使该网络直接收了改写或重复表述输入的训练。

虽然自编码器与编码器-解码器具有相同的结构,但是它们是为不同的任务而训练的。自编码器被训练来寻找输入数据的向量表示,这样输入就可以由网络的解码器以最小的误差重构。编码器和解码器互为伪逆过程。该网络的目的是找到输入数据(如图像或文本)的稠密向量表示,从而允许解码器以最小的误差重构它。在训练阶段,输入数据和预期输出是相同的。因此,如果目标是找到数据的稠密向量表示,而不是为语言翻译生成思想向量或为给定的问题寻找回复,那么自编码器是一个不错的选择。

t-SNE模型生成一个嵌入作为它的输出,所以在某种意义上,我们可以把它看作一个编码器。PCA也是一样,然而这些模型是无监督的,因此它们不能针对特定的输出或任务。这些算法主要是用于特征提取和可视化。它们创建了非常紧密的瓶颈以输出非常低维的向量(通常是二维或三维)。它们不是涉及用来输出任意长度的序列的。这就是编码器的区别。所以LSTM是用于从序列中提取特征和嵌入的最先进技术。

序列到序列对话

对话引擎问题和机器翻译之间其实非常相似,在聊天机器人的对话中生成回复与在机器翻译系统总生成英文语句的德语翻译没有什么不同。

翻译和对话任务都需要模型将一个序列映射到另一个序列。将英语词条序列映射到德语序列非常类似于将对话中的自然语言语句映射到对话引擎的预期回复语句。我们可以把机器翻译引擎想象成一个精神分裂的双语对话引擎。

但是,我们希望机器人有合适的回复,而不是只是一个回音室。因此,我们的模型需要引入希望聊天机器人谈论的领域的附加信息。我们的NLP模型需要学习一个从问题到回复的复杂映射,而不是回声或翻译,这需要更多的训练数据和更高维度的思想向量,因为它必须包含对话引擎需要了解的领域的所有信息。LSTM模型中增加思想向量的维数,可以增加其信息容量。如果想把翻译机器变成对话机器,还需要获得足够多的合适数据。

给定一组词条,我们可以训练机器学习流水线来模拟一个对话回复序列,我们需要足够多的对话语句对合在思想向量中足够大的信息空间来理解所有这些映射。一旦我们有了一个数据集,其中包含了足够多的从问题到回复的“翻译”对,我们就可以使用和机器翻译相同的网络来训练对话引擎。

Keras使用一种称为编码-解码模型的模块化架构,为构建序列到序列网络提供模块。它提供了一个API来访问LSTM网络的所有内部组件,我们需要这些组件来解决翻译、会话甚至基因型-表现型的问题。

LSTM

已知LSTM如何为循环网络提供方法来选择性地记住和遗忘它们在样本文档中“看到”的词条模式:每个时刻的输入词条都经过遗忘门和更新门,乘以权重和掩码,然后存储在记忆元胞中,各个时刻(词条)的网络输出不单单由输入词条决定,而是由输入词条和记忆单元当前的状态一起决定的。

重要的是,LSTM在文档之间共享词条模式识别器,因为遗忘门和更新门具有在读取多个文档后训练的权重。因此,LSTM不必为每个新文档重新学习英语拼写和语法。我们学习了如何激活存储在LSTM记忆元胞的权重中的这些词条模式,从而根据一些种子词条预测之后的词条及处罚序列的生成。(如下图)

通过预测一个个的词条,我们可以根据网络建议的可能的后续词条的概率分布来选择下一个词条,从而生成一些文本。虽然说不上完美,但还是很有趣的。

还有一种方法,就是引入LSTM模型,以一种随机性更弱、更可控的方式解码记忆元胞中的模式。使用LSTM在分类任务中创建的思想向量,然后使用生成的向量作为输入传递给第二个完全不同的LSTM,这个LSTM只试图逐个预测各个词条,这种方法提供了一种将输入序列映射到一个截然不同的输出序列的方法。

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

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

相关文章

重生奇迹MU 红龙剑士的风采 游戏玩家的记忆

在重生奇迹MU游戏中,剑士是一个老牌职业,而其中红龙剑士更是备受瞩目的角色。红龙剑士选手身着一身红色龙王装,仿佛已经沐浴了敌人的鲜血,是一个经验丰富的剑手。很多老玩家都信任剑士这个职业,并视其为忠实的伙伴&…

[每周一更]-(第114期):介绍GitLab不同角色对应的权限

文章目录 GitLab 角色及其权限项目级别角色组级别角色 使用场景示例 工作中一直使用Gitlab搭建了公司内网的代码管理工具,但是不同的用户会分配相应的权限,来管理不同用户及角色的权限信息,我们来介绍下角色的信息,方便我们管理公…

C++教程(一):超详细的C++矩阵操作和运算(附实例代码,与python对比)

python教程(一):超详细的numpy矩阵操作和运算(附实例代码) 在之前的章节中,我们详细介绍了python中numpy的矩阵操作。但在自动驾驶开发中,我们一般采用C进行功能开发,因此C矩阵运算…

重学SpringBoot3-集成RocketMQ(二)

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞👍收藏⭐评论✍ 重学SpringBoot3-集成RocketMQ(二) 1. 基础概念2. 准备工作3. 实现事务消息的生产者4. 事务监听器实现5. 消费者示例6. 发送事务消息7. 测试7.1 模…

【新片场-注册安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 1. 暴力破解密码,造成用户信息泄露 2. 短信盗刷的安全问题,影响业务及导致用户投诉 3. 带来经济损失,尤其是后付费客户,风险巨大,造…

如何用SQL Server和Oracle进行数据同步?

数据同步是大数据应用中非常重要的环节,它可以保证数据的实时性和一致性,为数据分析和决策提供重要依据。常见的数据同步方式包括ETL实时同步和实时ETL工具,其中实时ETL工具又可以分为基于日志追踪和基于触发器两种。 针对不同的数据库系统&…

在grafana上配置显示全部node资源信息概览

在grafana上配置显示全部node资源信息概览,便于巡检 1,注册grafana官网账号:Grafana dashboards | Grafana Labs 2、寻找可以展示所有node资源概览信息的dashboard,并下载支持prometheus数据源的dashboard&#xff…

DevOps 中常常被忽略却至关重要的一个工具

在今天的云原生开发时代,DevOps 已经成为许多企业提高开发和运维效率的标准流程。DevOps 工具链广泛而复杂,涵盖了从规划、开发、测试到部署、监控和运维的多个环节。例如:规划与项目管理工具 GitLab、Jira;版本控制工具 Git&…

c++—多态【万字】【多态的原理】【重写的深入学习】【各种继承关系下的虚表查看】

目录 C—多态1.多态的概念2.多态的定义及实现2.1多态的构成条件2.2虚函数的重写2.2.1虚函数重写的两个例外:2.2.1.1协变2.2.1.2析构函数的重写 2.3 c11的override和final2.3.1final2.3.2override 2.4 重载、重写、重定义的对比 3.抽象类3.1抽象类的概念3.2接口继承和…

搜索树和Map

一.搜索树 1.概念 二叉搜索树又叫二叉排序树,它可以是一颗空树也可以是具有以下性质的二叉树 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值若它的右子树不为空,则右子树上所有节点的值都大于根节点的值它的左子树也分别为二…

Redis 篇-深入了解使用 Redis 中的 GEO 数据结构实现查询附近店铺、BitMap 实现签到功能、HyperLogLog 实现 UV 流量统计

🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 GEO 数据结构的基本用法 1.1 使用 GEO 导入数据 1.2 使用 GEO 实现查找附近店铺功能 2.0 BitMap 基本用法 2.1 使用 BitMap 实现签到功能 2.2 统计连续签到功能 3…

windows server2012 配制nginx安装为服务的时候,直接跳要安装.net框架,用自动的安装,直接失败的解决。

1、上一个已成功在安装过程中的图: 2、之前安装过程中错误的图: 3、离线安装解决: 下载.net framework 3.5,然后解压后,选择指定备用源路径,然后选择.net安装包所在目录: 只要指定上面全路径就…

4G模块点对点传输手把手教程!如何实现远程设备直接通信

使用4G模块进行点对点传输,可以实现远程设备的直接通信,广泛应用于工业控制、远程监控、物联网等领域。本教程将详细讲解如何通过4G模块,构建设备之间的点对点(P2P)传输系统,从配置设备、建立通信通道到实际…

Delphi Web和Web服务开发目前有哪些选择

Delphi Web和Web服务开发目前有哪些选择 Delphi Web和Web服务开发目前有以下几个选择: Delphi MVC Framework(https://github.com/delphimvcframework/delphimvcframework):这是一个开源的Delphi Web框架,基于MVC&am…

【Linux】基本指令及其周边知识

1.准备阶段 在介绍Linux的基本指令之前,我先先向大家介绍一下我的Linux平台,首先我是在阿里云买了个服务器,然后使用Xshell来远程登录Linux,之后有关Linux上的操作都是在这上面进行的。如果你也买了相关的服务器并且设置了相关示…

Parallels Desktop19中文版2024九月最新

Parallels Desktop可以使轻松地在 MAC上运行成千上万款 Windows应用程序,如Excel,会计交易软件等。针对最新版 windows11和macOS Sonoma 进行优化。在 MAC虚拟机中跨多个操作系统开发和测试。包含 Parallels Toolbox – 40 多个适用于 Mac 和 PC 的一键…

ROS1录包偶现一次崩溃问题定位

现象&#xff1a;崩到了mogo_reporter里面 堆栈&#xff1a;crash里面同时存在两个主线程的堆栈 代码 #include "boost/program_options.hpp" #include <signal.h> #include <string> #include <sstream> #include <iostream> #include <…

[“1“, “2“, “3“].map(parseInt)结果

parseInt 的用法 parseInt 是 JavaScript 中的一个全局函数&#xff0c;用于将字符串转换为整数。它的基本语法如下&#xff1a; parseInt(string, radix);string&#xff1a;要解析的字符串。radix&#xff08;可选&#xff09;&#xff1a;字符串的基数&#xff0c;可以是 …

高科技企业选择跨网文件系统最容易踩坑的地方

在数字化时代&#xff0c;高科技企业频繁使用跨网文件交换系统的原因多种多样。首先&#xff0c;随着全球化的推进&#xff0c;企业需要在不同地理位置的分支机构之间传输敏感数据和重要文件。其次&#xff0c;跨网文件交换能够提高工作效率&#xff0c;确保信息的实时更新和共…

开源 TTS 模型「Fish Speech」1.4 发布;GameGen-O :生成开放世界游戏视频模型丨 RTE 开发者日报

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。 我们的社区编辑团队会整理分享 RTE&#xff08;Real-Time Engagement&#xff09; 领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、…