【问题标题】:Bidirectional LSTM Merge Mode explanation双向 LSTM 合并模式解释
【发布时间】:2020-07-20 08:04:22
【问题描述】:

我想了解更多有关使用双向 LSTM 进行序列分类时的合并模式的详细信息,尤其是对于我还不清楚的“Concat”合并模式。

根据我对这个方案的理解:

将前向和后向层的合并结果传递给sigmoid函数后计算输出y_t。 “add”、“mul”和“average”合并模式似乎相当直观,但我不明白在选择“concat”合并模式时如何计算输出 y_t。事实上,通过这种合并模式,我们现在在 sidmoid 函数之前有一个向量而不是单个值。

【问题讨论】:

    标签: python keras lstm recurrent-neural-network


    【解决方案1】:
    1. 在 Bi-LSTM 中,您将有一个 LSTM 从左到右展开(例如 LSTM1) 输入(比如 X)和另一个从右到左展开的 LSTM(比如 LSTM2)。
    2. 假设您的输入大小 (X.shape) 是 n X t X f 其中
      • n:批量大小
      • tsequence length/time-steps/no:of unrollings)
      • f:No:Of 每个时间步的特征
    3. 假设我们有一个带有单个 Bi-LSTM 定义如下的模型
    model.add(Bidirectional(LSTM(10, return_sequences=True), input_shape=(t, f)))
    
    1. 在这种情况下,LSTM1 将返回大小为 n X t X 10 的输出,LSTM2 将返回大小为 n X t X 10 的输出
    2. 现在您可以选择如何使用merge_mode 在每个时间步组合 LSMT1 和 LSTM2 的输出

    sum: 在每个时间步将 LSTM1 输出添加到 LSTM2。 IE。 LSTM1 的n X t X 10 + LSTM2 的n X t X 10 = 输出大小n X t X 10

    mul: 在每个时间步将 LSTM1 输出与 LSTM2 逐元素相乘,这将导致输出大小为 n X t X 10

    concat:在每个时间步将 LSTM1 输出到 LSTM2 的元素明智连接,这将导致输出大小为 n X t X 10*2

    ave: LSTM1 在每个时间步输出到 LSTM2 的元素平均,这将导致输出大小为n X t X 10

    无:将 LSTM1 和 LSTM2 输出作为列表返回

    根据merge_mode 组合输出后,不应用激活函数。如果你想应用激活,你必须在模型中明确定义为一个层。

    测试代码

    model = Sequential()
    model.add(Bidirectional(LSTM(10, return_sequences=True), input_shape=(5, 15), merge_mode='concat'))
    assert model.layers[-1].output_shape == (None, 5, 20)
    
    model = Sequential()
    model.add(Bidirectional(LSTM(10, return_sequences=True), input_shape=(5, 15), merge_mode='sum'))
    assert model.layers[-1].output_shape == (None, 5, 10)
    
    model = Sequential()
    model.add(Bidirectional(LSTM(10, return_sequences=True), input_shape=(5, 15), merge_mode='mul'))
    assert model.layers[-1].output_shape == (None, 5, 10)
    

    注意:

    您不能在序列模型中使用merge_mode=None,因为每一层都应该返回一个张量,但None 返回一个列表,因此您不能将其堆叠在模型中。但是您可以在 keras 的功能 API 中使用它。

    【讨论】:

    • 很好的答案。所以在 concat 之后,双向输出仍然保留正确的时间戳,对吧?
    【解决方案2】:

    这很简单。想象一下,您的前向 LSTM 层返回了类似[0.1, 0.2, 0.3] 的状态,而后向 LSTM 层产生了[0.4, 0.5, 0.6]。然后连接(concat 为简洁)是[0.1, 0.2, 0.3, 0.4, 0.5, 0.6],它被进一步传递给激活层。

    【讨论】:

    • 好的,谢谢。那么激活函数的输出是什么维度呢?
    • 如果激活函数是指 softmax 之类的东西,则将隐藏层的大小加倍(因为它是前向和后向状态的连接)。如果您的意思是添加密集层,那么无论您在定义它时设置什么输出。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 2018-06-04
    • 2019-05-08
    • 2017-08-19
    • 1970-01-01
    • 2017-12-20
    • 1970-01-01
    相关资源
    最近更新 更多