RNN的bp

本文介绍了RNN的反向传播(bp)过程,重点阐述了RNN如何通过权重将信息传递给下一层及自身输入,并对比了LSTM和GRU在记忆控制上的差异,如LSTM的f,i,o门和GRU的更新门、重置门。" 131028189,18870397,Python反向排序与延迟绑定:高阶函数揭秘,"['Python编程', '算法', '数据处理', '函数', '编程技巧']

RNN的bp

来源:https://zybuluo.com/hanbingtao/note/581764

RNN的权重向下层输出的同时,会将权重返回到本层的输入处,和下一次的输入加和
RNN结构

RNN只用了一个权重保存节点的状态,LSTM用了两个权重来保存,新加的状态称为单元状态(cell stat)
C和H两个状态

对长程记忆和短程记忆的控制,可以参考LSTM单元来了解:
LSTM结构

LSTM用三个门来控制数据的流动:f,i,o,其中forget门控制 Ct1Ct C t − 1 到 C t 的 量,input门控制 ht1xtCt h t − 1 和 x t 到 C t 的 量 ,output门控制 Ctht C t 到 h t 的 量

GRU有两个门,一个状态:
输入门、遗忘门、输出门变为两个门:更新门(Update Gate)和重置门(Reset Gate)
GRU

### 反向传播与循环神经网络的关系 反向传播(Backpropagation,简称BP)是训练神经网络的核心算法之一。对于传统的前馈神经网络(Feedforward Neural Networks),BP通过计算损失函数相对于权重的梯度来调整模型参数。然而,在循环神经网络(Recurrent Neural Networks, RNN)中,由于其特有的时间序列特性,标准的BP被扩展为一种称为 **BPTT (Backpropagation Through Time)** 的方法[^3]。 #### BPTT的工作机制 在RNN中,输入数据通常是一个序列 \( x_1, x_2, \ldots, x_T \),其中 \( T \) 表示序列长度。每个时间步 \( t \) 都会接收一个输入 \( x_t \),并将其传递到隐藏层状态 \( h_t \) 中。隐藏层的状态不仅取决于当前输入 \( x_t \),还受到上一时刻隐藏状态 \( h_{t-1} \) 的影响。因此,RNN可以表示为: \[ h_t = f(W_h h_{t-1} + W_x x_t + b) \] 其中: - \( W_h \) 是隐藏层之间的权值矩阵, - \( W_x \) 是输入到隐藏层的权值矩阵, - \( b \) 是偏置项, - \( f(\cdot) \) 是激活函数(如 tanh 或 ReLU)。 为了优化这些参数,BPTT 将整个序列展开成多个时间步,并将每一步视为独立的前馈神经网络的一部分。这样做的目的是使得误差可以通过时间维度向前传播,从而更新每一层的参数。具体来说,目标是最小化以下形式的损失函数: \[ L = \sum_{t=1}^{T} L(y_t, \hat{y}_t) \] 其中 \( y_t \) 和 \( \hat{y}_t \) 分别代表真实标签和预测值。 #### 实现细节 在实际操作过程中,BPTT 计算方式如下: 1. 前向传播阶段:按照上述公式依次计算各时间步上的隐藏状态以及最终输出; 2. 后向传播阶段:从最后一个时间步开始逐级回溯,利用链式法则求导数以获得关于各个参数的部分导数值; 值得注意的是,当序列过长时可能会遇到梯度消失或者爆炸的问题。针对这些问题,研究者提出了多种改进方案,比如长短时记忆单元(LSTM)[^5] 和门控循环单元(GRU) 等变体结构。 ```python import numpy as np class SimpleRNNCell: def __init__(self, input_size, hidden_size): self.Wx = np.random.randn(hidden_size, input_size) * 0.01 self.Wh = np.random.randn(hidden_size, hidden_size) * 0.01 self.b = np.zeros((hidden_size, 1)) def forward(self, xt, ht_prev): ht_current = np.tanh(np.dot(self.Wx, xt) + np.dot(self.Wh, ht_prev) + self.b) return ht_current def backpropagate(dht, cache): # dht: gradient w.r.t current hidden state # cache contains intermediate values from forward pass dh_next, dwx, dwh, db = None, None, None, None # Unpack cached variables needed for computing gradients. wx, wh, bx, prev_ht, it = cache['wx'], cache['wh'], cache['bx'], cache['prev_ht'], cache['it'] dtanh = (1 - it**2) * dht # Derivative of TanH activation function applied elementwise. dwx = np.dot(dtanh, prev_ht.T) dwh = np.dot(dtanh, it.T) db = np.sum(dtanh, axis=-1, keepdims=True) dh_next = np.dot(wh.T, dtanh) return dh_next, dwx, dwh, db ``` 以上代码片段展示了一个简单的单层RNN细胞及其对应的后向传播逻辑。 ### 总结 综上所述,反向传播技术经过适当修改后适用于处理具有动态特性的循环神经网络。它通过对不同时间节点间相互作用关系建模实现了复杂模式识别能力提升的同时也带来了诸如梯度不稳定之类的挑战。而现代深度学习框架如TensorFlow[Keras], PyTorch 提供了便捷接口帮助开发者高效完成此类任务配置与执行工作流程管理等方面的支持服务功能模块集成解决方案等等[^4].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值