Kerns LSTM 内核

数据挖掘 喀拉斯 rnn lstm 核心
2021-10-14 23:44:31

我试图了解如何使用 LSTM 单元中的权重矩阵。一个 LSTM 单元有几个权重矩阵:Wf, Wi, Wc, Wo如下所示:

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

(来自http://colah.github.io/posts/2015-08-Understanding-LSTMs/

同时,我在玩 Keras LSTM 并研究它的源代码: https ://github.com/keras-team/keras/blob/master/keras/layers/recurrent.py#L1871

在源代码中,只提到了一个内核。我想知道它Wc只是指吗?那么另一个权重矩阵在哪里Wf, Wi, Wo初始化和使用呢?谢谢!

3个回答

了解如何使用 LSTM 单元中的权重矩阵

在 LSTM 中,您有一个单元向量来跟踪手头任务的必要信息。

为了从很远的时间步长反向传播误差,LSTM 通过设计具有简单的线性运算 (*/+) 来更新单元向量,因此梯度很容易流动。

关键思想是我们通过的线性交互来操纵细胞向量,我们在当前输入和先前隐藏的特征之间引入一些非线性,以获得范围在零到一之间的新特征,表明我们操纵了多少(加/删除/更新)新特征向量的每个元素。

  1. 我们需要跟踪多少信息?

    w_f:通过连接两个向量并将它们与权重矩阵相乘并应用 sigmoid 非线性来获得 [0,1] 之间的值(每个元素不同),从而从先前隐藏特征和当前输入之间的交互中猜测我们应该从旧细胞向量中忘记多少。

    modified_old_cell = old_cell * forgetting_some_dimensions(忘记门 f_t)。

  2. 我们需要从当前输入中提取多少信息。

    我们引入了两个特征向量,通过连接两个向量(输入、先前的隐藏)并应用 tanh、sigmoid 来分别获得建议的单元特征和输入门特征。

    建议的_cell = non_linearity(previous_hiddens,input),因此我们使用 tanh 来获取 [-1,+1] 之间的值。

    修改建议细胞 = 建议细胞 * 输入门因此我们不需要添加当前时间步的所有信息。

    current_cell = 整合 (modified_old_cell,modified_proposed_cell)因此积分运算就是简单的加运算。

  3. 我们需要将多少信息传递给下一个时间步,因此如果问题是序列标记,那么某些输出特征可能只对当前时间步重要。

    与上述相同的机制:
    current_hidden_​​features = current_cell * outputting_some_dimensions(输出门 o_t)。

他们使用此变量通过连接它们来保存所有权重矩阵。

call函数中LSTMCell你可以看到,它们是如何解包的:

self.kernel_i = self.kernel[:, :self.units]
self.kernel_f = self.kernel[:, self.units: self.units * 2]
self.kernel_c = self.kernel[:, self.units * 2: self.units * 3]
self.kernel_o = self.kernel[:, self.units * 3:]

我很高兴在下面的表达式中提供 kernel、recurrent_kernel 和 bias 的直接用法。我想知道 Keras 的使用在编程语言中非常罕见。是否有人对数组表达式给出确切的解释。


### kernel--weights between x_{t} and units
W_i = W[:, :units]   
W_f = W[:, units:units * 2]
W_c = W[:, units * 2:units * 3]
W_o = W[:, units * 3:]

### recurrent kernel--weights between h_{t-1} and Units
U_i = U[:, :units]  #
U_f = U[:, units:units * 2]
U_c = U[:, units * 2:units * 3]
U_o = U[:, units * 3:]

### bias
b_i = b[:units]
b_f = b[units:units * 2]
b_c = b[units * 2:units * 3]
b_o = b[units * 3:]