代码
【MindSpore易点通】深度学习系列-循环神经网络下篇

【MindSpore易点通】深度学习系列-循环神经网络下篇

【MindSpore易点通】深度学习系列-循环神经网络下篇

上期我们已经对循环神经网络的基础结构进行了简单介绍,今天小编给大家带来循环神经网络的反向传播以及不同的循环网络介绍。

1.4 反向传播

cke_9577.png

通过上图可以看到,前向传播在网络中就是从左到右地计算这些激活项,直到输出所有地预测结果,而反向传播算法则需要在相反的方向上进行计算和传递信息,从而计算出所有合适的量,通过导数相关的参数,用梯度下降法来更新参数。

cke_29333.png

首先分析下前向传播的计算,输入序列:cke_200750.png,通过cke_215814.png计算出时间步1的激活项,通过cke_227950.png计算出cke_241054.png,然后计算cke_253321.png

计算出cke_265652.png,其实我们还需要cke_278825.png,所有的这些激活项都要取决于参数cke_292045.png;最终有了cke_305297.png,神经网络就可以计算第一个预测值cke_317648.png,接着到下一个时间步,继续计算出cke_331114.png,同理参数cke_343207.png将被用于所有这些节点。

cke_355329.png

反向传播有一点不太相同的是,我们还需要一个损失函数。

首先定义一个元素的损失函数:

cke_370604.png

它对应的是序列中一个具体的词,如果它是某个人的名字,那么cke_415277.png的值就是1,然后神经网络将输出这个词是名字的概率值,比如0.1,可以理解为某个时间步上某个单词的预测值的损失函数。

然后定义整个序列的损失函数:

cke_429549.png

通过cke_443914.png可以计算对应的损失函数,于是计算出第一个时间步的损失函数,第二个时间步的损失函数,...,一直到最后一个时间步,最后为了计算出总体损失函数,把每个单独时间步的损失函数都加起来。

RNN反向传播示意图:

cke_459350.png

典型的循环神经网络

常规来说,在RNN结构中它的输入量Tx等于输出数量Ty,但实际上也可能不一定相等。

比如我们上期提到的音乐生成这个例子,Tx可以是长度为1或空集。或者输入长度和输出长度不同,都是序列但长度不同,比如机器翻译,一个法语句子和一个英语句子不同数量的单词却能表达同一个意思。

当Tx=Ty时,可以称之为“多对多”(many-to-many)的结构,因为输入序列有很多的输入,而输出序列也有很多输出。

当Tx和Ty不相等时,比如“对于今天的用餐进行评价”,输出对应数字1-5分,所以x就是一个序列,而y可能是从1到5的一个数字。简化神经网络的结构,一次输入一个字,cke_493384.png,但是并不会在每个时间上都有输出,而是让RNN网络读入整个句子,然后在最后一个时间上得到输出。这样的神经网络叫做“多对一”(many-to-one)结构,它有很多输入,然后输出一个数字。

cke_511903.png

当然也有“一对一”(one-to-one)的结构,输入然后得到输出,这和我们之前讨论的神经网络没有太大区别。

cke_528456.png

另外也可以有“一对多”(one-to-many)的结构。比如以音乐生成为例,使用一个神经网络输出一些音符。输入可以是一个整数或者0向量。

还有一点需要注意的是,如果输入和输出长度不同,比如一句话翻译成英语,中文字数和输出句子的单词数量不相同,这里就需要上图2中的一个网络结构。这个网络结构有两个不同的部分,一部分是编码器,获取输入,另一部分是解码器,它会读取整个句子,然后输出翻译成其他语言的结果。

关于循环神经网络的介绍大体就结束啦,欢迎各位在小编的基础上进行补充呀!