RNN中的的反向传播推导(通俗版)

本文通过具体实例解析了反向传播的基本原理及链式法则的应用,并详细阐述了在循环神经网络(RNN)中的反向传播过程。

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

反向传播其实就是链式求导法则的重复使用,链式法则其实就是先计算外层函数的导数,再计算内层函数的导数,一直重复。误差反向传播的过程,就是层层求导的过程。在看RNN的反向传播之前,先看看简单网络的反向传播。

1、反向传播,链式求导

看一个小例子,如下图所示,其中f函数由x,y,z三种变量的组合来决定,x和y并不是直接和f相连。假设,x+y用q来表示,作为中间结果q=x+y。首先来看一下前向传播过程,就是根据当前的所有输入值来得到最后的输出值的过程。也就是f=(-2+5)*(-4)=-12。可以看出,三个输入x,y,z分别对最终的f值起到了不同的影响作用。有的影响大,有些影响小,有些是正的影响,有些是负的影响,因此,如果我们给出了f的真实值,就会出现一个误差,而每个输入x,y,z对这个误差的影响大小以及是正还是负的影响,可以用求导来得到。此处只演示x,y,z对f的影响,若要计算对误差的影响,只需对误差计算导数就可以。

这里给出第二个小例子:

需要注意的是,误差从输出一层一层往前传播,不可以跳过某些中间步骤,在计算每一步的误差时,需要乘上上一步得到的误差(链式法则,层层相乘)。在传播过程中,如果某一部分可以直接用一整个函数代替,则可以对整块求导,然后将导数值传到上一步,如下图所示,这仍然符合链式求导法则。

2、RNN中的反向传播

前向传播过程(黑色箭头方向):

输入为x,

隐层:ly1=sigmoid(x*W0)+pre_ly1*Wh,

由两部分组成,一部分是输入值乘以权重,再经过一个激活函数(这里暂时用sigmoid表示),另一部分是是隐藏层前一个状态保存的结果。

输出层:ly2=sigmoid(ly1*w1),

由隐层输出值和输出权重相乘,经过激活函数得到。

反向传播过程(红色箭头方向):

真实值为Y,输出层输出的预测值为ly2,两者差为:Y-ly2=err,计算得到总误差Err=1/2(Y-ly2)^2,也就是平方误差。接下来就要使用链式求导法则,反向传播误差,首先离误差最近的是输出ly2,则计算Err对ly2的偏导数,得到:

delta_ly2=(Y-ly2)*sigmoid'(ly2),

注意,这里sigmoid函数是对ly2求导。而Y-ly2=err,所以delta_ly2=err*sigmoid(ly2),接下来计算隐层的误差,从图中可以看出,隐层反向传过来的误差有两项,一个是后一个状态的隐层误差:next_ly1*Wh,另一个是输出层传下来的误差:delta_ly1=delta_ly2*W1*sigmoid'(ly1),

这个式子是由链式法则得出,每次计算当前步的误差需要乘上上一步的误差,因此有delta_ly2这一项,然后因为ly2=sigmoid(ly1*W1),根据链式法则计算ly2对ly1的导数,得到W1*singmoid'(ly1)。

然后计算按照下面公式更新参数:

需要更新的值也就是当前层的输出值乘以上一层传下来的误差。

 

 

RNN(循环神经网络)是一种能够处理序列数据的神经网络模型。它通过自循环的方式将前一时刻的隐藏状态信息传递给下一时刻,以此来建模序列中的时序关系。 RNN反向传播算法主要包含以下几个步骤: 1. 初始化:首先,我们需要初始化模型的参数,包括权重和偏置。这些参数会在反向传播过程中根据损失函数来进行调整。 2. 前向传播:在反向传播之前,我们需要先进行一次前向传播。假设我们有一个包含T个时刻的序列数据,每个时刻的输入是一个D维的向量,隐藏状态的维度为H。对于每个时刻t,我们先计算当前时刻的隐藏状态,根据当前时刻的输入数据和前一时刻的隐藏状态: ht = activation(Wx * Xt + Wh * ht-1 + b) 其中,Wx和Wh分别是输入与隐藏状态之间的权重矩阵,b是偏置项,activation是激活函数。 3. 计算损失函数:根据预测结果和真实结果计算损失函数,常见的损失函数包括均方差误差和交叉熵等。损失函数衡量了模型的预测与真实结果之间的差距。 4. 反向传播:在RNN中,由于隐藏状态之间存在时序关系,我们需要考虑到每个时刻的梯度对前一时刻的梯度的影响。首先,我们计算当前时刻的梯度: dht = dout + dht+1 其中,dout是损失函数对当前时刻的输出的导数。然后,我们利用当前时刻的梯度来计算当前时刻的权重矩阵和偏置项的梯度: dWx += Xt * dht dWh += ht-1 * dht db += dht 接下来,我们计算对前一时刻隐藏状态的梯度: dht-1 = Wh * dht 最后,我们利用当前时刻的梯度和前一时刻的梯度来计算损失函数对输入的导数: dXt = Wx * dht + dXt+1 这样就完成了一个时刻的反向传播。重复以上步骤,可以依次计算每个时刻的梯度,从而完成整个反向传播过程。 5. 更新参数:最后,利用计算得到的梯度信息更新模型的参数。采用梯度下降法,通过调整参数,使得损失函数尽可能地减小。 总结起来,RNN反向传播算法通过自循环的方式将梯度从当前时刻传递到前一时刻,并利用当前时刻和前一时刻的梯度来计算参数的梯度,然后通过梯度下降法来更新参数,从而优化模型。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值