[自然语言处理先修]六、循环神经网络
六、循环神经网络
学习路线参考:
https://blog.51cto.com/u_15298598/3121189
https://github.com/Ailln/nlp-roadmap
https://juejin.cn/post/7113066539053482021
本节学习使用工具&阅读文章:
https://zybuluo.com/hanbingtao/note/541458
https://blog.csdn.net/HiWangWenBing/article/details/121547541
https://easyai.tech/ai-definition/lstm/
https://zhuanlan.zhihu.com/p/518848475
1. RNN-概述
RNN跟传统神经网络最大的区别在于每次都会将前一次的输出结果,带到下一次的隐藏层中,一起训练。也就是说,RNN有记忆前文的能力。RNN对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息。
2. RNN-隐藏层
从上面的图来看,忽视右边W的部分,左边的部分就是普通的全连接神经网络。此时,隐藏层的输入为\(U\),输出为\(\theta(U*X)\)。
引入\(W\)后,隐藏层输出的值会与\(W\)相乘,加入下一次的隐藏层输入。假设本次隐藏层执行的是第\(t-1\)次循环,那么此次的输出会被加入到第\(t\)次循环中去。此时,隐藏层的输出变为:\(S_t=\theta(U_t*X_t+W_t*S_{t-1})\)。
反向传播时,\(U\)和\(W\)的权重都会被更新。
3. RNN-缺陷
-
容易出现梯度消失和梯度爆炸
-
由于梯度消失,导致RNN网络的时间序列不能太长,无法支持长序列,只有短期记忆
-
只利用了上文的信息,而没有利用下文的信息
-
RNN网络不同词对当前输出的影响效果完全取决于时间,离当前时间越远的隐藏层的输出,对当前隐藏层的输出的影响越小。RNN无法根据不同词本身的重要性来对当前的输出产生影响
卷积层的计算原理是池化核在输入矩阵上进行滑动,按照池化规则进行计算。通常池化核的计算方法一般有最大值池化和平均值池化两种。
4. LSTM-长短期记忆
长短期记忆网络是RNN的一种变体,通过门控制将短期记忆与长期记忆结合起来,且一定程度上解决了梯度消失的问题。
如果把RNN中的S和W看作是同一部分,那么结构图如下所示:
中间循环的模块在RNN中的结构非常简单,只有一个线性层,且只有一种状态。
LSTM对中间的循环部分(隐藏层部分)进行改变,使用了四个线性层,表示三个不同的状态。
5. LSTM-结构分析
-
黄色:代表线性层
-
粉色:对位操作。矩阵之间按对应位置进行运算
-
箭头:信息的传递、汇合、复制
- 黄色:细胞状态,LSTM 的关键。细胞状态有点像传送带。它贯穿整个链条,只有一些次要的线性交互作用。信息很容易以不变的方式流过。
- 紫色:隐层状态,受门控制而选择向细胞状态添加或移除信息。
6. LSTM-门结构
-
遗忘门
\(\theta\)(Sigmoid函数)的输出在0和1之间,其输出与\(C_{t-1}\)对位相乘。因此,当某一位信息为0时,\(C_{t-1}\)对应那一位的信息就消失;而值在0到1之间,对应位的信息保留一部分;值为1的时候,对应的信息完整的保留。
- 计算公式:\(f_t=\theta(W_f*[h_{t-1},x_t]+b_f)\),\([h_{t-1},x_t]\)表示两个矩阵进行拼接。
-
更新门
左半部分和遗忘门完全相同。右半部分的激活函数是\(tanh\)函数,该函数的输出在[-1,1]之间,可以看作是新的输入带来哪些信息。左右两部分首先对位相乘,表示对新的信息有选择的保留。随后将新信息加入原本的\(C_{t-1}\),完成了对信息的更新。
- 计算公式:\(i_t=\theta(W_i*[h_{t-1},x_t]+b_i), \widetilde C_t=\tanh(W_C*[h_{t-1},x_t]+b_C)\)
-
输出门
首先经过\(\theta\),表示输出哪些内容,其结果与经过tanh的\(C_t\)对位相乘,作为隐藏层本次的输出。
- 计算公式:\(o_t=\theta(W_o*[h_{t-1},x_t]+b_o), h_t=\tanh(C_t)*o_t\)