一篇文章玩转 RNN 网络 原理

1. RNN的网络结构(展开)

在这里插入图片描述
图 1 RNN网络的基本运算单元

RNN 网络是由一个个的 cell 组成的,每一个 cell 都五脏俱全:
可以看出,沿着时间轴 t 每一个RNN的单元内都有一个输入 / 隐藏 / 输出层的神经网络。

RNN的每个细胞单元在时间轴的方向上,向下一时刻的RNN细胞单元共享权重,来实现处理沿时间维度的信息。

1.2 RNN的权值共享

【权值共享的必要性】

  • 减少运算的权重参数:
  • 权重共享的本质是特征提取,在针对特征的时候,权值共享显得尤为重要
  • 权重共享有利于模型泛化:因为普通神经网络的输入是固定的,但是权重共享可以让输入不固定,比如比如很多张图像,每张图像上有个人脸,但是人脸在图像的不同位置,或者图像的大小也不相同,此时权重共享可以全图扫描,搜索人脸,进而把特征提取出来。

权重共享使得模型能够处理一个连续序列的特征,而不管输入的序列总长度是多少。
当这个连续序列在样本的不同位置时,依然能够识别,而不是学习每个位置的规则,这不仅抓住了不同特征之间的连续性,也减少了学习规则

我们先来看一下CNN 网络的空间范围的权值共享。
CNN 卷积网络的过程中,一个卷积核对一整幅原图进行计算的时候,扫描整幅图所有的部分用的是同一个卷积核。如下:
在这里插入图片描述
图 2 用一个卷积核进行卷积运算的全过程

可以看的很清楚,无论这个卷积核在原图的哪一个部分做运算,总是这同一个卷积核,最后输出得到一个特征图。
在这里插入图片描述
图 3 CNN通过卷积运算共享权重参数的过程细节

如上图所示,详细展示了,如何在卷积核运算的过程中 共享同一组权重参数,而且右边的神经网络层也可以看的很清楚,右面神经网络图的部分的 颜色对应的是左边卷积核中相同颜色的部分对应的参数。可以很直观的看到,参数的在整个过程中被共享,有效地减少了传统方法中的“全连接”运算导致的参数过多情况。


对于RNN 网络,我个人认为是存在两种意义上的【权值共享】:

  • cell 内部的权值共享,也就是跟CNN一样,卷积核在做卷积操作的时候可以共享权值
  • 在RNN网络的 cell 与 cell 之间,因为如果 RNN 对图片提取特征的话,提取的特征图信息是存在隐藏层里面的,也就是 <图1> 中的 S 序列中(这一点是类似于CNN网络的)。所以,cell 与 cell 之间的权值共享,其实是相当于共享每个细胞单元提取出的图片特征。

在这里插入图片描述
图 4 普通的提取特征的 CNN网络结构层和 RNN单个神经单元的比对

1.3 RNN计算方法

在这里插入图片描述
再看到这张图,定义以下符号:

  • 每一个时刻的输出为 O t O_t Ot
  • X X X 代表本细胞单元的输入值, X = [ X 1 , X 2 , . . . , X m ] X = [X_1,X_2,...,X_m] X=[X1,X2,...,Xm] 如果输入的是一张图片,那么 X X X 就是像素的展开(平铺)值
  • U U U 表示本细胞单元的 输入层隐藏层 之间的权重矩阵
  • V V V 表示 隐藏层输出层 之间的权重矩阵
  • W W W 用来衡量上一时刻的隐藏层的数据在这一时刻的运算中起多大作用的衡量指标。换句话说,就是上一个细胞单元中的隐藏层的数据对本细胞运算的影响程度
  • S t S_t St 代表在本细胞单元与矩阵 V V V 进行运算产生输出之前,所有之前运算的总和,这些元素包括:
    ① 上一时刻细胞单元的 S t − 1 S_{t-1} St1 W W W 的乘积
    ② 本时刻细胞单元输入的特征提取结果 U ⋅ X t U·X_t UXt(也就是本层的输入层与输入权重矩阵 U U U 的积运算)
    PS: S t S_t St 不仅仅由本细胞单元中的输入 X X X 决定,还由上一时刻的隐藏层的数值有关系

具体公式如下:
O t = g ( V ⋅ S t ) O_t = g(V·S_t) Ot=g(VSt)
S t = f ( U ⋅ X t + W ⋅ S t − 1 ) S_t=f(U·X_t+W·S_{t-1}) St=f(UXt+WSt1)

其实我认为这个地方对于 S t S_t St 的理解可以由两种方式:

  • 第一种就是如上 S t = f ( U ⋅ X t + W ⋅ S t − 1 ) S_t=f(U·X_t+W·S_{t-1}) St=f(UXt+WSt1),认为 t − 1 t-1 t1 时刻的隐藏层信息 S t − 1 S_{t-1} St1 是与 t t t 时刻隐藏层信息进行共享,因为他们维度是一样的,所以只需要通过 U U U 矩阵来协调 X t X_t Xt 的维度(使其与隐藏层的维度一致),然后在 t t t 时刻,将这两个结果进行直接求和得到 t t t 时刻隐藏层的数据。
  • 第二种理解是认为 t − 1 t-1 t1 时刻的隐藏层信息 S t − 1 S_{t-1} St1 t t t 时刻输入层 X t X_t Xt 进行共享,这两个数据虽然数据长度不一样,但好在都是一维的,所以在输入层进行加和,得到 ( S t − 1 + X t , 1 ) (S_{t-1} + X_t, 1) (St1+Xt,1) 维度的数据,然后将这个数据与特定维度的矩阵做运算,使其满足 t t t 时刻隐藏层的输入维度,同样也达到了目的。

总结来讲,这两种理解方式的不同就相当于:
1 × 3 + 2 × 6 = 15
(1 + 2)× 5 = 15

希望这么说可以帮大家更好的理解

1.4 RNN面对的问题

  • 梯度爆炸
  • 梯度消失

在这里插入图片描述
想要详细了解可以参考网页:
https://www.cnblogs.com/pinking/p/9418280.html

【如何解决梯度爆炸和消失问题】

1、对于RNN,可以通过梯度截断,避免梯度爆炸

2、可以通过添加正则项,避免梯度爆炸

3、使用LSTM等自循环和门控制机制,避免梯度消失,参考:https://www.cnblogs.com/pinking/p/9362966.html

4、优化激活函数,譬如将sigmold改为relu,避免梯度消失

  • 3
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

暖仔会飞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值