DL02-RNN学习笔记

来源:互联网 发布:淘宝老瑞贸易可信吗 编辑:程序博客网 时间:2024/06/03 13:22

摘要:主要是学习了李老师与李飞飞团队的两个视频,对学习的RNN做了一个笔记。

1. 李宏毅老师的RNN

https://www.bilibili.com/video/av15889450/index_21.html#page=21

1.1 RNN的引入与问题提出

RNN可以处理含有序列的数据问题,例如定票系中对自然语言处理中的词序列等。

问题提出:当不考虑词的序列时,arrive Taipei on November 2nd与leave Taipei on November on November 2nd建模/训练/结果预测是区别不出这两个不同意思。所以,要寻找一种含有记忆的方法去记住整个句子的意思,并理解句子的意思的不同。

1.2 RNN是什么及分类

RNN是Recurrent Neural Networks的简称,即循环神经网络。

为了解决对于序列串的记录问题,RNN引入了一个内存把上一次的结保存下来,像下面的store箭头,是第t时刻的数据为第t+1时刻把数据保存起来,当t+1时刻的数据进来后,把内存数据取出,作为下一时间的输入,与新输入一起计算[计算方法是第t时刻的值与第t+1时刻的值,在给出权值矩阵W下作线性组合计算],如下图。

另外,从网下找到了另一个图,更简单地描述了这个过程:
这里写图片描述
RNN分类
类1,Elman Network, 这种情况,是把隐含层的值传给下一个时刻。
这里写图片描述
类2,Jordan Network,把t时刻输出数据作一个保存,并在下面一个时刻传给隐含层。
这里写图片描述
类3,Bidirectional RNN,这是一个双向的RNN,这种RNN的好处是,在训练的过程中,可以双向一起计算,每个时刻都可以把整个个序列的信息用上。例如,在得出y_t+1这个结果,上面的x_t+1是从x_t+2更前面的的序列值传输有记忆计算得到的;对于下面的x_t+1,是从x_t后面的序列经过值传输有记忆计算得到的。这样,每个结果y_t都采用了整个个序列的所有信息。

1.3 LSTM讲解

LSTM是Long Short-term Memory的简称。
这里写图片描述
一个LSTM神经元,同4个input与1个output组成,其中3个input是Gate,1个为输入数据,对于Gate也是由输入数据来进行控制的。激活函数通常选用sigmoid function, sigmoid的输出介于0到1之间,表征了Gate的打开程度。如果程序是同步的,按上图的顺序进行运行。
第一步,由Z输入数据;
第二步,经过函数g,得到g(Z);
第三步,对于输入数据Z,给过权重矩阵作用后,生成Z_i,Z_i进行控制输入;
第四步,经过函数g,得到f(Z_i);
第五步,g(Z)g(Z_i),表示g(Z_i)进行对g(Z)输入进行控制;
第六步,对于输入数据Z,给过权重矩阵作用后,生成Z_f,Z_f进行控制输入;
第七步,经过函数f,得到f(Z_f);
第八步,从内存中取出数据C;
第九步,把C与f(Z_f)结合,得到cf(Z_f),进行控制是否会被忘记之前的数据,形成新的数据C‘;
C’ = g(Z)f(Z_i) + cf(Z_f)
第十步,把C’保存到内存中;
第十一步,C‘经过函数h(C’),准备输出;
第十二步,对于输入数据Z,给过权重矩阵作用后,生成Z_o,Z_o进行控制输入;
第十三步,经过函数f,得到f(Z_o);
第十四步,h(C’)爱到f(Z_o)的控制进行输出a=h(C’)f(Z_o);
由上面那个图,把四个输入放在一起,把C内存放在一边,加入多一个时刻:
这里写图片描述
增加更多的一些关系,最下面的c_t-1,h_t-1,x_t,这三个合并作为输入,然后再与四个不同的矩阵相乘得到4个gates.
同时,再增加一层,形成下如下图:
这里写图片描述

LSTM是一个典型的模型,当提到RNN时,很多时候,都指的是它。

1.4 LSTM的学习问题与解决

RNN的学习方法BPTT【BACKpropagation through time】【进一步深入,与其它的梯度一起学习】
问题:RNN的学习不稳定,有时还可以,有时会很不理想;损失函数的表面要么非常平坦,要么非常陡峭(The error surface is either very flat or very steep);当在比较平坦的时候,梯度值会比较小,需要一个比较大的学习率;而当这个学习过程中遇到了陡峭的地方,梯度值会会异常的大,如果用大的学习率去学习时,就会出现下面绿色的曲线了。

解决爆炸问题:
这个问题通过设置阈值去解决。
Razvan Pascanu使用了叫做“Clipping”的训练技巧:为梯度设置阈值,超过该阈值的梯度值都会被cut,这样参数更新的幅度就不会过大(虚线表示的轨迹),因此容易收敛。
这里写图片描述

