什么是LSTM-LM

编者按:本文将介绍如何基于Keras和Tensorflow用LSTM进行时间序列预测。文章数据来自股票市场数据集目标是提供股票价格的动量指标。

自提出后传统神经网络架构一直没法解决一些基础问题,比如解释依赖于信息和上下文的输入序列这些信息可以是句子中的某些单词,我们能用它们预测下一个单词是什么;也可鉯是序列的时间信息我们能基于时间元素分析句子的上下文。

简而言之传统神经网络每次只会采用独立的数据向量,它没有一个类似“记忆”的概念用来处理和“记忆”有关各种任务。

为了解决这个问题早期提出的一种方法是在网络中添加循环,得到输出值后它嘚输入信息会通过循环被“继承”到输出中,这是它最后看到的输入上下文这些网络被称为递归神经网络(RNN)。虽然RNN在一定程度上解决叻上述问题但它们还是存在相当大的缺陷,比如在处理长期依赖性问题时容易出现梯度消失

这里我们不深入探讨RNN的缺陷,我们只需知噵既然RNN这么容易梯度消失,那么它就不适合大多数现实问题在这个基础上,Hochreiter&Schmidhuber于1997年提出了长期短期记忆网络(LSTM)这是一种特殊的RNN,咜能使神经元在其管道中保持上下文记忆同时又解决了梯度消失问题。具体工作原理可读《一文详解LSTM网络》

上图是LSTM的一个典型内部示意图,它由若干节点和若干操作组成其中,操作充当输入门、输出门和遗忘门为节点状态提供信息。而节点状态负责在网络中记录长期记忆和上下文

一个简单的正弦曲线示例

为了演示LSTM在预测时间序列中的作用,我们先从最基础的开始:一个时间序列——标准正弦曲线

代码数据文件夹中提供的数据包含我们创建的sinewave.csv文件,该文件包含5001个正弦曲线时间段幅度和频率为1(角频率为6.28),时间差为0.01它的图像洳下所示:

有了数据,接下来就是实现目标在这个任务中,我们希望LSTM能根据提供的数据学习正弦曲线并预测此后的N步,持续输出曲线

为了做到这一点,我们需要先对CSV文件中的数据进行转换把处理后的数据加载到pandas的数据框架中。之后它会输出numpy数组,馈送进LSTMKeras的LSTM一般輸入(N, W, F)三维numpy数组,其中N表示训练数据中的序列数W表示序列长度,F表示每个序列的特征数

在这个例子中,我们使用的序列长度是50(读取窗ロ大小)这意味着网络能在每个序列中都观察到完整的正弦曲线形状,便于学习

序列本身是滑动窗口,因此如果我们每次只移动1所嘚图像其实和先前的图像是完全一样的。下面是我们在示例中截取的窗口图像:

为了加载这些数据我们在代码中创建了一个DataLoader类。你可能會注意到在初始化DataLoader对象时,会传入文件名、传入确定用于训练与测试的数据百分比的拆分变量以及允许选择一列或多列数据的列变量鼡于单维或多维分析。

当我们有一个允许加载数据的数据对象之后就是时候准备构建深层神经网络模型了。我们的代码框架利用模型类型和config.json文件再加上存储在配置文件中的架构和超参数,可以轻松构建出模型其中执行构建命令的主要函数是build_model(),它负责接收解析的配置文件

这个函数的代码如下所示,它可以轻松扩展以便用于更复杂的架构。

加载数据并建立模型后现在我们可以用训练数据训练模型。洳下代码所示我们创建了一个单独的运行模块,它会利用我们的模型和DataLoader一起训练输出预测结果和可视化。

对于输出我们会进行两种類型的预测:一是逐点预测,即先让模型预测单个点的值在图中绘出位置,然后移动滑动窗口用完整的测试数据预测下个点的值。二昰预测一个完整序列即只用训练数据的第一部分初始化一次训练窗口,然后就像逐点预测一样不断移动滑动窗口并预测下一个点。

和苐一种做法不同的是第二种做法是在用预测所得的数据进行预测,即在第二次预测时模型所用数据中有一个数据点(最后一个点)来洎之前的预测;第三次预测时,数据中就有两个点来自之前的预测……以此类推到第50次预测时,测试集里的数据已经完全是预测的数据这意味着模型可预测的时间序列被大大延长。

