通过时间反向传播
从
t=1
到
t=τ
应用如下更新方程:
a(t)=b+Wh(t−1)+Ux(t)
h(t)=tanh(a(t))
o(t)=c+Vh(t)
y^(t)=softmax(o(t))
设损失函数
L(t)
为给定
x(1),...,x(τ)
后
y(t)
的负对数似然,则:
L(x,y)=−∑tlogpmodel(y(t)|{x(1),...,x(τ)})
=−logexp(o(t)y(t))∑iexp(o(t)i)
=−logy^(t)
其中
i
为
o(t)
中元素的下标。
计算RNN的梯度
对于时间节点
t
,我们要基于t后面的节点梯度来计算当前的节点梯度。
扫描二维码关注公众号,回复:
56509 查看本文章
∂L∂L(t)=1
o(t)
是softmax函数的参数,设
i
为
o(t)
中元素的下标。
1. 计算
o(t)
的梯度
对于
o(t)
中的每个元素
o(t)i
:
当
i≠y(t)
时:
∂L∂o(t)i=−∑iexp(o(t)i)exp(o(t)y(t))×−exp(o(t)y(t))(∑iexp(o(t)i))2×exp(o(t)i)
=y^(t)i
当
i=y(t)
时:
∂L∂o(t)i=−∑iexp(o(t)i)exp(o(t)y(t))×(−exp(o(t)y(t))(∑iexp(o(t)i))2×exp(o(t)y(t))+exp(o(t)y(t))∑iexp(o(t)i))
=y^(t)i−1
2. 计算
h(t)
的梯度
当
h=τ
的时候,只有
o(τ)
为后续节点:
∂L∂h(τ)=V⊤∂L∂o(τ)
当
h≠τ
的时候,
o(t),h(t+1)
为后续节点:
因为:
h(t+1)=tanh(b+Wh(t)+Ux(t))
,所以
∂L∂h(t)=V⊤∂L∂o(t)+(∂h(t+1)∂h(t))⊤∂L∂h(t+1)
=diag(1−(h(t+1))2)W⊤(∂L∂h(t+1))
因为tanh是对每个元素分别应用tanh, 所以这里实际为
diag(tanh)
,
其Jacobian矩阵则为
diag(1−tanh2)
.
3.计算其他参数的梯度
因为参数是共享的,他们依赖于每一步时间t的节点:
∂L∂c
=∑t(∂o(t)∂c)T∂L∂o(t)
=∑t∂L∂o(t)
∂L∂b
=∑t(∂h(t)∂b(t))T∂L∂h(t)
=∑tdiag(1−(h(t))2)∂L∂h(t)
∂L∂V
=∑th(t)⊤∂L∂o(t)
∂L∂W
=∑t∂L∂h(t)∂h(t)∂W(t)
=∑tdiag(1−(h(t))2)∂L∂h(t)h(t−1)⊤
∂L∂U
=∑tdiag(1−(h(t))2)∂L∂h(t)x(t)⊤