机器学习实战:基于rasbt/machine-learning-book的RNN序列建模详解
序列数据建模与循环神经网络
本章将深入探讨如何使用循环神经网络(RNN)处理序列数据,这是机器学习中处理时间序列、自然语言等有序数据的重要技术。
序列数据基础
序列数据的特性
序列数据与普通结构化数据的最大区别在于其元素之间存在顺序依赖关系。例如:
- 时间序列数据(股票价格、传感器读数)
- 文本数据(单词序列)
- 音频信号
- DNA序列
序列表示方法
序列可以有多种表示形式:
- 时间步表示:将序列分解为离散时间步
- 独热编码:适用于离散类别数据
- 嵌入表示:通过学习得到的低维连续向量
序列建模任务分类
根据输入输出关系,序列建模可分为:
- 一对一:传统非序列模型
- 一对多:如图像字幕生成
- 多对一:如情感分析
- 多对多:如机器翻译
循环神经网络原理
RNN基本结构
RNN通过引入循环连接,使网络能够保持对历史信息的记忆。其核心是循环单元,在每个时间步:
- 接收当前输入和上一时刻的隐藏状态
- 计算当前隐藏状态
- 产生输出(可选)
数学表达式为: h_t = f(W_hh h_{t-1} + W_xh x_t + b_h)
隐藏循环与输出循环
RNN有两种主要变体:
- 隐藏循环(Elman网络):隐藏状态作为记忆
- 输出循环(Jordan网络):输出作为记忆
长期依赖问题
传统RNN面临梯度消失/爆炸问题,难以学习长距离依赖关系。解决方案包括:
- 梯度裁剪
- 改进的RNN结构(LSTM、GRU)
LSTM长短期记忆网络
LSTM通过引入门控机制解决了长期依赖问题,包含三个关键门:
- 遗忘门:决定保留多少旧记忆
- 输入门:决定添加多少新信息
- 输出门:决定输出多少当前状态
PyTorch实战:IMDb电影评论情感分析
数据准备
IMDb数据集包含5万条电影评论,标记为正面/负面情感。预处理步骤包括:
- 文本清洗(去除HTML标签等)
- 构建词汇表
- 序列填充/截断
嵌入层
使用嵌入层将离散单词索引映射为连续向量:
embedding = nn.Embedding(vocab_size, embed_dim)
构建RNN模型
关键组件:
- 嵌入层
- RNN/LSTM层
- 全连接分类层
双向RNN可以同时考虑前后文信息:
nn.LSTM(embed_dim, hidden_dim, bidirectional=True)
PyTorch实战:字符级语言模型
数据预处理
将文本分解为字符序列,构建字符到索引的映射。常用技术包括:
- 滑动窗口生成训练样本
- 独热编码字符表示
模型架构
字符级RNN通常包含:
- 嵌入层(可选)
- RNN/LSTM层
- 全连接输出层
文本生成
通过以下方式生成新文本:
- 给定种子字符
- 预测下一个字符的概率分布
- 采样生成新字符
- 重复过程
总结
本章系统介绍了RNN在序列建模中的应用,包括:
- 序列数据特性与表示方法
- RNN基本原理及变体
- LSTM解决长期依赖的机制
- PyTorch实现两个典型应用
RNN及其变体是处理序列数据的强大工具,在自然语言处理、时间序列预测等领域有广泛应用。理解这些模型的原理和实现方法,是掌握现代深度学习技术的重要一步。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考