深度学习与智能故障诊断学习笔记(三)——RNN与LSTM推导详解_lstm故障诊断_Vanderbiol的博客-程序员秘密

技术标签: lstm  rnn  深度学习  

1.RNN

1.1网络结构

标准神经网络的输入输出在不同例子中可能有不同的长度,在学习中并不共享从不同位置上学到的特征。因为标准神经网络的训练集是稳定的,即所有的特征域表达的内容是同一性质的,一旦交换位置,就需要重新学习。故障诊断和健康管理属于带有时间序列的任务场景,在进行学习时参数量巨大,标准神经网络无法体现出时序上的前因后果,所以引入循环神经网络。如图所示为RNN循环神经网络的单元。

其中x^{<t>}为当前输入,a^{<t-1>}为前一个状态,b为偏置项,tanh为激活函数,用于学习非线性部分。当前输入和前一个状态分别乘以对应权重并相加,在加上偏置项,乘激活函数得到当前状态a^{<t>},此状态在下一个神经元学习时又作为a^{<t-1>}进行运算,由此实现时序关联。输出\widehat{y}^{t}的激活函数根据任务类型来选择,若是多分类可以选择softmax,若二分类则可直接选择sigmod。

(注:输出并非每个神经元都必须有,RNN可以是多输入多输出,也可以是多输入单输出,仅在学习完成后输出)

1.2RNN网络特点

 RNN网络为串联结构,可以体现出“前因后果”,后面结果的生成要参考前面的信息,且所有特征共享一套参数。这使得RNN在面对不同的输入(两个方面),可以学习到不同的相应结果,并极大的减少了训练参数量。

(RNN输入和输出数据在不同场景中可以有不同的长度)

1.3损失函数

单个时间步的损失函数可根据多分类和二分类进行自定义

整个序列的损失函数是将所有单步损失函数相加,如式。

 1.4传播过程

前向传播如图一所示。

反向传播

 (图源自吴恩达老师课件)

求解梯度即复合函数求导,按照链式法则进行求导。

反向传播具体过程需要按照损失函数来具体求解,但上式对所有RNN模型都适用。

 1.5缺点

当序列太长时,容易产生梯度消失,参数更新只能捕捉到局部以来关系,没法再捕捉序列之间长期的关联或依赖关系。

如图为RNN连接,输入x,输出o(简单线性输出),权重w,s为生成状态。

 根据前向传播可得:

假设使用平方误差作为损失函数,对单个时间点进行求梯度,假设再t=3时刻,损失函数为L3 = \frac{1}{2}\left ( {Y}_3 - {O}_3 \right )^{2}。然后根据网络参数Wx,Ws,Wo,b1,b2等求梯度。

Wo:

 Wx(具体求解过程在下边):

 经整理可得:

 具体求解过程:

首先,所求目标为L3对Wx的偏导,通过链式法则进行展开。对比前向传播公式图可知,O3中并不能直接对Wx求偏导,而是包含在S3中,所以要展开成如下形式。

但在S3中又包含S2,S2中包含Wx和S1,S1中又包含Wx,嵌套了很多层,为了方便表示,我们用\theta3来表示S3括号中的内容。进一步简化可得:

 由S3演变为S2,同理可递推求出\frac{\partial S_{2}}{\partial W_{x}}\frac{\partial S_{1}}{\partial W_{x}}

再将所求出结果回代到公式中,可以得出 \frac{\partial S_{3}}{\partial W_{x}}

再回带至 \frac{\partial L_{3}}{\partial W_{x}}

 由该式可以看出,梯度的更新同时依赖于x3,x2,x1包括其梯度值。将该式处理为

此为t=3时刻的梯度公式,推广至任意时刻的梯度公式为:

此式括号中的项为求导的连乘,此处求出的导数是介于0-1之间的,有一定的机率导致梯度消失(但非主要原因)。造成梯度消失和梯度爆炸的主要原因是最后一项:当Ws很小的时候,它的k-1的次方会无限接近于0,而当Ws大于1时,它的k-1次方会很大。

