首页 > 解决方案 > BiLSTM(双向长短期记忆网络)和 MLP(多层感知器)

问题描述

我正在尝试使用 Bidirectional Long Short-Term Memory Networks 实现这篇论文的网络架构在广播电视中的说话人变化检测,作者是 Ruiqing Yin、Herve Bredin、Claude Barras,即在此处输入图像描述

该模型由两个 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,以及如何共享权重,您至少可以指出我做对与否。

标签: pythontensorflowkeraslstmmlp

解决方案


正如论文中的架构所建议的那样,您基本上希望将每个隐藏状态(它们本身是时间分布的)推入单独的密集层(从而在每个时间状态形成一个 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。因此它将隐藏状态序列返回到后续层。如果将此序列推入 Dense 层,则没有意义,因为您将返回 3D 张量(batch, time, feature)。现在,如果你想每次都形成一个密集的网络,你需要它是时间分布的。

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

如果您怀疑 TimeDistributed 层是什么 - 根据官方文档。

该包装器允许将层应用于输入的每个时间切片。

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

希望能解决你的困惑。


另一种直观的看待它的方式 -

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

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

  1. 如果您不返回序列,则 LSTM 的输出只是ht(下图的 LHS)的单个值
  2. 如果返回序列,则输出是序列 ( h0to ht)(下图的 RHS)

在此处输入图像描述

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


推荐阅读