循环神经网络(RNN)
文章目录
注意!!!!!!!
博主第一次发布的文章有点生疏,写得不够好,没有考虑到一些图片的大小以及一些小细节,本次文章主要是当成博主自己的心得笔记,如果能帮助到大家那更好,大伙嘴下留情啊!!!!!!!
在文章的最后有参考视频,小伙伴们如果还有疑惑可以看下面的参考视频,或许能对你有帮助!!!
RNN模型的作用
当序列数据需要考虑其本身的顺序性,比如天气、股票价格、语音等事件序列数据,RNN模型适合训练序列数据。
为什么要使用RNN而不是用MLP?
多层感知模型(Multilayer Perception Model)的短板在于:它输入端的神经元数量是预先设定的,每一个神经元都代表一个字或词,当在序列中增加输入信息的话(也就是加入新的字或词),模型就很难处理。
为什么难处理呢? 原因是每增加一个新的字或词,就相应的增加一个神经元,根据MLP结构,也就是全连接,会导致所有权重需要重新训练。
RNN模型则避免了这个问题,它在每期计算中会同时考虑当期输入值和前期状态值,并利用相同的模型架构循环下去。
RNN输入与输出
one to many
many to one
n to n
n to m
RNN模型
简单RNN模型
- 符号定义:
H_{i-1}
: 上期状态期H{i}
: 当期状态值x_i
: 输入值tanh(w_x +w_hH_0 + b)
: 激活函数
- BPTT(Backpropagation Through Time)
同样的,BPTT也会导致梯度消失和梯度爆炸,因为tanh取值范围为(-1,1),因此就需要LSTM模型和GRU模型。
LSTM(Long Short-Term Memory)长短期记忆模型
- LSTM模型
- 可以看出有3个sigmoid函数和2个tanh函数:sigmoid函数的取值范围在(0,1),而tanh函数的取值范围为(-1,1),因此sigmoid函数可以作为闸门,用来控制信息流出的比例;而tanh函数能够控制信息的增减方向,并把值锁在-1到1的区间内。
- 三扇门- 遗忘门(forget gate)- 输入门(input gate)- 输出门(output gate)1. 遗忘门
- 输入门
- 输出门
- 相比简单RNN模型,LSTM增加了记忆状态C这一元素。
- SLTM原理1. 上期状态值 C t − 1 C_{t-1} Ct−1通过遗忘门过滤到本期的部分,加上本期新增的部分决定 C t C_t Ct
- 来到遗忘门:上期过滤的部分通过sigmoid函数的遗忘门来控制。- 遗忘门的值为0时,意味着上期记忆完全遗忘。- 遗忘门的值为1时,上期值记忆完全保留。- 其公式为: f t = s i g m o i d ( w f ∗ [ H t − 1 , x t ] ) f_t = sigmoid(w_f*[H_{t-1},x_t]) ft=sigmoid(wf∗[Ht−1,xt])
- 来到输入门:sigmoid控制信息流出的比例;tanh控制信息流出的方向,上期状态值的sigmoid函数和tanh函数两者相乘得到本期新增的记忆部分,它与前期记忆流入的部分相加,得到当期的记忆状态值。 - sigmoid公式为: i t = s i g m o i d ( w i ∗ [ H t − 1 , x t ] ) i_t = sigmoid(w_i*[H_{t-1},x_t]) it=sigmoid(wi∗[Ht−1,xt])- tanh公式为: u t = t a n h ( w u ∗ [ H t − 1 , x t ] ) u_t = tanh(w_u*[H_{t-1},x_t]) ut=tanh(wu∗[Ht−1,xt])- ==本期记忆状态值 C t C_t Ct==公式为: C t = C t − 1 ∗ f t + u t ∗ i t C_t = C_{t-1}f_t + u_ti_t Ct=Ct−1∗ft+ut∗it- 其中 f t f_t ft表示的是遗忘门的sigmoid函数: f t = s i g m o i d ( w f ∗ [ H t − 1 , x t ] ) f_t = sigmoid(w_f*[H_{t-1},x_t]) ft=sigmoid(wf∗[Ht−1,xt])- ==本期记忆状态值 C t C_t Ct==公式为: C t = C t − 1 ∗ s i g m o i d ( w f ∗ [ H t − 1 , x t ] ) + t a n h ( w u ∗ [ H t − 1 , x t ] ) ∗ s i g m o i d ( w i ∗ [ H t − 1 , x t ] ) C_t = C_{t-1}sigmoid(w_f[H_{t-1},x_t]) + tanh(w_u*[H_{t-1},x_t])sigmoid(w_i[H_{t-1},x_t]) Ct=Ct−1∗sigmoid(wf∗[Ht−1,xt])+tanh(wu∗[Ht−1,xt])∗sigmoid(wi∗[Ht−1,xt])
- 最后来到输出门:输出门的sigmoid函数和当期记忆值 C t C_t Ct的tanH值相乘,得到本期的输出值 H t H_t Ht, C t C_t Ct和 H t H_t Ht会循环流入至T+1期,参与到下期的计算。- sigmoid函数: o t = s i g m o i d ( w o ∗ [ H t − 1 , x t ] ) o_t = sigmoid(w_o[H_{t-1},x_t]) ot=sigmoid(wo∗[Ht−1,xt])- ==本期输出值 H t H_t Ht==公式为: H t = o t ∗ t a n h ( c t ) H_t = o_t*tanh(c_t) Ht=ot∗tanh(ct)- ==本期输出值 H t H_t Ht==为: H t = s i g m o i d ( w o ∗ [ H t − 1 , x t ] ) ∗ t a n h ( c t ) H_t = sigmoid(w_o[H_{t-1},x_t])*tanh(c_t) Ht=sigmoid(wo∗[Ht−1,xt])∗tanh(ct)
- 循环操作多次后,获得 y p r e d i c t y_predict ypredict值- 公式为: Y p r e d i c t = H k ∗ w y Y_{predict} = H_k * w_y Ypredict=Hk∗wy(此图虽然是简单RNN模型,但LSTM的 Y p r e d i c t Y_{predict} Ypredict的由来也是一样的)
- 为什么说LSTM模型能够有效缓解梯度消失和梯度爆炸的问题呢?
- 核心部分
- 该4部分相加之后的和要么>1,要么在0~1之间, Δ W ΔW ΔW由黄框前面和多个4部分相乘后获得。
- 该 Δ W ΔW ΔW一般由0到1区间的数和>1的数多个混合相乘,从图可以看出该系统会变得更加稳定,不容易出现梯度消失和梯度爆炸的问题。
GRU(Gated Recurrent Units)
- GRU模型
GRU模型在计算当期状态值
H
t
H_t
Ht时,同时考虑**历史信息部分**和**新增信息部分**
- 两扇门- 更新门(updata gate)- 重置门(reset gate)1. 更新门更新门确定着上期状态能进入当期的比例 z t z_t zt。1. 重置门重置门决定了上期信息的遗忘比例 r t r_t rt。
- GRU工作原理1. 来到更新门:上期状态能进入当期的比例 z t z_t zt 由 s i g m o i d ( w u ∗ [ H t − 1 , x t ] ) sigmoid(w_u*[H_{t-1},x_t]) sigmoid(wu∗[Ht−1,xt])而来,它与上期状态值 H t − 1 H_{t-1} Ht−1 相乘,就得到了新状态中历史信息的部分。
- 来到重置门:上期信息的遗忘比例 r t r_t rt 由 s i g m o i d ( w u ∗ [ H t − 1 , x t ] ) sigmoid(w_u*[H_{t-1},x_t]) sigmoid(wu∗[Ht−1,xt])而来,它与上期状态值 H t − 1 H_{t-1} Ht−1相乘,并和当期输入信息部分相加,再通过tanH函数转化得到当前信息数据,当前信息数据和和对应比例== 1 − z 1-z 1−z相乘,得到新状态中新增信息的部分。
- 历史信息部分和新增信息部分相加,得到最终当期状态值。
参考视频
【数之道 09】揭开循环神经网络RNN模型的面纱_哔哩哔哩_bilibili
【循环神经网络】5分钟搞懂RNN,3D动画深入浅出_哔哩哔哩_bilibili
版权归原作者 Godwinwin 所有, 如有侵权,请联系我们删除。