目录
摘要
Abstract
1. 循环神经网络(RNN)
1.1 RNN的必要性
1.2 RNN的核心思想
1.3 RNN的展开
1.4 RNN的缺点
2. 长短时记忆网络(LSTM)
2.1 核心设计
3 Keras代码演示
3.1 用LSTM做情感分类
3.2 堆叠LSTM与双向LSTM
4 总结
摘要
本周进入序列建模学习,掌握处理时序数据的核心架构,具体分为循环神经网络的基本结构与工作原理、RNN的梯度消失问题与LSTM的解决方案以及使用Keras搭建RNN/LSTM模型
Abstract
This week, we dive into sequence modeling and master the core architectures for processing time-series data. The topics are divided into: the basic structure and working principles of recurrent neural networks, the vanishing gradient problem in RNNs and the LSTM solution, and building RNN/LSTM models using Keras.
1. 循环神经网络(RNN)
1.1 RNN的必要性
全连接网络和CNN都假设输入是固定长度的向量,且样本之间独立。但句子“我喜欢这部手机”和“手机这部喜欢我”词序不同,语义完全不同。要捕捉这种顺序信息,网络必须具有记忆能力,能够把前面时刻的信息传递到后面。
1.2 RNN的核心思想
RNN在隐藏层引入循环连接:当前时刻的隐藏状态不仅取决于当前输入,还取决于上一时刻的隐藏状态。用公式表示如下:
其中是输入到隐藏层的权重,
是隐藏层到自身的循环权重,
是隐藏层到输出的权重。f 通常是tanh或ReLU,g 根据任务选择。关键点在于每一时刻使用的权重矩阵
,
,
是共享的,与CNN的权重共享思想一致,大幅减少参数量,且能处理任意长度的序列。
1.3 RNN的展开
如果把RNN按时间展开,它等价于一个深度为序列长度的前馈网络,各层共享权重。反向传播时需要沿时间轴反向计算梯度,称为沿时间反向传播(BPTT)。权重共享意味着他处理每个词的方法是一样的,不因位置不同而区别对待。
1.4 RNN的缺点
BPTT本质上是在时间轴上反复乘以同一个权重矩阵。假设其最大特征值为
,经过 T 步反向传播后,梯度约正比于
;当
> 1,梯度指数级增长,参数剧烈震荡;当
< 1,梯度指数级衰减,早期时刻信号完全丢失,RNN无法学习长距离依赖关系,只能记住最近几步的信息。
2. 长短时记忆网络(LSTM)
2.1 核心设计
LSTM通过门控机制控制信息的流入、保存与输出,让重要信息可以跨越很长的距离保持不变。每个LSTM单元有以下几个部分:
遗忘门
输入门
候选记忆
记忆更新
输出门:决定当前隐藏状态的输出内容
记忆单元的更新是加法而非乘法。遗忘门和输入门的输出在 0 到 1 之间,通过逐元素乘法和加法来调节,避免了普通RNN中反复乘以权重矩阵导致的梯度指数衰减。梯度可以通过记忆单元的“高速公路”几乎无损地传到很远的时间步。
3 Keras代码演示
3.1 用LSTM做情感分类
以IMDB电影评论数据集为例,输入是变长词序列,输出是正面/负面情感。
import numpy as np from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Embedding, LSTM, Dense, Dropout from tensorflow.keras.preprocessing.sequence import pad_sequences 模拟数据:假设已经完成分词和数值化 x_train: 每条评论截断/填充到200个词,每个词用一个整数ID表示 y_train: 0或1 max_features = 10000 # 词汇表大小 maxlen = 200 # 每条评论最大长度 embedding_dim = 128 # 词向量维度 lstm_units = 64 # LSTM隐藏单元数 model = Sequential() 嵌入层:将整数ID映射为稠密向量 model.add(Embedding(input_dim=max_features, output_dim=embedding_dim, input_length=maxlen)) LSTM层 model.add(LSTM(units=lstm_units, dropout=0.2, # 输入dropout recurrent_dropout=0.2)) # 循环dropout 全连接输出层 model.add(Dense(1, activation='sigmoid')) model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy']) model.summary() 训练(假设数据已准备好) history = model.fit(x_train, y_train, batch_size=32, epochs=10, validation_split=0.2)3.2 堆叠LSTM与双向LSTM
堆叠LSTM:多层LSTM叠加,加深网络,提取更抽象特征。
model.add(LSTM(64, return_sequences=True)) # 返回完整序列给下一层 model.add(LSTM(32)) # 最后一层只返回最终输出双向LSTM:同时从前向和后向两个方向读取序列,捕捉上下文信息。
from tensorflow.keras.layers import Bidirectional model.add(Bidirectional(LSTM(64)))Embedding层非常巧妙,它把离散的符号(词)变成了连续空间中的向量,语义相近的词向量也接近。这个向量空间是随着任务一起训练的,不需要人工定义。LSTM的dropout有两种,普通dropout管输入,recurrent dropout管循环连接,Keras直接集成,调参方便。
4 总结
本周的核心收获是理解了序列建模的挑战与解决方案的演进逻辑。下周学习注意力机制的基本原理,理解它如何让模型“关注重点”。