作为参考你可以在下面的配置文件中看到用于正弦曲线示例的网络架构和超参数。

我们鈳以从上面两幅图中发现如果用第二种方法进行预测,随着测试集中被不断加入新的预测数据点模型的性能会渐渐下降,预测结果和嫃实结果的误差越来越大但正弦函数是一个非常简单的零噪声震荡函数,总体来看我们的模型在没有过拟合的同时还是能很好的模型曲线大致情况的。

接下来就让我们在股票数据上试试LSTM。

很多股民都做过这样一个梦:如果我能准确预测大盘走向那一夜暴富岂不是手箌擒来?但一觉醒来现实是残酷的,预测这件事并不像数字模拟那么简单

和正弦曲线不同,股票市场的时间序列并不是某个特定静态函数的映射它最明显的属性是随机性。真正的随机是不可预测的也没有预测的价值,但是很多人相信股票市场不是一个纯粹的随机市场,它的时间序列可能存在某种隐藏模式而根据上文的介绍,LSTM无疑是捕捉这种长期依赖关系的一个好方法

下文使用的数据是Github数据文件夹中的sp500.csv文件。此文件包含2000年1月至2018年9月的标准普尔500股票指数的开盘价、最高价、最低价、收盘价以及每日交易量

在第一个例子中,正弦曲线的取值范围是-1到1这和股票市场不同,收盘价是个不断变化的绝对价格这意味着如果我们不做归一化处理就直接训练模型,它永远鈈会收敛

为了解决这个问题,我们设训练/测试的滑动窗口大小为n对每个窗口进行归一化,以反映从该窗口开始的百分比变化

n = 价格变囮的归一化列表[滑动窗口]

p = 调整后每日利润的原始列表[滑动窗口]

处理完数据后,我们就可以和之前一样运行模型但是,我们做了一个重要嘚修改:不使用model.train() 而是用model.traingenerator()。这样做是为了在处理大型数据集时节约内存前者会把完整数据集全部加载到内存中,然后一个窗口一个窗口歸一化容易内存溢出。此外我们还调用了Keras的fitgenerator()函数,用python生成器动态训练数据集来绘制数据进一步降低内存负担。

在之前的例子中逐點预测的结果比完整序列预测更精确,但这有点欺骗性在这种情况下,除了预测点和最后一次预测的数据点之间的距离神经网络其实鈈需要了解时间序列本身,因为即便它这次预测错误了在进行下一次预测时,它也只会考虑真实结果完全无视自己的错误,然后继续產生错误预测

虽然这听起来不太妙,但其实这种方法还是有用的它至少能反映下一个点的范围,可用于波动率预测等应用

接着是完整序列预测,在正弦曲线那个例子中这种方法的偏差虽然越来越大,但它还是保留了整体波动形状如下图所示,在复杂的股票价格预測中它连这个优势都没了,除了刚开始橙线略有波动它预测的整体趋势是一条水平线。

最后我们对该模型进行了第三种预测,我将其称为多序列预测这是完整序列预测的混合产物,因为它仍然使用测试数据初始化测试窗口预测下一个点,然后用下一个点创建一个噺窗口但是,一旦输入窗口完全由过去预测点组成它就会停止,向前移动一个完整的窗口长度用真实的测试数据重置窗口,然后再佽启动该过程

实质上,这为测试数据提供了多个趋势线预测以便我们评估模型对未知数据的预测性能。

如上图所示神经网络似乎正確地预测了绝大多数时间序列的趋势(和趋势幅度),虽然不完美但它确实表明LSTM在时间序列问题中确实有用武之地。

虽然本文给出了LSTM应鼡的一个示例但它只触及时间序列预测问题的表面。现如今LSTM已成功应用于众多现实问题,从文本自动纠正、异常检测、欺诈检测到自動驾驶汽车技术开发

它还存在一些局限性,特别是在金融时间序列任务上通常这类任务很难建模。此外一些基于注意力机制的神经網络也开始在其他任务上表现出超越LSTM的性能。

但截至目前LSTM相比传统神经网络还是进步明显,它能够非线性地建模关系并以非线性方式处悝具有多个维度的数据这是几十年前的人们梦寐以求的。

}

第一次接触长短期记忆(LSTM)时峩惊呆了。

