RNN及其公式推导

本文详细介绍了循环神经网络(RNN)的基本结构和公式推导,包括前向算法和反向传播算法(BPTT)的关键步骤。通过分析RNN的隐藏层和输出层之间的关系,以及误差项和权重更新的计算,帮助读者深入理解RNN的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

RNN及其公式推导

RNN即循环神经网络,循环神经网络的种类有很多,本文主要是对基本的神经网络进行推导。一开始对推导很晕,在阅读了许多资料之后,整理如下。

结构

这里写图片描述

上图所示的是最基本的循环神经网络,但是这个图是抽象派的,只画了一个圈不代表只有一个隐层。如果把循环去掉,每一个都是一个全连接神经网络。 x 是一个向量,它表示输入层, s 也是一个向量,它表示隐藏层,这里需要注意,一层是有多个节点,节点数与 s 的维度相同。 U 是输入层到隐藏层的权重矩阵,与全连接网络的权重矩阵相同, o 也是一个向量,它表示输出层, V 是隐藏层到输出层的权重矩阵。

公式推导

这里写图片描述

  RNN的BPTT算法关键就在于理解上图。前向算法很好理解,根据RNN的结构定义则很容易推出,下面是后向算法的推导。它的基本原理和BP算法一样的,同样包含了三个步骤:
  1. 前向计算每个神经元的输出值
  2. 方向计算每个神经元的误差项 δj ,它的误差项是指误差函数 E 对神经元 j 的加权输入的偏导数,如上图所示(下文将 atj 记作 nettj )
  3.计算每个权重的梯度,然后用优化算法更新

  误差项计算
  
让我们回到第一张图的表示方法,用向量

### LSTM 数学公式推导过程 LSTM(长短期记忆网络)的核心在于其独特的门控机制以及细胞状态的设计,这些特性使其能够在长时间序列中有效传递梯度并缓解梯度消失问题。以下是关于LSTM数学公式的详细推导及其核心概念。 #### 1. 前向传播公式 LSTM 的前向传播主要由以下几个部分组成: - **遗忘门 (Forget Gate)** 遗忘门决定了当前时刻的细胞状态需要忘记多少过去的信息。计算如下: \[ f_t = \sigma(W_f \cdot [h_{t-1}, x_t] + b_f) \] 其中 \( W_f \) 和 \( b_f \) 是遗忘门的权重矩阵和偏置项,\( h_{t-1} \) 表示上一时刻隐藏状态,\( x_t \) 表示当前输入[^2]。 - **输入门 (Input Gate)** 输入门决定哪些新信息会被写入到细胞状态中。分为两部分:输入门本身和候选值。 \[ i_t = \sigma(W_i \cdot [h_{t-1}, x_t] + b_i), \quad \tilde{C}_t = tanh(W_c \cdot [h_{t-1}, x_t] + b_c) \] 其中 \( W_i, b_i \) 控制输入门,而 \( W_c, b_c \) 则用于生成新的候选值 \( \tilde{C}_t \)[^2]。 - **细胞状态更新 (Cell State Update)** 细胞状态通过遗忘旧信息并与新信息相结合的方式进行更新: \[ C_t = f_t \odot C_{t-1} + i_t \odot \tilde{C}_t \] 这里使用逐元素乘法 (\(\odot\)) 来实现对信息的选择性保留或丢弃[^2]。 - **输出门 (Output Gate)** 输出门控制当前时刻的隐藏状态如何被输出: \[ o_t = \sigma(W_o \cdot [h_{t-1}, x_t] + b_o), \quad h_t = o_t \odot tanh(C_t) \] 以上即为LSTM的标准前向传播公式[^4]。 --- #### 2. 反向传播公式 为了优化参数,在反向传播过程中需计算损失函数相对于各参数的梯度。具体步骤如下所示: - 定义误差信号: 设总损失函数为 \( J \),则对于任意时间步 \( t \),有: \[ \frac{\partial J}{\partial h_t} \] - 计算针对不同组件的梯度: 对于每个门及细胞状态的变化量分别求解对应的梯度表达式。例如,考虑遗忘门的影响时可得: \[ \frac{\partial J}{\partial f_t} = \frac{\partial J}{\partial C_t} \odot C_{t-1} \][^3] 进一步展开其他各项梯度关系直至最终得到所有待估计参数上的梯度为止。 --- #### 3. 缓解梯度消失的关键点 LSTM 能够缓解传统 RNN 中存在的梯度消失现象主要是依赖于以下两点设计思路: - 使用恒定错误流路径(constant error carousel): 即使经过多个时间步长传输后仍能保持较大数值大小而不趋于零; - 引入可控开关结构允许特定条件下完全关闭某些连接从而阻止不必要的衰减效应发生.[^1] --- ```python import numpy as np def lstm_cell_forward(xt, a_prev, c_prev, parameters): """ 实现单个LSTM单元的前向传播 参数: xt -- 当前时间步的输入数据 (n_x,) ... 返回: at_next -- 下一个隐藏状态 (n_a,) ct_next -- 更新后的细胞状态 (n_a,) cache -- 存储反向传播所需的数据元组 """ # 提取参数... ft = sigmoid(np.dot(parameters['Wf'], concat_input.T) + parameters['bf'])[:, None].T it = sigmoid(np.dot(parameters['Wi'], concat_input.T) + parameters['bi'])[:, None].T cctilde = np.tanh(np.dot(parameters['Wc'], concat_input.T) + parameters['bc'])[:, None].T ot = sigmoid(np.dot(parameters['Wo'], concat_input.T) + parameters['bo'])[:, None].T c_next = ft * c_prev + it * cctilde a_next = ot * np.tanh(c_next) cache = (a_next, c_next, a_prev, c_prev, ft, it, cctilde, ot, xt, parameters) return a_next, c_next, cache def lstm_backward(da, caches): # 初始化变量... for t in reversed(range(len(caches))): current_cache = caches[t] gradients = one_step_lstm_backward(da[:, :, t], dc_prev_temp, current_cache) da_prev += gradients["da_prev"] dc_prev += gradients["dc_prev"] dx = gradients["dx"] dWf = gradients["dWf"] ... return gradients ``` ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值