如下为t=20时梯度更新计算的结果:

从式中可以看出,t=3的节点由于连乘过多导致梯度消失,无法将信息传给t=20,因此t=20的更新无法引入t=3时的信息,认为t=20节点跟t=3的节点无关联。 

对于梯度爆炸和梯度消失,可以通过梯度修剪来解决。相对于梯度爆炸,梯度消失更难解决。而LSTM很好的解决了这些问题。

2.LSTM

 2.1设计思路

RNN是想把所有信息都记住,不管是有用的信息还是没用的信息。而LSTM设计了一个记忆细胞,具备选择性记忆功能,可以选择记忆重要信息,过滤掉噪声信息,减轻记忆负担。

2.2整体结构

如图为LSTM与RNN结构对比

 LSTM

 RNN

2.3单元结构

在LSTM每个时间步中,都有一个记忆细胞,这个东西给予了LSTM选择记忆功能,使得LSTM有能力自由选择每个时间步里面记忆的内容。

下图中Ct-1为上一个记忆细胞,ht-1为上一个时间点的状态,经过该单元,输出一个新的记忆细胞和一个新的状态。在单元中有三个\sigma\sigma被称为门单元,它的输出值介于0-1之间。ft为遗忘门,it为更新门,Ot为输出门。

门是一种选择性地让信息通过的方法。它们由sigmoid神经网络层和逐点乘法运算组成。Sigmoid层输出0到1之间的数字,描述每个组件应允许通过多少。值为零表示“不让任何内容通过”,而值为 1 表示“允许所有信息通过”

 

公式所示为前向传播,Ct与Ct-1,ht-1,xt等参数都有关,其中Wxf,Whf,Wxi分别代表相应权重。在单元结构图中可以看出ft与Ct-1进行×运算(对应元素相乘),gt与it进行×运算,两者相加为新生成的ct。

2.4 缓解梯度爆炸和梯度消失

此过程为公式推导(以求Wxf为例)。

 

通过调节Whf,Whi,Whg的值,可以灵活控制Ct对Ct-1的偏导值,当要从n时刻长期记忆某个东西到m时刻时,该路径上的

 从而大大缓解了梯度消失和梯度爆炸。

(B站搜索老弓的学习日记,本篇博客为RNN与LSTM的学习笔记)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Vanderbiol/article/details/124256099

智能推荐

TabLayout选项卡[email protected](r.id.tab)_容华谢后的博客-程序员秘密

1.介绍TabLayout 是Google在2015年I/O大会上推出的一款选项卡控件,功能与TabPageIndicator类似,可以兼容到Android2.1及以上版本。效果图如下:2.使用方法在build.gradle文件中加上这段代码:compile 'com.android.support:design:22.2.0'public class TabL

pycharm未识别python工具库的解决方法_pycharm无法识别python_初入运维大头菜的博客-程序员秘密

pycharm未识别python工具库的解决方法本人遇到了已经安装了python工具库,但pycharm没有识别到的情况。后来发现,原来是我设置的运行环境没有选对。我的工具库安装在conda创建的新的虚拟环境中,而pycharm使用的还是默认的运行环境,所以才出现这个问题。解决办法:依次点击-&gt;file-&gt;Settings…-&gt;Project:工程名-&gt;Project Interpreter,在右侧点击设置图标-&gt;Add…,选择Existing environment,将

Web 存储对象localStorage并sessionStorage允许在浏览器中保存键/值对_组合成键值对放入localstorage_allway2的博客-程序员秘密

Web 存储对象localStorage并sessionStorage允许在浏览器中保存键/值对。它们的有趣之处在于,数据在页面刷新(对于sessionStorage)甚至完全浏览器重新启动(对于localStorage)后仍然存在。我们很快就会看到。我们已经有了 cookie。为什么要附加对象?与 cookie 不同,Web 存储对象不会随每个请求一起发送到服务器。正因为如此,我们可以存储更多。大多数浏览器允许至少 2 兆字节(或更多)的数据,并具有配置它的设置。 与 cookie 不同..

