【现代深度学习技术】现代循环神经网络06:编码器-解码器架构

【作者主页】Francek Chen

【专栏介绍】⌈ ⌈ ⌈PyTorch深度学习 ⌋ ⌋ ⌋ 深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上,结合当代大数据和大算力的发展而发展出来的。深度学习最重要的技术特征是具有自动提取特征的能力。神经网络算法、算力和数据是开展深度学习的三要素。深度学习在计算机视觉、自然语言处理、多模态数据分析、科学探索等领域都取得了很多成果。本专栏介绍基于PyTorch的深度学习算法实现。

【GitCode】专栏资源保存在我的GitCode仓库:https://gitcode.com/Morse_Chen/PyTorch_deep_learning

文章目录


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


图1 编码器-解码器架构

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

一、编码器

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

python 复制代码
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)转换为编码后的状态。注意,此步骤可能需要额外的输入,例如:输入序列的有效长度,这在机器翻译与数据集中进行了解释。为了逐个地生成长度可变的词元序列,解码器在每个时间步都会将输入(例如:在前一时间步生成的词元)和编码后的状态映射成当前时间步的输出词元。

python 复制代码
#@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

三、合并编码器和解码器

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

python 复制代码
#@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)

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

小结

  • "编码器-解码器"架构可以将长度可变的序列作为输入和输出,因此适用于机器翻译等序列转换问题。
  • 编码器将长度可变的序列作为输入,并将其转换为具有固定形状的编码状态。
  • 解码器将具有固定形状的编码状态映射为长度可变的序列。
相关推荐
有才不一定有德1 天前
解密黑盒:如何追踪 AI 角色的“观点”变化?
人工智能·多智能体系统
晞微1 天前
ResNet18 迁移学习实战:CIFAR-10 图像分类与 CPU 优化
人工智能·分类·迁移学习
java_logo1 天前
Onlyoffice Documentserver Docker 容器化部署指南
运维·人工智能·docker·容器·onlyoffice·milvus·documentserver
数据猿1 天前
【金猿人物展】涛思数据创始人、CEO陶建辉:实现AI时代时序数据库向“数据平台”的转型
大数据·数据库·人工智能·时序数据库·涛思数据
TMT星球1 天前
京东健康联合京东金榜发布2025年度三大品类金榜
人工智能
oak隔壁找我1 天前
Spring AI Alibaba + Crawl4ai + Docker 搭建一个具有联网搜索能力的Agent
人工智能
海边夕阳20061 天前
【每天一个AI小知识】:什么是大语言模型(LLM)?
人工智能·深度学习·神经网络·机器学习·语言模型·自然语言处理·llm
算力魔方AIPC1 天前
破解“竖排文本”魔咒:在 RTX 3060 上微调 PaddleOCR-VL 以识别日本漫画
人工智能
袖手蹲1 天前
Arduino UNO Q 从 Arduino Cloud 远程控制闪烁 LED
人工智能·单片机·嵌入式硬件·电脑
有Li1 天前
医用图像配准中从基于模型到学习正则化的综合综述|文献速递-文献分享
论文阅读·深度学习·文献