编码器-解码器架构

本文介绍了编码器-解码器架构在处理序列转换问题,特别是机器翻译任务中的作用。编码器将输入序列转换为固定形状的编码状态,而解码器则根据此状态生成输出序列。在机器翻译示例中,输入的英文句子被编码,然后解码为法文翻译。编码器和解码器的接口定义了模型的前向传播过程,其中解码器的状态初始化和每个时间步的输出词元生成是关键。这种架构为后续的序列转换模型奠定了基础。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

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

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

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

1.编码器

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

from mxnet.gluon import nn


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

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

2.解码器

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

我们将特定的“<eos>”词元添加到所有序列的末尾, 用于表示序列的结束。 当模型通过一个词元接一个词元地生成序列进行预测时, 生成的“<eos>”词元说明完成了序列输出工作。

#@save
class Decoder(nn.Block):
    """编码器-解码器架构的基本解码器接口"""
    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. 合并编码器和解码器

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

#@save
class EncoderDecoder(nn.Block):
    """编码器-解码器架构的基类"""
    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)

“编码器-解码器”体系架构中的术语状态 会启发人们使用具有状态的神经网络来实现该架构。

### CNN 编码器-解码器架构工作原理 #### 工作机制概述 卷积神经网络(CNN)中的编码器-解码器结构是一种特殊的网络设计模式,广泛应用于图像处理领域。该架构由两部分组成:编码器解码器。 #### 编码过程 给定原始像素图 \(I\) ,基本的 CNN 分支通过一系列尺度将其编码成多级特征映射[^1]。每一层可以是一个操作函数组合的结果,比如卷积(Conv),池化(Pooling),批标准化(BN)以及激活函数等。这些操作共同作用于输入数据上,逐步提取抽象层次更高的语义信息: ```python import torch.nn as nn class Encoder(nn.Module): def __init__(self): super(Encoder, self).__init__() self.conv1 = nn.Conv2d(in_channels=3, out_channels=64, kernel_size=3, stride=1, padding=1) self.bn1 = nn.BatchNorm2d(num_features=64) self.relu = nn.ReLU() def forward(self, x): x = self.conv1(x) x = self.bn1(x) x = self.relu(x) return x ``` 上述代码展示了如何构建一个简单的编码模块,在实际应用中通常会有多个这样的模块堆叠起来形成完整的编码路径。 #### 解码过程 解码阶段旨在恢复空间分辨率并重建目标输出。这通常是通过对来自编码端的信息进行反向传播来实现,即采用转置卷积、最近邻插值或其他形式的放大方法增加维度大小的同时减少通道数量: ```python class Decoder(nn.Module): def __init__(self): super(Decoder, self).__init__() self.deconv1 = nn.ConvTranspose2d(in_channels=64, out_channels=3, kernel_size=3, stride=1, padding=1) def forward(self, x): x = self.deconv1(x) return x ``` 整个编解码流程能够有效地捕捉到输入图片内部复杂的几何关系,并用于后续的任务分析。 ### 应用场景实例 #### 图像分割 在医学影像诊断方面,由于 CNN 可以捕获医疗图像中存在的复杂空间依赖性,因此非常适合执行区分性的分类任务[^2]。对于特定器官或病变区域的精确定位而言,基于 U-net 架构编码器-解码器模型表现尤为出色。 #### 超分辨率重建 当面对低质量或者模糊不清的照片时,利用此框架可以从少量细节中推测出更精细的内容,从而达到提升画质的效果。 #### 风格迁移 借助预训练好的艺术风格滤镜作为先验知识指导新作品创作的过程也离不开此类技术的支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

流萤数点

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值