深度学习之基础模型——长短时记忆网络LSTM

server/2024/11/15 8:42:00/

相关资料

(1)人人都能看懂的GRU - 知乎 (zhihu.com)

引入

在 RNN 那篇博客中提到,根据 RNN 反向传播 BPTT 的特点, RNN 对长时间序列问题难以处理,因为会出现梯度消失和梯度爆炸的问题。详细来说就是当输入序列比较长的时候,RNN 结构也会相应变长,此时根据反向传播中的链式法则,容易使得梯度过大或者过小,也就是 RNN 对越早序列上的数据越容易遗忘。
LSTM 设计的初衷就是使得神经网络对较早输入的数据有更好的记忆力。但是如何能让神经网络对过去的信息也能拥有更好的记忆力成为了难题。如果直接去思考比较难以理解,我们可以类别人类的正常的记忆方式。如果我们早起后重复读一个英语单词 A 五遍,和起床后二十个英语单词各读五遍(其中第一个英语单词也是 A),那么大概率在第一种情况下我们更容易记住 A。这是因为在第二种情况下,有太多别的单词干扰。RNN 的作用也十分类似。如果每个时间点上输入的数据都需要记忆,那么势必越早输入的数据重要性越低。最直接的解决方法可以是使用注意力机制,为不同时间点的输入序列分配不一样的权重,但是对于高维的输入数据,这样无疑会大大加深网络参数量,且不容易训练。但是这种分配注意力(权重)的方法有一点是值得认同的,就是所谓的记忆好与差其实就是比重的高与低。只读一个单词更容易记住,是因为没有别的记忆进行干扰(相对理想的情况下);读二十个单词不容易记住,是因为有大量记忆内容进行干扰,单词 A 所占记忆的比重很低。LSTM 的初衷也是如此,通过一些手段使得重要的信息得以保留,而不重要的信息被抛弃,使得重要的信息所占“记忆”的“比重”变高。

基本原理

LSTM 采用了一种比较巧妙的处理方式,将不同时间点之间连接起来的部分分为“长期记忆线” C C C 和“短期记忆线” h h h。“长期记忆线”类似于 RNN 中的连接方式,用于汇集输入序列上的所有信息;而“短期记忆线”,顾名思义,主要是汇集短期时间内的输入信息,并根据其重要程度,将重要的传给“长期记忆线”,而将不重要的抛弃,这样“长期记忆线”就能够更好地维持其所拥有的信息更加有效。

请添加图片描述

相信大伙在网上也看过 LSTM 内部各种门的各种各样的画法,这里我自己画了一种觉得方便理解。
LSTM 将“短期记忆线” h t − 1 h_{t-1} ht1 和正常的输入数据 x t x_{t} xt “拼接”组成隐藏神经元新的输入 [ h t − 1 , x t ] [h_{t-1},x_{t}] [ht1,xt],并分别输入到三个“门”中,用于控制信息的记忆性。为此,LSTM 分成了三个门:“遗忘门”“输入门”和“输出门”。

请添加图片描述

遗忘门 Forget Gate

遗忘门主要的作用是对重要以及不重要的信息进行选择记忆或者遗忘。对于输入 [ h t − 1 , x t ] [h_{t-1},x_{t}] [ht1,xt],首先经过线性层 W 1 W_{1} W1 进行维度映射(调整成适合的输入),接着通过 sigmoid 函数将输入值映射到 0,1 之间,并与“长期记忆线”输入相乘。注意这里的相乘是张量 (矩阵)对应位置元素相乘。

请添加图片描述

这样做的原理在于,“短期记忆”和“新记忆”拼接起来形成的新张量,如果值比较小说明该记忆不重要,不重要就会被 sigmoid 赋予更接近于 0 的权重,反之则会赋予更接近于 1 的权重。之后再与“长期记忆线”相乘,将不重要的与接近于 0 的权重相乘,将重要的需要保留的与接近于 1 的权重相乘。也就是不重要的“遗忘”,重要的“保留”。

