一、RNN基本结构

deeplearning.ai学习RNN 随笔 第1张

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

普通神经网络不能处理时间序列的信息,只能割裂的单个处理,同时普通神经网络如果用来处理文本信息的话,参数数目将是非常庞大,因为如果采用one-hot表示词的话,维度非常大。

RNN可以解决这两个问题

1)RNN属于循环神经网络,当从左到右读取文本信息的时候,上一时刻的状态输出可以传递到下一时刻,例如上图的a表示状态,a(1)向下传递,这样就考虑了前面的信息,如果是双向RNN的话,上下文都考虑进去了。

2)RNN参数是共享的。为方便理解,上述图示是展开的RNN结构,其实RNN只有一个循环体,一组共享参数。

 

上述图是一个最基本的RNN结构,a<T>代表不同时刻的状态,a0是一个初始化的零时刻的状态,可以设置为零向量;x<T>代表不同时刻的输入,y<T>代表不同时刻的输出,计算公式如下:

deeplearning.ai学习RNN 随笔 第2张

其中g为激活函数。

 

 二、反向传播

1)计算损失

  以命名实体识别作为例子,如果是地名就为1,不是地名就为0。输入是一句文本信息X=[he come from NewYork],输出一组Y=[0,0,0,1],X与Y的长度一致。模型预测的输出就是该输入x是地名的概率值,比如0.2,所以其实就是一个二分类问题,损失函数可以采用标准的逻辑回归损失或者说交叉熵损失。

deeplearning.ai学习RNN 随笔 第3张

第一个是元素级别的损失,也就是单个时刻的损失,第二个是整体序列的损失。

2)反向传播更新参数

因为RNN是一个循环体,其展开形式就是上述图所示,因为后面的状态a与输出y都依赖于前面的计算得到的,所以在进行反向传播的时候,跟普通神经网络一样,需要一层层向后利用梯度下降法计算梯度,并更新参数。与普通神经网络更新参数不同的一点就是,RNN因为是共享参数,所以在进行反向传播的时候,每传播一层更新的都是同一组参数。

 

三、其它形式的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表示对电影的评分等级,这种结构设计如下形式:

 deeplearning.ai学习RNN 随笔 第4张

2)one-to-many(音乐生成)

输入x为一个整数,表示你想要的音乐类型或者是你想要的音乐的第一个音符;输出Y是一段生成的音乐。这种结构输入是一个x,输出是多个y。

 deeplearning.ai学习RNN 随笔 第5张

 3)many-to-many(机器翻译)

这次的many-to-many是输入X与Y长度不一致的情况,例如机器翻译。其结构如下:

deeplearning.ai学习RNN 随笔 第6张

 

 四、用RNN训练一个语言模型

所谓语言模型,就是输入一句话,能得出这句话出现的概率。例如下面的这句话:

deeplearning.ai学习RNN 随笔 第7张

在训练的时候会从左到右一个个读取:

deeplearning.ai学习RNN 随笔 第8张

每一个输出y<t>,会通过softmax函数得出长度为字典长度|v|的向量,表示预测为每一个词的概率。后面的输入为前面的一个词,例如x<2>的输入就是cat,表示在前一个词为cat,后一个词输出为average的概率是多少,因此每一个词的输出都考虑了前面词的信息。

输出y<t>已经经过softmax层了,所以采用交叉熵计算损失即可,如下:

deeplearning.ai学习RNN 随笔 第9张

第一个为单个元素损失,第二个为整个序列的损失。

 整个模型训练完毕后,如果要计算p(y<1>,y<2>,y<3>)的概率,只需要把该序列像训练的时候带入模型,得出分别预测出来的概率连乘即可:

deeplearning.ai学习RNN 随笔 第10张

 

 

deeplearning.ai链接:https://mooc.study.163.com/learn/2001280005?tid=2001391038#/learn/content

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