BiLSTM(双向长短期记忆网络)与 MLP(多层感知器)

BiLSTM (Bidirectional Long Short-Term Memory Networks) with MLP(Multi-layer Perceptron)

我正在尝试实现本文的网络架构 使用双向长短期记忆网络在广播电视中进行说话人变化检测,作者:Ruiqing Yin、Herve Bredin、Claude Barras , 即 enter image description here

该模型由两个 Bi-LSTM(Bi-LSTM 1 和 2)和一个多层感知器 (MLP) 组成,其权重在整个序列中共享。 B. Bi-LSTM1 有 64 个输出(32 个前向和 32 个后向)。 Bi-LSTM2 有 40 个(每个 20 个)。全连接层分别是 40 维、10 维和 1 维。前向和后向 LSTM 的输出被连接起来并前馈到下一层。共享 MLP 由三个完全连接的前馈层组成,前两层使用 tanh 激活函数,最后一层使用 sigmoid 激活函数,以便输出介于 0 和 1 之间的分数。 我参考了各种来源并提出了以下代码,

model = Sequential()

model.add(Bidirectional(LSTM(64, return_sequences=True)))
model.add(Bidirectional(LSTM(40, return_sequences=True)))
model.add(TimeDistributed(Dense(40,activation='tanh')))
model.add(TimeDistributed(Dense(10,activation='tanh')))
model.add(TimeDistributed(Dense(1, activation='sigmoid')))

model.build(input_shape=(None, 200, 35))
model.summary()

我对 TimeDistributed 层感到困惑,它如何模拟 MLP,以及如何共享权重,您能否至少指出我是否做对了。

正如论文中的架构所建议的那样,您基本上想要将每个隐藏状态(它们本身是时间分布的)推入单独的密集层(从而在每个时间状态形成一个 MLP)。

Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
bidirectional (Bidirectional (None, 200, 128)          51200     
_________________________________________________________________
bidirectional_1 (Bidirection (None, 200, 80)           54080     
_________________________________________________________________
time_distributed (TimeDistri (None, 200, 40)           3240      
_________________________________________________________________
time_distributed_1 (TimeDist (None, 200, 10)           410       
_________________________________________________________________
time_distributed_2 (TimeDist (None, 200, 1)            11        
=================================================================
Total params: 108,941
Trainable params: 108,941
Non-trainable params: 0

这里的Bi-LSTM设置为return_sequence = True。因此它 returns 到后续层的隐藏状态序列。如果你将这个序列推入一个 Dense 层,它就没有意义,因为你要 return 一个 3D 张量 (batch, time, feature)。现在,如果你想在每个时间形成一个 Dense 网络,你将需要它是时间分布的。

如输出形状所示,该层在 200 个时间步长的每个时间步长处创建一个 40 节点层,这些时间步长是之前 Bi-LSTM 的输出(隐藏状态)。然后每一个都与 10 个节点层堆叠 (None, 200, 10)。同样,逻辑如下。

如果您怀疑 TimeDistributed 层是什么 - 根据 official documentation.

This wrapper allows applying a layer to every temporal slice of an input.

最终目标是speaker change detection。这意味着您想要在 200 个时间步中的每个时间步预测说话者或说话者的概率。因此输出层returns 200 logits (None, 200, 1).

希望能解决您的困惑。


另一种直观的看待方式-

您的 Bi-LSTM 设置为 return 序列,而不仅仅是特征。此序列中 returned 的每个时间步都需要有自己的密集网络。 TimeDistributed Dense 基本上是一个接受输入序列并将其输入到每个时间步的分离密集节点的层。因此,它没有像标准密集层那样有 40 个节点,而是有 200 X 40 个节点,其中输入表示第 3 个 40 个节点,是来自 Bi-LSTM 的第 3 个时间步。这模拟了 Bi-LSTM 序列上的时间分布 MLP。

我在使用 LSTM 时更喜欢的良好视觉直觉 -

  1. 如果您不 return 序列,则 LSTM 的输出只是 ht 的单个值(下图的 LHS)
  2. 如果你 return 序列,输出是一个序列(h0ht)(下图的 RHS)

添加一个 Dense 层,在第一种情况下只会将 ht 作为输入。在第二种情况下,您将需要一个 TimeDistributed Dense,它将“堆叠”在每个 h0ht.

的顶部