美文网首页深度学习
循环神经网络13-编码器-解码器架构

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

作者: R7_Perfect | 来源:发表于2025-11-11 09:34 被阅读0次

一、编码器-解码器架构概述

在许多实际应用中(例如机器翻译),我们的输入和输出都是长度可变的序列。传统的神经网络难以直接处理这种变长输入输出问题。编码器-解码器(Encoder-Decoder)架构正是为此而设计的。它由两个主要组件构成:

  • 编码器(Encoder): 接收一个长度可变的输入序列,并将其转换为一个固定形状的“编码状态”。
  • 解码器(Decoder): 接收编码状态,并逐步生成长度可变的输出序列。

举个简单例子,对于英语到法语的机器翻译,输入序列可能是:

  • 英文输入:X=(They,are,watching,.)

编码器将这个序列编码为一个固定的状态 s(可以理解为一个向量),表示为:

  • 编码状态:s=f(X)

其中,f 表示编码器内部的映射函数。然后,解码器基于这个状态 s,逐个生成输出词元,得到翻译后的序列:

  • 法文输出:Y=(Ils,regardent,.)
    如图所示,整个过程可以直观地理解为将一个变长序列“压缩”为一个定长的状态,再由这个状态“解压缩”出另一个变长序列。


    image.png

二、编码器

编码器的核心任务是将输入序列转换为一个固定形状的编码状态。假设输入序列为


b88c7fc4-78c8-4390-ab72-12c776dcafca.png

那么编码器可以看作是一个函数 f,输出一个状态向量


97a58070-8e4e-406f-9d9a-a31d5f3f2ea0.png
在深度学习中,常用循环神经网络(RNN)、长短时记忆网络(LSTM)或门控循环单元(GRU)来实现编码器,因为它们能够处理序列数据。
下面是一个基于 PyTorch 框架的编码器接口示例代码:
class Encoder(nn.Module):
    """编码器-解码器架构的基本编码器接口"""

    def __init__(self, **kwargs):
        super(Encoder, self).__init__(**kwargs)

    def forward(self, X, *args):
        # X 为输入序列(长度可变)
        # 此处应实现编码逻辑,将 X 转换为固定形状的编码状态
        raise NotImplementedError

在这个接口中,任何继承 Encoder 的模型都需要实现 forward 方法。数学上可以认为这个过程为:


97a58070-8e4e-406f-9d9a-a31d5f3f2ea0.png

三、解码器

解码器负责将固定形状的编码状态转换为长度可变的输出序列。其核心在于:

  • 初始化状态:将编码器输出转换为解码器的初始状态。
  • 逐步生成输出:在每个时间步,解码器根据当前状态和上一步输出生成下一个词元。

例如,在序列生成过程中,我们可以在时间步 t 用下面两个公式描述状态更新与输出生成:


51762b14-bd49-4e2d-9731-19fac9f7e32f.png

其中:


662d288b-5d21-4d78-8c6a-1942cf429362.png
下面给出一个 PyTorch 实现的解码器接口示例代码:
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

四、合并编码器和解码器

编码器与解码器虽然是两个独立的组件,但在整个序列转换模型中必须协同工作。整体流程如下:

  1. 编码阶段:输入序列 XXX 经过编码器处理,生成编码输出 enc_outputs。
  2. 状态初始化:将 enc_outputs 通过解码器的 init_state 方法转换为初始解码状态 dec_state。
  3. 解码阶段:解码器根据输入(如目标序列的部分信息)和 dec_state 逐步生成输出序列。

整个过程可以用下面的公式来描述:


53fd8142-c063-47ed-b57d-97f0425eb7de.png

下面是一个整合编码器和解码器的 PyTorch 接口示例代码:

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_X:输入序列
        # dec_X:解码器接收的输入(例如目标序列的部分)
        enc_outputs = self.encoder(enc_X, *args)
        dec_state = self.decoder.init_state(enc_outputs, *args)
        return self.decoder(dec_X, dec_state)

五、小结

本文介绍了编码器-解码器架构,这种架构在处理序列转换问题(如机器翻译)中具有广泛的应用。主要内容回顾如下:

  • 编码器:将变长输入序列


    b88c7fc4-78c8-4390-ab72-12c776dcafca.png

    转换为固定形状的编码状态


    97a58070-8e4e-406f-9d9a-a31d5f3f2ea0.png
  • 解码器:接收编码状态,利用状态更新公式和输出生成公式


    51762b14-bd49-4e2d-9731-19fac9f7e32f.png

    逐步生成输出序列。

  • 整合:整个模型通过编码器输出与解码器初始状态的衔接实现完整的序列转换过程,即


    53fd8142-c063-47ed-b57d-97f0425eb7de.png

这种架构不仅为后续更复杂的循环神经网络(例如带注意力机制的模型)奠定了基础,也为实现机器翻译等任务提供了清晰的模块化设计思路。希望通过本文的讲解,大家能对深度学习中的序列转换模型有更直观的理解,并尝试阅读和实现相关代码。

相关文章

  • Seq2Seq 模型详解

    Seq2Seq 是一种循环神经网络的变种,包括编码器 (Encoder) 和解码器 (Decoder) 两部分。S...

  • 11 JAVE 内置解码器和编码器

    JAVE内置ffmpeg可执行文件包含以下解码器和编码器: 音频解码器 音频编码器 视频解码器 视频编码器

  • MediaCodec中文API

    MediaCodec类可用于访问低级媒体编解码器,即编码器/解码器组件。 它是Android低级多媒体支持架构的一...

  • Transformer 变形金刚

    (一)Transformer 变形金刚 Transformer是基于编码器-解码器架构来处理序列问题的一个网络架构...

  • transformer再记(解码器)

    上一篇:transformer再记(编码器)解码器与编码器在细节上有差异。 编码器与解码器的连接:编码器通过处理输...

  • CNN计算原理

    1.卷积conv CNN编码器与解码器:神经网络为线性变换,当输入向量维度高于输出向量维度时,神经网络相当于一个编...

  • 编码器-解码器(seq2seq)和注意力机制

    编码器-解码器(seq2seq) 编码器(encoder)和解码器(decoder)分别对应着输入序列和输出序列的...

  • 编码器和解码器

    (一)编码器和解码器 这是最近几年比较新的概念。 首先我们重新考察一下CNN,我们之前说,我们经过很多神经网络层,...

  • 2019-04-14

    自编码器,解码器,编码器模型 原文:Manifold Learning和Autoencoders不是我写的:) 重...

  • Coding the World

    编码解码器 Denoising AutoEncoders降噪自动编码器 降噪自动编码器DA是在自动编码器的基础上,...

网友评论

    本文标题:循环神经网络13-编码器-解码器架构

    本文链接:https://www.haomeiwen.com/subject/snyffstx.html