深度学习入门(六十四)循环神经网络——编码器-解码器架构

news2025/1/24 11:40:50

深度学习入门(六十四)循环神经网络——编码器-解码器架构

  • 前言
  • 循环神经网络——编码器-解码器架构
    • 课件
      • 重新考察CNN
      • 重新考察RNN
      • 编码器-解码器架构
      • 总结
    • 教材
      • 1 编码器
      • 2 解码器
      • 3 合并编码器和解码器
      • 4 训练模型
      • 5 小结
      • 参考文献

前言

核心内容来自博客链接1博客连接2希望大家多多支持作者
本文记录用,防止遗忘

循环神经网络——编码器-解码器架构

课件

重新考察CNN

在这里插入图片描述

  • 编码器:将输入编程成中间表达形式(特征)
  • 解码器:将中间表示解码成输出

重新考察RNN

在这里插入图片描述

  • 编码器:将文本表示成向量
  • 解码器:向量表示成输出

编码器-解码器架构

一个模型被分为两块:

  • 编码器处理输入
  • 解码器生成输出
    在这里插入图片描述

总结

  • 使用编码器-解码器架构的模型,编码器负责表示输入,解码器负责输出

教材

正如我们在上一节机器翻译数据集中所讨论的, 机器翻译是序列转换模型的一个核心问题, 其输入和输出都是长度可变的序列。 为了处理这种类型的输入和输出, 我们可以设计一个包含两个主要组件的架构: 第一个组件是一个编码器(encoder): 它接受一个长度可变的序列作为输入, 并将其转换为具有固定形状的编码状态。 第二个组件是解码器(decoder): 它将固定形状的编码状态映射到长度可变的序列。 这被称为编码器-解码器(encoder-decoder)架构, 如图所示。
在这里插入图片描述

我们以英语到法语的机器翻译为例: 给定一个英文的输入序列:“They”“are”“watching”“.”。 首先,这种“编码器-解码器”架构将长度可变的输入序列编码成一个“状态”, 然后对该状态进行解码, 一个词元接着一个词元地生成翻译后的序列作为输出: “Ils”“regordent”“.”。 由于“编码器-解码器”架构是形成后续章节中不同序列转换模型的基础, 因此本节将把这个架构转换为接口方便后面的代码实现。

下图描述了使用编码器—解码器将英语句子翻译成法语句子的一种方法。在训练数据集中,我们可以在每个句子后附上特殊符号“<eos>”(end of sequence)以表示序列的终止。编码器每个时间步的输入依次为英语句子中的单词、标点和特殊符号“<eos>”。图10.8中使用了编码器在最终时间步的隐藏状态作为输入句子的表征或编码信息。解码器在各个时间步中使用输入句子的编码信息和上个时间步的输出以及隐藏状态作为输入。我们希望解码器在各个时间步能正确依次输出翻译后的法语单词、标点和特殊符号"<eos>“。需要注意的是,解码器在最初时间步的输入用到了一个表示序列开始的特殊符号”<bos>"(beginning of sequence)。

在这里插入图片描述

1 编码器

编码器的作用是把一个不定长的输入序列变换成一个定长的背景变量 c c c,并在该背景变量中编码输入序列信息。常用的编码器是循环神经网络。

让我们考虑批量大小为1的时序数据样本。假设输入序列是 x 1 , . . . , x T x_1,...,x_T x1,...,xT ,例如 x i x_i xi是输入句子中的第 i i i个词。在时间步 t t t,循环神经网络将输入 x t x_t xt 的特征向量 x t x_t xt和上个时间步的隐藏状态 h t − 1 h_{t-1} ht1变换为当前时间步的隐藏状态 h t h_{t} ht 。我们可以用函数 f f f表达循环神经网络隐藏层的变换:

h t = f ( x t , h t − 1 ) h_t=f(x_t,h_t-1{}) ht=f(xt,ht1)

接下来,编码器通过自定义函数 q q q将各个时间步的隐藏状态变换为背景变量。

c = q ( h 1 , . . . , h T ) c=q(h_1,...,h_T) c=q(h1,...,hT)
例如,当选择 q ( h 1 , . . . , h T ) = h T q(h_1,...,h_T)=h_T q(h1,...,hT)=hT时,背景变量是输入序列最终时间步的隐藏状态 h T h_T hT

以上描述的编码器是一个单向的循环神经网络,每个时间步的隐藏状态只取决于该时间步及之前的输入子序列。我们也可以使用双向循环神经网络构造编码器。在这种情况下,编码器每个时间步的隐藏状态同时取决于该时间步之前和之后的子序列(包括当前时间步的输入),并编码了整个序列的信息。