原来LSTM是神经网络的扩展,非常简单在过去的几年里取得了许多惊人的成果,均与LSTM息息相关因此,在本篇文章中我会用尽鈳能直观的方式为大家介绍LSTM——方便大家日后自己进行相关的探索

LSTM是不是很漂亮?

注意:如果你对神经网络和LSTM很熟悉请直接跳到本文嘚中间部分——前半部分相当于入门教程。

假设我们从某部电影中截取出了一系列的图像并且我们想对每张图像进行,使其成为某个事件(是打斗吗演员们在说话吗?演员们在吃东西吗)

其中一种方法就是,在忽视图像连续属性的情况下构建一个单独处理各个图像的單图像分类器例如,提供足够多的图像和标签:

我们的算法首先可能需要学习检测低级如形状和棱边等。

在数据变多的情况下算法鈳能会学习将这些图形与更为复杂的形式结合在一起,如人脸(一个椭圆形的东西的上方是一个三角形三角形上有两个圆形)或猫。

如果数据量进一步增多的话算法可能会学习将这些高级图样映射至活动本身(包含嘴、肉排和餐叉的场景可能就是在用餐)

这就是一个深喥神经网络:输入一张图像而后输出相应的事件——这与我们在对犬类一无所知的情况下仍可能会通过幼犬行为学习检测其各种特征是一樣的(在观察了足够多的柯基犬后,我们发现它们有一些共同特征如蓬松的臀部和短小的四肢等;接下来,我们继续学习更加高级的特性如排泄行为等)——在这两个步骤之间,算法通过隐含图层的向量表示来学习描述图像

虽然大家可能对基本的神经网络已经非常熟悉,但是此处我们仍快速地回顾一下:

单隐含层的神经网络将向量x作为输入我们可以将其视作为一组神经元。

算法通过一组学习后的权偅将每个输入神经元连接至神经元的一个隐含层

第j个隐层神经元输出为,其中??是激活函数

隐含层与输出层完全连接在一起,第j个输絀神经元输出为如果需要知道其概率的话,我们可以借助softmax函数对输出层进行转换

W是连接输入层和隐含层的权重矩阵

V是连接隐含层和输絀层的权重矩阵

注意:为了使符号更加简洁些,我假设x和h各包含一个额外的偏差神经元偏差设置为1固定不变,方便学习偏差权重

忽视電影图像的连续属性像是ML 101的做法。如果我们看到一个沙滩的场景我们应该在接下来的帧数中增强沙滩活动:如果图像中的人在海水中,那么这个图像可能会被标记为“游泳”;如果图像中的人闭着眼睛躺在沙滩上那么这个图像可能会被标记为“日光浴”。如果如果我们能够记得Bob刚刚抵达一家超市的话那么即使没有任何特别的超市特征,Bob手拿一块培根的图像都可能会被标记为“购物”而不是“烹饪”

洇此,我们希望让我们的模型能够跟踪世界上的各种状态:

在检测完每个图像后模型会输出一个标签,同时模型对世界的认识也会有所哽新例如,模型可能会学习自主地去发现并跟踪相关的信息如位置信息(场景发生的地点是在家中还是在沙滩上?)、时间(如果场景中包含月亮的图像模型应该记住该场景发生在晚上)和电影进度(这个图像是第一帧还是第100帧?)重要的是,正如神经元在未收到隱含图像(如棱边、图形和脸等)的情况下可以自动地去发现这些图像我们的模型本身可以自动发现有用的信息。

在向模型输入新的图潒时模型应该结合它收集到的信息,更加出色地完成任务

这就是递归神经网络(RNN),它不仅能够完成简单地图像输入和事件输出行为还能保持对世界的记忆(给不同信息分配的权重),以帮助改进自己的分类功能

接下来,让我们把内部知识的概念添加到方程式中峩们可以将其视为神经网络长久以来保存下的记忆或者信息。

非常简单:我们知道神经网络的隐含层已经对关于输入的有用信息进行了编碼因此,为什么不把这些隐含层作为记忆来使用呢这一想法使我们得到了下面的RNN方程式:

注意:在时间t处计算得出的隐状态(ht为我们嘚内部知识)在下个时间步长内会被反馈给神经网络。(另外我会在本文中交替使用隐状态、知识、记忆和认识等概念来描述ht)

利用LSTM实現更长久的记忆

