循环神经网络RNNCell单元详解及反向传播的梯度求导

摘要

本文给出循环神经网络RNNCell单元的定义公式, 并求解其在反向传播中的梯度.

本文给出的相关公式是编程导向的, 完整的, 可以直接用于代码实现, 已通过 Python 验证.

相关

配套代码, 请参考文章 :

纯Python和PyTorch对比实现循环神经网络RNN及反向传播

纯Python和PyTorch对比实现循环神经网络RNNCell及反向传播

Affine 变换的定义和梯度, 请参考:

affine/linear(仿射/线性)变换函数详解及全连接层反向传播的梯度求导

系列文章索引 :
https://blog.csdn.net/oBrightLamp/article/details/85067981

正文

1. RNNCell 定义

1.1 一次循环

考虑输入一个 3 阶张量 X i j k X_{ijk} Xijk, 该张量可以表示为 i i i 个尺寸为 j × k j \times k j×k 的矩阵 X j k X_{jk} Xjk, 同时表明循环单元的输入尺寸为 k k k.

若单元输出尺寸为 n n n, 输入层矩阵 X j k X_{jk} Xjk ,变换矩阵为 W n k W_{nk} Wnk, 偏置向量 a 1 × n a_{1 \times n} a1×n, 变换后的矩阵为 Y j n Y_{jn} Yjn.

设初始隐含层矩阵为 H j n H_{jn} Hjn, 变换矩阵为 V n × n V_{n \times n} Vn×n, 偏置向量 b 1 × n b_{1 \times n} b1×n, 变换后的矩阵为 Z j n Z_{jn} Zjn.

设激活函数为 tanh, 则一次 RNNCell 循环变换为 :
Y j n = X j k W n k T + a 1 × n    Z j n = H j n V n n T + b 1 × n    A j n = Y j n + Z j n    O j n = t a n h ( A j n ) Y_{jn} = X_{jk}W_{nk}^T+a_{1 \times n}\\ \;\\ Z_{jn} = H_{jn}V_{nn}^T+b_{1 \times n}\\ \;\\ A_{jn}=Y_{jn}+Z_{jn}\\ \;\\ O_{jn} = tanh(A_{jn}) Yjn=XjkWnkT+a1×nZjn=HjnVnnT+b1×nAjn=Yjn+ZjnOjn=tanh(Ajn)
将以上过程记为 :
O j n = R N N C e l l ( X j k , H j n ) O_{jn} = RNNCell(X_{jk},H_{jn}) Ojn=RNNCell(Xjk,Hjn)
循环到下一次时, 将 O j n O_{jn} Ojn 代入 H j n H_{jn} Hjn, 与下一个 X j k X_{jk} Xjk 重新进行运算.

1.2 循环迭代

下面使用迭代记法表示 RNNCell 运算.

使用 H j n ( 0 ) H_{jn}^{(0)} Hjn(0) 表示初始隐含层矩阵, 对于 :
X i j k = X j k ( 1 ) , X j k ( 2 ) , X j k ( 3 ) , ⋯   , X j k ( i ) X_{ijk} = X_{jk}^{(1)},X_{jk}^{(2)},X_{jk}^{(3)},\cdots,X_{jk}^{(i)} Xijk=Xjk(1),Xjk(2),Xjk(3),,Xjk(i)
则 :
H j n ( 1 ) = R N N C e l l ( X j k ( 1 ) , H j n ( 0 ) )    H j n ( 2 ) = R N N C e l l ( X j k ( 2 ) , H j n ( 1 ) )    H j n ( 3 ) = R N N C e l l ( X j k ( 3 ) , H j n ( 2 ) ) ⋮ H j n ( i ) = R N N C e l l ( X j k ( i ) , H j n ( i − 1 ) ) H_{jn}^{(1)} = RNNCell(X_{jk}^{(1)},H_{jn}^{(0)})\\ \;\\ H_{jn}^{(2)} = RNNCell(X_{jk}^{(2)},H_{jn}^{(1)})\\ \;\\ H_{jn}^{(3)} = RNNCell(X_{jk}^{(3)},H_{jn}^{(2)})\\ \vdots\\ H_{jn}^{(i)} = RNNCell(X_{jk}^{(i)},H_{jn}^{(i-1)})\\ Hjn(1)=RNNCell(Xjk(1),Hjn(0))Hjn(2)=RNNCell(Xjk(2),Hjn(1))Hjn(3)=RNNCell(Xjk(3),Hjn(2))Hjn(i)=RNNCell(Xjk(i),Hjn(i1))

