好问题!
tl; dr:单元状态和隐藏状态是两个不同的事物,但是隐藏状态取决于单元状态,并且确实具有相同的大小。
更长的解释
可以从下图(同一博客的一部分)中看出两者之间的区别:
单元格状态是通过顶部从西向东移动的粗线。整个绿色块称为“单元”。
上一个时间步的隐藏状态被视为当前时间步的输入的一部分。
但是,如果不进行完整的演练,则很难看到两者之间的依赖性。我将在此处进行操作,以提供另一种观点,但受到博客的影响很大。我的表示法是相同的,在解释中我将使用博客中的图像。
我喜欢认为操作顺序与博客中的操作方式有所不同。就个人而言,就像从输入门开始。我将在下面介绍这种观点,但是请记住,该博客很可能是通过计算来建立LSTM的最佳方法,而这种解释纯粹是概念性的。
这是正在发生的事情:
输入门
在时间的输入是和。这些被连接起来并被馈入非线性函数(在这种情况下为S型)。此S形函数称为“输入门”,因为它充当输入的权宜之计。它根据当前输入随机决定在这个时间步上将更新哪些值。txtht−1
也就是说,(按照您的示例),如果我们有一个输入向量和一个先前的隐藏状态,那么输入门将执行以下操作:xt=[1,2,3]ht=[4,5,6]
a)将和连接,得到xtht−1[1,2,3,4,5,6]
b)计算乘以串联向量,然后加上偏差(在数学上:,其中是从输入向量到非线性的权重矩阵;是输入偏压)。WiWi⋅[xt,ht−1]+biWibi
假设我们正在从一个六维输入(级联输入向量的长度)到一个关于要更新哪些状态的三维决策。这意味着我们需要一个3x6的权重矩阵和3x1的偏差向量。让我们给这些值:
Wi=⎡⎣⎢123123123123123123⎤⎦⎥
bi=⎡⎣⎢111⎤⎦⎥
计算结果为:
⎡⎣⎢123123123123123123⎤⎦⎥⋅⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢123456⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥+⎡⎣⎢111⎤⎦⎥=⎡⎣⎢224262⎤⎦⎥
c)将先前的计算输入非线性:it=σ(Wi⋅[xt,ht−1]+bi)
σ(x)=11+exp(−x)(我们将此元素逐个应用于向量的值)x
σ(⎡⎣⎢224262⎤⎦⎥)=[11+exp(−22),11+exp(−42),11+exp(−62)]=[1,1,1]
用英语来说,这意味着我们将更新所有状态。
输入门具有第二部分:
d)Ct~=tanh(WC[xt,ht−1]+bC)
这部分的要点是计算状态更新的方式(如果要这样做的话)。这是此时间步骤中新输入对单元状态的贡献。计算遵循上面说明的相同过程,但使用tanh单位而不是S型单位。
输出乘以该二进制矢量,但是在进行单元更新时将覆盖该内容。Ct~it
一起告诉我们要更新的状态,告诉我们如何更新它们。它告诉我们到目前为止我们要添加哪些新信息。itCt~
然后是忘记门,这是您问题的症结所在。
忘记门
忘记门的目的是删除不再相关的先前学习的信息。博客中给出的示例是基于语言的,但是我们也可以想到滑动窗口。如果您要建模一个自然地由整数表示的时间序列,例如疾病爆发期间某个区域中的传染性个体计数,那么也许一旦该区域中的某个疾病死亡,您就不再需要考虑何时使用该区域了。考虑疾病下一步将如何传播。
就像输入层一样,忘记层从上一个时间步中获取隐藏状态,并从当前时间步中获取新输入并将其连接起来。关键是随机决定要忘记什么和要记住什么。在之前的计算中,我显示了全1的S形图层输出,但实际上,它接近0.999,因此我进行了四舍五入。
计算看起来很像我们在输入层所做的:
ft=σ(Wf[xt,ht−1]+bf)
这将为我们提供一个大小为3的矢量,其值在0到1之间。让我们假设它给了我们:
[0.5,0.8,0.9]
然后,我们根据这些值随机决定要忘记的那三部分信息中的哪一部分。一种方法是从均匀(0,1)分布生成一个数字,如果该数字小于单元“打开”的概率(对于单元1、2和3,则为0.5、0.8和0.9) ),然后打开该单元。在这种情况下,这意味着我们会忘记该信息。
快速说明:输入层和忘记层是独立的。如果我是一个博彩人,我敢打赌这是并行化的好地方。
更新单元状态
现在,我们拥有更新单元状态所需的一切。我们将来自输入和忘记门的信息组合在一起:
Ct=ft∘Ct−1+it∘Ct~
现在,这将有些奇怪。表示Hadamard乘积,这是一个入门乘积,而不是像我们之前做的那样乘以。∘
撇开:哈达玛产品
例如,如果我们有两个向量和而我们想采用Hadamard积,则可以这样做:x1=[1,2,3]x2=[3,2,1]
x1∘x2=[(1⋅3),(2⋅2),(3⋅1)]=[3,4,3]
抛开。
这样,我们将要添加到单元格状态(输入)的内容与要从单元格状态(忘记)中删除的内容结合在一起。结果是新的单元状态。
输出门
这将为我们提供新的隐藏状态。从本质上讲,输出门的目的是确定在更新后续单元状态时我们希望模型的下一部分要考虑哪些信息。博客中的示例还是语言:如果名词为复数形式,则下一步中的动词变位将发生变化。在疾病模型中,如果特定区域中的个体的敏感性与另一区域中的个体的敏感性不同,则感染的可能性可能会改变。
输出层再次使用相同的输入,但是会考虑更新后的单元状态:
ot=σ(Wo[xt,ht−1]+bo)
同样,这给了我们概率的向量。然后我们计算:
ht=ot∘tanh(Ct)
因此,当前单元状态和输出门必须在输出内容上达成共识。
即,如果结果是的随机已经作出决定后,以每个单元是否是开还是关,以及结果是,然后,当我们采用Hadamard乘积时,我们将得到,只有通过输出门和单元状态都打开的单元才是最终输出的一部分。[ 0 ,1 ,1 ] ö 吨 [ 0 ,0 ,1 ] [ 0 ,0 ,1 ]tanh(Ct)[0,1,1]ot[0,0,1][0,0,1]
[编辑:博客上有一条评论说,再次将转换为实际输出,这意味着屏幕上的实际输出(假设您有一些)是另一个非线性变换。]ÿ 吨 = σ (w ^ ⋅ ħ 吨)htyt=σ(W⋅ht)
该图显示转到两个位置:下一个单元格,以及到屏幕的“输出”。我认为第二部分是可选的。ht
LSTM上有很多变体,但这涵盖了要点!