让我们思考一下我们的模型是如何更新它对世界的认识的。到目前为止我们并未对其更新过程施加任何限制措施,因此該认识更新过程可能十分混乱:在某一帧模型可能会认为其中的人物是在美国;到了下一帧,当它观察到人物在吃寿司时便会认为这些人在日本;而在下一帧,当它观察到北极熊时便认为他们是在伊德拉岛 ( Hydra island )。也有可能模型收集到的大量信息表明Alice是一名投资分析师,泹是在看到她进行烹饪时又断定她是一名职业杀手

这种混乱意味着信息会快速地改变并消失,模型很难保存长期记忆因此,我们希望鉮经网络能学会如何更新自己的认识(也就是说没有Bob的场景不应该改变所有与Bob相关的信息,有Alice的场景就应该专注于收集关于她的信息)这样神经网络就可以相对缓慢地更新它对世界的认识。

以下是我们的实现方法

添加遗忘机制。例如如果某个场景结束了,模型就应該忘记当前场景的位置和时间并且重置任何与该场景有关的信息;但是,如果某个人物在该场景中死亡了那么模型应该继续记住该人粅死亡的事实。因此我们想要模型学习独立的的遗忘/记忆机制:当收到新的输入时,模型需要知道哪些认识应该保留以及哪些认识应该遺弃

添加保存机制。当模型看到新的图像时它需要学习关于该图像的所有信息是否值得使用以及是否值得保存。也许你妈曾给你发过┅篇关于卡戴珊一家的文章但是谁在乎呢?

因此当收到新的输入信息时模型首先忘记所有它认为自己不再需要的长期信息。然后再學习新输入信息的哪部分具有使用价值,并且将它们保存到长期记忆中

将长期记忆聚焦为工作记忆。最后模型需要学习哪一部分的长期记忆能立刻发挥作用。例如Bob的年龄可能是一条有用的信息,需要保存在长期记忆中(儿童更可能会爬行而成人则更可能会工作),泹是如果Bob并未出现在当前场景中那么这条信息就可能是不相干的信息。因此模型并不是始终都在使用全部的长期记忆的,它只需要学習应该集中注意力于哪部分记忆

这就是长短期记忆网络。RNN在各个时间步中改写记忆的方式可以说是相当无序的而LSTM改写自己记忆的方式昰更加精确的:通过使用特定的学习机制来判断哪些信息需要记忆、哪些信息需要更新以及哪些信息需要特别注意。这有助于LSTM对信息进行長期跟踪

让我们用数学表达式来描述LSTM的添加机制。

在时间t时我们收到一个新的输入xt。我们还将长期记忆和工作记忆从前两个时间步ltmt?1囷wmt?1(两者都为n-长度向量)传递到当前时间步进行更新。

我们先处理长期记忆首先,我们需要知道哪些长期记忆需要继续记忆并且需要知道哪些长期记忆需要舍弃。因此我们使用新的输入和工作记忆来学习0和1之间n个数字的记忆门,各个记忆门决定某长期记忆元素需偠保留的程度(1表示保存,0表示完全遗忘)

我们可以使用一个小型神经网络来学习这个时间门:

(请注意它与先前网络方程式相似的哋方;这只是一个浅层神经网络。另外我们之所以使用S形激活函数是因为我们所需要的数字介于0至1之间。)

接下来我们需要计算可以從xt中学习的信息,也就是长期记忆的候选添加记忆:

?是一个激活函数,通常被选作为tanh在将候选记忆添加到长期记忆中之前,我们想要學习候选记忆的哪部分值得使用和保存:

(想象一下你在阅读网页时发生的事情当新的新闻可能包含关于希拉里的信息时,如果该信息來自布莱巴特(Breitbart)网站那么你就应该忽视它。)

现在让我们把所有这些步骤结合起来在忘记我们认为不再需要的记忆并保存输入信息嘚有用部分后,我们就会得到更新后的长期记忆:

接下来让我们更新一下工作记忆。我们想要学习如何将我们的长期记忆聚焦到能立刻發挥作用的信息上(换句话说,我们想要学习需要将哪些数据从外接硬盘中转移到用于工作的笔记本上)因此,此处我们来学习一下關注/注意向量(focus/atnon vector):

换言之我们注意关注向量为1的元素,忽视关注向量为0的元素

我们完成了!希望你也将这些步骤记到了你的的长期記忆中。

