深度学习——循环神经网络

循环神经网络

为什么要引入循环神经网络

怎样才能建立一个模型,建立一个神经网络来学习𝑋到𝑌的映射?可以尝试的方法之一是使用标准神经网络,在我们之前的例子中,我们有 9 个输入单词。想象一下,把这 9 个输入单词,可能是 9 个 one-hot 向量,然后将它们输入到一个标准神经网络中,经过一些隐藏层,最终会输出 9 个值为 0 或 1 的项,它表明每个输入单词是否是人名的一部分。
在这里插入图片描述
但结果表明这个方法并不好,主要有两个问题:

  1. 输入和输出数据在不同例子中可以有不同的长度,不是所有的例子都有着同样输入长度𝑇𝑥或是同样输出长度的𝑇𝑦。即使每个句子都有最大长度,也许你能够填充(pad)或零填充(zero pad)使每个输入语句都达到最大长度,但仍然看起来不是一个好的表达方式。
  2. 它并不共享从文本的不同位置上学到的特征,具体来说,如果神经网络已经学习到了在位置 1 出现的 Harry 可能是人名的一部分,那么如果Harry 出现在其他位置,比如𝑥<𝑡>时,它也能够自动识别其为人名的一部分的话,这就很棒了。
    之前我们提到过这些(上图编号 1 所示的𝑥<1>……𝑥<𝑡>……𝑥<𝑇𝑥>)都是 10,000 维的 one-hot 向量,因此这会是十分庞大的输入层。如果总的输入大小是最大单词数乘以 10,000,那么第一层的权重矩阵就会有着巨量的参数。

什么是循环神经网络?

如果你以从左到右的顺序读这个句子,第一个单词就是,假如说是𝑥<1>,我们要做的就是将第一个词输入一个神经网络层,我打算这样画,第一个神经网络的隐藏层,我们可以让神经网络尝试预测输出,判断这是否是人名的一部分。循环神经网络做的是,当它读到句中的第二个单词时,假设𝑥<2>它不是仅用𝑥<2>就预测出𝑦^<2>,他也会输入一些来自时间步 1 的信息。具体而言,时间步 1 的激活值就会传递到时间步 2。然后,在下一个时间步,循环神经网络输入了单词𝑥<3>,然后它尝试预测输出了预测结果𝑦<3>,等等,一**直到最后一个时间步,输入了𝑥<𝑇𝑥>**,然后输出了𝑦<𝑇𝑦>。至少在这个例子中𝑇𝑥 = 𝑇𝑦,同时如果𝑇𝑥和𝑇𝑦不相同,这个结构会需要作出一些改变。所以在每一个时间步中,循环神经网络传递一个激活值到下一个时间步中用于计算
在这里插入图片描述
在零时刻需要构造一个激活值𝑎<0>,这通常是零向量。有些研究人员会随机用其他方法初始化𝑎<0>,不过使用零向量作为零时刻的伪激活值是最常见的选择,因此我们把它输入神经网络。
在每一个时间步中,你输入𝑥<𝑡>然后输出𝑦<𝑡>。然后为了表示循环连接有时人们会像这样画个圈,表示输回网络层,有时他们会画一个黑色方块,来表示在这个黑色方块处会延迟一个时间步(像上图最右边的循环神经网络)

循环神经网络是从左向右扫描数据,同时每个时间步的参数也是共享的,我们用𝑊ax表示管理着从𝑥<1>到隐藏层的连接的一系列参数,每个时间步使用的都是相同的参数𝑊ax。而激活值也就是水平联系是由参数𝑊𝑎𝑎决定的,同时每一个时间步都使用相同的参数𝑊𝑎𝑎,同样的输出结果𝑊ya决定。在这个循环神经网络中,它的意思是**在预测𝑦<3>时,不仅要使用𝑥<3>的信息,还要使用来自𝑥<1>和𝑥<2>的信息**,因为来自𝑥<1>的信息可以通过这样的绿色的路径来帮助预测𝑦<3>。
在这里插入图片描述

