首页 > 解决方案 > 带有 Dropout 层的 Keras 小批量梯度下降

问题描述

我有一个关于 Keras/Tensorflow 中的 Dropout 实现的问题,当batch_size参数大于一时,使用小批量梯度下降优化。原论文说:

唯一的区别是,对于 mini-batch 中的每个训练案例,我们通过丢弃单元对细化网络进行采样。该训练案例的前向和反向传播仅在此细化网络上完成。每个参数的梯度在每个 mini-batch 中的训练案例上进行平均。任何不使用参数的训练案例都会为该参数贡献一个零梯度。

但是它是如何在 Keras 中实现的呢?据我了解,对于批次中的每个样本,单独的梯度是根据当前模型计算的(因为不同的样本下降了不同的单位)。接下来,在处理完批次中的所有样本之后,对每个权重各自的梯度求和,这些和除以batch_size然后应用于各自的权重。

通过源代码,我看不到它是否以及在哪里被处理。在函数_process_single_batch中,计算整体\平均批损失,并基于该批梯度计算。这对于没有 Dropout 层的模型效果很好,但是 Dropout 层呢,如何记住每个样本(丢弃了不同的神经元)的单个模型设置,然后在梯度下降计算期间考虑?

我认为我遗漏了一些东西,我想确保在涉及 Dropout 层时正确理解 Keras 对小批量梯度下降的实现。

标签: tensorflowkerasdeep-learningneural-networkdropout

解决方案


您从论文中描述的是对如何实现 Dropout 的理论解释。它并没有在任何框架中真正实现。

Dropout 实现为在训练期间以给定概率从伯努利分布中采样丢弃掩码的层。这个掩码包含 0 和 1,其中 0 表示这个特定的神经元被丢弃了。

然后使用自动微分计算通过 Dropout 层的梯度,这意味着将来自前一层的输入梯度乘以 drop mask 的分量,这会抵消掉掉的神经元的梯度。

正如您所提到的,放置掩码是获得适当行为的关键。梯度和前向传递是一起计算的,并且为批次中的每个样本采样不同的 drop mask,这意味着这无需框架的额外支持即可工作。

实现删除神经元的完整想法会复杂得多。


推荐阅读