标准神经网络的输入输出在不同例子中可能有不同的长度,在学习中并不共享从不同位置上学到的特征。因为标准神经网络的训练集是稳定的,即所有的特征域表达的内容是同一性质的,一旦交换位置,就需要重新学习。故障诊断和健康管理属于带有时间序列的任务场景,在进行学习时参数量巨大,标准神经网络无法体现出时序上的前因后果,所以引入循环神经网络。如图所示为RNN循环神经网络的单元。
其中为当前输入,
为前一个状态,b为偏置项,tanh为激活函数,用于学习非线性部分。当前输入和前一个状态分别乘以对应权重并相加,在加上偏置项,乘激活函数得到当前状态
,此状态在下一个神经元学习时又作为
进行运算,由此实现时序关联。输出
的激活函数根据任务类型来选择,若是多分类可以选择softmax,若二分类则可直接选择sigmod。
(注:输出并非每个神经元都必须有,RNN可以是多输入多输出,也可以是多输入单输出,仅在学习完成后输出)
RNN网络为串联结构,可以体现出“前因后果”,后面结果的生成要参考前面的信息,且所有特征共享一套参数。这使得RNN在面对不同的输入(两个方面),可以学习到不同的相应结果,并极大的减少了训练参数量。
(RNN输入和输出数据在不同场景中可以有不同的长度)
单个时间步的损失函数可根据多分类和二分类进行自定义
整个序列的损失函数是将所有单步损失函数相加,如式。
前向传播如图一所示。
反向传播
(图源自吴恩达老师课件)
求解梯度即复合函数求导,按照链式法则进行求导。
反向传播具体过程需要按照损失函数来具体求解,但上式对所有RNN模型都适用。
当序列太长时,容易产生梯度消失,参数更新只能捕捉到局部以来关系,没法再捕捉序列之间长期的关联或依赖关系。
如图为RNN连接,输入x,输出o(简单线性输出),权重w,s为生成状态。
根据前向传播可得:
假设使用平方误差作为损失函数,对单个时间点进行求梯度,假设再t=3时刻,损失函数为L3 = 。然后根据网络参数Wx,Ws,Wo,b1,b2等求梯度。
Wo:
Wx(具体求解过程在下边):
经整理可得:
具体求解过程:
首先,所求目标为L3对Wx的偏导,通过链式法则进行展开。对比前向传播公式图可知,O3中并不能直接对Wx求偏导,而是包含在S3中,所以要展开成如下形式。
但在S3中又包含S2,S2中包含Wx和S1,S1中又包含Wx,嵌套了很多层,为了方便表示,我们用3来表示S3括号中的内容。进一步简化可得:
由S3演变为S2,同理可递推求出和
再将所求出结果回代到公式中,可以得出
再回带至
由该式可以看出,梯度的更新同时依赖于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很好的解决了这些问题。
RNN是想把所有信息都记住,不管是有用的信息还是没用的信息。而LSTM设计了一个记忆细胞,具备选择性记忆功能,可以选择记忆重要信息,过滤掉噪声信息,减轻记忆负担。
如图为LSTM与RNN结构对比
LSTM
RNN
在LSTM每个时间步中,都有一个记忆细胞,这个东西给予了LSTM选择记忆功能,使得LSTM有能力自由选择每个时间步里面记忆的内容。
下图中Ct-1为上一个记忆细胞,ht-1为上一个时间点的状态,经过该单元,输出一个新的记忆细胞和一个新的状态。在单元中有三个,
被称为门单元,它的输出值介于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。
此过程为公式推导(以求Wxf为例)。
通过调节Whf,Whi,Whg的值,可以灵活控制Ct对Ct-1的偏导值,当要从n时刻长期记忆某个东西到m时刻时,该路径上的
从而大大缓解了梯度消失和梯度爆炸。
(B站搜索老弓的学习日记,本篇博客为RNN与LSTM的学习笔记)
闲来无事,整一整python+selenium,写完代码后运行发现找不到webdriver的路径:之前是仿照java一样直接把webdriver放到浏览器的安装目录下迫于无奈,只好查一下问题如何处理,突然看到eclipse都可以直接导入webdriver到当前工作路径下运行,那么pychar应该也是可以的咯说干就干,直接copy了一个geckowebdriver放到了D:\Users\Admini...
HTML5新增标签与属性目录一、HTML5新增属性1.1、contextmenu1.2、contentEditable1.3、hidden1.4、draggable1.5、data-*1.6、placeholder占位属性1.7、required必填属性1.8、pattern正则属性1.9、autofocus自动聚焦属性1.10、autocomplete自动完成属性1.11、novalidate不...
文章目录垃圾回收相关概念System.gc() 的理解手动 GC 理解不可达对象的回收行为内存溢出与内存泄漏内存溢出内存泄漏Stop the World代码感受 Stop the World垃圾回收的并行与并发并发的概念并行的概念垃圾回收的并发与并行HotSpot的算法实现细节根节点枚举安全点与安全区域记忆集与卡表什么是跨代引用?记忆集与卡表再谈引用概述再谈引用:强引用再谈引用:软引用再谈引用:弱引用再谈引用:虚引用再谈引用:终结器引用(了解)1、文章可能会优先更新在Github,个人博客,公众号【Gi
之前在项目上碰到了一个问题:刚开机的时候点击主屏幕的全局搜索框没反应,需要等几十秒之后才会正常反应。刚开始猜测是在等待什么初始化条件,但从应用栏里启动全局搜索却很快,因此可以排除这种情况,于是打算从源码层去看看。在launcher里并未找到这个全局搜索的相关代码,因此怀疑这是一个AppWidget,在android代码中全局搜索“android.appwidget.action.AP...
本文主要参考https://stackoverflow.com/questions/12118720/python-tf-idf-cosine-to-find-document-similaritStackOverflow的回答主要是使用sklearn的TfidfTransformercosine_similarity就是计算L2归一化的向量点乘。如果x,y是行向量,它们的cosine sim...
前言小助手今天说的这个工具,是Linux下网络探测必备,在故障排查,远程连接中,简单方便,配上管道符操作,可以组装成强大的功能。他就是 Nmap 工具包内的 Ncat。介绍Netcat是用于跨TCP和UDP端口读写数据的实用程序。它可以用来做很多很酷的事情,比如文件传输,端口扫描,端口重定向,回溯别人的电脑,制作一个简单的聊天程序,用于网络故障排除等等,这就是为什么它被称为瑞士军刀。此外,现在几乎...
许多企业依赖于用户生成的位置数据或从运行收集此类数据的应用程序的供应商处购买数据。一些 POI 数据提供商雇用或签约人员来手动维护他们的 POI 数据库:使用运行专门构建的应用程序的智能手机在城市中漫步并添加新位置或验证现有位置。位置数据收集器记录用户固定的位置,并根据该信息创建自己的 POI 记录。但是,用户提供的地理数据并不能保证准确性,因为它取决于硬件、应用程序的位置权限和精度设置。这些专门构建的应用程序不会存储、收集或共享除物理位置之外的任何数据(没有将上下文与真实的人和他们的移动设备联系起来)。
做自己想做的事情人生才有意义,只要你想没什么事是做不到的
【报错】测试VIP是否漂移,发现并未漂移,查看日志发现一只报/etc/keepalived/check_mysql.sh exited with status 1,猜想防火墙问题。[[email protected] keepalived]#tailf -n 100 /var/log/messages/etc/keepalived/check_mysql.sh exited with status 1【原因】一般是由seliunx防火墙导致【解决】setenforce 0 #零时关闭
在Spring Boot项目中解决出现404错误的方法发布时间:2020-11-20 15:59:41来源:亿速云阅读:149作者:Leah今天就跟大家聊聊有关在Spring Boot项目中解决出现404错误的方法,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。背景在使用SpringBoot的过程中,你肯定遇到过404错误。比如下面的代码:@...
最近想研究下kettle中user defined java class功能,但是在
本章主要内容如下:序列填充 预训练词嵌入 LSTM 双向 RNN 多层 RNN 正则化 优化1.准备数据首先设置seed,并将其分类训练、测试、验证集。注意:由于 RNN 只能处理序列中的非 padded 元素(即非0数据),对于任何 padded 元素输出都是 0 。所以在准备数据的时候将include_length设置为True,以获得句子的实际长度。import torchfrom torchtext.legacy import dataSEED = 1234