概述
1. 什么是LSTM
长短期记忆(Long short-term memory, LSTM)是一种特殊的RNN,主要是为了解决长序列训练过程中的梯度消失和梯度爆炸问题。简单来说,就是相比普通的RNN,LSTM能够在更长的序列中有更好的表现。
2. 网络结构
LSTM之所以能够解决RNN的长期依赖问题,是因为LSTM引入了门(gate)机制用于控制特征的流通和损失。LSTM是由一系列LSTM单元(LSTM Unit)组成,其链式结构如下图。
在后面的章节中我们再对LSTM的详细结构进行讲解,首先我们先弄明白LSTM单元中的每个符号的含义。每个黄色方框表示一个神经网络层,由权值,偏置以及激活函数组成;每个粉色圆圈表示元素级别操作;箭头表示向量流向;相交的箭头表示向量的拼接;分叉的箭头表示向量的复制。总结如图,
2.1 单元状态
LSTM的核心部分是类似于传送带的部分,这一部分一般叫做单元状态(cell state)它自始至终存在于LSTM的整个链式系统中。
其中,
C
t
=
f
t
×
C
t
−
1
+
i
t
×
C
t
~
C_{t}=f_{t}times C_{t-1}+i_{t}times widetilde{C_{t}}
Ct=ft×Ct−1+it×Ct
LSTM网络能通过一种被称为门的结构对细胞状态进行删除或者添加信息。门能够有选择性的决定让哪些信息通过。其实门的结构很简单,就是一个sigmoid层和一个点乘操作的组合。如下图所示
2.2 忘记门
LSTM的第一步就是决定细胞状态需要丢弃哪些信息。这部分操作是通过一个称为忘记门的
s
i
g
m
o
i
d
sigmoid
sigmoid单元来处理的。它通过查看
h
t
−
1
h_{t-1}
ht−1和
x
t
x_{t}
xt信息来输出一个
0
−
1
0-1
0−1之间的向量,该向量里面的
0
−
1
0-1
0−1值表示细胞状态
C
t
−
1
C_{t-1}
Ct−1中的哪些信息保留或丢弃多少。
0
0
0表示不保留,
1
1
1表示都保留。忘记门如下图所示。
2.3 输入门
下一步是决定给细胞状态添加哪些新的信息。这一步又分为两个步骤,首先,利用
h
t
−
1
h_{t-1}
ht−1和
x
t
x_{t}
xt通过一个称为输入门的操作来决定更新哪些信息。然后利用
h
t
−
1
h_{t-1}
ht−1和
x
t
x_{t}
xt通过一个
t
a
n
h
tanh
tanh层得到新的候选细胞信息
C
~
t
tilde C_{t}
C~t,这些信息可能会被更新到细胞信息中。这两步描述如下图所示。
2.4 更新门
下面将更新旧的细胞信息
C
t
−
1
C_{t-1}
Ct−1,变为新的细胞信息
C
t
C_{t}
Ct。更新的规则就是通过忘记门选择忘记旧细胞信息的一部分,通过输入门选择添加候选细胞信息
C
~
t
tilde C_{t}
C~t的一部分得到新的细胞信息
C
t
C_{t}
Ct。更新操作如下图所示
2.5 输出门
更新完细胞状态后需要根据输入的
h
t
−
1
h_{t-1}
ht−1和
x
t
x_{t}
xt来判断输出细胞的哪些状态特征,这里需要将输入经过一个称为输出门的
s
i
g
m
o
i
d
sigmoid
sigmoid层得到判断条件,然后将细胞状态经过
t
a
n
h
tanh
tanh层得到一个
[
−
1
,
1
]
[-1,1]
[−1,1]之间值的向量,该向量与输出门得到的判断条件相乘就得到了最终该RNN单元的输出。该步骤如下图所示
3. 缺点
- RNN的梯度问题在LSTM及其变种里面得到了一定程度的解决,但还是不够。它可以处理100个量级的序列,而对于1000个量级,或者更长的序列则依然会显得很棘手。
- 计算费时。每一个LSTM的cell里面都意味着有4个全连接层(MLP),如果LSTM的时间跨度很大,并且网络又很深,这个计算量会很大,很耗时。
4.参数个数计算
LSTM 的参数很明显了,就是
A
A
A中的参数,
A
A
A 内部具体是这样的:
这个其实就是一个简单的RNN结构,具体计算可以参考 深度学习 RNN 原理介绍
一个cell
有
4
4
4个这样结构相同的网络,那么一个cell
的总参数量就是直接
×
4
times 4
×4。注意这
4
4
4个权重不是共享的,都是独立的网络。
所以,一般来说,一层 LSTM 的参数量计算公式是:
4
[
d
h
(
d
h
+
d
x
)
+
d
h
]
,
d
x
表
示
输
入
维
度
,
d
h
表
示
输
出
维
度
4[d_h(d_h+d_x)+d_h],d_x表示输入维度,d_h表示输出维度
4[dh(dh+dx)+dh],dx表示输入维度,dh表示输出维度
那么显而易见,一层双向 LSTM 的参数量就是上述公式
×
2
times 2
×2。
下面我们看一个具体的case,如
from keras.models import Sequential, Model
from keras.layers import Dense, LSTM
model = Sequential()
model.add(Dense(108, input_shape=(32,256)))
model.add(LSTM(128))
model.add(Dense(32))
model.summary()
- Dense层:Dense作为第一层,需要指定输入数据的维度,这里指定的是 256 256 256,也就是说每个神经元有 256 256 256个输入,根据神经元计算公式 y = w x + b y = w x + b y=wx+b,因为 x x x有 256 256 256个,所以对应的 w w w有 256 256 256个,外加偏置 b b b,每个神经元共计 ( 256 + 1 ) ( 256 + 1 ) (256+1)个参数需要训练,又因为共有 108 108 108个神经元,所以需要训练的参数共计 ( 256 + 1 ) × 108 = 27756 ( 256 + 1 ) × 108 = 27756 (256+1)×108=27756;
- LSTM层:Dense层的输出是LSTM的输入,也就是说LSTM的输入为 108 108 108,输出 128 128 128维,所以需要训练的参数共计 4 × [ 128 × ( 128 + 108 ) + 128 ] = 121344 4times[128times(128+108)+128]=121344 4×[128×(128+108)+128]=121344;
- Dense层:Dense层的输入是LSTM的输出 128 128 128,神经元 32 32 32个,所以需要训练的参数共计 32 × ( 128 + 1 ) = 4128 32times(128+1)=4128 32×(128+1)=4128;
5.参考文献
https://zhuanlan.zhihu.com/p/147496732
最后
以上就是笨笨魔镜为你收集整理的深度学习 LSTM 原理介绍1. 什么是LSTM2. 网络结构3. 缺点4.参数个数计算5.参考文献的全部内容,希望文章能够帮你解决深度学习 LSTM 原理介绍1. 什么是LSTM2. 网络结构3. 缺点4.参数个数计算5.参考文献所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复