循环神经网络(Recurrent Neural Network Model)

来源:Coursera吴恩达深度学习课程

上篇文章介绍了RNN的数学符号(Notation),现在我们讨论一下怎样才能建立一个神经网络来学习X到Y的映射。如下图所示。

可以尝试的方法之一是使用标准神经网络,还是我们之前的例子,“Harry Potter and Herminoe Granger invented a new spell.”,把这9个输入单词(可能是9个one-hot向量),将它们输入到一个标准神经网络中,经过一些隐藏层,最终会输出9个值为0或1的项,它表明每个输入单词是否是人名的一部分。

但结果表明这个方法并不好,主要有两个问题(problems)

(1)是输入和输出数据在不同例子中可以有不同的长度,不是所有的例子都有着同样输入长度T_x或是同样输出长度的T_y。即使每个句子都有最大长度,也许你能够填充(pad)或零填充(zero pad)使每个输入语句都达到最大长度,但仍然看起来不是一个好的表达方式。

(2)一个像这样单纯的神经网络结构,它并不共享从文本的不同位置上学到的特征。你希望将部分图片里学到的内容快速推广到图片的其他部分,而我们希望对序列数据也有相似的效果。

而且我们之前提到的对于一个10,000的词表,单词都是10,000维的one-hot向量,因此这会是十分庞大的输入层。如果总的输入大小是最大单词数乘以10,000,那么第一层的权重矩阵就会有着巨量的参数。但循环神经网络就没有上述的两个问题。

什么是循环神经网络呢?

如上图所示,如果从左到右的顺序读这个句子,第一个单词x^<1>就是我们要做的就是将第一个词输入一个神经网络层,第一个神经网络的隐藏层,我们可以让神经网络尝试预测输出y^<1>,判断这是否是人名的一部分。循环神经网络做的是,当它读到句中的第二个单词x^<2>时,它不是仅用x^<2>就预测出y^<2>,他也会输入一些来自时间步1的信息。具体而言,时间步1的激活值就会传递到时间步2。然后,在下一个时间步,循环神经网络同时也输入了x^<3>,然后预测输出了预测结果y^<3>,等等,一直到最后一个时间步。注意在这个例子中,T_x = T_y,当不相等时这个结构会需要作出一些改变。所以在每一个时间步(time step)中,循环神经网络传递一个激活值到下一个时间步中用于计算

要开始整个流程,在零时刻构造一个激活值a^<0>,通常是零向量。使用零向量作为零时刻的伪激活值是最常见的选择,因此我们把它输入神经网络。

在一些研究论文中或是一些书中你会看到这类神经网络,用这样的图形来表示(上图最右侧图像所示),表示循环连接(recurrent connection)时会画个圈,表示输回网络层;一个黑色方块(shaded box)来表示在这个黑色方块处会延迟一个时间步。在本次课程中更倾向于使用左边这种分布画法。

循环神经网络是从左向右扫描数据,同时每个时间步的参数也是共享的,如上图的红色标记,我们用W_ax来表示从x^<1>到隐藏层的连接的一系列参数,每个时间步使用的都是相同的参数。而激活值也就是水平联系是由参数W_aa决定的,同样每一个时间步都使用相同的参数,同样的输出结果由参数W_ya决定。下图详细讲述这些参数是如何起作用。

注意到这个循环神经网络的一个缺点它只使用了这个序列之前的信息来做出预测,为了判断Teddy是否是人名的一部分,仅仅知道句中前两个词是完全不够的,还需要知道句中后部分的信息,因为句子也可能是这样的,“Teddy bears are on sale!”。因此如果只给定前三个单词,是不可能确切地知道Teddy是否是人名的一部分,第一个例子是人名,第二个例子就不是,所以只看前三个单词不够。这样特定的神经网络结构的一个限制是它在某一时刻的预测仅使用了从序列之前的输入信息并没有使用序列中后部分的信息,在之后的双向循环神经网络(bidirectional recurrent neural networks)(BRNN)的视频中处理这个问题。现在这个更简单的单向神经网络结构就够我们来解释关键概念(explain the key concepts)。

接下来我们具体地写出这个神经网络计算了些什么。

上图是一张清理后的神经网络示意图(the picture of the neural network),先输入零向量a^<0>,接着是前向传播过程(forward propagation),先计算激活值a^<1>,再计算y^<1>。

对矩阵下标的解释:例如W_ax的第一个下标a表示用来计算某个a类型的变量,第二个下标意味着要乘以某个x类型的量。

循环神经网络用的激活函数经常是tanh,有时候也会用ReLU,但是tanh是更通常的选择。选用哪个激活函数是取决于你的输出y,如果它是一个二分类问题,那么可以会用sigmoid函数作为激活函数;如果是k类别分类问题的话,那么可以选用softmax作为激活函数。对于更一般的情况,在t时刻有:

上述等式定义了神经网络的前向传播。下面具体看看这两个等式

将上述的第一个等式,以更简单的形式写出来,写为:

我们定义W_a的方式是将矩阵W_aa和W_ax水平并列放置,如:

例如之前的例子,如果a是100维的,x是10,000维的,那么W_aa就是个(100,100)维的矩阵W_ax就是个(100,10000)维的矩阵,因此如果将这两个矩阵堆起来,W_a就会是个(100,10100)维的矩阵。这种记法的好处是我们可以不使用两个参数矩阵,而是将其压缩成一个参数矩阵W_a,所以当我们建立更复杂模型时这就能够简化我们要用到的符号。

同样对于y也有更简化的例子:

现在我们知道了基本的循环神经网络,之后我们会一起来讨论反向传播以及如何能够用RNN进行学习。

说明:记录学习笔记,如果错误欢迎指正!转载请联系我。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值