忘记循环神经网络(RNN)中的层-


13

我试图找出一个RNN的“忘记”层中每个变量的尺寸,但是,我不确定自己是否走对了。下一张图片和等式来自Colah的博客文章“ Understanding LSTM Networks”

在此处输入图片说明

哪里:

  • m * 1xt是大小为向量的输入m1
  • ht1是大小为向量的隐藏状态n1
  • [xt,ht1]是一个串联(例如,如果,则)xt=[1,2,3],ht1=[4,5,6][xt,ht1]=[1,2,3,4,5,6]
  • wf是大小为矩阵的权重,其中是单元状态的数量(如果在上面的示例中,而,并且如果我们有3个单元状态,则矩阵)k(m+n)km=3n=3wf=33
  • bf是大小为向量的偏差,其中是单元状态的数量(由于上述示例中,因此是 向量)。k1kk=3bf31

如果将设置为: wf

[1234565678910345678]

和为bf[1,2,3]

然后是Wf.[ht1,xt]=

[1234565678910345678].[123456]=[91175133]

然后,我们可以添加偏差Wf.[ht1,xt]+bf=

[91175133]+[123]=[92177136]

然后将它们输入到S型函数中:,其中,因此我们执行此函数元素明智的做法,并获得。11+exx=[92177136]

[111]

这意味着对于每个单元状态(有单元状态),我们允许它传递到下一层。Ct1k=3

以上假设正确吗?

这也意味着单元格状态和隐藏状态的数量相同吗?

Answers:


14

好问题!

tl; dr:单元状态和隐藏状态是两个不同的事物,但是隐藏状态取决于单元状态,并且确实具有相同的大小。

更长的解释

可以从下图(同一博客的一部分)中看出两者之间的区别:

单元格状态是通过顶部从西向东移动的粗线。

单元格状态是通过顶部从西向东移动的粗线。整个绿色块称为“单元”。

上一个时间步的隐藏状态被视为当前时间步的输入的一部分。

但是,如果不进行完整的演练,则很难看到两者之间的依赖性。我将在此处进行操作,以提供另一种观点,但受到博客的影响很大。我的表示法是相同的,在解释中我将使用博客中的图像。

我喜欢认为操作顺序与博客中的操作方式有所不同。就个人而言,就像从输入门开始。我将在下面介绍这种观点,但是请记住,该博客很可能是通过计算来建立LSTM的最佳方法,而这种解释纯粹是概念性的。

这是正在发生的事情:

输入门

在此处输入图片说明

在时间的输入是和。这些被连接起来并被馈入非线性函数(在这种情况下为S型)。此S形函数称为“输入门”,因为它充当输入的权宜之计。它根据当前输入随机决定在这个时间步上将更新哪些值。txtht1

也就是说,(按照您的示例),如果我们有一个输入向量和一个先前的隐藏状态,那么输入门将执行以下操作:xt=[1,2,3]ht=[4,5,6]

a)将和连接,得到xtht1[1,2,3,4,5,6]

b)计算乘以串联向量,然后加上偏差(在数学上:,其中是从输入向量到非线性的权重矩阵;是输入偏压)。WiWi[xt,ht1]+biWibi

假设我们正在从一个六维输入(级联输入向量的长度)到一个关于要更新哪些状态的三维决策。这意味着我们需要一个3x6的权重矩阵和3x1的偏差向量。让我们给这些值:

Wi=[111111222222333333]

bi=[111]

计算结果为:

[111111222222333333][123456]+[111]=[224262]

c)将先前的计算输入非线性:it=σ(Wi[xt,ht1]+bi)

σ(x)=11+exp(x)(我们将此元素逐个应用于向量的值)x

σ([224262])=[11+exp(22),11+exp(42),11+exp(62)]=[1,1,1]

用英语来说,这意味着我们将更新所有状态。

输入门具有第二部分:

d)Ct~=tanh(WC[xt,ht1]+bC)

这部分的要点是计算状态更新的方式(如果要这样做的话)。这是此时间步骤中新输入对单元状态的贡献。计算遵循上面说明的相同过程,但使用tanh单位而不是S型单位。

输出乘以该二进制矢量,但是在进行单元更新时将覆盖该内容。Ct~it

一起告诉我们要更新的状态,告诉我们如何更新它们。它告诉我们到目前为止我们要添加哪些新信息。itCt~

