Perenial youth.

ECNU 2019 NLP Spring_Seminar 第六讲 Recurrent neural network

ECNU 2019 NLP Spring_Seminar 第六讲 Recurrent neural network

别问我第五讲去哪了。。没听懂 先鸽了。。

这一讲主要是讲Simple RNN和LSTM的原理,以及seq2seq,attention,auto-encoder,GAN等基于RNN的概念,相当重要

课件链接: http://speech.ee.ntu.edu.tw/~tlkagk/courses/ML_2016/Lecture/RNN%20(v2).pdf

Part I:

我们先来看一个对话机器人的任务。对话机器人常用Slot Filling(插槽)的方式实现。也就是说,面对用户的输入,我们要辨别出每一个词汇属于哪一个slot:

需要识别出Taipei和November属于哪些slot

这个问题首先可以尝试用我们之前说的DNN来解决,就是一个多分类的问题,类别数等于slot数(要注意加一个other):

但是问题来了,DNN是不会考虑上下文的,也就是遇到下述两个句子就无法分辨了:“我11月2日要去台北”和“我11月2日要离开台北”。那么怎么办呢?这时候就需要使用上下文的信息了,DNN是无法做到的。因此就需要循环神经网络。

首先解释什么是循环神经网络:循环神经网络是一种可以利用过去信息的网络。也就是一种“时序”的神经网络。传统的DNN是把所有输入同时处理,而循环神经网络,是时序的,也就是顺序处理每一个小的输入单元,并用上一步处理的结果辅助下一步的处理。因此输入的每个input是有依赖关系的,不是完全无关的。也就是所谓的context information。

一个RNN的简单原理图。两个蓝色的是2个记忆元,记录上一次的hidden单元的值(绿色)。依次input [1 1],[1 1],[2 2],输出是[4 4],[12 12]…、

因此用RNN解决Slot Filling差不多是这么一回事:把每一个word当做一个input丢进RNN中

注意的是,总共只有一个神经网络,这里不是三个,是一个的重复使用。

因此RNN的结构可以是这样的:

第一种,每一个隐藏层使用上一次对应的隐藏层的信息;
第二种,隐藏层使用上一次的output的信息

我们刚才说的是正向的RNN,也就是使用了上文信息,但是我们如果还想使用下文信息呢?那么可以反向也train一个RNN。这样就是一个双向RNN:

这样得到的信息更多。

上面提到的是Simple RNN,刚才的Memory可以随时存取。但是现在的memory一般都是Long Short-term Memory(LSTM).如果想把值写到memory cell中,则需要通过input gate;输出的地方也有一个output gate。只有打开的时候其它cell才能使用这个output。还有一个叫做forget gate,决定memory cell什么时候更新。上面这3个gate都是网络自己学到的。

LSTM有四个inputs:输入以及三个控制门的信号

具体来看三个gate如何work:

\(z_i\)控制输入是否可以放到memory cell中。
\(z_f\) 控制memory是否要忘记之前的memory。
\(z_o\) 控制memory cell的结果是否要输出出去
LSTM的简单例子
具体来看一个LSTM的例子。图中四个部分的weight都是网络训练的时候学到的。

这里的每个LSTM就像DNN中的每一个neuron。因此一层也可能有很多LSTM。

这里的参数是DNN的四倍

真实的LSTM:时间维度上来说, \(z_i,z_f,z_o,z\)由 \(c_{t-1},h_{t-1},x_t\)决定. \(z_i,z_f,z_o,z\)的每一个dimension对应这一层的每一个LSTM cell的4个输入。

真实应用场景下的LSTM长这样:

Part II:

RNN这种架构要如何做learning呢?

也是用梯度下降

与DNN类似,也是梯度下降,但是要考虑序列

LSTM是比较难训练的。

为什么会有这个原因呢?因为RNN的error surface很崎岖。

如何解决这个问题?Clipping. 当梯度大于某个值的时候,就把梯度设为某个定值。

为什么会有这个问题呢?有人猜是sigmoid。但是并不是这个原因。有人换了activation function 发现也不work。有人发现是因为网络过深导致的。因为RNN是时序的,一个neuron反复使用了很多次。所以w只要稍微有一点变化,由于反复不断的使用,就会产生很大的影响。

LSTM也可以解决这个问题。

为什么LSTM可以缓解gradient vanish的问题:因为forget gate里的信息是加的形式,不像simple RNN是完全洗掉的,因此加的形式梯度是相加,不是相乘,因此grandient vanish的问题比较好解决。但是forget gate可以把memory cell洗掉;因此其实实际搭一个LSTM时我们要保证forget gate尽量开启。

也有一些其他方法可以解决RNN的梯度消失的问题:

同时作者还指出有一篇文章提到,identity matrix initialize的RNN+ReLU的性能可以吊打LSTM(但是随机初始化的LSTM+ReLU性能比较差)

RNN的应用:

情感分类任务
提取关键词任务:RNN+attention+DNN
输入是多维,输出也是多维;同时输入比输出要长。这里举例语音识别任务

取每一段时间节点,分析这一段的音频;但是这样会有一个很明显的问题,你不知道一个词是多长,例如你会把好棒分析成好好好好好棒棒棒棒棒。。一个显然的方法是,把重复的词消去,但是这么一来,又没办法识别出好棒棒了

一个解决方法是CTC:在output时,不止output所有中文,同时多output一个符号null。所以输出只要把null拿掉就可以了

CTC在做训练的时候,可以穷举所有可能的alignment,假设全部都是对的去训练

举例

Seq2Seq: 以machine translation为例。

让machine读一遍input 然后每次根据上一次的output产生新的output(有点像成语接龙)。那么什么时候为止呢?再add一个symbol代表停止:”===”

那么可不可以再进一步,输入英文语音输出中文文本呢?也就是跳过英文语音识别呢?是可以的,有人做过这个事情。

Seq2Seq思想也可以用于句法解析:

Seq2Seq——Auto-encoder

bag-of-word无法考虑上下文信息。简单地说,auto-encoder是一种提炼句子中有效信息的方法。同样,这也可以作为句子的embedding表示,与word2vec类似。在下一讲,Seq2seq中会再详细去说。

input 一个word sequence,通过RNN编成embedding;再把这个embedding作为decode的输入,将embedding解码成word sequence。这个步骤不需要label,只需要大量的文章输入。

Seq2seq learning : Chat-bot

收集对话信息作为input和output

Attention-based Model

可以看做RNN的进阶版。稍微提一下。具体之后专题会说(疯狂挖坑) 。

2.0版
阅读理解中使用attention的例子。3个hop分别表示reading head controller的位置

我们知道,一些Structured Learning手段也可以实现序列的学习。那么RNN和Structured Learning有什么区别呢?

  1. 结构化学习考虑整个序列才进行学习,这一点比RNN只考虑单向好(但是可以做两个方向的RNN解决这个问题)
  2. 可以外部限制标注。比如你可以在结构化学习的模型中去要求某个label出现多少次这种限制,但是在RNN中你却不能这么做,只能在训练数据中多出现这种数据来隐式地影响model
  3. 结构化学习的cost和error是相关的,好
  4. 结构化学习难以deep,也就是model space不太好,但是RNN可以很deep,model space很广

但是可以把两者结合起来:

xinyu