RNN(Recurrent Neural Network)循环神经网络

1、介绍

卷积神经网络等的输入和输出都是相互独立的,而RNN拥有记忆能力,其记忆能力依赖于输入和输出

网络结构如下图所示:

展开结构如下:

参数共享:

Wo 、Ws 、Wx 为参数,通过梯度下降不断更新,三个参数在一个神经单元(cell)中是共享的

在 t 时刻:

输入为

该时刻记忆:

输出为 :

即:t时刻的输出不仅与当前时刻的输入有关,还与前一时刻的记忆有关

2、存在的问题——梯度消失和梯度爆炸

对t3时刻的代价函数求偏导:

通过上式可推导出任意时刻对Wx、Ws求偏导的一般公式:

Ws同理。

又因为:

所以:

即在反向传播过程中对Wx和Ws求偏导时会乘以tanh函数的导数,网络层数越深乘上的导数越多。这是因为St随着时间序列向前传播,而St又是Ws、Wx的函数

又因为如下图所示tanh函数的导数不大于1

因此当Ws也是一个大于0但是小于1的数时,越深的层中较远的层的信息就会越趋近于0,即梯度消失

当Ws是一个足够大的数时,越深的层中较远的层的信息就会越趋近于正无穷,即梯度爆炸

(RNN中的梯度消失不是指损失对参数的总梯度消失了,而是RNN中对较远时间步的梯度消失了)

在神经网络中使用较小梯度进行更新的层会停止学习,导致RNN会忘记过早的内容,因此称其为具有短时记忆的神经网络

解决方案:RNN的变体LSTM、GRU

变体一:Long Short-Term Memory (LSTM)长短期记忆网络

相比于原始的RNN的隐层(hidden state), LSTM增加了一个细胞状态Ct(cell state)

下图表示 t 时刻的输入输出:

解释:

神经网络(黄色方框):

表示一层神经网络,也就是w^T x + b的操作。区别在于使用的激活函数不同,σ表示的是softmax函数,他是将数据压缩到[0,1]范围内,如下图所示;tanh表示的是双曲正切激活函数,他把数据归一化到[-1,1]之间

细胞状态Ct(黄色圆圈):

t-1 时刻的细胞状态Ct-1,通过上一时刻的隐层状态ht-1与当前时刻的输入Xt进行适当的修改(具体操作为通过遗忘门与输入门进行计算,见下文)得到当前时刻的细胞状态Ct,如下图所示:

此外,Ct会参与当前时刻的隐层输出ht的计算

隐层状态ht(紫色圆圈):

t -1 时刻的隐层状态ht-1,通过“门”对细胞状态Ct进行修改,并参与计算当前时刻的细胞状态Ct

ht不仅是由上一个状态,和本次的输入所决定,还有一个细胞状态Ct-1,这是其与RNN最大的不同

LSTM的三扇门(均包含sigmoid函数):

输入门:

选择保留部分当前输入的信息,输入前一层的信息,接近1的信息表示更为重要

其次还要将前一层隐藏状态的信息和当前输入的信息传递到 tanh 函数中去,创造一个新的侯选值向量。最后将 sigmoid 的输出值与 tanh 的输出值相乘,sigmoid 的输出值 it 将决定 tanh 的输出值中哪些信息是重要且需要保留下来的

输入门及网络的公式

遗忘门:

选择丢弃哪些细节

越靠近1的信息越可能被保存,越接近0的信息越可能被遗忘。下图中遗忘门的输出ft与上一时刻的细胞状态Ct相乘即可选择遗忘哪些细节。

遗忘门及对应网络的公式

输出门:

通过输入以及记忆块决定输出

”门“的存在使得LSTM能够让有用的信息在记忆中长期保存,理论上能一直保存

LSTM为什么能够解决梯度消失和梯度爆炸:

通过训练让“门”学习保存哪些信息,丢弃哪些信息。

LSTM的变式:带窥孔的LSTM:

弥补网络的一个缺点:当前的细胞状态不能影响到三个门在下一时刻的输出,使整个细胞状态对上一单元模块的序列处理中丢失了部分信息,因此在内部网络结构中加入了窥孔连接,该连接可以让门观察到细胞状态。具体网络结构如下