爆炸原因是权重累乘,引起了梯度的消失与梯度的爆炸,例如
这里写图片描述
解决梯度消失问题:
这个问题一般是通过构建神经网络结构解决。
(1)LSTM
可以处理梯度的消失问题,不可以解决梯度的爆炸问题。因为记忆的旧信息与新输入的信息是相加的;另外forget gate 不关闭,梯度是不会消失。
(2) clockwise RNN
(3) SCRN[Structurally Constrained Recurrent Network]

1.5 RNN的应用

1.5.1. Many to one

Input is a vector sequence, but output is only one vector;
(1) 应用1:情感分析

这里写图片描述

(2) 应用2:Key Term Extraction 关键词抽取

这里写图片描述

1.5.2. Many to Many

输入与输出都是一个序列时。

(1) 语音识别【输出比输入短】

语音识别—CTC[Connectionist Temporal Classification]
Graves, Alex, and Navdeep Jaitly. “Towards end-to-end speech recognition with
recurrent neural networks.” Proceedings of the 31st International Conference on
Machine Learning (ICML-14). 2014.

(2)机器翻译

输入与输出有不同的长度[Sequence to sequence learning]
机器翻译:这个关联会一直下去,直到遇到了终止符。
这里写图片描述
另外,英文—>中文[借助语音为中间来翻译,不用识别英文意思]

(3) 句法分析【Syntactic parsing】
  Syntactic parsing.把语法树描述成一个序列来求解。可以转换过来。
(4) Sequence-to-sequence Auto-encodeer

a. 将文档转换为向量表示【如果用bag of word来描述,会把两句相反的句子理解成同一个意思的。而RNN考虑了序列,序列就有语序,会更鲁棒。】
这里写图片描述
b. 可以把语音的变长的序列变成定长的向量。
首先把音频段经过训练,变成一个定长的向储存起来;然后,预测时,把语音也经过同样的处理就成一个向量;最后计算这个向量的相似性来达到识别的效果。
这里写图片描述
下图带有红框的神经元包含了所有语音的信息,这个是完成了Encoder的最终阶段;然后,接入到decoder网络来进行训练,最后这个红框的向量是我们所需要的向量。这个有点像word2vec.训练出来可以在坐标系中表示这些向量,它的发音相近的会距离得比较近的。
这里写图片描述
另一个例子,seq2seq可以训练对话:
这里写图片描述

(5) Attention-based Model 注意力模型
  Neural Turing Machine 神经图灵机
(6) Reading Comprehension
(7) 其它应用
      视频标题生成      图片标题生成

这里写图片描述
可视化问答
Speech Question Answering
RNN与Structured Learning

2. 李飞飞团队

https://www.bilibili.com/video/av13260183/index_5.html#page=10

2.1 RNN的分类####

这里写图片描述

2.1.1 one to one#####

Vanilla Neural Networks : Vanilla本意是香草,在这里基本等同于raw.可理解为最原始的神经网络, 一种原始的前向神经网络,输入是一个固定大小的对象例如图片或向量,只有一个输出,这个可以用来作分类,有一个分类的分数。

2.1.2 one to many

一个图片输入,输入出图片题目。

2.1.3 many to one

Sentiment Classification 情感分类

2.1.4 many to many

机器翻译 【一系列词对应一系列词】,输入与输出的系列都是变长的。

2.2 RNN

这里写图片描述
强调了一点,函数与权重W都是共享的。

2.3 RNN学习

这里写图片描述
当梯度值大于1时,梯度爆炸,解决方法采用Gradient clipping.设置一个域值,不要让梯度过度膨胀;
当梯度值小于1时,梯度消失,解决方法是调整RNN模型,例如LSTM
这里写图片描述
显示了由x与h_t-1时刻的值与权重W作用产生结果,经过激活函数生成四个门。
矩阵运算中,可以把h看与红色x与绿块h的维度,4h*2h与2h相乘,得到4h的矩阵,对这个4h的矩阵值做激活函数操作,生成i,f,o,g四个门,这是一个0~1的小数。
这里写图片描述
当生成了四个门,这里是LSTM的数据流及梯度流。
从x_t与h_t-1叠加形成一个新矩阵开始,经过W与激活函数生成了f,i,g,o四个门。f控制了上一次数据是否可以向前通过;i控制新数据的输入流,这个g就是新的数据内容了,与i控制组合得到结果并与C_t-1经f门作用后相合生成新的内存数据C_t. C _t在o的控制下输出h_t. 这个模型用到了cell的输出数据。

相对于李宏毅老师的课,这个还有很多其它项目展示,不列出来,LSTM从一个更细致的角度去展示了,含有形式化的语言会多一些。

课外阅读

https://distill.pub/2016/augmented-rnns/
描述了RNN向四个方法发展【Neural Turing Machines,Attentional Interfaces,Adaptive Computation Time,Neural Programmer】

[happyprince, http://blog.csdn.net/ld326/article/details/78816498 ]