RNN
什么是RNN(Recurrent Neural Network)
在之前的所提到的NN,比如CNN,都是没有记忆性的。但如果我们要求NN能处理上下文的信息,比如下面的航空检票系统:
每次输入一条信息,我们想知道每个单词是属于哪一类(slot),即:构建一个NN,输出每个单词属于每个slot的概率。
在第一条信息时,我们已经知道了Taipei是dest,因此在处理第二条信息我们要能使用这一信息。
这就要求NN有存储功能。这就是RNN的核心。
Elman Network
实际的操作并不复杂:在一些神经处有会有一个存储值,每次操作得到新的值后将其存储起来,留到下次使用。
那回到航空检票系统,做法也和上例类似。看似是用了三个神经元,实际上是一个神经元用了三次,大大减少了开支。
在处理第二条信息时,就会发现:同样的输入可能会有不同的输出。
Jordan Network
Elman Network存储的是神经元的值,而Jordan Network存储的是Output的值。通常效果更好。
Bidirectional RNN
RNN也可以双向训练。
LSTM(Long Short-term Memory)
LSTM的基本架构由3个gate和1个Memory组成,如下图:
- Input Gate:由NN产生一个 z i z_i zi,得到 f ( z i ) = 0 o r 1 f(z_i)=0\ or\ 1 f(zi)=0 or 1,决定输入的值 z z z是否能进入LSTM。
- Forget Gate:由NN产生一个 z f z_f zf,得到 f ( z f ) = 0 o r 1 f(z_f)=0\ or\ 1 f(zf)=0 or 1,决定是否遗忘原本存储的值 c c c。
- Output Gate:由NN产生一个 z o z_o zo,得到 f ( z o ) = 0 o r 1 f(z_o)=0\ or\ 1 f(zo)=0 or 1,决定输入的值 z z z是否能进入LSTM
LSTM的参数是普通神经网络的四倍,一个简单的例子如下:
输入Xt先经过线性转化为4个vector组成的
z
z
z。C是memory的vector。h是上一个LSTM神经元隐层的输出。
RNN的Learning
如何训练RNN
Loss Function:对每个输入, 其输出的与相应的reference vector计算cross entropy, cross entropy之和就是loss function
训练方法:Gradient Descent,具体而言是BPTT(不细讲)。
但出现了一个问题:
- RNN的error surface要么很平缓要么很陡峭。
- 参数可能跳到悬崖上,造成loss暴增。
- 或者跳到悬崖边上(gradient很大),造成参数飞出去(NAN)。
- 因此RNN的训练是很难的。
解决方法:
- clipping: 当gradient>某个阈值时,令gradient = 阈值。
Why
并不是因为来自sigmoid的gradient vanish,因为换成ReLU也存在相同问题。(RNN中把sigmoid换成ReLU效果往往更差)
其实是因为RNN处理的是time sequence, 同样的weight在不同时刻被多次使用。 如下例:
如何解决
最常用的方法是LSTM。也就是把每个存储单元替换成LSTM即可。
但LSTM可以解决梯度消失的问题,但是难以解决梯度爆炸;
原因在于:
- Memory and input are added
- The influence never disappears unless forget gate is closed
目前,还有一种技术叫GRU(Gated Recurrent Unit)。与LSTM基本一样,但只用了两个gate,方法是:
- 当 input gate 打开时,forget gate 就自动关闭。
- 把存储单元里的值清掉,新的值才会进来。
Many to one
之前的例子是input和output一对一的。但RNN可以做到更多东西。
如上,将序列按照顺序在不同时间点输入,最后一个时间点把输出拿出来,经过些处理,得到结果。
Many to Many(Output is shorter)
但语音辨识中,可能遇到更复杂的情况:
正常的网络可能识别出好好好棒棒棒棒棒,然后可以通过Trimming去重,但是这样就无法识别好棒棒。
解决方法:CTC(Connectionist Temporal Classification),在输出中增加空字符。
Many to Many(No Limitation)
其基本思路如上。但是问题是不知道何时停止联想。
引出,其思路也有点类似CTC,在训练中,添加一种output,叫做===,代表“断”。
RNN v.s. Structured Learning
Deep这件事很重要,可以带来很大优势。
实际上,二者还可以结合在一起。
- input的feature先通过RNN与LSTM;
- 其输出作为 HMM 等的输入;
- 二者可以一起 Learn 的,可以一起Gradient Descent。
比如:
- Speech Recognition: CNN/LSTM/DNN + HMM
- Semantic Tagging: Bi-directional LSTM + CRF/Structured SVM