展开最后一层作为示例 :
Y j n ( i ) = X j k ( i ) W n k T + a 1 × n    Z j n ( i ) = H j n ( i − 1 ) V n n T + b 1 × n    A j n ( i ) = Y j n ( i ) + Z j n ( i )    H j n ( i ) = t a n h ( A j n ( i ) ) Y_{jn}^{(i)} = X_{jk}^{(i)}W_{nk}^T+a_{1 \times n}\\ \;\\ Z_{jn}^{(i)} = H_{jn}^{(i-1)}V_{nn}^T+b_{1 \times n}\\ \;\\ A_{jn}^{(i)}=Y_{jn}^{(i)}+Z_{jn}^{(i)}\\ \;\\ H_{jn}^{(i)} = tanh(A_{jn}^{(i)}) Yjn(i)=Xjk(i)WnkT+a1×nZjn(i)=Hjn(i1)VnnT+b1×nAjn(i)=Yjn(i)+Zjn(i)Hjn(i)=tanh(Ajn(i))
在迭代的过程中, W n k T ,    V n n T ,    a 1 × n ,    b 1 × n W_{nk}^T,\; V_{nn}^T,\; a_{1 \times n},\; b_{1 \times n} WnkT,VnnT,a1×n,b1×n 都是共享的, 不变的.

1.3 张量公式

使用 3 阶张量表示 :
H i j n = R N N C e l l ( i ) ( X i j k , H j n ( 0 ) ) H_{ijn} = RNNCell^{(i)}(X_{ijk},H_{jn}^{(0)}) Hijn=RNNCell(i)(Xijk,Hjn(0))
RNNCell 的上标 ( i ) (i) (i) 表示经过 i i i 次循环迭代运算.

注意, 经过 RNNCell 运算后, 输入尺寸为 i × j × k i \times j \times k i×j×k 的张量 X i j k X_{ijk} Xijk 将输出尺寸为 i × j × n i \times j \times n i×j×n 的张量 H i j n H_{ijn} Hijn.

2. 反向传播

考虑输入一个 3 阶张量 X i j k X_{ijk} Xijk, 经过 RNNCell 运算后, 输出 3 阶张量 H i j n H_{ijn} Hijn, 往前 forward 传播得到误差值 error ( 标量 e ), e 对 H i j n H_{ijn} Hijn 的梯度 ∇ e ( H i j n ) \nabla e_{(H_{ijn})} e(Hijn) 已由上游给出, 求 e 对 X i j k X_{ijk} Xijk 的梯度.
H i j n = R N N C e l l ( i ) ( X i j k , H j n ( 0 ) )    e = f o r w a r d ( H i j n ) H_{ijn} = RNNCell^{(i)}(X_{ijk},H_{jn}^{(0)})\\ \;\\ e = forward(H_{ijn}) Hijn=RNNCell(i)(Xijk,Hjn(0))e=forward(Hijn)
为了避免符号混乱, 将上游传递的梯度记为 ∇ e ( Q i j n ) = ∇ e ( H i j n ) \nabla e_{(Q_{ijn})} = \nabla e_{(H_{ijn})} e(Qijn)=e(Hijn), ∇ e ( H i j n ) \nabla e_{(H_{ijn})} e(Hijn) 用于迭代计算的中间结果.

2.1 关于 H 的梯度

从 RNNCell 运算的定义可以看出, 每一次循环迭代运算都是由 Affine 运算和激活函数运算组合而成.

对于 :
y = t a n h ( x ) = e x − e − x e x + e − x    d y d x = 1 − y 2 y = tanh(x)=\frac{e^x-e^{-x}}{e^x+e^{-x}} \\ \;\\ \frac{dy}{dx}= 1-y^2 y=tanh(x)=e

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值