这是一个很好的问题。我与之交谈的人是这样说的: LSTM有内存,而普通RNN没有。这意味着LSTM可以记住某些东西,而RNN则无法记住。 这句话要么是非常错误的,要么基本上是正确的,取决于你的观点。
首先让我解释为什么这是非常错误的。如果你真正尝试过实现RNN和LSTM,你将意识到它们的工作方式是及时展开它们,这使得你无需考虑“内存”或“状态”,它只是一个标准的前馈网络。
在此图中,存在一些变换,U,V,W,对于不同类型的网络,它们可能存在或不存在。特别是对于经典的RNN,缺少哪些?如果你回答V,那么是正确的。
RNN计算输出并将相同的输出传递到下一个时间步,换句话说,𝑠𝑡=𝑜𝑡。经典RNN没有状态的观点显然是错误的,因为它们确实具有状态,是你传递给下一步的内容。
在LSTM出现之前,人们通常认为状态和输出是同一件事,他们倾向于将此对象称为时间t的输出,而不是时间t的状态。请注意,V部分实际上位于网络之外,根本没有重复出现。这意味着可以使用传统的RNN,如果你可以提供正确的参数,则可以建模与LSTM基本上相同的事物(稍后再介绍)。当LSTM出现时,它们从一种状态变为具有两种状态,一种可以称为“单元”,另一种可以称为“输出”。
在这种看待方式上,它显然没有添加任何“内存”,它只是将两个信号传递给了下一步而不是一个。但是它所做的仍然是惊人的:如果你查看第一行(单元),会发现出现𝑐𝑡=𝑐𝑡-1(或𝑐𝑡中任何维数子集)的情况是多么容易。你可以将其视为随着时间的流逝而记住的东西。但是,让我再次强调一下,即使在传统的RNN中,你也可以进行设置,以使“状态”(或其子集)随着时间的推移得以保留,就像LSTM一样。
如果你认为拥有类似“记忆”的特殊功能是很基础的,那么让我向你介绍一下GRU:
就像传统的RNN中一样,这里只有一个状态,但是转换非常复杂。这有“记忆”吗?它的输出就像RNN中的状态一样,没有什么多余的,但是与RNN不同,它很容易保存值,因此它的输出类似于内存。 GRU在许多情况下非常有效,并且通常可以像LSTM一样对类似内存的现象进行建模。
因此,我与之交谈的人是完全错误的。但是,他也是对的。为什么?如果提供正确的权重,则RNN可以对类似记忆的现象进行建模。但机器学习的重点不是可以学习这些权重吗?事实证明这是不切实际的。在经典RNN中,将值保留为状态的模型非常复杂,其中的部分原因是梯度消失了,部分原因是激活函数容易使事情搞砸。但是通常为了建模你的问题,需要类似内存的行为。如果使用LSTM或GRU,则自然会得到这种行为。
换句话说,如果你希望循环网络表现得好像它可以记住事情,则应该使用LSTM和GRU,而不是传统的RNN。但是从理论上讲,后者同样有能力。这些都没有“记忆”(或全部都有),但是前两者在经过某个步骤时能够轻松保存状态,我们可以将其视为记忆,而后者则比较麻烦。
转载自 Dmitriy Genzel 布朗大学计算机科学博士