RNN Encoder–Decoder及GRU(Gate Recurrent Unit)

本文回顾了2014年的RNNEncoder-Decoder模型,它通过RNN学习可变长度序列间的概率,关注语义和句法特征,用于翻译和序列生成。模型利用GRU单元处理遗忘与更新,实验结果显示其优于依赖词频的传统模型。
部署运行你感兴趣的模型镜像

1 简介

本文跟进2014年《Learning Phrase Representations using RNN Encoder–Decoder for Statistical Machine Translation》翻译总结。

本文提出了RNN Encoder–Decoder模型。Encoder 将一个可变长度的源序列转化成一个固定长度的向量,Decoder将固定长度的向量再转化成一个可变长度的目标序列。

RNN Encoder–Decoder不像以前的模型依赖词频来预测,而是更关注语句的语义和句法特征。

2 RNN Encoder–Decoder

2.1 预备知识:Recurrent Neural Networks

一个RNN包括隐藏状态h、一个可选的输出y,可变长度输入序列x, 。
在这里插入图片描述

主要是下面3个公式:
在这里插入图片描述

其中t表示时间步长(timestep),K个多项式分布,j=1…K。

2.2 RNN Encoder–Decoder

该模型主要学习基于一个可变长度的序列条件下另一个可变长度序列的概率,如 在这里插入图片描述

RNN Encoder–Decoder可用于两个场景,一种方式是在给定输入序列下,生成目标序列;另一种方式是,模型可以用来对输入输出序列对进行打分排序,其中分数是下面公式3或公式4的概率p_θ (y|x).

在这里插入图片描述

公式如下,增加了y1…yt:

在这里插入图片描述

2.3 GRU(Gate Recurrent Unit)

当重置门(reset gate)r接近0时,隐藏状态将会忽略上一个隐藏状态,只是用当前的输入进行重置。这将有效的容许隐藏状态丢弃一些和未来无关的信息。捕捉短期依赖的单元更倾向于拥有更多的reset gate。

更新门(update gate)控制上一个隐藏状态的信息有多少会传递到当前隐藏状态。捕捉短期依赖的单元更倾向于拥有更多的update gate。
在这里插入图片描述

公式如下:
在这里插入图片描述

3 实验结果
RNN Encoder–Decoder不像以前的模型依赖词频来预测,而是更关注语句的语义和句法特征。可以看到下图的几个embedding空间,红色部分,大部分短语是时间方面的,他们在句法上相似;粉色部分是语义相似的,都是国家或者区域;蓝色部分也是句法相似。

在这里插入图片描述

您可能感兴趣的与本文相关的镜像

Seed-Coder-8B-Base

Seed-Coder-8B-Base

文本生成
Seed-Coder

Seed-Coder是一个功能强大、透明、参数高效的 8B 级开源代码模型系列,包括基础变体、指导变体和推理变体,由字节团队开源

### RNN Encoder 的基本概念 RNNRecurrent Neural Network)Encoder 是一种用于序列到序列(Seq2Seq)模型中的核心组件之一。其主要功能是对输入序列进行编码,将其转换为一个固定长度的向量表示,该向量可以被解码器用来生成目标序列。 在 Seq2Seq 模型中,通常会经历三个阶段: 1. **Encoding**: 输入序列通过 RNN 编码成上下文向量(Context Vector)。 2. **Manipulation**: 对这个上下文向量进行处理或调整(可选步骤)。 3. **Decoding**: 使用另一个 RNN 将上下文向量解码为目标序列[^2]。 ### RNN Encoder 的架构设计 #### 基本结构 RNN Encoder 可以基于简单的 RNN 单元构建,也可以采用更复杂的变体如 GRU 或 LSTM 来提高性能。以下是常见的几种实现方式: 1. **Simple RNN**: Simple RNN 是最基础的形式,它逐时间步接收输入并更新隐藏状态 \( h_t \),最终输出最后一个隐藏状态作为上下文向量。 ```python import tensorflow as tf model = tf.keras.Sequential([ tf.keras.layers.SimpleRNN(128, return_sequences=False), # 输出层或其他操作... ]) ``` 2. **LSTM 和 GRU**: 鉴于简单 RNN 容易受到梯度消失问题的影响,在实际应用中更多使用的是 LSTM (Long Short-Term Memory)GRU (Gated Recurrent Unit)。这两种单元能够更好地捕捉长期依赖关系。 ```python model = tf.keras.Sequential([ tf.keras.layers.LSTM(128, return_sequences=False), # 返回最后一步的状态 # 解码部分或其他操作... ]) ``` 3. **双向 RNN (Bidirectional RNN)**: 双向 RNN 同时考虑前向和反向的信息流,从而提供更加丰富的语义表达能力。这可以通过 `tf.keras.layers.Bidirectional` 实现。 ```python model = tf.keras.Sequential([ tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(128)), # 进一步处理... ]) ``` ### 注意力机制的应用 尽管传统的 RNN Encoder 能够很好地完成短序列的任务,但对于较长的序列,仅依靠最后一个隐藏状态可能无法充分表征整个输入序列的内容。因此引入了注意力机制来解决这一问题。注意力机制允许解码器动态关注不同位置上的输入特征,而不仅仅是固定的上下文向量[^3]。 例如,在 Keras 中可视化带有注意力机制的 RNN 结构如下所示: ```python from keras.models import Model from keras.layers import Input, LSTM, Dense, Concatenate, Attention # Encoder encoder_inputs = Input(shape=(None,)) encoder_lstm = LSTM(128, return_state=True) _, state_h, state_c = encoder_lstm(encoder_inputs) # Decoder with attention decoder_inputs = Input(shape=(None,)) decoder_lstm = LSTM(128, return_sequences=True, return_state=True) decoder_outputs, _, _ = decoder_lstm(decoder_inputs, initial_state=[state_h, state_c]) attention_layer = Attention() context_vector = attention_layer([decoder_outputs, encoder_outputs]) # 加入注意力权重计算 final_output = Dense(vocab_size)(Concatenate()([decoder_outputs, context_vector])) model = Model(inputs=[encoder_inputs, decoder_inputs], outputs=final_output) ``` 上述代码展示了如何将注意力机制融入到标准的 RNN 架构之中,使得模型能够在翻译等任务上表现得更好。 --- ### 总结 RNN Encoder 是 Seq2Seq 模型的重要组成部分,负责将输入序列转化为紧凑的上下文表示。为了应对复杂场景下的挑战,可以选择不同的网络结构(如 LSTM/GRU),甚至加入先进的技术手段比如双向 RNN 和注意力机制来提升效果[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值