LSTM学习笔记

Long Short-Term Memory(LSTM) 是一种循环神经网络(Recurrent Neural Network, RNN)。跟所有RNN一样,在网络单元足够多的条件下,LSTM可以计算传统计算机所能计算的任何东西。

Like most RNNs, an LSTM network is universal in the sense that given enough network units it can compute anything a conventional computer can compute. 维基百科

RNN

传统前馈神经网络(feedforward neural networks)如下图所示:

前馈神经网络只从输入节点接受信息,它只能对输入空间进行操作,对不同时间序列的输入没有“记忆”。在前馈神经网络中,信息只能从输入层流向隐藏层,再流向输出层。这种网络无法解决带有时序性的问题,比如预测句子中的下一个单词,这种情况下,往往需要使用到前面已知的单词。假设要预测这样一句话:百度是一家__公司。显然,受到前面的词语“百度”的影响,横线中填入“互联网”的概率远大于“金融”,即使单从语法上考虑,填入“金融”也是正确的。

RNN与前馈神经网络最大的不同是,它不仅能对输入空间进行操作,还能对内部状态空间进行操作,它的结构如下:

可以看到,RNN的隐藏层多了一条连向自己的边。因此,它的输入不仅包括输入层的数据,还包括了来自上一时刻的隐藏层的输出。

RNN可以采用BPTT(Back-Propagation Through Time)算法进行学习。BPTT和BP算法类似,都是基于梯度的训练方法。首先,将RNN按时间序列展开,如下图:

图中表示的是时间步长数为3的RNN的展开。一般的,时间步长为T的RNN展开后将含有T个隐藏层,T可以是任意的。当T为1时,RNN退化为一个普通的前馈神经网络。将RNN展开之后,就可以使用与训练带BP的前馈神经网络类似的方法进行训练。有一点需要注意的是,在展开的RNN中,每一层隐藏层实际上是相同的(只是在不同时刻的副本),也就是说,它们最后得到的参数必须是一致的。在训练过程中,不同时刻的隐藏层的参数可能会不一致,最后可以将它们的平均数作为模型的参数。

关于RNN的内容,具体的可以参考“A guide to recurrent neural networks and backpropagation”。

LSTM

梯度消失与避免

在实际应用中,上述RNN模型存在着梯度消失和梯度爆炸的问题。根据链式法则,输出误差对于输入层的偏导等于各层偏导的乘积(关于前馈神经网络的误差传播参考“一文弄懂神经网络中的反向传播法——BackPropagation”)。
假设使用的是平均平方误差,则在时刻t,输出层k的误差信号表示为(以下推导来自“Long Short-Term Memory”,本文采用与论文一致的表示方法):

其中,

是表示非输入单元,fi是可微函数,

表示当前网络单元的输入,wij是单元j和i的之间权重。非输出单元j的反向误差信号为:

对于时间步长为q的RNN网络,在t-q时刻的的误差可以通过以下递归函数来求解:

令lq = v,l0 = u,上式可以进一步写成:

由于梯度最终以乘积的形式得出,若乘式中的每一项(或大部分)都大于1,

则将导致梯度爆炸;若每一项都小于1,

则随着乘法次数的增加,梯度会消失。
梯度消失和梯度爆炸都会严重影响学习的过程。

为了避免梯度消失和梯度爆炸,一个简单的做法是强制让流过每个神经元的误差都为1,即

简单推导可以知道,f是一个线性函数。这样就保证了误差将以参数的形式在网络中流动,不会出现梯度爆炸或者梯度消失的问题,把这样的结构称为CEC(constant error carousel)。但是这种做法存在着权重冲突的问题。

权重冲突问题与解决

前面说到,RNN的隐藏层同时接受外界信息和上一时刻隐藏层的输出作为输入,回到前面将RNN展开成深层网络的情况。隐藏层在每一个时刻t的输出都通过权重向量U影响着下一个时刻t+1的隐藏层。而实际上,对于不同的时刻t, t+1, …, t+k,图中隐藏层的权重向量V和U是相同的。虽然在展开图中它们看起来像是不同层次的节点,但实际上,它们都是同一个实体。

