3. 循环神经网络
循环神经网络(RNN)及其在处理序列数据(如文本)中的应用:
- RNN 的必要性:传统的神经网络无法直接处理序列数据,因为它们需要固定长度的输入。RNN 通过引入循环机制,能够处理任意长度的序列,并捕捉序列中的时间依赖关系。
- RNN 的结构:RNN 由输入层、隐藏层和输出层组成。隐藏层负责“记忆”历史信息,并传递给下一个时间步。
- RNN 的工作原理:RNN 通过正向传播和反向传播逐步处理序列数据。正向传播用于计算输出,反向传播用于计算梯度并进行参数更新。
- RNN 的局限性:RNN 存在梯度消失和梯度爆炸问题,导致模型难以学习长距离依赖关系。
- BiRNN:双向 RNN(BiRNN)通过同时考虑正向和反向的上下文信息,能够更好地捕捉序列特征。
- RNN 的应用:RNN 在自然语言处理领域有着广泛的应用,例如文本分类、命名实体识别、机器翻译等。
练习题目
题目:不使用大模型自行实现 RNN 手写代码,数据准备部分可直接复制 prepare_inputs。
首先,根据公式 h_t = tanh(U x_t + W h_{t-1}) 实现 RNN 的核心计算逻辑。
使用循环遍历序列中的每个时间步,并更新隐藏状态。
将每一步计算出的隐藏状态保存下来,最终组合成一个包含所有时间步输出的张量。
import numpy as np
def prepare_inputs():
# ... (与原文中的 prepare_inputs 函数相同) ...
"""
使用 NumPy 准备输入数据
使用示例句子: "播放 周杰伦 的 《稻香》"
构造最小词表和随机(可复现)词向量, 生成形状为 (B, T, E) 的输入张量。
"""
np.random.seed(42)
vocab = {"播放": 0, "周杰伦": 1, "的": 2, "《稻香》": 3}
tokens = ["播放", "周杰伦", "的", "《稻香》"]
ids = [vocab[t] for t in tokens]
# 词向量表: (V, E)
V = len(vocab)
emb_table = np.random.randn(V, E).astype(np.float32)
# 取出序列词向量并加上 batch 维度: (B, T, E)
x_np = emb_table[ids][None]
return tokens, x_np
def custom_rnn_numpy(x_np, U_np, W_np):
B_local, T_local, _ = x_np.shape
h_prev = np.zeros((B_local, H), dtype=np.float32)
steps = []
for t in range(T_local):
x_t = x_np[:, t, :]
h_t = np.tanh(x_t @ U_np + h_prev @ W_np)
steps.append(h_t)
h_prev = h_t
return np.stack(steps, axis=1), h_prev
Myblog、java

浙公网安备 33010602011771号