构建LSTM(用于NILM):

1. Input (length determined by appliance duration)

2. 1D conv (filter size=4, stride=1, number of filters=16, activation function=linear, border mode=same)

3. Bidirectional LSTM (N=128, with peepholes)

4. Bidirectional LSTM (N=256, with peepholes)

5. Fully connected (N=128, activation function=TanH)

Python实现:

        # Creates the RNN module described in the papermodel = Sequential()            #顺序模型,即通过一层层神经网络连接构建深度神经网络# 1D Conv   一维卷积层model.add(Conv1D(16, 4, activation="linear", input_shape=(time_stamp,1), padding="same", strides=1))#Bi-directional LSTMsmodel.add(Bidirectional(LSTM(128, return_sequences=True, stateful=False), merge_mode='concat'))model.add(Bidirectional(LSTM(256, return_sequences=False, stateful=False), merge_mode='concat'))# Fully Connected Layersmodel.add(Dense(128, activation='tanh'))model.add(Dense(1, activation='linear'))model.compile(loss='mse', optimizer="adam")

变体二:Gate Recurrent Unit(GRU)门控循环单元

介绍:

GRU为新一代的循环神经网络,与LSTM类似

但是去掉了细胞状态Ct,使用隐藏状态来进行信息的传递,只包含更新门和重置门

 更新门:

GRU将LSTM中的输入门与遗忘门合二为一,称为更新门,用于控制前一时刻传递来的信息有多少能够被继续保留

重置门:

选择一定的信息丢弃(遗忘)

GRU的优势:

GRU的参数量少,减少过拟合的风险

LSTM的参数量是Navie RNN的4倍,参数量过多就会存在过拟合的风险,GRU只使用两个门控开关,达到了和LSTM接近的结果。其参数量是Navie RNN的三倍

GRU的构建:

1. Input (length determined by appliance duration)
2. 1D conv (filter size=4, stride=1, number of filters=16, activation function=ReLU, border mode=same)
3. Bidirectional GRU (N=64, activation function=ReLU)
4. Bidirectional GRU (N=128, activation function=ReLU)
5. Fully connected (N=128, activation function=ReLU)
6. Output: Output: Number of units:1, activation: linear
Python实现:
        model = Sequential()# 1D Convmodel.add(Conv1D(16, 4, activation="relu", padding="same", strides=1, input_shape=(time_stamp,1)))#Bi-directional GRUsmodel.add(Bidirectional(GRU(64, activation='relu', return_sequences=True), merge_mode='concat'))model.add(Dropout(0.5))model.add(Bidirectional(GRU(128, activation='relu', return_sequences=False), merge_mode='concat'))model.add(Dropout(0.5))# Fully Connected Layersmodel.add(Dense(128, activation='relu'))model.add(Dropout(0.5))model.add(Dense(1, activation='linear'))model.compile(loss='mse', optimizer="adam")

概括:

LSTM和CRU都是通过各种门函数来将重要特征保留下来,这样就保证了在long-term传播的时候也不会丢失。此外GRU相对于LSTM少了一个门函数,因此在参数的数量上也是要少于LSTM的,所以整体上GRU的训练速度要快于LSTM的,但仍要根据具体场景选择。

参考:

一文详解什么是RNN(循环神经网络)_Y1ran_的博客-CSDN博客

RNN原理-CSDN博客

大名鼎鼎的LSTM详解 - 知乎 (zhihu.com)

LSTM详解_风兮木萧的博客-CSDN博客

GRU详解-CSDN博客