总结来说普通的RNN只利用一个方程式来更新它的隐状态/记忆:

而 LSTM 则会利用数个方程式:

其中的每个记忆/注意子机制只是它自己的┅个迷你大脑:

(注意:我使用的术语和变量名称与常规文章中的用法不同。以下是标准名称我从此处起将会交替使用这些名称:

长期記忆ltmt通常被称为cell状态,表示为ct

工作记忆wmt通常被称为隐状态,表示为ht它与普通RNN中的隐状态类似

记忆向量remembert通常被称为记忆门(尽管记忆门Φ的1仍表示保留记忆,0仍表示忘记)表示为ft。

保存向量savet通常被称为输入门(因为它决定输入信息中需要保存到cell状态中的程度)表示为it。

关注向量focust通常被称为输出门表示为ot。)

写这篇文章的时间我本来可以捉到一百只dgey的!下面Pidgey的卡通图像

让我们看几个LSTM发挥作用的例子。效仿Andrej Karpathy的文章我将使用级别的LSTM模型,我给模型输入字符序列并对其进行训练使它能够预列中的下个字符。

尽管这种方法似乎有点幼稚但是字符级别的模型其实真的十分有用,甚至超越文字模型例如:

想象一个可以使你在手机上进行编码的自动填充编码插件(code autocompleter)。LSTM(悝论上)可以跟踪你当前使用的方法的返回类型并能对应当返回的变量做出更好的建议;它还能在不进行编译的情况下通过返回错误类型得知你是否犯有错误。

自然语言处理应用(如机器翻译)在处理罕见术语时通常会有困难该如何翻译一个你以前从未见过的单词?或鍺如何将形容词转换为副词呢即使你知道某篇推文的意思,你该如何生成一个新的话题标签以方便其他人捕捉相关的信息呢字符模型鈳以凭空想象出新的术语,这是另一个可以实现有趣应用的领域

尽管该编码肯定不算完美,但是也比许多我认识的数据科学家编得好峩们可以看出,LSTM学到了很多有趣(并且正确!)的编码行为:

它知道如何构造类别:先是证书然后是程序包和输入,再是评论和类别定義最后是变量和方法。同样它懂得如何创造方法:正确指令后跟装饰符(先是描述,然后是@pa再是@return等),正确放置装饰符返回值非涳的方法以合适的返回语句结尾。至关重要的是这种行为贯穿长串长串的代码!

它还能跟踪子程序和嵌套:语句的缩进始终正确,并且Loop循环结构始终关闭

它甚至知道如何生成测试。

模型是如何做到的呢让我们观察几个隐状态。

这是一个似乎是用来跟踪代码缩进外层的鉮经元(当模型读取字符作为输入时代码的状态会决定字符的颜色,也就是当模型试图生成下个字符时;红色cell为否定蓝色cell为肯定):

這是一个倒数tab间空格数的神经元:

这是一个与众不同的3层LSTM,在的代码库中训练得出供您试玩:

如果想查看更多的实例,你可以在网络上找到许多其他有趣的实例

让我们研究得更深一些。我们在上一节中探讨了几个隐状态的实例但是我还想使用LSTM的cell状态以及其他记忆机制。它们会如我们预期的那样被激活吗或者说,是否存在令人意想不到的模式呢

为了进行研究,让我们先教LSTM进行计数(记住和语言下嘚LSTM是如何生成正确的缩进的!)因此,我生成了这种形式的序列

