Recurrent Neural Network(RNN)
1.问题提出
想要对一个句子中的单词,对其语义进行标记,如下两个句子,相同单词Taipei
,在第1句中的语义是目的地(dest),在第2个句子中的语义是出发地(place of departure)
对于句子输入问题,可以将单词转变为一个向量,再进行输入
尝试使用神经网络处理这个问题,但对于相同的输入,神经网络的输出应该是相同的,也就是说神经网络不能区分在不同上下文环境下的相同单词的不同语义,神经网络只单纯的看单词的长相
2.RNN
2.1 定义
对于这样的问题,需要模型具有记忆能力,即能枸橘不同的上下文对相同的单词,产生不同的语义输出
-
对于句子1,模型在对
Taipei
产生输出时,它记得之前的单词是arrive
,因此输出语义为目的地 -
对于句子2,模型在对
Taipei
产生输出时,它记得之前的单词是leave
,因此输出语义为出发地
这种具有记忆力的网络就是RNN(Recurrent Neural Network)
以下展示了使用RNN解决这个问题的最基本的模型,注意从前到后依次输入各个单词,模型是按时间展开的
这样的结构可以叠加多层,如下图所示
2.2 不同类型的RNN
根据上一次传回的数据的不同可分为Elman和Jordan
双向考虑的RNN,Bidirectional RNN
只使用从左向右的RNN,当产生当前输出时,只能考虑到上文的信息。而使用下面这种结构,产生一个输出时,不仅考虑了上文的信息,还考虑了下文的信息
3.LSTM
3.1 定义
Long Short-Term Memory,长短期记忆网络
在单纯的记忆单元之上,增加了输入门(input gate)、输出门(output gate)和遗忘门(forget gate)
Long Short-Term看起来是一个比较矛盾的名字,对其理解如下
-
short-term memory
是针对原始的RNN来说的,其记忆单元在下一次的输出产生之后就被替换掉了,记忆单元中数据保存的时间特别短,所以称之为short-term memory
-
Long
相对于原始的RNN来说,记忆单元可以保存相对较长的时间,能够一直记得之前的信息,直到遗忘门起作用,清除记忆单元,因此称之为Long Short-Term Memory
3.2 工作原理
总共有4个输入和1个输出,4个输入分别是
- 原始输入\(z\)
- 输入门控制信号\(z_i\)
- 输出门控制信号\(z_o\)
- 遗忘门控制信号\(z_f\)
-
3个门的输入控制信号,需要经过激活函数,一般是logistic函数
输出范围为(0,1),输出为1表示门开启,输出为0表示门关闭
-
输入门的控制原理
\(f(z_i)g(z)\)
若\(f(z_i)=1\),输入门开启,实际输入即为\(g(z)\)
若\(f(z_i)=0\),输入门关闭,实际输入即为\(0\)
-
输出门的控制原理
\(f(z_o)h(c^\prime)\)
若\(f(z_o)=1\),输出门开启,输出为\(h(c^\prime)\)
若\(f(z_o)=0\),输出门关闭,输出为\(0\)
-
遗忘门的控制原理
\(c^\prime=f(z_i)g(z)+cf(z_f)\)
若\(f(z_f)=1\),遗忘门开启,记忆单元在原值的基础上加上新的输入
若\(f(z_f)=0\),遗忘门关闭,记忆单元清除原值,并设为新的输入值
对于工作原理的举例理解,见https://www.bilibili.com/video/BV1Wv411h7kN?p=40,29:50
3.3 网络结构
以上是对一个block工作原理的说明,可以理解为网络中的一个神经元(neuron),多个这样的block可以构成一个网络,此处类比原始的RNN更好理解一些
多层LSTM
4.细节问题
4.1 问题提出
RNN很难训练,原因是RNN的损失函数大部分非常平坦,且存在很陡峭的"悬崖"
在进行梯度下降参数更新时,要么非常缓慢,要么突然发生了一很大的更新
下面一个例子,用于直观理解为什么原始RNN会比较难训练
当参数发生很小的变化时,由于在时间序列上反复使用这个参数,就会导致参数的影响被放大,如:\(w^{999}\)。
简单循环网络从理论上可以建立长时间间隔的状态之间的依赖关系,但是由于梯度爆炸或消失问题,实际上只能学习到短期的依赖关系。这就是长期依赖问题(long-term dependencies problem)
——邱锡鹏nndl
总结,RNN既存在梯度爆炸(gradient explode)问题,也存在梯度消失(gradient vanishing)问题,debuff叠满了
4.2 解决方法
Clipping:当梯度大于某个阈值时,就直接截断为阈值,不让非常剧烈的参数更新发生
Clipping解决了RNN梯度爆炸的问题,而LSTM能够解决RNN梯度消失的问题,下面直观理解为什么LSTM能够解决梯度消失问题
直观理解,主要是LSTM将记忆单元原来的内容和新输入的内容进行求和,那么求梯度的时候就不会很小,联系resnet恒等映射的理解
Gated Recurrent Unit(GRU),相比于LSTM只有2个gate,基本思想是旧的不去,新的不来
,将输入门和遗忘门联动起来
5.进一步学习
对于RNN,LSTM,如有必要,需要推导其梯度公式
对于GRU,如有必要,需加深学习
从公式推导上理解,为什么LSTM,GRU能解决RNN面临的问题
参考:李宏毅机器学习课程