在编码器接口中,我们只指定长度可变的序列作为编码器的输入X。 任何继承这个Encoder基类的模型将完成代码实现。

from torch import nn

class Encoder(nn.Module):
    """编码器-解码器架构的基本编码器接口"""
    def __init__(self, **kwargs):
        super(Encoder, self).__init__(**kwargs)

    def forward(self, X, *args):
        raise NotImplementedError

2 解码器

刚刚已经介绍,编码器输出的背景变量 c c c编码了整个输入序列 x 1 , . . . , x T x_1,...,x_T x1,...,xT的信息。给定训练样本中的输出序列 y 1 , . . . , y T ′ y_1,...,y_{T'} y1,...,yT,对每个时间步 t ′ t′ t(符号与输入序列或编码器的时间步 t t t有区别),解码器输出 y t ′ y_{t'} yt的条件概率将基于之前的输出序列 y 1 , . . . , y t ′ − 1 y_1,...,y_{t'-1} y1,...,yt1和背景变量 c c c,即 P ( y t ′ ∣ y 1 , . . . , y t − 1 ′ , c ) P(y_{t'}|y_1,...,y_{t-1'},c) P(yty1,...,yt1,c)
为此,我们可以使用另一个循环神经网络作为解码器。在输出序列的时间步 t ′ t′ t ,解码器将上一时间步的输出 y t ′ − 1 y_{t'-1} yt1以及背景变量 c c c作为输入,并将它们与上一时间步的隐藏状态 s t ′ − 1 s_{t′−1} st1 变换为当前时间步的隐藏状态 s t ′ s_{t′} st。因此,我们可以用函数 g g g表达解码器隐藏层的变换:
s t ′ = g ( t t ′ − 1 , c , s t ′ − 1 ) s_{t'}=g(t_{t'-1},c,s_{t′−1}) st=g(tt1c,st1)
有了解码器的隐藏状态后,我们可以使用自定义的输出层和softmax运算来计算 P ( y t ′ ∣ y 1 , … , y t ′ − 1 , c ) P(y_{t′}∣y_1,…,y_{t′−1},c) P(yty1,,yt1,c)例如,基于当前时间步的解码器隐藏状态 s t ′ s_{t′} st、上一时间步的输出 y t ′ − 1 y_{t′−1} yt1以及背景变量 c c c来计算当前时间步输出 y t ′ y_{t'} yt 的概率分布。

在下面的解码器接口中,我们新增一个init_state函数, 用于将编码器的输出(enc_outputs)转换为编码后的状态。 注意,此步骤可能需要额外的输入,例如:输入序列的有效长度。 为了逐个地生成长度可变的词元序列, 解码器在每个时间步都会将输入 (例如:在前一时间步生成的词元)和编码后的状态 映射成当前时间步的输出词元。

class Decoder(nn.Module):
    """编码器-解码器架构的基本解码器接口"""
    def __init__(self, **kwargs):
        super(Decoder, self).__init__(**kwargs)

    def init_state(self, enc_outputs, *args):
        raise NotImplementedError

    def forward(self, X, state):
        raise NotImplementedError

3 合并编码器和解码器

总而言之,“编码器-解码器”架构包含了一个编码器和一个解码器, 并且还拥有可选的额外的参数。 在前向传播中,编码器的输出用于生成编码状态, 这个状态又被解码器作为其输入的一部分。

class EncoderDecoder(nn.Module):
    """编码器-解码器架构的基类"""
    def __init__(self, encoder, decoder, **kwargs):
        super(EncoderDecoder, self).__init__(**kwargs)
        self.encoder = encoder
        self.decoder = decoder

    def forward(self, enc_X, dec_X, *args):
        enc_outputs = self.encoder(enc_X, *args)
        dec_state = self.decoder.init_state(enc_outputs, *args)
        return self.decoder(dec_X, dec_state)

“编码器-解码器”体系架构中的术语状态 会启发人们使用具有状态的神经网络来实现该架构。 在下一节中,我们将学习如何应用循环神经网络, 来设计基于“编码器-解码器”架构的序列转换模型。

4 训练模型

根据最大似然估计,我们可以最大化输出序列基于输入序列的条件概率
在这里插入图片描述
并得到该输出序列的损失
在这里插入图片描述
在模型训练中,所有输出序列损失的均值通常作为需要最小化的损失函数。在图所描述的模型预测中,我们需要将解码器在上一个时间步的输出作为当前时间步的输入。与此不同,在训练中我们也可以将标签序列(训练集的真实输出序列)在上一个时间步的标签作为解码器在当前时间步的输入。这叫作强制教学(teacher forcing)。

5 小结

  • 编码器-解码器”架构可以将长度可变的序列作为输入和输出,因此适用于机器翻译等序列转换问题。

  • 编码器将长度可变的序列作为输入,并将其转换为具有固定形状的编码状态。

  • 解码器将具有固定形状的编码状态映射为长度可变的序列。

参考文献

[1] Cho, K., Van Merriënboer, B., Gulcehre, C., Bahdanau, D., Bougares, F., Schwenk, H., & Bengio, Y. (2014). Learning phrase representations using RNN encoder-decoder for statistical machine translation. arXiv preprint arXiv:1406.1078.

[2] Sutskever, I., Vinyals, O., & Le, Q. V. (2014). Sequence to sequence learning with neural networks. In Advances in neural information processing systems (pp. 3104-3112).

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

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

相关文章

分布式任务调度 - PowerJob

一、简介 1、介绍 PowerJob&#xff08;原OhMyScheduler&#xff09;是全新一代分布式任务调度与计算框架&#xff0c;其主要功能特性如下&#xff1a; 使用简单&#xff1a;提供前端Web界面&#xff0c;允许开发者可视化地完成调度任务的管理&#xff08;增、删、改、查&am…

数据库原理及MySQL应用 | 约束

约束是保证数据完整性的一种数据库对象&#xff0c;按约束作用不同&#xff0c;分为七种。 约束从字面上来看就是受到限制&#xff0c;它是附加在表上&#xff0c;通过限制列中、行中、表之间数据来保证数据完整性的一种数据库对象。 在MySQL中&#xff0c;有多种约束&#xf…

设计模式原则 - 开闭原则(五)

开闭原则一 官方定义基本介绍二 案例演示普通实现方式案例分析开闭原则实现案例分析三 注意事项一 官方定义 开闭原则&#xff08; Open Close Principle &#xff09;&#xff0c;又称为OCP原则&#xff0c;他的官方定义如下&#xff1a; Software entities like classes,modu…

基于Java+Swing+Mysql实现停车场管理系统

基于JavaSwingMysql实现停车场管理系统一、系统介绍二、系统展示三、其它1.其他系统实现一、系统介绍 1.系统功能 用户 1.登录系统 2.信息查询 包含计费标准&#xff0c;当前在场信息&#xff0c;用户历史信息&#xff0c;用户个人信息&#xff0c;出入场信息&#xff0c;当前…

Win10提示错误代码0xc0000001的解决办法

​有一些朋友在使用Win10系统的时候会遇到蓝屏故障&#xff0c;提示“无法正常启动你的电脑&#xff0c;在多次尝试后&#xff0c;你的电脑上的操作系统仍无法启动&#xff0c;因此需求对其进行修复。” Win10提示恢复无法正常启动你的电脑0xc0000001 故障原因&#xff1a; 错误…

实战案例:初探工程配置 图标组件热身

点击上方卡片“前端司南”关注我您的关注意义重大原创前端司南前言本文是 基于ViteAntDesignVue打造业务组件库[1] 专栏第 3 篇文章【实战案例&#xff1a;初探工程配置 & 图标组件热身】&#xff0c;我将从业务系统中最基础的图标组件入手&#xff0c;带着读者们练练手找找…

websocket的用处及vue和SpringBoot和nginx的引入-入门

websocket的用处及vue和SpringBoot的引入-入门 为什么要有websocket 微信 想一个场景&#xff0c;扫码登录&#xff0c;服务器并不知道用户有没有扫码&#xff0c;怎么办&#xff0c;一种办法是HTTP定时轮询&#xff0c;1-2秒就请求一次服务端&#xff0c;看看用户有没有扫码…

5.3 常见的电感式和电容式感测原理及应用

常见的电感式和电容式感测应用1、电感式和电容式工作原理1.1 电感式感测工作原理1.2 电容式感测工作原理2 FDC&#xff1a;电容式液位感测2.1 电容技术在液位感测中的优势2.2 电容式液位感测入门3 LDC&#xff1a;电感式触控按钮4 LDC&#xff1a;增量编码器和事件计数5 LDC&am…

再学C语言10:字符串(1)

一、字符串定义 字符串&#xff1a;一个或多个字符的序列 "hello world!" 双引号并不是字符串的一部分&#xff0c;只是用于通知编译器其中包含了一个字符串 C没有为字符串定义专门的变量类型&#xff0c;而是将其存储在char数组中 字符串中的字符存放在相邻的存…

Amazon 4.7 星评,领域新经典,了解服务设计就读它

2011 年&#xff0c;Adaptive Path 公司的 Brandon Schauer 粗略估算&#xff0c;美国每年在服务的规划和设计上大约花费 20 亿美元&#xff0c;但其中仅有 7000 万美元&#xff08;大约 3.5%&#xff09;花在了“服务设计”上。做另外 96.5% 的工作的那些人&#xff0c;从不觉…

参加大学生数学建模大赛,Matlab和Python到底哪个更好?

前言 后台的小伙伴经常会问编程过程中&#xff0c;MATLAB和Python到底哪个更好&#xff1f;这个问题一直困惑很多同学&#xff0c;今天小编来给大家从实用型来综合分析一下&#xff1a; 首先从两者各自的应用做个对比。 一、python的优势 Python相对于Matlab最大的优势&…

Mac M2芯 k8s(minikube)超详细实战 - 单节点部分

概述 我使用的电脑是Mac pro M2芯的&#xff0c;使用的虚拟环境是 Ubuntu 22.04 &#xff0c;M2芯兼容性不是特别好&#xff0c;所以尽量跟我博客中的版本保持一致。 虚拟机环境 Ubuntu 22.04docker &#xff1a;20.10.17minikube&#xff1a;v1.25.2 搭建minikube虚拟机环境…

【强化学习基础】强化学习的基本概念:状态、动作、智能体、策略、奖励、状态转移、轨迹、回报、价值函数

文章目录1.状态&#xff08;State&#xff09;2.动作&#xff08;Action&#xff09;3.智能体&#xff08;Agent&#xff09;4.策略&#xff08;Policy&#xff09;5.奖励&#xff08;Reward&#xff09;6.状态转移&#xff08;State transition&#xff09;7.智能体与环境交互…

高效率的Python开发工具——PyCharm v2022.3正式发布

JetBrains PyCharm是一种Python IDE&#xff0c;其带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具。此外&#xff0c;该IDE提供了一些高级功能&#xff0c;以用于Django框架下的专业Web开发。 PyCharm v2022.3官方正式版下载(q技术交流&#xff1a;786598704)…

wireshark抓包数据提取TCP/UDP/RTP负载数据方法

wireshark抓包数据提取TCP_UDP_RTP负载数据方法 文章目录wireshark抓包数据提取TCP_UDP_RTP负载数据方法1 背景2 TCP和UDP负载提取方式3 RTP负载提取方式1 背景 在视频抓包分析过程中&#xff0c;有时候需要从TCP、UDP、RTP中直接提取payload数据&#xff0c;比如较老的摄像机…

微课堂助力在线教育招生引流方式_付费视频系统搭建对在线教育的作用

一、借助优惠码线上线下推广课程 1、线下发传单&#xff1a; 机构先在我们后台创建对应课程的通用优惠码&#xff0c;然后再制作课程传单介绍页。传单上显示出对应课程的通用优惠码&#xff0c;线下派发传单给到用户。 2、线下刮刮卡片推广&#xff1a;将私有码制作成卡片配合…

SVM(二)对偶问题转化以及求解

上篇&#xff1a; SVM&#xff08;支持向量机&#xff09;&#xff08;一&#xff09;基本形式推导 凸优化 考虑如下优化问题&#xff1a; 应用拉格朗日乘子法&#xff1a; 定义拉格朗日对偶函数G\mathcal{G}G&#xff0c;这里 infinfinf 是上确界&#xff08;集合的最小上…

超标量处理器设计——第十章_提交

参考《超标量处理器》姚永斌著 文章目录超标量处理器设计——第十章_提交10.1 概述10.2 重排序缓存10.2.1 一般结构10.2.2 端口需求10.3 管理处理器的状态10.3.1 使用ROB管理指令集定义的状态10.3.2 使用物理寄存器管理指令集定义的状态10.4 特殊情况处理10.4.1 分支预测失败的…

【微服务】Nacos ⼀致性协议

目录 一、为什么 Nacos 需要⼀致性协议 二、为什么 Nacos 选择了 Raft 以及 Distro 1、从服务注册发现来看 2、从配置管理来看 3、为什么是 Raft 和 Distro 呢 三、早期的 Nacos ⼀致性协议 四、当前 Nacos 的⼀致性协议层 &#x1f496; Spring家族及微服务系列文章 …

【关于时间序列的ML】项目 2 :使用机器学习预测股票价格

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…