19 RNN之变换机制
系列进度
AI 30 个神经网络 · 第 19 / 62 篇
整理说明
这篇内容怎么整理
郭震 · 2026-06-04
阅读路线
先按这条路线读
先抓住主线,再回到代码、配置和图文细节,读起来会更稳。
RNN 把序列按时间步展开,用隐藏状态保存上下文。理解它时,先把数据在每一步如何传递画清楚。这篇重点看结构。先把数据流、关键模块和输出层画清楚,再回头看公式或代码。
我会检查 batch、time step、feature 三个维度的顺序。序列模型里,维度顺序错了很常见。
在上一篇中,我们详细探讨了卷积神经网络(CNN)的应用案例,涵盖了图像分类、目标检测等各类任务的实现过程。而在这一部分中,我们将集中讨论循环神经网络(RNN)的变换机制,了解其如何处理序列数据。
RNN的基本原理
RNN(Recurrent Neural Network)是一种专门用于处理序列数据的神经网络架构。与传统的前馈神经网络不同,RNN具有隐含状态,能够利用之前的时间步的信息,进行动态的状态更新。这种特性使得RNN在处理如文本、语音、视频等时序数据时表现颇为优异。
在RNN中,某一时刻的隐状态不仅依赖于当前输入,还与之前的隐状态有关。其核心递推关系可以表达为:
其中,和分别是隐状态和输入的权重矩阵,是激活函数,例如可以使用tanh或ReLU。
RNN的变换机制
在RNN的变换机制中,输入序列会逐步被传入网络,每一次的计算后,隐状态的更新不仅考虑当前的输入信息,还结合了过去的信息。这种机制使得RNN能在时间维度上进行信息的“记忆”和“遗忘”。然而,标准RNN在长序列学习时会出现梯度消失或爆炸的问题。
针对这一缺陷,Long Short-Term Memory(LSTM)和Gated Recurrent Unit(GRU)被提出。它们引入了门控机制来控制信息的存储与遗忘,从而有效解决了长序列依赖问题。
LSTM的门控机制
LSTM的变换机制利用三个门的结构(输入门、遗忘门、输出门)来精细化地调整记忆的流动。具体来说,其核心的状态更新方程如下:
- 遗忘门:决定从记忆中丢弃的信息
- 输入门:决定当前进入记忆的信息
- 输出门:决定从记忆中输出的信息
- 更新记忆单元状态
- 最终更新记忆和隐状态
h_t = o_t \ast \tanh(C_t) $$
通过上述公式,LSTM能够有效处理长距离依赖,并在每个时间步中选择性地保留信息。
变换机制在具体案例中的应用
在实际使用中,RNN的变换机制被广泛应用于诸多领域。下面是一个基于LSTM实现文本生成的具体案例。
理解 RNN 变换机制时,先看输入序列、隐藏状态、权重共享、时间步更新、梯度传播和长期依赖问题。
文本生成示例
假设我们有一段文本,我们希望利用LSTM模型生成新的文本内容。
import numpy as np
import tensorflow as tf
# 假设我们有了分好的字典和训练数据
char_to_idx = {'a': 0, 'b': 1, 'c': 2} # 示例字典
idx_to_char = {i: char for char, i in char_to_idx.items()}
text = "abcabcabc"
# 超参数定义
seq_length = 3
vocab_size = len(char_to_idx)
embedding_dim = 256
hidden_units = 128
# 数据预处理
inputs = []
targets = []
for i in range(len(text) - seq_length):
inputs.append([char_to_idx[char] for char in text[i:i + seq_length]])
targets.append(char_to_idx[text[i + seq_length]])
# 数据转换为tf.Tensor
inputs = tf.convert_to_tensor(inputs)
targets = tf.convert_to_tensor(targets)
# 定义LSTM模型
model = tf.keras.models.Sequential([
tf.keras.layers.Embedding(vocab_size, embedding_dim, batch_input_shape=[None, None]),
tf.keras.layers.LSTM(hidden_units,
return_sequences=False,
recurrent_initializer='glorot_uniform'),
tf.keras.layers.Dense(vocab_size)
])
model.compile(loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True), optimizer='adam')
# 训练模型
model.fit(inputs, targets, epochs=100)
# 文本生成函数
def generate_text(model, start_string, num_generate=10):
input_eval = [char_to_idx[s] for s in start_string]
input_eval = tf.expand_dims(input_eval, 0)
text_generated = []
# 低温生成
temperature = 1.0
model.reset_states()
for i in range(num_generate):
predictions = model(input_eval)
predictions = tf.squeeze(predictions, 0) / temperature
predicted_id = tf.random.categorical(predictions, num_samples=1)[-1, 0].numpy()
input_eval = tf.expand_dims([predicted_id], 0)
text_generated.append(idx_to_char[predicted_id])
return start_string + ''.join(text_generated)
# 生成文本
print(generate_text(model, start_string="ab", num_generate=10))
在这个简单的例子中,通过LSTM学习到的变换机制使得模型能够从“ab”这个前缀开始生成新的字符序列。
如果《RNN之变换机制》还没完全消化,可以从这张卡片的四个动作重新走一遍。
回看《RNN之变换机制》时,不必一次做大项目,先用一条简单样例确认主线是否清楚。
总结
在本篇中,我们深入分析了RNN及其变换机制,特别是LSTM的构成与应用。RNN的独特之处在于它对序列信息的处理能力,使得它在序列生成、情感分析等任务中都取得了良好的效果。在下一篇中,我们将探讨RNN在实际应用中的具体场景,进一步揭示其在现代深度学习中的重要地位。
阅读《RNN之变换机制》前,可以先用配图确认主线;读完后再检查哪些步骤能直接操作,哪些还需要补资料。
继续阅读
从这篇继续找到相关教程
常见问题
读前先确认这三点
RNN之变换机制适合谁读?
这是 AI 30 个神经网络 系列第 19 / 62 篇,适合正在学习AI 30 个神经网络,并且需要把概念落到操作步骤或判断标准里的读者。
读这篇AI 30 个神经网络教程要多久?
按中文技术文章阅读速度估算,通读大约 4 分钟;如果要跟着复现,建议把命令、配置和结果检查分开做。
这篇文章里的图文节点怎么用?
正文里有 6 个图文节点,可以先用它们抓住流程、配置和判断点,再回到对应段落细读。
分享文章
转发到常用平台
微信/朋友圈可先复制链接
相关教程
从相近问题继续读
继续阅读