然后是忘记门,这是您问题的症结所在。

忘记门

在此处输入图片说明

忘记门的目的是删除不再相关的先前学习的信息。博客中给出的示例是基于语言的,但是我们也可以想到滑动窗口。如果您要建模一个自然地由整数表示的时间序列,例如疾病爆发期间某个区域中的传染性个体计数,那么也许一旦该区域中的某个疾病死亡,您就不再需要考虑何时使用该区域了。考虑疾病下一步将如何传播。

就像输入层一样,忘记层从上一个时间步中获取隐藏状态,并从当前时间步中获取新输入并将其连接起来。关键是随机决定要忘记什么和要记住什么。在之前的计算中,我显示了全1的S形图层输出,但实际上,它接近0.999,因此我进行了四舍五入。

计算看起来很像我们在输入层所做的:

ft=σ(Wf[xt,ht1]+bf)

这将为我们提供一个大小为3的矢量,其值在0到1之间。让我们假设它给了我们:

[0.5,0.8,0.9]

然后,我们根据这些值随机决定要忘记的那三部分信息中的哪一部分。一种方法是从均匀(0,1)分布生成一个数字,如果该数字小于单元“打开”的概率(对于单元1、2和3,则为0.5、0.8和0.9) ),然后打开该单元。在这种情况下,这意味着我们会忘记该信息。

快速说明:输入层和忘记层是独立的。如果我是一个博彩人,我敢打赌这是并行化的好地方。

更新单元状态

在此处输入图片说明

现在,我们拥有更新单元状态所需的一切。我们将来自输入和忘记门的信息组合在一起:

Ct=ftCt1+itCt~

现在,这将有些奇怪。表示Hadamard乘积,这是一个入门乘积,而不是像我们之前做的那样乘以。

撇开:哈达玛产品

例如,如果我们有两个向量和而我们想采用Hadamard积,则可以这样做:x1=[1,2,3]x2=[3,2,1]

x1x2=[(13),(22),(31)]=[3,4,3]

抛开。

这样,我们将要添加到单元格状态(输入)的内容与要从单元格状态(忘记)中删除的内容结合在一起。结果是新的单元状态。

输出门

在此处输入图片说明

这将为我们提供新的隐藏状态。从本质上讲,输出门的目的是确定在更新后续单元状态时我们希望模型的下一部分要考虑哪些信息。博客中的示例还是语言:如果名词为复数形式,则下一步中的动词变位将发生变化。在疾病模型中,如果特定区域中的个体的敏感性与另一区域中的个体的敏感性不同,则感染的可能性可能会改变。

输出层再次使用相同的输入,但是会考虑更新后的单元状态:

ot=σ(Wo[xt,ht1]+bo)

同样,这给了我们概率的向量。然后我们计算:

ht=ottanh(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=σ(Wht)

该图显示转到两个位置:下一个单元格,以及到屏幕的“输出”。我认为第二部分是可选的。ht

LSTM上有很多变体,但这涵盖了要点!


感谢您的回答!我还有一个问题是你不在乎。深度神经网络之所以深,是因为ReLU的导数为1(如果输出大于0)。这个单元格也一样吗?我不确定Tanh和Sigmoid如何具有1的常数导数?
user1157751

我的荣幸!当神经网络具有多个隐藏层时,便被视为“深度”。激活函数(tanh,Sigmoid,ReLU)的导数会影响网络的训练方式。就像您说的那样,如果ReLU的输入大于0,则ReLU具有恒定的斜率,因此如果我们位于函数的该区域中,则其导数为1。如果我们在其激活区域的中间,Tanh和Sigmoid单元的导数接近1,但它们的导数将不会恒定。也许我应该对衍生品的独立博客文章....
StatsSorceress

您能否举例说明它们在激活区的导数接近1?我看过很多有关导数的资源,但没有做完数学运算吗?
user1157751

这是个好主意,但是要花一些时间来写一篇关于它的文章。同时,请考虑tanh函数的形状-它是拉长的“ S”。在中间是导数最高的位置。如果S是平坦的(S的尾部),则导数为0。我看到一个来源说S型曲线的最大导数为0.25,但我没有tanh的等效边界。
StatsSorceress

我不了解的部分与ReLU具有常数1导数的ReLU不同,其中x> 0,但是Sigmoid和tanh的两个导数都具有可变值。这怎么可能是“恒定的”?
user1157751
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.