1、什么是RNN
传统的神经网络是层与层之间是全连接的,但是每层之间的神经元是没有连接的(其实是假设各个数据之间是独立的)。这种结构不善于处理序列化的问题。比如要预测句子中的下一个单词是什么,这往往与前面的单词有很大的关联,因为句子里面的单词并不是独立的。
RNN之所以称为循环神经网路,即一个序列当前的输出与前面的输出也有关。具体的表现形式为网络会对前面的信息进行记忆并应用于当前输出的计算中,即隐藏层之间的节点不再无连接而是有连接的,并且隐藏层的输入不仅包括输入层的输出还包括上一时刻隐藏层的输出。
-
RNN的主要应用领域有哪些呢?
① 自然语言处理(NLP): 主要有视频处理, 文本生成, 语言模型, 图像处理
② 机器翻译, 机器写小说
③ 语音识别
④ 图像描述生成
⑤ 文本相似度计算
⑥ 音乐推荐、网易考拉商品推荐、Youtube视频推荐等新的应用领域
2、RNN模型结构
RNN结构,如图 :
- 如上图所示, 我们可以看到RNN层级结构较之于CNN来说比较简单, 它主要有input Layer,Hidden Layer, output Layer组成.
- 在Hidden Layer 有一个箭头表示数据的循环更新, 这个就是实现时间记忆功能的方法
Hidden Layer的层级展开图:
- 如上图,基本的结构如图,可以看到有个循环的结构,将其展开就是右边的结构。
- 此外,不同的循环结构类型有:根据输入输出节点的数量分为One to One、Many to One、One to Many、Many to Many等类型
3、运算说明
(1)如上循环的结构图,
-
输入单元(
inputs units
):
-
输出单元(output units)为:
-
隐藏单元(hidden units)输出集:
(2)时间t
隐层单元的输出为:
-
f
就是激励函数,一般是sigmoid,tanh, relu
等 - 计算s0时,即第一个的隐藏层状态,需要用到s−1,但是其并不存在,在实现中一般置为0向量
(3)时间 t
的输出为:
- 可以认为隐藏层状态是网络的记忆单元,包含了前面所有步的隐藏层状态。而输出层的输出只与当前步的有关。
- 在实践中,为了降低网络的复杂度,往往只包含前面若干步而不是所有步的隐藏层状态
注:
在RNNs
中,每输入一步,每一层都共享参数U,V,W
,(因为是将循环的部分展开,天然应该相等)
RNNs
的关键之处在于隐藏层,隐藏层能够捕捉序列的信息。
4、RNN的反向传播
由于每一步的输出不仅仅依赖当前步的网络,并且还需要前若干步网络的状态,那么这种BP改版的算法叫做Backpropagation Through Time(BPTT) , 也就是将输出端的误差值反向传递,运用梯度下降法进行更新
以下图为例:
(1)接受完序列中所有样本后再统一计算损失,此时模型的总损失可以表示为(假设输入序列长度为n
):
(2)
其中:
令:…(1)(没有经过激励函数和变换函数前)
则:,
(3)矩阵V的更新
对矩阵 V 的更新过程,根据(1)式可得, (和传统的神经网络一致,根据求导的链式法则):
因为:,所以对矩阵V的更新对应的导数:
(4)矩阵U和W的更新
RNN
的 BP
算法的主要难点在于它 State
之间的通信
可以采用循环的方法来计算各个梯度,t
应从n
开始降序循环至 1
计算时间通道上的局部梯度(同样根据链式法则)
利用局部梯度计算U
和W
的梯度,这里累加是因为权值是共享的,所以往前推算一直用的是一样的权值:
(5)训练过程中的问题
- 从 公式(2)和(3) 中可以看出,时间维度上的权重
W
更新需要计算,即经过激励函数的导数。如果时间维度上很长,则这个梯度是累积的,所以造成梯度消失或爆炸 -
RNN
主要的作用就是能够记住之前的信息,但是梯度消失的问题又告诉我们不能记住太久之前的信息,改进的思路有两点:
<1>使用一些方法,比如合适的激励函数,初始化,BN等等
<2>二是改进state
的传递方式,比如就是下面提及的LSTM
。关于为何 LSTMs 能够解决梯度消失,直观上来说就是上方时间通道是简单的线性组合。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:深度学习(DL)– RNN循环神经网络算法详解 - Python技术站