⨀
\bigodot
⨀表示操作矩阵中对应的元素相乘,因此要求两个相乘矩阵是同型的。
⨁
\bigoplus
⨁则代表进行矩阵加法操作。
LSTM内部结构-输入门+遗忘门+输出门
RNN和LSTM结构图对比:
RNN 和 LSTM的区别:
LSTM比RNN多了一个输入状态,包括两个输入
c
t
c^t
ct(cell state)和
h
t
h^t
ht(hidden state)。
首先使用LSTM的当前输入
x
t
x^t
xt和上一个状态传递下来的
h
t
−
1
h^{t-1}
ht−1拼接训练得到四个状态。
{
z
=
t
a
n
h
(
W
h
t
−
1
x
t
)
z
i
=
σ
(
W
i
h
t
−
1
x
t
)
z
f
=
σ
(
W
f
h
t
−
1
x
t
)
z
o
=
σ
(
W
o
h
t
−
1
x
t
)
\begin{cases} z &=tanh(W^{x^t}_{h^{t-1}}) \\ z^i &= \sigma({W^i}^{x^t}_{h^{t-1}}) \\ z^f &= \sigma({W^f}^{x^t}_{h^{t-1}}) \\ z^o &= \sigma({W^o}^{x^t}_{h^{t-1}}) \\ \end{cases}
⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧zzizfzo=tanh(Wht−1xt)=σ(Wiht−1xt)=σ(Wfht−1xt)=σ(Woht−1xt)
其中, 记忆
z
i
z^i
zi, 忘记
z
f
z^f
zf, 输出
z
o
z^o
zo是由拼接向量乘以权重矩阵之后,再通过一个sigmoid激活函数转换成0到1之间的数值,来作为一种门控状态。而z则是将结果通过一个tanh激活函数将转换成-1到1之间的值(这里使用tanh是因为这里是将其做为输入数据,而不是门控信号)。
3个阶段
两条数据流
第一步通过遗忘和输入门计算当前的
c
t
c^t
ct
第二步通过输出门计算当前的
h
t
h^t
ht
1、忘记
具体来说是通过计算得到的 z f z^f zf来作为忘记门控,来控制上一个状态的 c t − 1 c^{t-1} ct−1哪些需要留哪些需要忘。
2、记忆
主要是会对输入 x t x^t xt 进行选择记忆。哪些重要则着重记录下来,哪些不重要,则少记一些。当前的输入内容由前面计算得到的 z z z表示。而选择的门控信号则是由 z i z^i zi来进行控制。
1 + 2
将上面两步得到的结果相加,即可得到传输给下一个状态的 c t c^t ct 。
3、输出
这个阶段将决定哪些将会被当成当前状态的输出。主要是通过
z
o
z^o
zo来进行控制的。并且还对上一阶段得到的
c
o
c^o
co进行了放缩(通过一个
t
a
n
h
tanh
tanh激活函数进行变化)。
与普通RNN类似,输出
y
t
y^t
yt往往最终也是通过
h
t
h^t
ht变化得到。
LSTM实战-预测
参考之前的一篇:https://blog.csdn.net/ACBattle/article/details/85307422
GRU内部结构-更新门+重置门
主要包括三次数据的处理(三条明确的轨迹路线)红 + 黑 + 紫
总的公式为:
重
置
−
计
算
h
:
{
r
=
σ
(
W
r
h
t
−
1
x
t
)
h
t
−
1
′
=
h
t
−
1
⨀
r
h
′
=
t
a
n
h
(
W
h
t
−
1
′
x
t
)
重置-计算h : \begin{cases} r &= \sigma({W^{r}}^{x^t}_{h^{t-1}}) \\ {h^{t-1}}^{'} &= h^{t-1} \bigodot r \\ h^{'} &= tanh({W}^{x^t}_{{h^{t-1}}^{'}}) \\ \end{cases}
重置−计算h:⎩⎪⎨⎪⎧rht−1′h′=σ(Wrht−1xt)=ht−1⨀r=tanh(Wht−1′xt)
更 新 − 计 算 z : { z = σ ( W z h t − 1 x t ) 更新-计算z: \left\{ \begin{array}{c} z &= \sigma({W^{z}}^{x^t}_{h^{t-1}}) \\ \end{array} \right. 更新−计算z:{z=σ(Wzht−1xt)
汇 总 输 出 : { h t = z ⨀ h t − 1 + ( 1 − z ) ⨀ h ′ 汇总输出: \left\{ \begin{array}{c} h^t = z \bigodot h^{t-1} + (1 - z)\bigodot {h^{'}} \end{array} \right. 汇总输出:{ht=z⨀ht−1+(1−z)⨀h′
通过上一个传输下来的状态 h t − 1 h^{t-1} ht−1和当前节点的输入 x t x^{t} xt来获取两个门控状态。
1、重置:计算 h h h
reset:
r
=
σ
(
W
r
h
t
−
1
x
t
)
r = \sigma({W^{r}}^{x^t}_{h^{t-1}})
r=σ(Wrht−1xt)
首先通过重置门得到
h
t
−
1
′
=
h
t
−
1
⨀
r
{h^{t-1}}^{'} = h^{t-1} \bigodot r
ht−1′=ht−1⨀r
再将
h
t
−
1
′
{h^{t-1}}^{'}
ht−1′与输入的
x
t
x^t
xt进行拼接,在通过一个tanh来将数据缩到{-1, 1}之内。即可得到的
h
′
h^{'}
h′。
h
′
=
t
a
n
h
(
W
h
t
−
1
′
x
t
)
h^{'}= tanh({W}^{x^t}_{{h^{t-1}}^{'}})
h′=tanh(Wht−1′xt)
这里的
h
′
h^{'}
h′主要是包含了当前输入的
x
t
x^t
xt数据。有针对性的对
h
′
h^{'}
h′添加到当前的隐藏状态,相当于“记忆了当前时刻的状态”。类似于LSTM的选择记忆阶段。
2、更新:计算 z z z
update:
z
=
σ
(
W
z
h
t
−
1
x
t
)
z = \sigma({W^{z}}^{x^t}_{h^{t-1}})
z=σ(Wzht−1xt)
同时进行遗忘和更新。
我们使用了先前得到的更新门控 z(update gate)。
更新门:
h
t
=
z
⨀
h
t
−
1
+
(
1
−
z
)
⨀
h
′
h^t = z \bigodot h^{t-1} + (1 - z)\bigodot h^{'}
ht=z⨀ht−1+(1−z)⨀h′
门控信号的范围是
0
1
0~1
0 1,门控信号越接近1,代表“记忆”下来的数据越多;而越接近0则代表“遗忘”的越多。
疑惑:遗忘与记忆的关系和为1?
GRU实战-文本情感分类
https://blog.csdn.net/ACBattle/article/details/101945050