距离上次更新已经 1814 天了,文章内容可能已经过时。

课程主页:https://web.stanford.edu/class/archive/cs/cs224n/cs224n.1194/

视频地址:https://www.bilibili.com/video/av46216519?from=search&seid=13229282510647565239

这里回顾CS224N Lecture 7的课程内容,这一讲介绍了梯度消失以及梯度爆炸的问题,GRU以及LSTM。

Vanishing Gradient and Gradient Explosion Problems

回顾梯度计算公式

EW=t=1TEtW

由链式法则不难得到

EtW=k=1tEtytythththkhkW

上式中最难计算的是hthk,注意到

hthk=j=k+1thjhj1=j=k+1tWT×diag[f(hj1)]

其中

f(hj1)=σ(Whhj1+Wee(t)+b1)

上述等式中省略了下标。

结合以上几个式子可得

EW=t=1Tk=1tEtytytht(j=k+1thjhj1)hkW

利用范数不等式可得

hjhj1WTdiag[f(hj1)]βWβh

其中βW,βh分别表示WT,diag[f(hj1)]的范数上限,从而

hthk=j=k+1thjhj1(βWβh)tk

所以如果βWβh<1,那么梯度的范数就会非常小,从而产生梯度消失的问题。

在实际中,也会产生梯度爆炸的问题,该问题的解决方式较为简单,只要将梯度按比例缩小即可:

g^EWif g^threshold then       g^thresholdg^g^end if

Deep Bidirectional RNNs

之前介绍的RNN是单向的,这里介绍双向RNN:

计算公式如下

ht=f(Wxt+Vht1+b)ht=f(Wxt+Vht+1+b)yt=g(Uht+c)=g(u[ht;ht]+c)

将双向RNN堆叠起来即可得到Deep Bidirectional RNN:

计算公式和双向RNN非常接近:

ht(i)=f(W(i)ht(i1)+V(i)ht1(i)+b(i))ht(i)=f(W(i)ht(i1)+V(i)ht+1(i)+b(i))y^t=g(Uht+c)=g(U[ht(L);ht(L)]+c)

为了解决梯度消失或者梯度爆炸的问题,人们提出了一些结构,其中最常见的为GRU和LSTM。

Gated Recurrent Units(GRU)

zt=σ(W(z)xt+U(z)ht1) (Update gate) rt=σ(W(r)xt+U(r)ht1) (Reset gate) h~t=tanh(rtUht1+Wxt) (New memory) ht=(1zt)h~t+ztht1 (Hidden state) 

图示如下:

Long-Short-Term-Memories

it=σ(W(i)xt+U(i)ht1)(Input gate)ft=σ(W(f)xt+U(f)ht1)(Forget gate)ot=σ(W(0)xt+U(o)ht1)(Output/Exposure gate)c~t=tanh(W(c)xt+U(c)ht1)(New memory cell)ct=ftct1+itc~t(Final memory cell)ht=ottanh(ct)

图示如下: