29.RNN-Recurrent Neural Network

本文介绍了RNN(循环神经网络)在处理序列数据时的记忆性,通过Elman Network阐述了其工作原理,并对比了与前馈神经网络的区别。接着详细讲解了LSTM(长短期记忆网络)的基本结构,包括输入门、遗忘门和输出门,解释了为何LSTM能有效缓解梯度消失问题。最后提到了训练RNN时面临的挑战及解决方案,如LSTM如何改善RNN的梯度问题。

1、从一个例子说起

       假设要做一个智能客服系统或者智能订票系统之类的,需要用到一个叫做 Slot Filling(添槽) 的技术,举个例子,如果做一个人对智能订票系统说 ”I would like to arrive Taipei on November 2nd“。那么你的系统会有一些 Slot,在这里应该是 Destination 和 time of arrival ,然后根据对方的话讲一些词填入到这些 Slot 中。具体如下图:

        那应该要怎么实现以上的 Slot Filling 呢?可以考虑用之前学过的 前馈神经网络(Feedforward Neural NetWork),将输入的单词转换成向量的形式输入神经网络进行学习。将单词转换成向量的方法有很多,如1-of-N encoding、Dimension for "others"  word hashing等。

       单词转换成向量

        那以上的方法真的可行吗? 想一下输入的两个句子是

                ***arrive Taipei on November 2nd.

                ***leave Taipei on November 2nd.

       第一句中的 Taipei 表示的是目的地,而第二句中的表示的是出发地,但是我们的前馈神经网络是无法分辨这种情况的,因为前馈神经网络并不知道在 Taipei 之前是什么单词。也就是说,因为前馈神经网络没有记忆性。

2、Recurrent Neural Network(RNN)

       RNN 具有记忆性,而这是通过设置一些内存单元实现的,如在下图中,a1 和 a2 就表示内存,其中存的值就是 hidden layer 的输出。并且,a1 和 a2 同样会被当成下一阶段hidden layer 输入。

       A、假设所有的 weight 都是 1bias 都是 0a1 和 a2 的初始值是 0 σ(z)=z(即线性函数),

             a、第一次的输入为 [1, 1] ,那 hidden layer 的输出就是 [2, 2],同时 a1 和 a2 也会被更新为 [2, 2],output = [4, 4].

             b、第二次的输入为 [1, 1] ,那 hidden layer 的输出就是 [6, 6],同时 a1 和 a2 也会被更新为 [6, 6],output = [12, 12].

             c、第三次的输入为 [2, 2] ,那 hidden layer 的输出就是 [16, 16],同时 a1 和 a2 也会被更新为 [16, 16],output = [32, 32].

       B、如上,前两次输入是一样的,但是因为有“记忆性”,所以两次的输出不一样。并且我们注意到,现在这个 RNN 对顺序是敏感的,也就是说,如果我们把第三次输入换到第一次,那么整个输出的结果都会改变。

      以上介绍的叫做 Elman NetworkRNN 还有很多其他的变体,比如 Jordan Network,还有 双向的RNN,即 Bidirectional RNN 。

        以上的这些都是一些 RNN 的 simple 版本,接下来的才是主菜,才是我们目前真正实用的 RNN。

3、Long Short-term Memory (LSTM)

       3.1 基本结构

          1.LSTM 的构成如下图:

       d、Input Gate 只有打开时,输入才能进入到内存单元(Memory Cell).

       e、Output Gate 只有打开时,才能输出。

       f、Forget Gate 打开时,内存将被清空。(这里一般控制信号为0才叫做打开)。

       2.由上图可以知道,LSTM 有 4 个输入

          a、输入到 input gate 中的值;

          b、控制 input gate 的值;

          c、控制 output gate 的值;

          d、控制 forget gate 的值。

          一个输出

          a、从 outpu gate 中输出的值。

       为什么叫 Long Short-term Memory?因为之前介绍的 RNN 中,每次有新的值进来,内存中的值就会被替换掉,所以记忆是“short-term“。但是 LSTM 加了好几个控制阀门,内存并不会每次都被替换,所以有更 ”long“ 的记忆。、

       3.2 进一步分析

             先上一张图:

       上图中的 active funtion 都是 sigmoid,经过 sigmoid 后的值都会在 0 ~ 1之间,表示当前这个 gate 被打开的程度。

       相信根据这张图可以很容易的与上一张图的各个部件对应起来,然后我们省去分析的过程(因为很简单),可以很容易的得到,

        也就是说,

        ①当 f(zi)=0 时,input gate 就被关闭了,也就相当于没有了输入。

        ②当 f(zf)=0 时,forget gate 就被打开了,将会清空原本的指。

        ③当 f(zo)=0 时,output gate 就被关闭了,将不会有输出值。

        ④反之,可以自己推一下。

       3.3 应用到例子

       输入 [x1, x2, x3],y为输出,最上一排为memory数据。输入[1,0,0],x2=0,x3=0,故y=0。输入[3,1,0],x2=1,故将x1=3写入memory,x3=0,故y=0。输入[2,0,0],x2=0,memory不变,x3=0,故y=0。输入[4,1,0],x2=1,故将x1=4写入memory,memory变为7,x3=0,故y=0。依次执行

       LSTM 的 4 个输入,其实输入都是一样的,但是我们可以通过调整每个输入的权值来使他们表现得不一样。当然在实际应用中,这些 weight ,bias都是机器自己学习出来的。

       3.4 组合起来

       我们之前讲的虽然看起来很复杂,但是对应到我们之前的的神经网络的架构,我们会发现,上面这个看起来很复杂的东西其实只是一个神经元(Neural),所以要把 LSTM 真正应用起来,就是拿上面讲的这个去替换 Neural Network 中的 Neural ,如果有两个 neural 那么就是这样子:

       其实上面也是一个简化版,真正的 LSTM 长得像下面这样子:

