Long Short Term Memory(LSTM)

2024-02-23 13:59
文章标签 memory long lstm short term

本文主要是介绍Long Short Term Memory(LSTM),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

       LSTM也就是长短期记忆,是用来解决RNN网络中的梯度消失而提出的。

       首先我们了解一下RNN(循环神经网络),该网络主要用来处理时序问题,也就是网络的前后输入之间是有联系的,网络不仅要学习输入样本本身的特征,还有学习相邻输入样本之间的关系,所以RNN常用来处理自然语言问题,因为要理解一句话,不仅要理解话里的每个字或单词的意思,还要理解这些字或单词的不同排列顺序会产生什么不同的意思。RNN解决时序问题的措施无非就是在下一时刻输入样本的同时将该时刻的输出一同输入,这样就可以同时学习 t - 1 时刻和 t 时刻的样本特征了,由于 t-1 时刻学习得到的特征是对 t 时刻之前的所有时刻的样本的处理(这是递归的),t 时刻的状态就只和 t-1 时刻状态相关,所以说RNN其实就相当于是一个马尔可夫链模型,每一时刻的训练时只考虑前一时刻的状况就能考虑到之前所有时刻的状况,所以这样一来网络就能较为容易地学习到时序输入样本之间的联系。 RNN的网络结构就如图一最左边所示,将其按照训练输入展开就是等号右边的结果。图二所示的是RNN内部的结构,两个输入进行一系列处理后通过tanh激活函数输出,ht 就是 t 时刻的隐层输出。

图一

 

图二

 

        但是RNN有所有神经网络所共有的缺点,那就是梯度弥散,t0 时刻的状态可能到 tn(n比较大) 时就会因为梯度弥散而作用微乎其微,而且前面某些时刻的状态在后面可能会用不到,也就没有必要再将其算进去增加网络的学习难度,所以根据这些种种的原始RNN网络的缺点, 长短期记忆训练LSTM就被提出来解决这一问题。LSTM最初地motivate就是原有RNN的基础上始终维持一条主线,称之为cell,这条主线包含有目前为止所有序列的有用的信息,主线中的信息不会随着梯度弥散而消失,因为在每个时刻训练时都会依据输入的样本对主线进行更新,或删除某些信息,或增加某些信息,而且主线会和上一时刻的输出一起对该时刻的输出起作用。    

图三

       如图三所示是LSTM的网络结构,可以看到与RNN不同的是贯穿序列的有两条线,上面一条便是主线,下面一条便是之前时刻是的隐层输出h,我们可以看到相比原始的RNN,LSTM网络结构中多出了很多操作,从Cell进来开始我们就可以看到有两个操作作用在其上,首先是乘操作,这便是对主线中的没用的信息删除操作,因为我们可以看到乘数是经过sigmoid激活的,所以乘数的数值在(0,1),0表示完全删除,1表示完全接受,0和1之间的值就是相应程度的接受,该操作对应的模块称之为遗忘门,对主线进行一定程度的剔除;接着是加操作,这就是将当前时间 t 的信息添加到主线中去,这一模块被称为输入门,可以注意到这个模块中有tanh激活函数,之前原始RNN的隐层输出就是先进行tanh的,所以tanh激活后的值应该就是当前时刻 t 的信息,在加到主线之前还有一个乘的操作无非就是对当前时刻 t 的信息进行一次过滤或者说是attention;遗忘门和输入门就是分别对主线信息进行删除和添加的操作(根据当前时刻训练样本的信息),后面就是要利用主线信息来结合当前时刻训练样本信息生成该时刻的隐层输出,该模块就是输出门,我们可以看到,该模块中的tanh函数的输入是主流信息,sigmoid函数的输入值是当前时刻的输入样本和前一时刻的隐层输出,所以输出门还是在用当前训练样本的信息去筛选主流信息中的特征进行输出。下面我们就给出LSTM中三门具体的运算公式:

图四 遗忘门

       

       首先是遗忘门,f_{t} 就是对主流信息乘的系数,它的计算公式如图四中右边的公式所示,h_{t-1} 表示前一时刻 t-1 时刻隐层输出,x_{t} 表示当前时刻 t 的序列样本输入, W_{f} 和 b_{f} 就是用于训练的权重和偏置。\sigma 表示sigmoid激活函数。

 

图五 输入门

 

        接着是输入门,该模块先生成当前时刻 t 的信息 \tilde{C_{t}}} 以及用于进一步筛选信息的 i_{t} ,最终新的主流信息的生成公式为:

                                                                                 C_{t} = f_{t} * C_{t-1} + i_{t} * \tilde{C_{t}}

 

