通过时间的方向传播(Backpropagation through time)

本文介绍了在循环神经网络中如何运用反向传播算法,并详细解释了该算法在时间维度上的应用,即“穿越时间反向传播”,这对于理解循环神经网络的工作原理至关重要。

来源:Coursera吴恩达深度学习课程

之前我们已经学过了循环神经网络的基础结构,在本节文章中我们将来了解反向传播(back propagation)是怎样在循环神经网络中运行的,它还有个很别致的名字:叫做“通过(穿越)时间反向传播(backpropagation through time)”。。和之前一样,当你在编程框架中实现循环神经网络时,编程框架通常会自动处理反向传播。Andrew认为,在循环神经网络中,对反向传播的运行有一个粗略的认识还是非常有用的,让我们来一探究竟。

对于前向传播(上图蓝色箭头所指方向)怎样在神经网络中从左到右地计算这些激活项,直到输出所有的预测结果。而对于反向传播(上图红色箭头所指方向),计算方向与前向传播基本上是相反的。

如上图,我们分析一下前向传播(forward propagation)的计算,现在有一个输入(input)序列,x^<1>,x^<2>,...,x^,为了计算出a^<1>,还需要参数W_a和b_a,所有的这些激活项都要取决于参数W_a和b_a,接着使用参数W_y和b_y可以计算出第一个预测值y帽^<1>。(参数如上图绿色标记)

为了计算反向传播,还需要一个损失函数。我们先定义一个元素的损失函数

我们将它定义为标准逻辑回归损失函数,也叫交叉熵损失函数(Cross Entropy Loss)。这是关于单个位置上或者说某个时间步t上某个单词的预测值的损失函数。

现在我们来定义整个序列的损失函数,通过将每一个单独时间步的顺势函数加起来,将L定义为

上图就是完整的计算图(computation graph),反向传播算法需要在相反的方向上进行计算和传递信息(红色标记)。最终把前向传播的箭头都反过来,就可以计算出所有合适的量,然后通过导数相关的参数,用梯度下降法(gradient descent)来更新参数。

在这个反向传播的过程中,最重要的信息传递或者说最重要的递归运算就是这个从右到左的运算(红色圆圈标记),这个算法有一个很别致的名字,叫做“通过(穿越)时间反向传播(backpropagation through time)”。取这个名字的原因是对于前向传播,你需要从左到右进行计算,在这个过程中,时间t不断增加。而对于反向传播,你需要从右到左进行计算,就像时间倒流。

说明:记录学习笔记,如果错误欢迎指正!转载请联系我。

Backpropagation Through Time(BPTT)即反向传播通过时间,是RNN用于计算梯度的方法,从最后一个时间步 T 向时间步 1 传播。其核心公式为计算权重矩阵 \( \mathbf{W}_h \) 的梯度: \( \frac{\partial L}{\partial \mathbf{W}_h} = \sum_{t=1}^T \frac{\partial L}{\partial \mathbf{h}_t} \cdot \frac{\partial \mathbf{h}_t}{\partial \mathbf{W}_h} \) ,误差项 \( \delta_t \) 的计算公式为 \( \delta_t = \frac{\partial L}{\partial \mathbf{h}_t} = \left[ \frac{\partial L}{\partial \mathbf{y}_t} \cdot \frac{\partial \mathbf{y}_t}{\partial \mathbf{h}_t} + \frac{\partial \mathbf{h}_{t+1}}{\partial \mathbf{h}_t} \cdot \delta_{t+1} \right] \cdot \sigma'(\mathbf{z}_t) \) [^1]。 BPTT算法的具体实现步骤可通过伪代码展示: ```python def GRADDESCBPTT(x, y, h, θ, ζ, loss, η): h0 = h ∇θJ, ∇ζJ = 0 # 初始化梯度为0 for i in range(1, L + 1): zi = W * hi-1 + U * xi + b # 计算隐藏状态输入 hi = Ψ(zi) # 更新隐藏状态 ŷi = V * hi + c # 生成预测 if loss == "squared": ei = ŷi - yi else: ei = σ(ŷi) - yi ∇ζJ = ∇ζJ + ∇ζ * g(hi) * ei # 累积预测参数梯度 εL+1 = 0 # 初始化误差向量为0 for i in range(L, 0, -1): εi = W.T * DΨ(zi+1) * εi+1 + V.T * ei # 更新误差向量 ∇θJ = ∇θJ + ∇θ * fi(hi-1) * εi # 累积过渡参数梯度 θ = θ - η * ∇θJ # 更新过渡参数 ζ = ζ - η * ∇ζJ # 更新预测参数 return θ, ζ ``` 在应用方面,递归神经网络(RNN)作为深度学习的核心组成部分之一,BPTT作为其计算梯度的方法,在处理复杂序列数据的任务上发挥重要作用。不过,RNN在处理长时间依赖时表现不佳,主要是因为BPTT存在梯度消失问题。当RNN进行反向传播时,梯度需通过时间逐步传递,在深度序列中,由于权重矩阵的反复相乘,梯度可能会快速衰减至接近零,导致模型无法学习到长距离时间依赖 [^2][^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值