通俗理解RNN循环神经网络原理

1、RNN的简单介绍

       我们前面提到的无论是人工神经网络还是CNN卷积神经网络,他们的前提都是:元素之间是相互独立的,前一个输入与后一个输入是没有关系的。但现实世界中,很多元素都是相互连接的,比如:某人说:我喜欢美食,其中最喜欢吃的是肉蟹煲,以后有钱了一定要每天吃___.这里填空,人应该都知道是填“肉蟹煲“。因为我们是根据上下文的内容推断出来的,但机器要做到这一步就比较难了。因此,我们就需要使用循环神经网络了,他的本质是:像人一样拥有记忆的能力。因此,他的输出就依赖于当前的输入和记忆。

2、RNN的网络结构

基本循环神经网络结构:一个输入层、一个隐藏层和一个输出层。
在这里插入图片描述
       x为输入层向量,o为输出层的向量,U是输入层到隐藏层的权重矩阵,V是隐藏层到输出层的权重矩阵。循环神经网络的隐藏层的值s不仅取决于当前的这次输入x,还取决于上一次隐藏层的值s。权重矩阵W就是隐藏层上一次的值作为这一次的输入权重。将上图展开:
在这里插入图片描述
       这个网络在t时刻接收到输入Xt之后,隐藏层的值是St,输出值是Ot。关键一点是,St的值不仅仅取决于Xt,还取决于St−1。
在这里插入图片描述
       式1是输出层的计算公式,输出层是一个全连接层,也就是它的每个节点都和隐藏层的每个节点相连。V是输出层的权重矩阵,g是激活函数。

       式2是隐藏层的计算公式,它是循环层。U是输入x的权重矩阵,W是上一次的值St−1作为这一次的输入的权重矩阵,f是激活函数。

       隐含层有两个输入,第一是U与Xt向量的乘积,第二是上一隐含层输出的状态S(t−1)和W的乘积。等于前一次计算输出的S(t−1)需要缓存一下,在本次输入Xt一起计算,共同输出最后的O。

如果反复把式2带入式1,我们将得到:
在这里插入图片描述
        从上面可以看出,循环神经网络的输出值Ot,是受前面历次输入值Xt、Xt−1、Xt−2、Xt−3、…影响的,这就是为什么循环神经网络可以往前看任意多个输入值的原因。这样其实不好,因为如果太前面的值和后面的值已经没有关系了,循环神经网络还考虑前面的值的话,就会影响后面值的判断。

3、双向循环神经网路

对于语言模型来说,很多时候光看前面的词是不够的,比如下面这句话:
我的手机坏了,我打算___一部新的手机。
我们这个时候就需要双向循环神经网络。
在这里插入图片描述
从上图可以看出,双向循环神经网络的隐藏层要保存两个值,一个A参与正向计算,另一个值A’参与反向计算。最终的输出值y2取决于A2和A′2。其计算方法为:
在这里插入图片描述
A2 和A′2则分别计算:
在这里插入图片描述
现在,我们已经可以看出一般的规律:正向计算时,隐藏层的值St与St−1有关;反向计算时,隐藏层的值S′t与S′t+1有关;最终的输出取决于正向和反向计算的加和。现在,我们仿照式1和式2,写出双向循环神经网络的计算方法:
在这里插入图片描述
从上面三个公式我们可以看到,正向计算和反向计算不共享权重,也就是说U和U’、W和W’、V和V’都是不同的权重矩阵。

3、深度循环神经网络

循环神经网络的训练算法:BPTT
BPTT算法是针对循环层的训练算法,它的基本原理和BP算法是一样的,也包含同样的三个步骤:

1、前向计算每个神经元的输出值;

2、反向计算每个神经元的误差项δj值,它是误差函数E对神经元j的加权输入 n e t j net_j netj的偏导数;

3、计算每个权重的梯度。

4、最后用随机梯度下降算法更新权重。

