- 介绍GRU之前,首先我们先直观的理解一下梯度消失(Gradient Vanishing)问题。
RNN在NLP中具有很大的应用价值,但是其存在一个很大的缺陷,那就是梯度消失的问题。例如下面的例句中:
The cat, which already ate …,was full;
The cats, which already ate …,were full.
在这两个句子中,cat对应着was,cats对应着were,(中间存在很多很长省略的单词),句子中存在长期依赖(long-term dependencies),前面的单词对后面的单词有很重要的影响。但是我们目前所见到的基本的RNN模型,是不擅长捕获这种长期依赖关系的。
和基本的深度神经网络结构类似,输出 y y y得到的梯度很难通过反向传播再传播回去,也就是很难对前面几层的权重产生影响,所以RNN也有同样的问题,也就是很难让网络记住前面的单词是单数或者复数,进而对后面的输出产生影响。
对于梯度消失问题,在RNN的结构中是我们首要关心的问题,也更难解决; 虽然梯度爆炸在RNN中也会出现,但对于梯度爆炸问题,因为参数会指数级的梯度,会让我们的网络参数变得很大,得到很多的Nan或者数值溢出,所以梯度爆炸是很容易发现的,我们的解决方法就是用梯度修剪(gradient clipping),也就是观察梯度向量,如果其大于某个阈值,则对其进行缩放,保证它不会太大。
1. GRU
- 一个包含一个更新门 Γ u \Gamma_u Γu的GRU简化版本如下图示:
公式如下:
c ~ < t > = t a n h ( W c [ c < t − 1 > , x < t > ] + b c ) \tilde c^{<t>}=tanh(W_c[c^{<t-1>},x^{<t>}]+b_c) c~<t>=tanh(Wc[c<t−1>,x<t>]+bc)
Γ u = σ ( W u [ c < t − 1 > , x < t > ] + b u ) \Gamma_u=\sigma(W_u[c^{<t-1>},x^{<t>}]+b_u) Γu=σ(Wu[c<t−1>,x<t>]+bu)
c < t > = Γ u ∗ c ~ < t > + ( 1 − Γ u ) ∗ c < t − 1 > c^{<t>}=\Gamma_u*\tilde c^{<t>}+(1-\Gamma_u)*c^{<t-1>} c<t>=Γ