Deep Learning for Computer Vision——Recurrent Neural Networks
第一部分为什么需要 RNN序列建模问题传统 CNN 和全连接网络FC的输入和输出大小是固定的比如 224x224 的图片输入输出 1000 个类别。但现实中有很多任务输入或输出是可变长度的序列如文本、语音、视频帧。RNN 就是为了处理可变长度序列数据而设计的。根据输入输出长度的不同分为四种模式参考图 11对1 (One-to-one)传统神经网络。1对多 (One-to-many)固定大小输入变长输出例如图像描述输入一张图输出一段文字。多对1 (Many-to-one)变长输入固定输出例如视频分类输入多个视频帧输出一个动作标签。多对多 (Many-to-many)变长输入变长输出且长度通常相等例如逐帧视频分类、机器翻译这节课的核心。第二部分RNN 的核心原理1. “展开图”与循环结构RNN 有一个隐藏状态Hidden State它像一个“内存条”保存了过去所有时间步的信息。展开结构Unrolled RNN是理解 RNN 的最佳方式我们把时间维度铺开每一个 RNN 单元不仅接收当前输入还接收上一个单元的输出。text[输入] x1 --- [RNN] --- [输出] y1 ↑ ↑ | └── (携带上一步的信息 h1传给下一步) (x2) --- [RNN] --- [输出] y2 ... 以此类推2. 数学公式隐藏状态更新公式旧的隐藏状态记忆。当前时刻的输入。带有参数 W 的函数如 tanh 或 ReLU。关键点所有时间步共享同一组权重 W参数量不随序列长度增加输出公式使用另一组权重将隐藏状态转换为输出。注意隐藏状态和输出的维度可以不同。基础 RNNVanilla RNN具体公式为什么用 tanh因为它的值域在 [-1, 1] 之间有界且零中心化可以避免数值爆炸。h0 初始化为零向量或学习得到的参数。第三部分实战举例——手写 RNN 检测“连续 1”任务输入一串 0 和 1如果当前输入和上一个输入都是 1则输出 1否则输出 0。输入序列[0, 1, 0, 1, 1, 1, 0, 1, 1]期望输出[0, 0, 0, 0, 1, 1, 0, 0, 1]手动构造一个 RNN设定隐藏状态为 3 维向量[当前值, 上一个值, 常数 1]。作为初学者可以想象它像一个小账本。初始化 h0[0,0,1假设最开始看到了两个 0。使用 ReLU 作为激活函数简化计算大于 0 保留小于 0 变成 0。构造权重矩阵参考图 7输入变换将 x 送入第 1 个位置即W_xh [[1], [0], [0]]。状态转移将上一次的“当前值”移入“上一个值”的位置即W_hh [[0,0,0], [1,0,0], [0,0,1]]。计算逻辑以一个具体步骤演示假设上一步状态上一次输入是1当前输入。记忆已更新。输出设置[1,1,−1]则ReLU((1∗1)(1∗1)(1∗(−1)))ReLU(1)1。 结论只要构造出合适的权重普通的 RNN 就能完成这个逻辑任务但在实际应用中我们不需要手写权重而是通过梯度下降自动学习 WW。第四部分如何训练 RNN难点与解决方案1. 多对多任务的损失计算与梯度更新对于多对多任务每个时间步都有一个损失 LtLt总损失是它们之和L。因为所有时间步共享权重 W所以在反向传播BPTT时我们需要把每个时间步算出的 W 的梯度全部加在一起。2. 梯度消失问题与截断 BPTT致命缺陷当序列很长时反向传播跨越的时间步很多如果使用 tanh 或 Sigmoid它们的导数往往小于 1连乘之后∏tanh′梯度会迅速趋近于 0梯度消失。这意味着网络“记不住”很早期的信息长距离依赖。解决方案1截断 BPTT (Truncated Backpropagation through time)你不需要在整个序列上反向传播耗时且爆内存。做法设置一个窗口如 N10前向传播一直往前跑记忆保留但反向传播只倒退最近的 10 步。这样既节省了内存又近似了梯度。注分布式训练时每个 GPU 算梯度后加起来更新权重原理类似。3. 解决方案2LSTM长短期记忆网络LSTM 是为了解决梯度消失问题而设计的。参考图13它的核心是引入一条“高速公路”叫细胞状态沿着这条路径走信息不经过任何非线性激活函数只能通过“门”来加减从而保证梯度能无损流过。LSTM 公式解析4个门通过拼接输入和隐状态乘以一个大的权重矩阵得到 i,f,o,g遗忘门 f决定上一时刻的中有多少保留下来。Sigmoid 函数0 是忘掉1 是保留输入门 i决定当前的新信息 g 有多少写入到 中。新候选值 g生成当前的候选记忆。tanh 函数细胞状态更新f⊙i⊙g加法操作让梯度畅通无阻输出门 o决定最终输出 的多少。o⊙tanh()第五部分RNN 的高级用法与模型细节1. 字符级语言模任务根据已有字符预测下一个字符。例如输入 h输出 e输入 e输出 l...输入层处理我们不会直接用 One-hot 向量做矩阵乘法因为太稀疏而是使用嵌入层Embedding Layer本质上就是一个大小可学习的矩阵相当于查表提取密集特征。采样Sampling在测试时我们用网络预测出下一个字符的概率分布然后采样一个字符将其作为下一次的输入循环往复直到遇到“结束符”。2. 多层 RNN 与应用多层 RNN将 RNN 层堆叠起来深度维度每一层处理上一层的数据增加模型的表达能力。应用图像描述提取 CNN 倒数第二层的特征作为 h0 输入到 RNN 中。视觉问答将问题和图片特征融合输入 RNN输出答案概率。优点能处理任意长序列模型参数量固定。缺点无法并行训练前一步的输出是后一步的输入必须串行速度极慢容易丢失早期信息。 总结备忘输入输出只要想到了“变长序列”第一反应就是 RNN 族。共享参数RNN 的参数在不同时间步是完全共享的这是和 CNN 共享卷积核有异曲同工之妙的地方。实际现状虽然 RNN/LSTM 理论很重要但在现代 NLP 领域如 ChatGPT它们基本已被Transformer取代因为 Transformer 支持高度并行训练且能通过注意力机制直接捕捉长距离依赖。联想记忆你可以把 RNN 想象成“一面倒的动态长卷”把 LSTM 的细胞状态想象成“一条笔直的传送带”门控就像是控制传送带上物品加减的开关。