通过实例理解LSTM

2024-09-29 17:09:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在LSTM中编码一个时间步。我的重点是理解忘记门层输入门层候选值当前未来单元状态的功能

假设我在t-1和xt的隐藏状态如下。为了简单起见,我们假设权重矩阵是恒等矩阵,所有偏差都为零

htminus1 = np.array( [0, 0.5, 0.1, 0.2, 0.6] )
xt = np.array( [-0.1, 0.3, 0.1, -0.25, 0.1] )

我知道遗忘状态是htminus1xt的乙状结肠

那么,是吗

ft = 1 / ( 1 + np.exp( -( htminus1 + xt ) ) )

>> ft = array([0.47502081, 0.68997448, 0.549834  , 0.4875026 , 0.66818777])

我指的是this link来实现一个块LSTM的一次迭代。这个链接说ft应该是0或1。我是不是遗漏了什么

如何根据下图中给出的模式获得忘记门层?一个例子将对我起到说明作用。

enter image description here

沿着相同的路线,如何获得输入门层,it和新候选值的向量,\tilde{C}_t,如下图所示?

enter image description here

最后,如何根据下图给出的方案获得新的隐藏状态ht

一个简单的例子将有助于我理解。提前谢谢

enter image description here


Tags: 功能重点编码状态np时间矩阵array
2条回答

从数字上看这并不明显,但这是它的工作原理-

  1. 如果您看到两行连接形成一行,则这是一个串联操作。您已将其解释为添加

  2. 无论您在哪里看到sigmoidtanh块,都意味着与可训练权重矩阵相乘

  3. 如果两行由一个显式的x+连接,则分别执行元素乘法和加法

因此,正确的操作不是sigmoid(htminus1+xt),而是sigmoid(Wf * np.concatenate(htminus1+xt)) + bfWf是可训练参数的矩阵,bf是相应的偏差项

请注意,我刚刚用numpy在图像的右侧写下了方程式,其他的不多。将[a, b]解释为ab之间的concetenation操作

您可以类似地定义其他操作

ft = sigmoid(Wf * np.concatenate(htminus1, xt)) + bf
it = sigmoid(Wi * np.concatenate(htminus1, xt)) + bi
Ctt = tanh(Wc * np.concatenate(htminus1, xt)) + bc
Ot = sigmoid(Wo * np.concatenate(htminus1, xt)) + bo

Ct = (C_{t-1} * ft) + (Ctt * it)
ht = Ot * tanh(Ct)

注:我将C^{tilda}表示为Ctt

除了已经介绍的细节外,我还想阐明计算和连接的一些更精细的方面

权重矩阵W_f实际上由两个并排连接的权重矩阵组成,即沿轴=1,每个权重矩阵处理前一时间步激活(htminus1)和当前输入(xt)。然而,表示法[htminus1, xt]表示通过堆叠(即沿轴=0)将htminus1xt垂直串联而获得的矩阵

这些忽略偏差的矩阵计算可以这样表示- LSTM matrix calculations

了解这些计算是如何在tensorflow LSTM模型中进行的也是一个信息。下面的代码块只包含与此处讨论相关的主要计算,因为完整的代码如下link

# gate layers calculations on current inputs
x_i = K.dot ( inputs_i , self.kernel_i )
x_f = K.dot ( inputs_f , self.kernel_f )
x_c = K.dot ( inputs_c , self.kernel_c )
x_o = K.dot ( inputs_o , self.kernel_o )

# adding biases
if self.use_bias :
  x_i = K.bias_add ( x_i , self.bias_i)
  x_f = K.bias_add ( x_f , self.bias_f)
  x_c = K.bias_add ( x_c , self.bias_c)
  x_o = K.bias_add ( x_o , self.bias_o)

# gate layers calculations using previous output  -> h_tm1 i.e htminus1
i = self.recurrent_activation (x_i + K.dot(h_tm1 , self.recurrent_kernel_i) )
f = self.recurrent_activation (x_f + K . dot( h_tm1 , self.recurrent_kernel_f) )
c = f * c_tm1 + i * self.activation (x_c + K.dot(h_tm1, self.recurrent_kernel_c) )
o = self.recurrent_activation (x_o + K.dot(h_tm1 , self.recurrent_kernel_o) )

相关问题 更多 >

    热门问题