这就产生一个问题,在某一个时刻t,隐藏层可能需要使得权重向量U整体有一个较大的值,即t-1时刻隐藏层的输出对t时刻很重要;而在时刻t+k,隐藏层可能需要使权重U有一个较小的值,也就是说此时隐藏层不想受到t+k-1时刻的计算结果的影响。考虑现实的例子,假如要预测以下句子中动词的形式,括号中为需要预测的词:I may (go) home and (get) my book, but that (depends)。句子中go和get的形式受到may的影响,而depends的形态由that决定,而与may无关。因此预测过程中,当读入and时,may的影响还在,因此应该增大权重U的值,而在读入that的时候,应该同时减小来自上一时刻的隐藏层输出的影响,即减小权重U的,这就与前面产生了冲突。

为了解决这种冲突,Sepp Hochreiter和Jürgen Schmidhuber早在1997年就在论文“Long Short-Term Memory”提出了LSTM,下面的部分图以及公式来自该论文。为了使隐藏层的输出对下一个时刻的影响变得可控,LSTM引入了输入门,输出门的概念。LSTM的基本单元称为记忆元件(memory cell),它是在CEC的基础上扩展而成的,如下图:

图中,3表示输入门(input gate);6表示输出门(output gate);4是CEC单元,可以看到它有一条到自己的权值为1的边。之后,又有人将LSTM进一步扩展,引入了遗忘门,如下图(图片内容出自“Understanding LSTM Networks”):

为了方便表示,把上一个图称为lstm-1,这个图称为lstm-2。lstm-2中与lstm-1编号相同的单元分别一一对应,可以看到,lstm-2比lstm-1多了单元8,它就是所谓的遗忘门。lstm-2中元素的含义如下:

 表示一个门,它由一个网络层和一个乘法单元构成。

在上面的图例中,每一条黑线表示信息(向量)的传递,从一个节点的输出到其他节点的输入。粉色的圈代表 pointwise 的操作,诸如向量的和,而黄色的矩形表示学习到的神经网络层。合在一起的线表示向量的连接,分开的线表示内容被复制,然后分发到不同的位置。

LSTM的信息传播

输入信息前向传播

(以下图片内容出自“Understanding LSTM Networks”)
首先,记忆元件(memory cell)接受上一个时刻的输出(ht-1)以及这个时刻的外界信息(xt)作为输入,将它们合并成一个长向量,经过

### 关于LSTM的教程与学习笔记 #### LSTM网络简介 长期短期记忆(Long Short-Term Memory, LSTM)是一种特殊的循环神经网络架构,旨在解决传统RNN中的梯度消失问题。通过引入门控机制,LSTM能够有效地捕捉长时间依赖关系并处理序列数据[^1]。 #### LSTM结构解析 LSTM的核心组件包括输入门、遗忘门和输出门三个部分。这些门的作用分别是控制新信息进入细胞状态的程度;决定哪些值应该被丢弃以及如何更新当前的记忆单元;最后则是基于新的细胞状态来计算最终输出向量。 #### PyTorch实现多层LSTM模型 在构建深层LSTM时,`num_layers`参数用于指定堆叠多少个LSTM层。当设置 `num_layers=2` 时,则表示会创建一个由两个连续工作的LSTM组成的网络体系,在这种情况下第二个LSTM接收来自前一层的结果作为其输入,并继续对其进行加工直至得出整个系统的预测结果[^2]。 ```python import torch.nn as nn class StackedLSTM(nn.Module): def __init__(self, input_size, hidden_size, num_layers, output_size): super(StackedLSTM, self).__init__() self.lstm = nn.LSTM(input_size=input_size, hidden_size=hidden_size, num_layers=num_layers, batch_first=True) self.fc = nn.Linear(hidden_size, output_size) def forward(self, x): out, _ = self.lstm(x) out = self.fc(out[:, -1, :]) return out ``` 此代码片段展示了如何利用PyTorch库定义一个多层LSTM模型类。其中包含了初始化函数(`__init__()`) 和正向传播过程 (`forward()`) 的具体实现方式。 #### 学习资源推荐 对于希望深入了解LSTM理论和技术应用的学习者来说,可以从上述提到的文章入手进一步探索更多案例研究和技术细节[^3]。此外还有其他优秀的在线博客文章提供了丰富的实践经验和技巧分享[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值