4、训练 RNN

       4.1 定义 Loss

       如上图中,每一个单词对应一个 Slot,将句子按顺序丢进 Network 中,产生一个输出 y,将每个 y 与预期的正确输出做 cross entropy,然后累加起来,就是最终的 Loss。(注意,顺序不能打乱)。

       4.2 学习(learning)

       定义完 Loss funtion 以后,就可以开始训练了,这次我们用的仍然是 Backpropagation ,但是做了一点改动,所以就叫做 Backpropagetion through time(BPTT),因为我们输入的是一个时间序列,所以 BPTT 考虑了时间的影响。

       好的,那这个所谓的 BPTT 是怎么工作的呢?emmmm……….我也不知道,因为老师说这个不讲。反正就只要知道 RNN 是可以用 Gradient Descent 来训练就行了。

       言归正传,我们开始去让 RNN 去学习,但是不幸的是,这个过程可能不会那么顺利。通常我们希望我们的学习 Loss 曲线是下面蓝色的那一条,即随着 Epoch 的增多,Total Loss 逐渐下降。然而事实是,我们现实中遇到的很有可能是绿色的那一条。

       那为什么会产生上图的现象呢? 因为 RNN 某些地方的 error surface 非常的陡峭。所谓的 error surface 就是指 Total Loss 对参数变化的敏感程度。error sufface 过大就会导致在某些点上参数非常小的变化就会引起 Total Loss 的剧烈抖动。

       下图就代表着参数 w1,w2 对 Total Loss 的影响,在大部分地方都是平坦的,但是一旦到了某些地方,影响就变得非常陡峭,这样子就很容易导致Loss 的剧烈抖动。

        ①clipping 用来解决上述问题的方法,非常简单粗暴。就是当 gradient 超过一定的阈值的时候,就令 gradient 等于阈值。结束。

        ②出现这一切的根源是什么? 如下图,同一个weight 在不同的时间点会被反复利用 ,所以会出现爆炸。

       4.3 解决方法

       使用 LSTM: 可以解决 gradient vanishing 的问题(但无法解决gradient explode)。因为 LSTM 的内存和输入是 相加 的,每个输入产生的影响会一直存在,不会突然消失 。

       为什么把RNN换成LSTM?因为LSTM可以解决gradient vanishing的问题,那为什么可以解决gradient vanishing的问题?因为 LSTM 的内存和输入是 相加 的,每个输入产生的影响会一直存在,不会突然消失 。而RNN内存每个时间点都会被覆盖掉,每个输入产生的影响会消失。

       LSTM与RNN不同的地方是如果weight可以影响到内存memory里边的值,如果产生影响,这种影响会一直都存在。而RNN内存里边的值每个时间点都会被覆盖掉,影响会消失。LSTM内存memory里边的值消失只有一种可能就是Forget Gate将内存清空,然而Forget Gate多数情况下是不会将内存清空的。

          LSTM有input gate、 output gate、 forget gate,而GRU只有两个gate,所以GRU所需的参数量比较少,在training可以较小过拟合。GRU实质上是“旧的不去新的不来”,它把input gate、forget gate联动起来,只有把memory里边的值清除掉,新的值才可以input进来。

        还有其他的解决这类问题的方法

