本文是笔者为了完成毕业设计而进行学习的一个个人学习日记
图片和链接均源自网络,侵删
RNN网络结构
RNN作为循环神经网络的基础结构,只能对短期的内容进行记忆,但是是不得不学的。相对于普通的FCNN,它更关注时间序列,随着时间的推进,不断有新的输入加入到RNN中,而每次经过计算后的输出值,会作为部分输入参与到下一个节点的计算中。如下图:
在标准的RNN中,每个神经元中都只有一个简单的结构,例如一个Sigmoid层或一个Tanh层,将输入变换为(0, 1)或(-1, 1)上的输出,公式如下:
σ
(
x
)
=
1
1
+
exp
(
−
x
)
t
a
n
h
(
x
)
=
e
x
−
e
−
x
e
x
+
e
−
x
\sigma(x)=\frac{1}{1+\exp(-x)}\\ tanh(x)=\frac{e^x-e^{-x}}{e^x+e^{-x}}
σ(x)=1+exp(−x)1tanh(x)=ex+e−xex−e−x
深度学习之RNN(循环神经网络):https://blog.csdn.net/qq_32241189/article/details/80461635
Pytorch循环神经网络(RNN)快速入门与实战:https://blog.csdn.net/weixin_45727931/article/details/114369073
长短时记忆网络(LSTM)
长短时记忆网络,相较于普通的RNN,它解决了短期依赖的问题。LSTM的关键在于细胞状态,它是贯穿于细胞上方的水平线,只存在一些少量的线性交互,信息在上面流传时保持相对小的变化。
如上图所示,LSTM拥有三种类型的门结构:忘记门、输入门和输出门,来保护和控制细胞状态。
忘记门
忘记门在LSTM神经元中的位置如下图所示。它会读取上一个神经元的输出
h
t
−
1
h_{t-1}
ht−1和当前输入
x
t
x_t
xt,经过一个简单的sigmoid
层,输出一个
f
t
f_t
ft,即:
f
t
=
σ
(
W
f
h
h
t
−
1
+
W
f
x
x
t
+
b
f
)
f_t=\sigma(W_{fh}h_{t-1}+W_{fx}x_t+b_f)
ft=σ(Wfhht−1+Wfxxt+bf)。
而这个输出 f t f_t ft会与上一个神经元输出的细胞状态 C t − 1 C_{t-1} Ct−1相乘,由于 f t f_t ft的值在0到1之间,与原先的细胞状态相乘后,相当于忘记了一定程度 C t − 1 C_{t-1} Ct−1的内容。
例如,在语言处理中,我们假设原先的细胞状态 C t − 1 C_{t-1} Ct−1可能保存着当前主语的信息(如性别等),而当我们看到新的主语时,我们希望丢弃原先的主语信息,防止干扰后续信息的正常流传。
输入门
输入门在LSTM神经元中的位置如下如所示。输入值通过Tanh层产生新的候选值向量 C ~ t \tilde{C}_t C~t,它会经过与Sigmoid层产生的 i t i_t it相乘,Sigmoid层决定了我们需要更新什么值(即 i t × C ~ t i_t\times\tilde{C}_t it×C~t),最后,这个值会加入到细胞状态中。
类比到上面的例子中,当我们丢弃了原先的主语信息后,我们需要把新的主语信息加入到细胞状态中,来代替原先的信息。
输出门
经过上面的变化,我们已经得到了新的细胞状态
C
t
C_t
Ct,即:
C
t
=
f
t
×
C
t
−
1
+
i
t
×
C
~
t
C_t=f_t\times C_{t-1}+i_t\times\tilde{C}_t
Ct=ft×Ct−1+it×C~t
而新的细胞状态将会有一部分要作为输出,这部分通过Sigmoid层来决定。我们将细胞状态
C
t
C_t
Ct经过Tanh层处理后,与Sigmoid门产生的
o
t
o_t
ot相乘,产生了我们需要输出的
h
t
h_t
ht。
同样类比到上面的例子,这个输出的部分可能包含了一些主语之外的其他信息,需要通过细胞状态进行推断。
最后,这里还有两张图,但不适合放在这里,就放两个超链接吧:LSTM详细结构图和LSTM结构动图。
如何从RNN起步,一步一步通俗理解LSTM:https://blog.csdn.net/v_JULY_v/article/details/89894058
Pytorch LSTM实现中文单词预测(附完整训练代码):https://blog.csdn.net/guyuealian/article/details/128582675
时间序列预测——LSTM模型(附代码实现):https://blog.csdn.net/weixin_52910499/article/details/124693212
双向长短时记忆网络(BiLSTM)
BiLSTM指的是双向LSTM,从上面LSTM的介绍中我们也可以看出,单项的循环神经网络结构模型实际上只是不断参考“上文”和“当前”的信息,而没有考虑到“下文”的信息。在实际语言分析中,我们有可能会需要结合上下文内容,因此,我们有了双向长短时记忆网络。其最终的输出的结果为正向的LSTM结果与反向LSTM结果的简单堆叠。
Pytorch实战笔记(1)——BiLSTM 实现情感分析:https://blog.csdn.net/qq_35357274/article/details/128701233
一幅图真正理解LSTM、BiLSTM:https://blog.csdn.net/weixin_42118657/article/details/120022112
门控神经网络(GRU)
GRU是门控神经网络(Gate Recurrent Units),它与LSTM最大的不同在于GRU将忘记门和输入门合并了,组成了一个“更新门”。目前没有详细学,感觉论文看过来应该跟NLP关系不大。这里有个动图可以了解一下。
还有一个介绍了全部上述四种RNN及其变体的博客,图做的挺好的:
【Pytorch学习笔记十二】循环神经网络(RNN)详细介绍(常用网络结构及原理):https://blog.csdn.net/QH2107/article/details/126706353
个人神经网络学习日记:
神经网络学习日记(一)——神经网络基本概念
神经网络学习日记(二)——全连接神经网络及Pytorch代码实现
神经网络学习日记(三)——CNN卷积神经网络
神经网络学习日记(四)——RNN、LSTM、BiLSTM、GRU
神经网络学习日记(五)——数据加载器(DataLoader)的调用
由于是第一次写博客,不知道是否有侵犯其他人文章版权的问题,如果有请务必联系我,谢谢!