图六 输出门

       

       最后是输出门,如图六所示,用本次输入的序列信息 o_t 去筛选主流信息获得隐层输出 h_{t}  ,不是将 o_t 激活前的值作为隐层的输出可能是因为主流信息包含的信息量更加丰富而且此刻主流信息已经包含了当前时刻序列样本的信息。

 

 

这篇关于Long Short Term Memory(LSTM)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/738877

相关文章

自然语言处理系列六十三》神经网络算法》LSTM长短期记忆神经网络算法

注:此文章内容均节选自充电了么创始人,CEO兼CTO陈敬雷老师的新书《自然语言处理原理与实战》(人工智能科学与技术丛书)【陈敬雷编著】【清华大学出版社】 文章目录 自然语言处理系列六十三神经网络算法》LSTM长短期记忆神经网络算法Seq2Seq端到端神经网络算法 总结 自然语言处理系列六十三 神经网络算法》LSTM长短期记忆神经网络算法 长短期记忆网络(LSTM,Long S

Tensorflow lstm实现的小说撰写预测

最近,在研究深度学习方面的知识,结合Tensorflow,完成了基于lstm的小说预测程序demo。 lstm是改进的RNN,具有长期记忆功能,相对于RNN,增加了多个门来控制输入与输出。原理方面的知识网上很多,在此,我只是将我短暂学习的tensorflow写一个预测小说的demo,如果有错误,还望大家指出。 1、将小说进行分词,去除空格,建立词汇表与id的字典,生成初始输入模型的x与y d

long long,_int64使用小结

前言:   在16位环境下,int/unsigned int 占16位,long/unsigned long占32位   在32位环境下,int占32位,unsigned int占16位,long/unsigned long占32位 何时需要使用:   long 和 int 范围是[-2^31,2^31),即-2147483648~2147483647,而unsigned范围是[0,2^32),

CNN-LSTM模型中应用贝叶斯推断进行时间序列预测

这篇论文的标题是《在混合CNN-LSTM模型中应用贝叶斯推断进行时间序列预测》,作者是Thi-Lich Nghiem, Viet-Duc Le, Thi-Lan Le, Pierre Maréchal, Daniel Delahaye, Andrija Vidosavljevic。论文发表在2022年10月于越南富国岛举行的国际多媒体分析与模式识别会议(MAPR)上。 摘要部分提到,卷积

回归预测 | MATLAB实现PSO-LSTM(粒子群优化长短期记忆神经网络)多输入单输出

回归预测 | MATLAB实现PSO-LSTM(粒子群优化长短期记忆神经网络)多输入单输出 目录 回归预测 | MATLAB实现PSO-LSTM(粒子群优化长短期记忆神经网络)多输入单输出预测效果基本介绍模型介绍PSO模型LSTM模型PSO-LSTM模型 程序设计参考资料致谢 预测效果 Matlab实现PSO-LSTM多变量回归预测 1.input和outpu

RNN发展(RNN/LSTM/GRU/GNMT/transformer/RWKV)

RNN到GRU参考: https://blog.csdn.net/weixin_36378508/article/details/115101779 tRANSFORMERS参考: seq2seq到attention到transformer理解 GNMT 2016年9月 谷歌,基于神经网络的翻译系统(GNMT),并宣称GNMT在多个主要语言对的翻译中将翻译误差降低了55%-85%以上, G

《长得太长也是错?——后端 Long 型 ID 精度丢失的“奇妙”修复之旅》

引言 在前后端分离的时代,我们的生活充满了无数的机遇与挑战——包括那些突然冒出来的让人抓狂的 Bug。今天我们要聊的,就是一个让无数开发者哭笑不得的经典问题:后端 Long 类型 ID 过长导致前端精度丢失。说到这个问题,那可真是“万恶之源”啊,谁让 JavaScript 只能安全地处理 Number.MAX_SAFE_INTEGER(也就是 9007199254740991)以内的数值呢?

【硬刚ES】ES入门 (13)Java API 操作(4)DQL(1) 请求体查询/term 查询,查询条件为关键字/分页查询/数据排序/过滤字段/Bool 查询/范围查询/模糊查询/高亮查询/聚合查

本文是对《【硬刚大数据之学习路线篇】从零到大数据专家的学习指南(全面升级版)》的ES部分补充。 1 请求体查询 2 高亮查询 3 聚合查询 package com.atguigu.es.test;import org.apache.http.HttpHost;import org.apache.lucene.search.TotalHits;import org.elasticse

踩坑记录(Long[]ids)

主要针对Long[] ids 的判空问题 问题代码 public void delYnjC(Long[] ids) {if (CollectionUtils.isEmpty(Collections.singleton(ids))) {throw new NullPointerException("参数不能为空");}naturalYnjCMapper.delYnjC(ids);} 修正