通俗理解什么是 LSTM 神经网络

本文通过大学考试复习的场景,浅显易懂地介绍了LSTM的工作原理,涉及遗忘门、输入门和输出门的选择性遗忘、信息过滤功能。作者强调了LSTM在处理时间序列任务中的应用,并提到了模型训练中的权值调整对于算法表现的重要性。

大家好啊,我是董董灿。

刚开始做程序开发时,在公司提交代码前,都需要让大佬们 review(评审),大佬们看完,总会在评论区打出一串"LGTM"。

当时作为小白的我,天真地以为大佬觉得我提交的代码还不错,在开玩笑的夸我说"老哥太猛"。

后来才知道,这原来是 review 的一种黑话,Look Good To Me(LGTM) 的意思,也就是说"我觉得没问题"。

后来学算法,看到了 LSTM,心想这又是什么意思呢。

1、 什么是 LSTM

LSTM(Long Short Term Memory),长短时记忆,是一种特殊的循环神经网络。昨天的那篇文章介绍 Seq2Seq 的时候说过, LSTM 实际上就是一种 Seq2Seq 结构。

这个网络主要是用来处理具有时间序列的数据任务,比如文本翻译、文本转语音等等。

网上关于 LSTM 的文章其实有很多,但我当时学习的时候却感觉很难受,因为很多文章基本上来就是公式一扔,三个门一讲就完事儿了。

作为小白看完之后,依然学不到东西,并且很难对这个算法有一个感性的认识。

后来查阅了很多资料,不记得在哪篇文章或者哪个视频里看到了一个关于这个算法的详解,印象很深,今天就和大家来分享一下。 

请跟上下面的思路,文章不长,读完后,希望你会对 LSTM 有一个全新的认识。

2、从一个考试的例子出发来理解 LSTM

首先我们假设一个场景,我们是大学生,目前正处于期末考试阶段,并且已经考完了线性代数,接下来还有一门高数要考。

而我们作为学生,很自然的要开始复习(学习)高数的内容了。

在这个场景中,使用 LSTM 来处理这种带有时间序列的任务,即考完了线性代数,接着去学习高数。

我们来看看,LSTM是怎么和人一样,学到了高数的内容的。虽然不打算说太多技术细节,但是 LSTM 里的一些概念还是要结合例子来说。

首先,LSTM的结构大致如下面这样。

图片

我们只看中间的一个方框,他接受了前面方框的两个输出(一个是上一层真正的输出状态,对应上面的黑色箭头;一个是上一层输出的隐藏状态,对应下面的输出箭头),同时接受了一个新的 Xt 作为输入。

好,那我们就从这里开始。

我们现在要参加高数考试了,在学习高数知识。

我们肯定是希望把所有与高数有关的内容都记住,与高数无关的都忘掉,最好就是在参加高数考试时,大脑里全是高数知识,其他的物理化学知识全部忘掉。

我们从中间大方框的最左边来分析。

首先这个时候,我们接受了上一个单元时刻的输出,上一个时刻我们考线性代数,输出的状态是刚考完线性代数的状态。

那我们这个时候最想做的是什么?当然是把之前学的与本次考高数无关的都忘掉(选择性遗忘)。

为什么说是选择性遗忘呢?

我们上一场考的是线性代数,那本场接着考高数,其实线性代数和高数之间还是有很多知识相关的,所以这个时候我们肯定希望把相关的部分留下来,把不相关的忘掉。

那如果上一场我们考的是英语,那么大概率所有知识都是不相关的,我们几乎都可以忘掉。

说到这,怎么把上一个方框单元的输出状态进行选择性遗忘呢?这里就遇到了 LSTM 结构中的第一个门 —— 遗忘门

遗忘门

图片

我们可以看到,第一个遗忘门是由一个激活函数和一个乘法来完成的。

它接受了本次状态的信息(xt),也就是我们正在复习的高数的知识,同时接受了上一个方框单元的隐藏状态(ht-1, 上一场考试后我们的大脑状态),然后通过激活函数后与上一个单元的输出(Ct-1)做乘法。

