深度学习中的编码器-解码器和Seq2Seq

“Encoder-Decoder和“Seq2Seq”之间的关系

Seq2Seq并不特指具体的方法,这个名词强调的是目的,以”输入序列,输出序列“为目的的,可以统称为Seq2Seq模型。Seq2Seq使用的具体方法基本上都在Encoder-Decoder框架的范围内。

  • Seq2Seq属于Encoder-Decoder框架的范围内
  • Seq2Seq这个名词(概念)强调的是目的,而Encoder-Decoder强调的是框架

Encoder-Decoder

Encoder-Decoder模型主要是NLP领域的一个概念。它不是一种特殊的算法,而是一类算法的总称,也就是一个通用的框架,可以使用不同的算法来解决不同的任务
Encoder-Decoder这个框架很好的诠释了机器学习中的核心思想
将现实世界中的问题转化为数学问题,并通过解决数学问题来解决现实世界的问题
Encoder
DecoderEncoder-Decoder

关于Encoder-Decoder,有两点需要说明:
1.不管输入和输出的长度如何,中间的”向量c“是固定的(这也是它的缺点,当输入太大时会丢失信息)
2.可以根据任务选择不同的编码器和解码器(比如RNN、LSTM、GRU等)

Seq2Seq

Seq2Seq(Sequence-to-sequence的缩写),顾名思义,就是输入一个序列,输出另一个序列。该结构最重要的方面是输入序列和输出序列的长度是可变的。比如下面这张图
Seq2Seq如上图:输入6个汉字,输出3个英文单词。输入和输出的长度不同。

Seq2Seq的起源

在Seq2Seq框架提出之前,深度神经网络在图像分类等问题上取得了非常好的效果。在它擅长解决的问题中,输入和输出通常可以表示为固定长度的向量。如果长度稍有变化,则使用补零操作。

然而,许多重要的问题,如机器翻译、语音识别、自动对话等,都是按顺序表达的,它们的长度是事先无法得知的。因此,如何突破之前深度神经网络的限制,使其能够适应这些场景,成为了13年的研究热点,Seq2Seq框架应运而生。

编码器-解码器的应用

在这里插入图片描述机器翻译、对话机器人、诗歌生成、代码补全、文章摘要(文本-文本)

编码器-解码器的缺陷

如上所述:Encoder和Decoder之间只有一个“向量c”来传递信息,并且c的长度是固定的。

为了便于理解,我们比喻为“压缩-解压缩”的过程:

将 800X800 像素的图像压缩为 100KB 看起来更清晰。将 3000X3000 像素的图像压缩为 100KB 会显得模糊。
在这里插入图片描述Encoder-Decoder也是类似的问题:当输入信息过长时,会丢失一些信息。
为了解决这个问题,Attention机制应运而生

参考链接:Encoder-Decoder和Seq2Seq

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,下面是使用 TensorFlow 2 编写编码器解码器,并封装为 Seq2Seq 模型的示例代码: ```python import tensorflow as tf from tensorflow.keras.layers import Input, LSTM, Dense from tensorflow.keras.models import Model class Seq2Seq(Model): def __init__(self, num_encoder_tokens, num_decoder_tokens, latent_dim): super(Seq2Seq, self).__init__() # 定义编码器 self.encoder_inputs = Input(shape=(None, num_encoder_tokens)) self.encoder_lstm = LSTM(latent_dim, return_state=True) _, self.encoder_state_h, self.encoder_state_c = self.encoder_lstm(self.encoder_inputs) self.encoder_states = [self.encoder_state_h, self.encoder_state_c] # 定义解码器 self.decoder_inputs = Input(shape=(None, num_decoder_tokens)) self.decoder_lstm = LSTM(latent_dim, return_sequences=True, return_state=True) self.decoder_outputs, _, _ = self.decoder_lstm(self.decoder_inputs, initial_state=self.encoder_states) self.decoder_dense = Dense(num_decoder_tokens, activation='softmax') self.decoder_outputs = self.decoder_dense(self.decoder_outputs) # 定义模型 self.model = Model([self.encoder_inputs, self.decoder_inputs], self.decoder_outputs) def call(self, inputs): encoder_inputs, decoder_inputs = inputs # 编码器 _, state_h, state_c = self.encoder_lstm(encoder_inputs) encoder_states = [state_h, state_c] # 解码器 decoder_outputs, _, _ = self.decoder_lstm(decoder_inputs, initial_state=encoder_states) decoder_outputs = self.decoder_dense(decoder_outputs) return decoder_outputs ``` 在这个示例代码,我们定义了一个 `Seq2Seq` 类,它继承自 `Model` 类,并在 `__init__` 方法定义了编码器解码器的结构。在 `call` 方法,我们重新定义了编码器解码器,以便在推理时使用。 注意,我们使用了 `Model` 类来定义模型,而不是 `Sequential` 类。这是因为 Seq2Seq 模型是一个具有多个输入和输出的模型,无法使用 `Sequential` 类来定义。 接下来,你可以使用以下代码来创建一个 Seq2Seq 模型: ```python model = Seq2Seq(num_encoder_tokens, num_decoder_tokens, latent_dim) model.compile(optimizer='adam', loss='categorical_crossentropy') model.summary() ``` 其,`num_encoder_tokens` 和 `num_decoder_tokens` 分别表示编码器解码器的输入序列和输出序列的词汇表大小,`latent_dim` 表示编码器解码器 LSTM 层的隐藏状态维度。你需要根据实际情况进行调整。 最后,你可以使用 `fit` 方法来训练模型: ```python model.fit([encoder_input_data, decoder_input_data], decoder_target_data, batch_size=batch_size, epochs=epochs, validation_split=0.2) ``` 其,`encoder_input_data`、`decoder_input_data` 和 `decoder_target_data` 分别表示编码器的输入序列、解码器的输入序列和解码器的目标序列,`batch_size` 和 `epochs` 分别表示训练时的批次大小和迭代次数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值