LSTM网络结构
long short term memory,即我们所称呼的LSTM,是为了解决长期以来问题而专门设计出来的,所有的RNN都具有一种重复神经网络模块的链式形式。在标准RNN中,这个重复的结构模块只有一个非常简单的结构,例如一个tanh层。
LSTM也有与RNN相似的循环结构,但是循环模块中不再是简单的网络,而是比较复杂的网络单元。LSTM的循环模块主要有4个单元,以比较复杂的方式进行连接。
先熟悉以下标记:
在上图中,每条线都承载着整个矢量,从一个节点的输出到另一个节点的输入。 粉色圆圈表示按点操作,如矢量加法,而黄色框表示学习的神经网络层。 合并的行表示串联,而分叉的行表示要复制的内容,并且副本到达不同的位置。
LSTM核心
每个LSTM的重复结构称之为一个细胞(cell),在LSTM中最关键的就是细胞的状态,下图中贯穿的那条横线所表示的就是细胞状态。这条线的意思就是
C
t
−
1
C_{t-1}
Ct−1先乘以一个系数,再线性叠加后从右侧输出。
门可以实现选择性地让信息通过,主要是通过一个 sigmoid 的神经层 和一个逐点相乘的操作来实现的。
sigmoid层输出的是0-1之间的数字,表示着每个成分能够通过门的比例,对应位数字为0表示不通过,数字1表示全通过。比如一个信息表示为向量[1, 2, 3, 4],sigmoid层的输出为[0.3, 0.5, 0.2, 0.4],那么信息通过此门后执行点乘操作,结果为[1, 2, 3, 4] .* [0.3, 0.5, 0.2, 0.4] = [0.3, 1.0, 0.6, 1.6]。
LSTM共有3种门,通过这3种门控制与保护细胞状态。
逐步详解LSTM
遗忘门
第一步: 通过遗忘门过滤掉不想要的信息;
遗忘门决定遗忘哪些信息,它的作用就是遗忘掉老的不用的旧的信息,遗忘门接收上一时刻输出信息
h
t
−
1
h_{t-1}
ht−1和当前时刻的输入
x
t
x_t
xt,然后输出遗忘矩阵
f
t
f_t
ft决定上一时刻细胞状态
C
t
−
1
C_{t-1}
Ct−1的通过状态。
让我们回到语言模型的示例,该模型试图根据所有先前的单词来预测下一个单词。 在这样的问题中,细胞状态可能包括当前受试者的性别,从而可以使用正确的代词。 看到新主语时,我们想忘记旧主语的性别。。
左侧的
h
t
−
1
h_{t-1}
ht−1和下面输入的
x
t
x_t
xt经过了连接操作,再通过一个线性单元,经过一个σ也就是sigmoid函数生成一个0到1之间的数字作为系数输出,表达式如上,
W
f
W_f
Wf和
b
f
b_f
bf作为待定系数是要进行训练学习的。
输入门
第二步: 决定从新的信息中存储哪些信息到细胞状态中去。即产生要更新的信息。
包含两个小的神经网络层,一个是熟悉的sigmoid部分:
i
t
=
σ
(
W
i
⋅
[
h
t
−
1
,
x
t
]
+
b
i
)
i_{t}=\sigma\left(W_{i} \cdot\left[h_{t-1}, x_{t}\right]+b_{i}\right)
it=σ(Wi⋅[ht−1,xt]+bi) 另一个tanh标识(映射到-1到1)也是一个神经网络层,表达式为:
C
~
t
=
tanh
(
W
C
⋅
[
h
t
−
1
,
x
t
]
+
b
C
)
\tilde{C}_{t}=\tanh \left(W_{C} \cdot\left[h_{t-1}, x_{t}\right]+b_{C}\right)
C~t=tanh(WC⋅[ht−1,xt]+bC) 其中的
W
C
W_C
WC和
b
C
b_C
bC都是要通过训练得到的。
sigmoid 层接收
x
t
x_t
xt和
h
t
−
1
h_{t-1}
ht−1产生决定我们要更新哪些信息。接下来一个tanh层产生候选状态值
C
~
t
\tilde{C}_t
C~t 。再联合待更新的数值与候选状态值,对旧的状态Ct-1 进行更新。
第三步: 更新细胞状态
新细胞状态 = 旧细胞状态 × 忘记门结果 + 要更新的新信息
(
C
t
=
f
t
∗
C
t
−
1
+
i
t
∗
C
~
t
C_{t}=f_{t} * C_{t-1}+i_{t} * \tilde{C}_{t}
Ct=ft∗Ct−1+it∗C~t)
f t f_t ft 是遗忘矩阵, C t − 1 C_{t-1} Ct−1是上一时刻的状态(旧状态), i t i_t it 是决定要更新哪些数字, C ~ t \tilde{C}_{t} C~t是候选状态。
输出门
第四步: 基于细胞状态,确定输出信息
首先利用输出门(sigmoid层)产生一个输出矩阵
O
t
O_t
Ot,决定输出当前状态
C
t
C_t
Ct的哪些部分。接着状态
C
t
C_t
Ct通过tanh层之后与
O
t
O_t
Ot相乘,成为输出的内容
h
t
h_t
ht 。
一个输出到同层下一个单元,一个输出到下一层的单元上,首先,我们运行一个 sigmoid 层来确定细胞状态的哪个部分将输出出去。
o
t
=
σ
(
W
o
[
h
t
−
1
,
x
t
]
+
b
o
)
o_{t}=\sigma\left(W_{o}\left[h_{t-1}, x_{t}\right]+b_{o}\right)
ot=σ(Wo[ht−1,xt]+bo)
接着,我们把细胞状态通过 tanh 进行处理(得到一个在 -1 到 1 之间的值)并将它和 sigmoid 门的输出相乘,最终我们仅仅会输出我们确定输出的那部分。
h
t
=
o
t
∗
tanh
(
C
t
)
h_{t}=o_{t} * \tanh \left(C_{t}\right)
ht=ot∗tanh(Ct) 在语言模型中,这种影响是可以影响前后词之间词形的相关性的,例如前面输入的是一个代词或名词,后面跟随的动词会学到是否使用“三单形式”或根据前面输入的名词数量来决定输出的是单数形式还是复数形式。