python - 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,以及如何共享权重,您至少可以指出我做对与否。
解决方案
正如论文中的架构所建议的那样,您基本上希望将每个隐藏状态(它们本身是时间分布的)推入单独的密集层(从而在每个时间状态形成一个 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 时我更喜欢的良好视觉直觉 -
- 如果您不返回序列,则 LSTM 的输出只是
ht
(下图的 LHS)的单个值 - 如果返回序列,则输出是序列 (
h0
toht
)(下图的 RHS)
添加一个密集层,在第一种情况下只会ht
作为输入。在第二种情况下,您将需要一个 TimeDistributed Dense,它将“堆叠”在每个h0
to之上ht
。
推荐阅读
- javascript - 在 React 状态下更改二维数组
- mysql - 如何删除 mysql 'where' 查询中的非字母数字字符?
- angular - Angular 5 自定义指令输入属性值未定义
- javascript - Node.js:无限循环失败且没有错误
- angular - Angular 6在父请求时加载子路由组件
- java - 如何获取android应用程序的总CPU时间
- python-3.x - 通过 Colab 访问 Google Drive 文件的 3 种方式有什么区别?
- r - R:在for循环中将多行附加到数据帧
- odoo - 更新旧 api 中的上下文
- rdf - 可以为谓词分配类型吗?