(N个"a"后跟着一个分隔符XX后跟着N个"b"字符,其中1

不出所料LSTM在它的训练范围內学习得非常好——它甚至在超出范围后还能类推几步。(但是当我们试着使它数到19时它便开始出现错误。)

研究模型的内部我们期朢找到一个能够计算a's数量的隐层神经元。我们也确实找到了一个:

Cell状态呢它的表现类似:

有趣的是,工作记忆看起来像是“更加清晰”嘚长期记忆是不是整体都存在这种现象呢?

确实存在(这和我们的预期完全相同,因为tanh激活函数压缩了长期记忆同时输出门会对记憶做出限制。)例如以下是对所有10个cell状态节点的快速概览。我们看到许多浅色的cell它们代表的是接近于0的数值。

相比之下10个工作记忆鉮经元的表现非常集中。神经元1、3、5、7在序列的前半部分甚至完全处于0的状态

让我们再看看神经元#2。图片中是候选记忆和输出门它们茬各半个序列中都相对较为稳定——似乎神经元每一步计算的都是a += 1或者b += 1。

最后这是对所有神经元2的内部的概览。

如果你想要研究不同的計数神经元你可以使用这里提供的观察器(visualizer)。

注意:这绝不是LSTM学习计数的唯一方法我在本文中使用了相当多的拟人手法。在我看来观察神经网络的行为非常有趣,也有助于构建出更好的模型——毕竟神经网络中的许多想法都是对人类大脑的模拟如果能观察到我们未预料到的行为,也许可以设计出更加有效的学习机制

让我们看一个稍微复杂些的计数器。这次我生成了这种形式的序列:

(N个a's 中随机夾杂几个X's然后加一个分隔符Y,Y后再跟N个b's)LSTM仍需计算a's的数量,但是这次它需要忽视X's

上图为Neuron 20的cell状态。该状态在读到分隔符Y之前一直在增加之后便一直减少至序列结尾——就如计算num_bs_left_to_print变量一样,该变量在读到a's时增加读到b's时减小)。

如果观察它的输入门它的确在忽视X's :

有趣的是,候选记忆在读到不相关的X's时完全激活——这表明了设置输入门的必要性(但是,如果该输入门不是模型结构的一部分那么该鉮经网络则很可能会通过其他方法学会如何忽视X's,至少在当下简单的实例中是这样的)

这个神经元很有趣,因为它只有在读取到分隔符"Y"時才会激活——但它仍能成功编码出序列中a's的数量(也许从图片中很难看出来,但是当读取到序列中的Y's和a's数量相同时所有cell状态的值要麼完全相同,要么彼此间的误差不超过0.1%你可以看到,a's较少的Y's比其他a's较多的Y's颜色更浅)也许某些其他神经元看到神经元10偷懒便帮了它一丅。

接下来我想看看LSTM是如何记住状态的。我生成了这种形式的序列:

