概述
记录一下对RNN,LSTM,GRU基本原理(正向过程以及简单的反向过程)的个人理解
RNN
Recurrent Neural Networks,循环神经网络
(注意区别于recursive neural network,递归神经网络)
为了解决DNN存在着无法对时间序列上的变化进行建模的问题(如自然语言处理、语音识别、手写体识别),出现的另一种神经网络结构——循环神经网络RNN。
RNN结构
- 第 t t 层神经元的输入,除了其自身的输入 xt x t ,还包括上一层神经元的隐含层输出 st−1 s t − 1
- 每一层的参数U,W,V都是共享的
- 每一层并不一定都得有输入和输出,如对句子进行情感分析是多到一,文本翻译多到多,图片描述一到多
数学描述
(以下开始符号统一)
回忆一下单隐含层的前馈神经网络
输入为
X∈Rn×x
X
∈
R
n
×
x
(n个维度为x的向量)
隐含层输出为
输出层输入 H∈Rn×h H ∈ R n × h
输出为
现在对 X X 、 H H 、 Y Y 都加上时序下标
同时引入一个新权重 Whh∈Rh×h W h h ∈ R h × h
得到RNN表达式
H0 H 0 通常置零
深层RNN和双向RNN
通过时间反向传播和随之带来的问题
输入为
xt∈Rx
x
t
∈
R
x
不考虑偏置
隐含层变量为
输出层变量为
则损失函数为
以一个三层为例
三个参数更新公式为
明显的
根据链式法则
先计算目标函数有关最终时刻隐含层变量的梯度
假设 ϕ(x)=x ϕ ( x ) = x (RNN中用激活函数relu还是tanh众说纷纭,有点玄学)
通项为
注意上式,当每个时序训练数据样本的时序长度T较大或者时刻t较小,目标函数有关隐含层变量梯度较容易出现衰减和爆炸
梯度裁剪
为了应对梯度爆炸,一个常用的做法是如果梯度特别大,那么就投影到一个比较小的尺度上。
θ
θ
为设定的裁剪“阈值”,为标量,若梯度的范数大于此阈值,将梯度缩小,若梯度的范数小于此阈值,梯度不变
LSTM
RNN的隐含层变量梯度可能会出现衰减或爆炸。虽然梯度裁剪可以应对梯度爆炸,但无法解决梯度衰减。因此,给定一个时间序列,例如文本序列,循环神经网络在实际中其实较难捕捉两个时刻距离较大的文本元素(字或词)之间的依赖关系。
LSTM(long short-term memory)由Hochreiter和Schmidhuber在1997年被提出。
LSTM结构
这里两张图先不用细看,先着重记住公式后再回来看
数学描述
(同上,符号统一)
设隐含状态长度
h
h
,时刻输入
Xt∈Rn×x
X
t
∈
R
n
×
x
(
x
x
维)及时刻隐含状态
Ht−1∈Rn×h
H
t
−
1
∈
R
n
×
h
,
输入门,遗忘门,输出门,候选细胞如下
(思考侯选细胞激活函数的不同)
记忆细胞
想象,如果遗忘门一直近似1且输入门一直近似0,过去的细胞将一直通过时间保存并传递至当前时刻
隐含状态
输出同RNN
GRU
由Cho、van Merrienboer、 Bahdanau和Bengio在2014年提出,比LSTM少一个门控,实验结果却相当
GRU结构
数学描述
设隐含状态长度
h
h
,时刻输入
Xt∈Rn×x
X
t
∈
R
n
×
x
(
x
x
维)及时刻隐含状态
Ht−1∈Rn×h
H
t
−
1
∈
R
n
×
h
,
重置门,更新门如下
候选隐含状态
隐含状态
输出
(无力吐槽csdn了,预览和实际用的不一套渲染,公式丑死)
最后
以上就是温婉羊为你收集整理的RNN,LSTM,GRU基本原理的个人理解RNNLSTMGRU的全部内容,希望文章能够帮你解决RNN,LSTM,GRU基本原理的个人理解RNNLSTMGRU所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复