1. ARIMA 2. SARIMA 3. VAR 4. Auto-ARIMA 5. Auto-SARIMA 6. LSTM 7. GRU 8. RNN 9. CNN 10. MLP 11. DNN 12. MLP-LSTM 13. MLP-GRU 14. MLP-RNN 15. MLP-CNN 16. LSTM-ARIMA 17. LSTM-MLP 18. LSTM-CNN 19. GRU-ARIMA 20. GRU-MLP 21. GRU-CNN 22. RNN-ARIMA 23. RNN-MLP 24. RNN-CNN 25. CNN-ARIMA 26. CNN-MLP 27. CNN-LSTM 28. CNN-GRU 29. ARIMA-SVM 30. SARIMA-SVM 31. VAR-SVM 32. Auto-ARIMA-SVM 33. Auto-SARIMA-SVM 34. LSTM-SVM 35. GRU-SVM 36. RNN-SVM 37. CNN-SVM 38. MLP-SVM 39. LSTM-ARIMA-SVM 40. LSTM-MLP-SVM 41. LSTM-CNN-SVM 42. GRU-ARIMA-SVM 43. GRU-MLP-SVM 44. GRU-CNN-SVM 45. RNN-ARIMA-SVM 46. RNN-MLP-SVM 47. RNN-CNN-SVM 48. CNN-ARIMA-SVM 49. CNN-MLP-SVM 50. CNN-LSTM-SVM 51. CNN-GRU-SVM 52. ARIMA-RF 53. SARIMA-RF 54. VAR-RF 55. Auto-ARIMA-RF 56. Auto-SARIMA-RF 57. LSTM-RF 58. GRU-RF 59. RNN-RF 60. CNN-RF 61. MLP-RF 62. LSTM-ARIMA-RF 63. LSTM-MLP-RF 64. LSTM-CNN-RF 65. GRU-ARIMA-RF 66. GRU-MLP-RF 67. GRU-CNN-RF 68. RNN-ARIMA-RF 69. RNN-MLP-RF 70. RNN-CNN-RF 71. CNN-ARIMA-RF 72. CNN-MLP-RF 73. CNN-LSTM-RF 74. CNN-GRU-RF 75. ARIMA-XGBoost 76. SARIMA-XGBoost 77. VAR-XGBoost 78. Auto-ARIMA-XGBoost 79. Auto-SARIMA-XGBoost 80. LSTM-XGBoost 81. GRU-XGBoost 82. RNN-XGBoost 83. CNN-XGBoost 84. MLP-XGBoost 85. LSTM-ARIMA-XGBoost 86. LSTM-MLP-XGBoost 87. LSTM-CNN-XGBoost 88. GRU-ARIMA-XGBoost 89. GRU-MLP-XGBoost 90. GRU-CNN-XGBoost 91. RNN-ARIMA-XGBoost 92. RNN-MLP-XGBoost 93. RNN-CNN-XGBoost 94. CNN-ARIMA-XGBoost 95. CNN-MLP-XGBoost 96. CNN-LSTM-XGBoost 97. CNN-GRU-XGBoost 98. ARIMA-ANN 99. SARIMA-ANN 100. VAR-ANN 上面这些缩写模型的全称及相关用途功能详细解释
07-15
以下是对缩写模型的全称及相关用途功能的详细解释: 1. ARIMA (AutoRegressive Integrated Moving Average): 适用于平稳时间序列数据的预测,结合了自回归 (AR) 和移动平均 (MA) 的模型。 2. SARIMA (Seasonal ARIMA): 在ARIMA模型基础上添加了对季节性因素的建模,适用于带有季节性的时间序列数据的预测。 3. VAR (Vector Autoregression): 用于多变量时间序列数据的预测,基于自回归模型,能够捕捉变量之间的相互依赖关系。 4. Auto-ARIMA: 自动选择ARIMA模型的参数,通过对多个模型进行评估和选择来实现自动化。 5. Auto-SARIMA: 自动选择SARIMA模型的参数,通过对多个模型进行评估和选择来实现自动化。 6. LSTM (Long Short-Term Memory): 长短期记忆网络,一种适用于处理长期依赖关系的循环神经网络,用于时间序列数据的建模和预测。 7. GRU (Gated Recurrent Unit): 一种类似于LSTM的循环神经网络,具有更简化的结构,适用于时间序列数据的建模和预测。 8. RNN (Recurrent Neural Network): 适用于处理序列数据的神经网络模型,能够捕捉时间序列的动态特性。 9. CNN (Convolutional Neural Network): 卷积神经网络,主要用于图像处理,但也可以用于时间序列数据的预测,特别擅长局部模式的识别。 10. MLP (Multi-Layer Perceptron): 多层感知机,一种前馈神经网络模型,适用于处理非线性关系的时间序列数据。 11. DNN (Deep Neural Network): 深度神经网络,具有多个隐藏层的神经网络模型,能够学习更复杂的特征表示。 12. MLP-LSTM: 结合了多层感知机和长短期记忆网络的模型,用于时间序列数据的建模和预测。 13. MLP-GRU: 结合了多层感知机和门控循环单元网络的模型,用于时间序列数据的建模和预测。 14. MLP-RNN: 结合了多层感知机和循环神经网络的模型,用于时间序列数据的建模和预测。 15. MLP-CNN: 结合了多层感知机和卷积神经网络的模型,用于时间序列数据的建模和预测。 这些模型可以根据具体问题和数据的特性来选择和使用,以获得最佳的时间序列预测性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值