这个网络的缺点是:它只使用了这个序列中之前的信息来做出预测,尤其当预测𝑦^<3>时,它没有用到𝑥<4>,𝑥<5>,𝑥<6>等等的信息。所以这就有一个问题,因为如果给定了这个句子,“Teddy Roosevelt was a great President.”,为了判断 Teddy是否是人名的一部分,仅仅知道句中前两个词是完全不够的,还需要知道句中后部分的信息,这也是十分有用的,因为句子也可能是这样的,“Teddy bears are on sale!”。因此如果只给定前三个单词,是不可能确切地知道 Teddy 是否是人名的一部分,第一个例子是人名,第二个例子就不是,所以你不可能只看前三个单词就能分辨出其中的区别。解决方法就是双向循环神经网络

循环神经网络的前向计算

在这里插入图片描述
这里是一张清理后的神经网络示意图,和我之前提及的一样,一般开始先输入𝑎<0>,它是一个零向量。接着就是前向传播过程,先计算激活值𝑎<1>,然后再计算𝑦<1>。 𝑎<1> = 𝑔1(𝑊𝑎𝑎𝑎<0> + 𝑊𝑎𝑥𝑥<1> + 𝑏𝑎) ,𝑦^<1> = 𝑔2(𝑊𝑦𝑎𝑎<1> + 𝑏𝑦)我将用这样的符号约定来表示这些矩阵下标,举个例子𝑊ax,第二个下标意味着𝑊ax要乘以某个𝑥类型的量,然后第一个下标𝑎表示它是用来计算某个𝑎类型的变量。同样的,可以看出这里的𝑊ya乘上了某个𝑎类型的量,用来计算出某个𝑦^类型的量。
循环神经网络用的激活函数经常是 tanh,不过有时候也会用 ReLU,但是 tanh 是更通常的选择,如果它是一个二分问题,那么我猜你会用 sigmoid 函数作为激活函数,如果是𝑘类别分类问题的话,那么可以选用 softmax 作为激活函数。不过这里激活函数的类型取决于你有什么样类型的输出𝑦,对于命名实体识别来说𝑦只可能是 0 或者 1,那我猜这里第二个激活函数𝑔可以是 sigmoid 激活函数。
更一般的情况下,在𝑡𝑎时刻,
<𝑡> = 𝑔1(𝑊𝑎𝑎𝑎<𝑡−1> + 𝑊𝑎𝑥𝑥<𝑡> + 𝑏𝑎)
𝑦^<𝑡> = 𝑔2(𝑊𝑦𝑎𝑎<𝑡> + 𝑏𝑦)
所以这些等式定义了神经网络的前向传播,你可以从零向量𝑎<0>开始,然后用𝑎<0>和 𝑥<1>来计算出𝑎<1>和𝑦<1>,然后用𝑥<2>和𝑎<1>一起算出𝑎<2>和𝑦<2>等等,像图中这样,从左到右完成前向传播。
在这里插入图片描述
接下来为了简化这些符号,我要将这部分(𝑊aa𝑎<𝑡−1> + 𝑊ax𝑥<𝑡>)以更简单的形式写出来,我把它写做𝑎<𝑡> = 𝑔(𝑊𝑎[𝑎<𝑡−1>, 𝑥<𝑡>] + 𝑏𝑎),那么左右两边划线部分应该是等价的。所以我们定义𝑊𝑎的方式是将矩阵𝑊𝑎𝑎和矩阵𝑊𝑎𝑥水平并列放置[𝑊𝑎𝑎 ⋮ 𝑊𝑎𝑥] = 𝑊𝑎。举个例子,如果𝑎是 100 维的,然后延续之前的例子,𝑥是 10,000 维的,那么𝑊𝑎𝑎就是个(100,100)维的矩阵,𝑊𝑎𝑥就是个(100,10,000)维的矩阵,因此如果将这两个矩阵堆起来,𝑊𝑎就会是个(100,10,100)维的矩阵。
符号([𝑎<𝑡−1>, 𝑥<𝑡>])的意思是将这两个向量堆在一起.
你可以自己检查一下,用这个矩阵乘以这个向量,刚好能够得到原来的量,因为此时,矩阵[𝑊𝑎𝑎 ⋮ 𝑊𝑎𝑥]乘以[𝑎<𝑡−1> 𝑥<𝑡> ],刚好等于𝑊𝑎𝑎𝑎<𝑡−1> + 𝑊𝑎𝑥𝑥<𝑡>,刚好等于之前的这个结论。
同样对于这个例子(𝑦^<𝑡> = 𝑔(𝑊𝑦𝑎𝑎<𝑡> + 𝑏𝑦)),我会用更简单的方式重写,𝑦^<𝑡> = 𝑔(𝑊𝑦𝑎<𝑡> + 𝑏𝑦)。现在𝑊𝑦和𝑏𝑦符号仅有一个下标,它表示在计算时会输出什么类型的量,所以𝑊𝑦就表明它是计算y类型的量的权重矩阵,而上面的𝑊𝑎和𝑏𝑎则表示这些参数是用来计算𝑎类型或者说是激活值的。
在这里插入图片描述