循环层如下图所示:
在这里插入图片描述
前向计算
使用前面的式2对循环层进行前向计算:
st=f(Uxt+Wst−1)
我们假设输入向量x的维度是m,输出向量s的维度是n,则矩阵U的维度是n x m,矩阵W的维度是n x n。下面是上式展开矩阵的样子,看起来会直观一些:
在这里插入图片描述
误差项的计算
BPTT算法将第I层t时刻的误差项δlt值沿两个方向传播,一个方向是其传递到上一层网络,得到δl−1t,这部分只和权重矩阵U有关;另一个方向是将其沿时间线传递到初始t1时刻,得到δl1,这部分只和权重矩阵W有关。

4、RNN的梯度爆炸和消失问题

实践中前面介绍的几种RNN并不能很好的处理较长的序列,RNN在训练中很容易发生梯度爆炸和梯度消失,这导致梯度不能在较长序列中一直传递下去,从而使RNN无法捕捉到长距离的影响。

通常来说,梯度爆炸更容易处理一些。因为梯度爆炸的时候,我们的程序会收到NaN错误。我们也可以设置一个梯度阈值,当梯度超过这个阈值的时候可以直接截取。

梯度消失更难检测,而且也更难处理一些。总的来说,我们有三种方法应对梯度消失问题:

1、合理的初始化权重值。初始化权重,使每个神经元尽可能不要取极大或极小值,以躲开梯度消失的区域。

2、使用relu代替sigmoid和tanh作为激活函数。

3、使用其他结构的RNNs,比如长短时记忆网络(LTSM)和Gated Recurrent Unit(GRU),这是最流行的做法。我们将在以后的文章中介绍这两种网络。

5、RNN的应用举例

我们来介绍一下RNN语言模型,我们首先把词依次输入到循环神经网络中,每输入一个词,循环神经网络就输出截止到目前为止下一个最可能的词。例如,当我们依次输入:

我 昨天 上学 迟到 了

循环神经网络的输出如下图所示:
在这里插入图片描述
其中,s和e是两个特殊的词,分别表示一个序列的开始和结束。

向量化

为了让语言模型能够被神经网络处理,我们必须把词表达为向量形式,这样神经网络才能处理。所以我们需要把“词”进行向量化。

1、建立一个包含所有词的词典,每个词在词典里面有一个唯一的编码。

2、任意一个词都可以用一个N维的one-hot向量来表示(其中N是词典中词的总个数)。假设一个词在词典中的编号是i,v是表示这个词的向量,Vj是向量的第j个元素,则:
在这里插入图片描述
上面这个公式的含义,可以用下面的图来直观的表示:
在这里插入图片描述
但是处理这种向量会导致我们的神经网络有很多参数,带来庞大的计算量。因此往往需要使用一些降维方法。

语言模型要求输出的是下一个最可能的词,我们可以让循环神经网络计算词典中每个词是下一个词的概率,概率最大的词就是下一个最后的词。输出向量是一个N维向量,向量中的每个元素对应着词典中相应的词是下一个词的概率。
在这里插入图片描述
Softmax层

语言模型时对下一个词出现的概率进行建模,让神经网络输出概率的方法就是用Softmax层作为神经网络的输出层。Softmax作为激活函数:1、每一项为取值为0-1之间的正数;2、所有项的总和是1。
在这里插入图片描述
语言模型的训练
首先我们把语料“我 昨天 上学 迟到 了”转换成语言模型的训练数据集。我们获取输入-标签对:
在这里插入图片描述
对输入x和标签y进行向量化得到one-hot向量。向量中只有一个元素的值是1,其他元素都是0。

最后我们使用交叉熵误差函数作为优化目标,对模型进行优化。

交叉熵误差

当激活函数是softmax时,对应的误差函数E通常选择交叉熵误差函数,其定义如下:
在这里插入图片描述
在上式子中,N是训练样本的个数,向量yn是样本的标记,向量On是网络的输出。标记yn是一个one-hot向量,例如:y1=[1,0,0,0],如果网络的输出O=[0.03,0.09,0.24,0.64],那么交叉熵是(假设只有一个训练样本,即N=1):
在这里插入图片描述

6、项目

可以跑一下GitHub上比较火的这个项目Char-RNN练练手。

参考链接:
https://www.cnblogs.com/LXP-Never/p/10391308.html

  • 5
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值