RNN及变体LSTM、GRU(在NILM中的应用)相关推荐

  1. 通俗易懂的RNN总结(包含LSTM/GRU/BPTT等)

    1.RNN介绍: RNN的基本想法是如何采用序列信息.在传统神经网络中我们假设所有的输入和输出都是相互独立的,但对于很多任务这样的假设并不合适.如果你想预测一个句子的下一个单词,的则需要知道之前的wo ...

  2. RNN的优秀变种: LSTM GRU

    长短期记忆 大名鼎鼎的Long short term memory (LSTM).LSTM的提出,正是为了解决RNN的痛点,加强了捕捉时间序列中时间步距离较大的依赖关系的能力. 需要注意的是LSTM并 ...

  3. 子集和与一个整数相等算法_背包问题的一个变体:如何解决Java中的分区相等子集和问题...

    子集和与一个整数相等算法 by Fabian Terh 由Fabian Terh Previously, I wrote about solving the Knapsack Problem (KP) ...

  4. 第六讲-循环神经网络(RNN)及变体LSTM

    1.卷积神经网络(CNN)与循环神经网络(RNN)的简单对比: CNN:借助卷积核(kernel)提取特征后,送入后续网络(如全连接网络Dense)进行分类.目标检测等操作.CNN借助卷积核从空间维度 ...

  5. 梯度消失/爆炸与RNN家族的介绍(LSTM GRU B-RNN Multi-RNNs)-基于cs224n的最全总结

    vanishing gradients and fancy RNNs(RNN家族与梯度消失) 文章目录 vanishing gradients and fancy RNNs(RNN家族与梯度消失) 内 ...

  6. 从起源、变体到评价指标,一文解读NLP的注意力机制

    作者 | yuquanle 转载自AI小白入门(ID:StudyForAI) 目录 1.写在前面 2.Seq2Seq 模型 3.NLP中注意力机制起源 4.NLP中的注意力机制 5.Hierarchi ...

  7. 【RNN架构解析】LSTM 模型

    LSTM 模型 前言 1. LSTM 内部结构图 2. Bi-LSTM 介绍 3. LSTM 代码实现 4. LSTM 优缺点 前言 了解LSTM内部结构及计算公式. 掌握Pytorch中LSTM工具 ...

  8. 变体类的使用 package record case【转载】

    **************理论区 start********************* DELPHI中记录的存储方式       在DELPHI中,我们用record关键字来表明一个记录,有时候,我 ...

  9. 【Android Gradle 插件】Extension 扩展类型 ( Module 引入插件类型 | application 插件 | library 插件 | Variants 变体列表 )

    文章目录 一.Module 引入插件类型 1.com.android.application 插件 2.com.android.library 插件 二.Extension 扩展类型 三.applic ...

最新文章

  1. python 自动化对比返回结果
  2. 对于随机森林的通俗理解
  3. #打开cmd指定路径_CMD
  4. 想给男友一个惊喜,没想到是这样的结局......
  5. 启动php-fpm服务器_无服务器冷启动不是问题-这就是为什么(对于大多数应用程序)...
  6. python怎么清理垃圾_【原创】python实现清理本地缓存垃圾
  7. CMake配置OpenCV时,显示错误:find_host_package(PythonInterp 2.7)' found wrong Python version
  8. 八皇后问题程序及注解
  9. 谦虚:让你备受人们的欢迎 — 《别输在不会表达上》
  10. android 解压gzip,在Android中使用GZIPInputStream解压缩数据
  11. 【转】微波射频工程师必读经典参考书
  12. HTML怎么引入字体包中的字体
  13. mdadm chuck_面向所有人的Python-Chuck博士提供的14小时免费Python课程
  14. 【边学边记_12】——VGA原理与FPGA实现
  15. Date的getDay()和getDate()的区别:
  16. jsp2022326税务税收协同办公系统
  17. LoadRunner思考时间
  18. 新手问题:如何理解sql语句中 +textBox1.Text+
  19. 万达商业再递招股书:上半年派息35亿 腾讯与碧桂园是股东
  20. 脉冲式激光测距机原理

热门文章

  1. C#原子操作(Interlocked.Decrement和Interlocked.Increment)
  2. 四平方数和定理(leetcode 279 python)
  3. 2020-11-30 09:51:55 精确到秒的时间戳
  4. Android的六大进程
  5. 2022年房地产开发行业研究报告
  6. Java项目:医院管理系统(java+SSM+layui+maven+mysql)
  7. Eclipse在线安装主题(color theme)以及安装color theme第三方主题(图文)
  8. OpenGL - SSAO
  9. 音视频技术学习总结入门
  10. 复选框全部选中/全部取消