形象的解释一下这个过程:我们学习了高数的内容(xt),大脑中还保留了一部分上一场线性代数的内容,也就是隐藏状态(ht-1),这两个状态经过激活函数激活,选择性的保留,谁的权重大,那么谁最后保留下来的信息就多。

所以,这一步,我们刻苦复习高数和不刻苦复习高数,对应 xt 的权重是不一样的,肯定刻苦复习高数会使得高数的权重更大,那么保留下来的信息就多。

经过激活函数之后,我们认为保留下来的更多的是和高数有关的信息。

那么这个信息去和上一场考试完成时的输出状态相乘(得到的信息就是和高数有关的信息(这个信息会继续往后传),其余的与高数无关的信息由于激活后几乎为零,也就被遗忘了。

到了这,我们把之前该遗忘的都遗忘了,但是要参加高数考试,光遗忘(清空大脑无用信息)是远远不够的,更重要的是要把我们学到的高数知识(xt)给记住。

那我们需要给大脑输入新学到的高数知识,也就是 LSTM 要学习高数知识,接下来就到了第二个门 - 输入门

输入

从名字也很好理解,输入本层想学的知识,所以叫做输入门。

图片

看上图,本次学习的高数知识(xt)和上次隐层的状态结合后,通过一个激活,然后还通过了一个 tanh,然后两者相乘。

本次的激活与遗忘门的激活不同之处在于,遗忘门的激活输出是作用在上一层的输出上,而输入门的激活是作用在  tanh 的输出上。

通俗的理解,这样会选择我们本次学习的高数的内容(因为不是所有的高数内容都会被考到),两者相乘起到一个信息过滤的作用,乘法的输出为提纯后的高数知识(这些高数知识大概率会被考到)。

然后和上面经过遗忘门筛选过的信息相加,就得到了一个新的考高数时的知识库(在这里,有上一层(考完线性代数后)遗留下来的与高数考试相关的知识,比如加减乘除等通用运算知识,也有本次复习高数之后经过提纯的知识,比如微积分,可以说是必考题)。

那到了这一步,基本上我们就可以去参加考试了,下面就是输出门

输出门

图片

输入门和遗忘门的信息相加之后(Ct),直接输出到下一层。

图片

输出门还有个分支,xt 通过激活之后和tanh的输出相乘,然后作为隐藏状态传给下一层。

那这是在干嘛呢?

还记得我们的目的是干什么?考试。

这里就理解为正在考高数好了,带着之前提纯过的知识以及本次学的知识,做了几道高数题,然后考完了高数(又是一次信息过滤,只记住了考完高数后的考的那几道题),作为隐藏状态传给下一层。

有可能下层又要考数理统计了,数理统计可能又要用到本层的高数知识以及前一层的线性代数的知识了,又一个循环,直到所有的考试结束。

这里我们用一个考试的例子,通俗的描述了下遗忘门、输入门和输出门的作用,以及 LSTM 是如何做到选择性遗忘和信息过滤的,希望能帮助到学习 LSTM 的你。

至于为什么在LSTM中,遗忘门可以遗忘掉我们不想要的信息,输入门可以提纯信息,输出门去考试的时候可以发挥最好的状态去做题呢?

可以认为是训练 LSTM 网络的事了。在训练LSTM的时候,最终网络收敛会得到一系列的权值,用于帮助遗忘门更好的遗忘,输入门更好的输入,输出门更好的输出。

最后,一些技术细节比如为什么要选 sigmoid 激活函数,感兴趣的话可以去搜一下,这里不再赘述了。

希望你看完本文后,能对 LSTM 这一算法有个感性的认识。

文中的部分表述来源于之前看过的文章或者视频中的讲解,找不到出处了,如果有同学知道来源,可以在评论区留言,给作者署一下名。

<think>嗯,用户想了解RNN的基本概念和工作原理,特别是通俗的解释。首先,我需要回忆一下RNN的基础知识。根据引用[2],RNN是专门处理序列数据的,比如文本、语音,这点很重要。传统神经网络是前馈的,而RNN有循环连接,能记住之前的信息。 用户可能对循环结构不太清楚,得用个比喻。引用[3]提到,RNN的记忆就像人听故事时记住之前的情节,这个比喻不错。可以举例子,比如预测句子下一个词,需要知道之前的词,这样用户容易理解。 然后要解释RNN的结构。隐藏层的状态会传递到下一个时间步,形成循环。可能需要画个图,但文字描述的话,可以用展开的示意图,比如每个时间步处理一个输入,并传递状态。引用[3]中的循环结构是关键,要强调这种循环如何保存信息。 还要提到RNN的数学表达,比如$h_t = f(W_{hh}h_{t-1} + W_{xh}x_t + b)$,但要用通俗的语言解释,避免太技术化。比如,当前状态是之前状态和当前输入的组合,经过某种处理。 然后,用户可能需要知道为什么RNN有用,应用场景有哪些。引用[2]提到文本生成、机器翻译、股票预测,这些例子能帮助用户理解实际用途。 不过,用户的问题可能还隐含想知道RNN的局限性,比如长依赖问题,但用户没有直接问,可能在相关问题里提到。比如梯度消失或爆炸,导致难以学习长序列,这时候可以简要提一下LSTM或GRU作为改进,但不要深入,除非用户问到。 要检查是否需要对比其他网络,比如CNN,但用户主要关注RNN,所以可能不需要,除非在相关问题里提到。引用[3]有提到CNN和RNN的结合应用,但这里可能先专注RNN本身。 最后,确保回答结构清晰,分点解释,使用例子和比喻,避免术语堆砌。相关的问题可以包括应用、改进、训练方法等,如引用[1]里的BPTT,双向RNN等,但问题要简明,引导用户深入。</think>### RNN神经网络通俗解释 #### 一、基本概念 RNN(循环神经网络)是专门处理**序列数据**的神经网络,比如文本、语音、股票走势等[^2]。它的核心特点是具有**记忆功能**,就像人类阅读文章时会记住前文内容来理解后续句子。 #### 二、工作原理三步走 1. **记忆传递** 每次处理新输入时,RNN会把当前的输入和之前的"记忆"(隐藏状态)结合起来。例如: - 输入句子"我爱吃__",预测下一个词时,需要记住"吃"这个动作 - 数学表达:$$h_t = f(W_{hh}h_{t-1} + W_{xh}x_t + b)$$ 其中$h_t$是新记忆,$h_{t-1}$是旧记忆,$x_t$是当前输入 2. **循环结构** 通过隐藏状态的循环传递,形成链式结构: ``` 输入序列: x₁ → x₂ → x₃ ↓ ↓ ↓ 隐藏状态: h₀ → h₁ → h₂ → h₃ ↓ ↓ ↓ ↓ 输出: y₁ y₂ y₃ y₄ ``` 3. **时间展开特性** 处理"今天天气很好,我要去__"这句话时: - 第1步:处理"今天"生成记忆A - 第2步:用记忆A处理"天气"生成记忆B - 第3步:用记忆B处理"很好"生成记忆C - 最终用记忆C预测"公园/跑步/购物"等合理词汇[^3] #### 三、典型应用场景 1. 文本生成(小说/诗歌创作) 2. 机器翻译(中英文句子转换) 3. 股票趋势预测 4. 语音识别与合成 ```python # 简易RNN单元实现示例 class SimpleRNN: def __init__(self, input_size, hidden_size): self.Wxh = np.random.randn(hidden_size, input_size) # 输入权重 self.Whh = np.random.randn(hidden_size, hidden_size) # 记忆权重 self.b = np.zeros((hidden_size, 1)) # 偏置 def forward(self, x, h_prev): h_next = np.tanh(np.dot(self.Wxh, x) + np.dot(self.Whh, h_prev) + self.b) return h_next ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

董董灿是个攻城狮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值