循环神经网络的反向计算

我们来分析一下前向传播的计算,现在你有一个输入序列,𝑥<1>,𝑥<2>,𝑥<3>一直到𝑥<𝑇𝑥>,然后用𝑥<1>还有𝑎<0>计算出时间步 1 的激活项,再用𝑥<2>和𝑎<1>计算出𝑎<2>,然后计算𝑎<3>等等,一直到𝑎<𝑇𝑥>。
为了真正计算出𝑎<1>,你还需要一些参数,𝑊𝑎𝑏𝑎,用它们来计算出𝑎<1>。这些参数在之后的每一个时间步都会被用到,于是继续用这些参数计算𝑎<2>,𝑎<3>等等,所有的这些激活项都要取决于参数𝑊𝑎和𝑏𝑎。有了𝑎<1>,神经网络就可以计算第一个预测值𝑦<1>,接着到下一个时间步,继续计算出𝑦<2>,𝑦^<3>,等等,一直到𝑦^<𝑇𝑦>。为了计算出𝑦^,需要参数𝑊𝑦 𝑏𝑦,它们将被用于所有这些点。
然后为了计算反向传播,你还需要一个损失函数。我们先定义一个元素损失函数
𝐿<𝑡>(𝑦^<𝑡> , 𝑦<𝑡>) = −𝑦<𝑡>log 𝑦^<𝑡> − (1 − 𝑦^<𝑡>)𝑙𝑜𝑔(1 − 𝑦^<𝑡>)
它对应的是序列中一个具体的词,如果它是某个人的名字,那么𝑦<𝑡>的值就是 1,然后神经网络将输出这个词是名字的概率值,比如 0.1。我将它定义为标准逻辑回归损失函数,也叫交叉熵损失函数(Cross Entropy Loss)。这是关于单个位置上或者说某个时间步𝑡上某个单词的预测值的损失函数。
现在我们来定义整个序列的损失函数,将𝐿定义为
𝐿(𝑦^ , 𝑦) = ∑𝐿<𝑡>(𝑦^<𝑡> , 𝑦<𝑡>) 𝑇𝑥 𝑡=1
在这个计算图中,通过𝑦^<1>可以计算对应的损失函数,于是计算出第一个时间步的损失函数,然后计算出第二个时间步的损失函数,然后是第三个时间步,一直到最后一个时间步,最后为了计算出总体损失函数,,我们要把它们都加起来,计算出最后的L。
反向传播算法需要在相反的方向上进行计算和传递信息,最终你做的就是把前向传播的箭头都反过来,在这之后你就可以计算出所有合适的量,然后你就可以通过导数相关的参数,用梯度下降法来更新参数。
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值