1、RNN基本结构网络
普通神经网络不能处理时间序列的信息,只能割裂的单个处理,同时普通神经网络若是用来处理文本信息的话,参数数目将是很是庞大,由于若是采用one-hot表示词的话,维度很是大。dom
RNN能够解决这两个问题:函数
1)RNN属于循环神经网络,当从左到右读取文本信息的时候,上一时刻的状态输出能够传递到下一时刻,例如上图的a表示状态,a(1)向下传递,这样就考虑了前面的信息,若是是双向RNN的话,上下文都考虑进去了。this
2)RNN参数是共享的。为方便理解,上述图示是展开的RNN结构,其实RNN只有一个循环体,一组共享参数。spa
上述图是一个最基本的RNN结构,a<T>表明不一样时刻的状态,a0是一个初始化的零时刻的状态,能够设置为零向量;x<T>表明不一样时刻的输入,y<T>表明不一样时刻的输出,计算公式以下:翻译
其中g为激活函数。设计
2、反向传播3d
1)计算损失code
以命名实体识别做为例子,若是是地名就为1,不是地名就为0。输入是一句文本信息X=[he come from NewYork],输出一组Y=[0,0,0,1],X与Y的长度一致。模型预测的输出就是该输入x是地名的几率值,好比0.2,因此其实就是一个二分类问题,损失函数能够采用标准的逻辑回归损失或者说交叉熵损失。blog
第一个是元素级别的损失,也就是单个时刻的损失,第二个是总体序列的损失。
2)反向传播更新参数
由于RNN是一个循环体,其展开形式就是上述图所示,由于后面的状态a与输出y都依赖于前面的计算获得的,因此在进行反向传播的时候,跟普通神经网络同样,须要一层层向后利用梯度降低法计算梯度,并更新参数。与普通神经网络更新参数不一样的一点就是,RNN由于是共享参数,因此在进行反向传播的时候,每传播一层更新的都是同一组参数。
3、其它形式的RNN结构
以前讲的例子是属于many-to-many的形式,且输入X与输出Y的长度相等,这种形式适合解决序列标注问题。还有其它形式的RNN结构
1)many-to-one (情感分析问题)
情感分析问题的输入是一个连续序列,例如对电影的描述“There is nothing to like in this movie”,而输出y=1/0,表示正面与负面;或者y=1,2,3,4,5表示对电影的评分等级,这种结构设计以下形式:
2)one-to-many(音乐生成)
输入x为一个整数,表示你想要的音乐类型或者是你想要的音乐的第一个音符;输出Y是一段生成的音乐。这种结构输入是一个x,输出是多个y。
3)many-to-many(机器翻译)
文章开头讲的结构也属于many-to-many形式,可是那种形式X与Y的长度是一致的,适合解决序列标注的问题。此次的many-to-many是输入X与Y长度不一致的状况,例如机器翻译。其结构以下:
前面一部分叫作encoder,分别输入x和状态a;后面一部分叫作decoder,Y直到输出为EOS结束。
4、用RNN训练一个语言模型
所谓语言模型,就是输入一句话,能得出这句话出现的几率。例以下面的这句话:
在训练的时候会从左到右一个个读取:
每个输出y<t>,会经过softmax函数得出长度为字典长度|v|的向量,表示预测为每个词的几率。后面的输入为前面的一个词,例如x<2>的输入就是cat,表示在前一个词为cat,后一个词输出为average的几率是多少,所以每个词的输出都考虑了前面词的信息。
输出y<t>已经通过softmax层了,因此采用交叉熵计算损失便可,以下:
第一个为单个元素损失,第二个为整个序列的损失。
整个模型训练完毕后,若是要计算p(y<1>,y<2>,y<3>)的几率,只须要把该序列像训练的时候带入模型,得出分别预测出来y<1>,y<2>,y<3>的几率,第一个输入x=0,得出y<1>的几率,第二个输入y<1>得出y<2>的几率,第三个输入y<2>得出y<3>的几率,最后连乘便可:
5、采样新序列
前面第四部分咱们已经训练生成了一个语言模型,这样咱们就能够采样新序列,或者说是利用语言模型来生成新的语句序列,其结构形式以下:
a<0>和x<1>输入均可以设置为零向量,每一层的输出都是一个softmax在字典|v|每一个词的几率输出,能够利用np.random.choice随机进行采样选取一个词,做为第一个词。而后后面节点的输入就是前面节点的输出,后面每一层的输出都进行随机采样,直到到达设定的时间步或者输出为EOS为止,这样就能够生成新序列了。下面就是利用莎士比亚文章训练的语言模型生成的采样序列:
6、RNN的问题
梯度消失:
在反向传播的过程当中,因为梯度消失的问题,RNN的输出很难受到序列靠前的输入的影响,由于无论输出是什么,不管输出是对仍是错,这个区域都很难反向传播到序列的前面部分,所以网络也很难调整序列前面的计算,因此RNN就不擅长处理长期依赖的问题。
梯度爆炸:
随着网络深度的加深,参数呈指数级别增加,甚至出现数值溢出为Nan的状况,这就是梯度爆炸。解决办法就是采用梯度修剪,观察梯度向量,若是大于某一个阈值时候,就缩放梯度向量,保证不会太大,这种方式处理梯度爆炸鲁棒性比较好。
综合来讲,梯度消失更难处理一些。
deeplearning.ai连接:https://mooc.study.163.com/learn/2001280005?tid=2001391038#/learn/content