输入门 Input Gate

输入门的作用是将输入的信息有保留的输入到“长期记忆线”上。这个门由两条线组成,一条是经过 W 2 W_{2} W2 再经过 sigmoid 激活函数激活,另外一条是经过 W 3 W_{3} W3 再经过 tanh 激活函数激活,最后将两者相乘。其实通过下有图不难发现,将 sigmoid 那条线删去,右边部分就是 RNN 在隐藏神经元的部分。本质上,RNN 就是利用此将序列不同位置的信息输入经过激活后加入主记忆线。与 RNN 不同的是,在这里利用 sigmoid 函数将重要性划分至 0,1 并与经过 tanh 经过激活的信息相乘,以将不重要的信息值减少,最后才输入到“长期记忆线”上。

请添加图片描述

输出门 Output Gate

输出门的作用是将信息有选择性的输出到“短期记忆线”上。不难发现输出门的整体结构和输入门十分相似,只不过其输入和输出内容发生了变化。输出门也是通过 sigmoid 分配权重,将更有价值的信息输出到“短期记忆线”上。

请添加图片描述


http://www.ppmy.cn/server/23529.html

相关文章

【C++风云录】神经科学研究必备:六种最佳神经网络模型和库简介

赋予神经科学新力量:NEST, Brian2, Theano, Armadillo, OpenNN and Shark的主要功能和应用 前言 在复杂的神经科学领域,一系列强大的工具和库已经被开发出来,用于模拟、分析和理解我们的大脑。本文将深入探讨六种重要的神经网络模型和库&am…

充电器进阶,原边恒流,单片机控制小电流(预充电)的方案

前言 很多充电器,为了能控制电流输出,也就是充电时需要有小电流、大电流的情况,都会用副边及单片机进行控制,但因为是副边控制,需要一个比较器、一个二极管、若干电阻、若干电容,整体BOM成本可能多了三毛钱…

【Qt】error LNK2001: 无法解析的外部符号

参考:Qt/VS LNK2019/LNK2001:无法解析的外部符号_qt lnk2001无法解析的外部符号-CSDN博客 微软官方报错文档-链接器工具错误 LNK2019 __declspec error LNK2001: 无法解析的外部符号 "__declspec(dllimport) 原因 以这种为前缀的基本上跟库相关…

服务器数据恢复—Storwize V3700存储数据恢复案例

服务器存储数据恢复环境: 某品牌Storwize V3700存储,10块硬盘组建了2组Mdisk加入到一个存储池中,一共创建了1个通用卷来存放数据,主要数据为oracle数据库。 服务器存储故障: 其中一组Mdisk中两块磁盘出现故障离线&…

【leetcode面试经典150题】74. 填充每个节点的下一个右侧节点指针 II(C++)

【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主,题解使用C语言。(若有使用其他语言的同学也可了解题解思路,本质上语法内容一致&…

常用的网站和软件

编程社区 Stack Overflow - 全球最大的编程问题解答社区,涵盖各种编程语言和技术。网址:https://stackoverflow.comCSDN - 主要面向中国开发者的技术社区,提供技术文章、论坛帖子和博客。网址:https://www.csdn.net 开发软件 J…

Excel文件解析--超大Excel文件读写

使用POI写入 当我们想在Excel文件中写入100w条数据时,我们用普通的XSSFWorkbook对象写入时会发现,只有在将100w条数据全部加载入内存后才会用write()方法统一写入,这样效率很低,所以我们引入了SXSSFWorkbook进行超大Excel文件的读…

python爬虫6

1 简介 BeautifulSoup 是一个用于解析HTML和XML文档的Python库。它提供了一种灵活和便捷的方式来导航、搜索和修改解析树。BeautifulSoup简化了网络爬虫的工作,使得开发者可以轻松地解析网页内容,提取所需的数据。 2 初体验 使用BeautifulSoup的第一步…