FFmpeg在Ubuntu下的安装及常见视频处理方法_羁士的博客-程序员秘密

一、安装可通过PPA进行安装sudo add-apt-repository ppa:kirillshkrogalev/ffmpeg-nextsudo apt-get updatesudo apt-get install ffmpeg二、相关概念比特率比特率,是一个决定音视频总体质量的参数。他决定每个时间单位处理的bit数,英文为 bit rate,描

随便推点

k8s技术预研11--kubernetes网络原理_运维个西瓜的博客-程序员秘密

关于k8s网络,我们通常有以下问题需要回答:k8s的网络模型是什么Docker背后的网络基础是什么Docker自身的网络模型和局限k8s的网络组件之间是怎么通信的外部如何访问k8s的集群有哪些开源的组件支持k8s的网络模型接下来的内容,就对以上问题的答案进行深入探究。1、k8s网络模型Kubernetes 网络模型设计的一个基础原则是:每个 Pod 都拥有一个独立的 IP 地址,而且假定所有 Po...

ue4 热浪效果特效_ue 热浪折射_[苦行僧]的博客-程序员秘密

在群里有个同学问热浪效果怎么实现。其实我也不知道怎么实现,我就查了一下,大概知道了原理,于是用材质写出来了。先上图看看热浪效果是啥样热浪效果和水波效果原理差不多就是在uv上做文章,正常的uv如果不去操作,就是一张图平整的铺在面上,如果你对uv稍微的变化,就会出现很多不一样的效果。热效果就是在正常uv的基础上给定一个小的随机的偏差就行了,xy方向随机值可以不同。随机值可以...

在多台linux 服务器上同步文件_6587845888的博客-程序员秘密

1.先在每台服务器上安装rsyncyum install rsync启动rsync服务在要将文件或目录同步到其他服务器上的机器上的目录/usr/local/bin下创建xsync文件(root权限)使用命令touch xsyncxsync脚本文件:#!/bin/sh# 获取输入参数个数,如果没有参数,直接退出pcount=$#if((pcount==0));thenecho no args...;exit;fi# 获取文件名称p1=$1fna.

堆漏洞挖掘中的bins分类(fastbin、unsorted bin、small bin、large bin)_arena bins_董哥的黑板报的博客-程序员秘密

一、bin链的介绍bin是一个由struct chunk结构体组成的链表 前面介绍过,不同的chunk根据特点不同分为不同的chunk,为了将这些chunk进行分类的管理,glibc采用了bin链这种方式管理不同的chunk 不同的bin链是由arena管理的 bin链中的chunk均为free chunk二、bin链分类根据bin链成员的大小不同,分为以下几类:fast bi...

spfa求负环_spfa 负环_明心_前进的博客-程序员秘密

我们之前已经介绍了spfa算法,即只将距离变短了的节点带入队列对其他节点的距离进行更新。而这种方式其实还可以用来判断图中是否含有负环。因为我们记录了每次距离变短的节点,我们可以进行一个统计,然后利用两个常用的方法对负环进行判断:统计每个点入队的次数,如果某个节点入队n次,则存在负环统计每个点最短路所包含的边数,如果某点的最短路边数大于等于n,则说明也存在负环对第一种情况,如果没有权重为2的边,那么b点只会入队一次,但是如果,我们增加了权重为2的边,那么a点和b点都会不断入队,直到入队n次,我们

允许 使用接口传递对象,为什么?_weixin_30384031的博客-程序员秘密

第一次使用观察者模式时,碰到了使用 接口传递对象的例子,一开始只是使用,并没有想为什么但总觉得通过接口来传递对象怪怪的,识别对象的应该是属性啊,怎么接口也可以用来识别对象的类型呢?最近偶然有些想法:打个比方,就拿我们这个社会来说,可以按照属性来划分人的种类:黄种人、白种人,男人,女人等等也可以按照 人的技能来划分:程序员,工程师,演员,政客程序员会编程,工程师会××,演员会演戏,政客会玩政治……转...