首页 > 其他分享 >机器学习——编码器和解码器架构

机器学习——编码器和解码器架构

时间:2023-11-15 13:00:11浏览次数:30  
标签:__ 编码器 架构 self init 解码器 序列

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

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

 

编码器

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

from torch import nn


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

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

 

解码器

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

#@save
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

 

合并编码器和解码器

 

#@save
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)

 

 

总结

 

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

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

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

 

标签:__,编码器,架构,self,init,解码器,序列
From: https://www.cnblogs.com/yccy/p/17833583.html

相关文章

  • 云原生架构实战08 Kubernetes运维管理
    一、普罗米修斯架构简介Heapster是容器集群监控和性能分析工具,天然地支持Kubernetes和CoreOSKubernetes有个出名的监控agent--cAdvisor,在每个KubernetesNode上都会运行cAdvisor,它会收集本机以及容器的监控数据(cpumemory,filesystem, networkuptime)。在较新的版本中,k8s......
  • 轻量级前端架构之:小程序技术
    小程序技术自微信2016年提出并大力推动,如今已经成为了中国前端研发的“潮流”,或者说是“趋势”。早期,微信小程序是微信公众平台推出的一种应用形态。微信小程序开放平台允许开发者在微信内直接开发和发布应用,用户无需下载安装,即可在微信中使用。 之所以推出小程序技术,是为了......
  • 浅谈移动端GPU架构
    【USparkle专栏】如果你深怀绝技,爱“搞点研究”,乐于分享也博采众长,我们期待你的加入,让智慧的火花碰撞交织,让知识的传递生生不息!一、前言本文是关于TBR、TBDR和IMR三种不同的GPU架构的学习和总结,希望可以帮助到大家理解这些概念。前置概念现有的GPU架构主要分为以下三类:Imm......
  • 轻量级前端架构有哪些特性?
    小程序技术自微信2016年提出并大力推动,如今已经成为了中国前端研发的“潮流”,或者说是“趋势”。早期,微信小程序是微信公众平台推出的一种应用形态。微信小程序开放平台允许开发者在微信内直接开发和发布应用,用户无需下载安装,即可在微信中使用。之所以推出小程序技术,是为了解决传统......
  • 【Redis】详解 Redis哨兵(Sentinel)架构,Master 挂了的故障转移措施
    (目录)Redis哨兵(Sentinel)架构Redis主从复制一主多从架构master主要负责写入,slave负责读取,有读写分离的功能redis主从同步原理1、slave执行命令向master建立连接2、master执行bgsave(后台存储),生成rdb快照(redis备份方式,data以二进制方式保存在本地),发送到slave上3、sla......
  • 深入解析监控易产品架构
      在现代化的信息技术体系中,产品架构的设计和实施是实现高效运维的基石。一个精心设计和实施的产品架构不仅能够保证IT系统的稳定运行,还能够应对复杂多变的业务需求。本文将详细探讨监控易的产品架构,包括数据中台、功能应用层和展示层的设计与工作原理。数据中台  数据中台......
  • 从混乱到优雅:基于DDD的六边形架构的代码翻新指南
    前言趁着双十一备战封板,终于又有一些时间可以梳理一下最近的心得。最近这半年跟同事讨论比较多的是分层架构,然后就会遇到两个触及灵魂的问题,一个是如何做好分层架构,二是DDD在架构层面该如何落地。为了说好分层,我们需要了解架构的意义。良好的架构是为了保证一下两点:治理应用......
  • 基于 Istio 的灰度发布架构方案实践之路
    1.背景介绍灰度发布,又名金丝雀发布,是指能够平滑过渡的一种发布方式。基于系统稳定性和快速业务迭代的综合考虑,业务应用开发团队采取了新版本服务灰度上线的方式,即新版本服务并非全量发布到线上环境,而是发布少数几个实例进行灰度验证,没有问题后再全量发布。在部分核心服务进行接......
  • 申报软件著作权时,用vscode编码器统计代码行数(转载)
    原文地址https://blog.csdn.net/michiko98/article/details/133743417在一些特殊情况中我们需要计算代码的行数,这时我们就可以借助vscode的VS CodeCounter插件进行统计。第一步:选择VS Code Counter进行安装。(安装完毕有条件的可以重启编码器)。第二步:快捷键ctrl+shift+p进......
  • VPC终端节点的实现架构和原理
    本文分享自天翼云开发者社区《VPC终端节点的实现架构和原理》,作者:云云生息什么是VPC终端节点?在传统的VPC架构中,为了使VPC内的资源能够与云服务提供商的各种服务进行通信,通常需要通过公共Internet进行访问。这种方式存在一些问题,比如安全性、可靠性、访问速度等。为了解决这些问......