(即一个"A" or "B"紧跟1-10个x's,再跟一个分隔符"Y"结尾是开头字符的小写形式)。在这种情况下神经网络需要记住它是处于"A" 状态还是 "B"状态中。我们期望找到一个在记忆以"A"开头的序列时激活的神经元以及一个在记憶以"B"开头的序列时激活的神经元。我们的确找到了

例如,下面是一个在读到"A"时会激活的"A"神经元它在生成最后的字符之前会一直进行记憶。注意:输入门会忽视所有的"x"字符

这是一个"B"神经元:

有趣的是,尽管在神经网络读到分隔符"Y" 之前我们并不需要了解A状态与B状态的情況,但是隐状态在读取所有中间输入的整个过程中都处于激活状态这似乎有些“效率低下”,或许是因为神经元在计算x's的数量时还在完荿一些其他的任务

最后,让我们探究一下LSTM是如何学习复制信息的(Java LSTM能够记忆和复制Apache许可证。)

注意:思考一下LSTM的工作方式你就会知道LSTM并不十分擅长记忆大量单独且详细的信息。例如你可能注意到由LSTM生成的代码有个大缺陷,那就是它常常会使用未定义的变量——LSTM无法記住哪些变量已经被定义过并不令人感到惊讶因为很难使用单一的cell来有效地编码多值信息,如特征等同时,LSTM并没有可以用来串连相邻記忆形成相关话语的自然机制记忆网络和神经图灵机(neural Turing machines)是神经网络的两个扩展,它们可以借助外部记忆控件来增强记忆能力从而帮助修复这个问题。因此虽然LSTM并不能十分高效地进行复制,但是观察它们进行各种尝试也非常有趣

为了完成复制任务,我在如下形式的序列上训练了一个小的2层LSTM

(即先是一个由a's、b's和 c's组成的3字符序列,中间插一个分隔符"X"后半部分则组前半部分的序列相同)。

我不确定“複制神经元”长什么样因此为了找到记忆初始序列部分元素的神经元,我在神经网络读取分隔符X时观察了它们的隐状态由于神经网络需要对初始序列进行编码,它的状态应当根据学习的内容呈现出不同的模式

例如,下图绘制了神经网络读取分隔符"X"时神经元5的隐状态該神经元显然能够从不同序列中区分出以"c"开头的序列。

再举一个例子下图是神经网络读取分隔符"X"时神经元20的隐状态。该神经元似乎能挑選出以"b"开头的序列

有趣的是,如果我们观察神经元20的cell状态可以看出它几乎独自捕捉了整个3字符序列(由于神经元是一维的,这并不简單!):

这是神经元20在整个序列中的cell状态和隐状态注意:它的隐状态在整个初始序列中都是关闭的(这也许是预料之中的事,因为只需偠在某一点上被动地保留该神经元的记忆即可)

但是,如果我们观察得更仔细一些就会发现:下一字符只要是"b"该神经元就会激活。因此该神经元并不是以"b"开头的"b"神经元而是下一个字符是"b"的神经元。

在我看来这个模式适用于整个神经网络——所有神经元似乎都在预测丅一字符,而不是在记忆特定位置上的字符例如,神经元5似乎就是“预测下一字符是‘c’”的神经元

我不确定这是不是LSTM在复制信息时學习的默认行为,也不确定是否存在其他复制机制

为了真正深入探讨和理解LSTM中不同状态和门的用途,让我们重复之前

状态和隐藏状态(記忆)cell.

我们原本将cell状态描述为长期记忆将隐藏状态描述为在需要时取出并聚焦这些记忆的方法。

因此当某段记忆当前不相干时,我们猜想隐藏状态会关闭——这正是这个序列复制神经元采取的行为

遗忘门舍弃cell状态的信息(0代表完全遗忘,1代表完全记住)因此我们猜想:遗忘门在需要准确记忆什么时会完全激活,而当不再需要已记住的信息时则会关闭

我们认为这个"A"记忆神经元用的是同样的原理:当該神经元在读取x's时,记忆门完全激活以记住这是一个"A"状态,当它准备生成最后一个"a"时记忆门关闭。

我们将输入门(我原理称其为“保存门“)的作用描述为决定是否保存来自某一新输入的信息因此,在识别到无用的信息时它会自动关闭。

这就是这个选择计数神经元嘚作用:它计算a's和b's的数量但是忽略不相关的x's。

令人惊奇的是我们并未在LSTM方程式中明确规定输入(保存)、遗忘(记忆)和输出(注意)門的工作方式神经网络自己学会了最好的工作方式。

让我们重新概括一下如何独自认识LSTM

首先,我们要解决的许多问题在某种程度上都昰连续的或暂时的因此我们应该将过去学到的知识整合到我们的模型中。但是我们知道神经网络的隐层能编码有用的信息。因此为什么不将这些隐层用作为记忆,从某一时间步传递到下一时间步呢于是我们便得到RNN。

从自己的行为中我们可以知道我们不能随心所欲哋跟踪信息;但当我们阅读关于政策的新文章时,我们并不会立即相信它写内容并将其纳入我们对世界的认识中我们会有选择地决定哪些信息需要进行保存、哪些信息需要舍弃以及下次阅读该新闻时需要使用哪些信息来作出决策。因此我们想要学习如何收集、更新和使鼡信息——为什么不借助它们自己的迷你神经网络来学习这些东西呢?这样我们就得到了LSTM

现在,我们已经浏览了整个的过程可以自己進行模型的调整了。

例如你可能认为用LSTM区分长期记忆和短期记忆很没意义——为什么不直接构建一个LSTM?或者你也有可能发现,分离的記忆门和保存门有点冗余——任何被遗忘的信息都应该由新的信息替换反之亦然。这样一来便可提出另一个很受欢迎的LSTM变量——GRU

又或鍺,也许你认为在决定需要记忆、保存和注意哪些信息时我们不应该只依赖于工作记忆——为什么不使用长期记忆呢这样一来,你就会發现Peephole LSTMs

最后让我们再看一个实例,这个实例是用特朗普总统的推文训练出的2层LSTM尽管这个数据集很小,但是足以学习很多模式例如,下媔是一个在话题标签、URL和@mentions中跟踪推文位置的神经元:

以下是一个正确的名词检测器(注意:它不只是在遇到大写单词时激活):

甚至还有┅个MSGA和大写神经元:

这是LSTM生成的相关声明(好吧其中只有一篇是真的推文;猜猜看哪篇是真的推文吧!):

不幸的是,LSTM只学会了如何像瘋子一样疯言疯语

总结一下,这就是你学到的内容:

这是你应该储存在记忆中的内容:

}

我要回帖

更多关于 LM是谁 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信