tensorflow - 带有 Dropout 层的 Keras 小批量梯度下降
问题描述
我有一个关于 Keras/Tensorflow 中的 Dropout 实现的问题,当batch_size
参数大于一时,使用小批量梯度下降优化。原论文说:
唯一的区别是,对于 mini-batch 中的每个训练案例,我们通过丢弃单元对细化网络进行采样。该训练案例的前向和反向传播仅在此细化网络上完成。每个参数的梯度在每个 mini-batch 中的训练案例上进行平均。任何不使用参数的训练案例都会为该参数贡献一个零梯度。
但是它是如何在 Keras 中实现的呢?据我了解,对于批次中的每个样本,单独的梯度是根据当前模型计算的(因为不同的样本下降了不同的单位)。接下来,在处理完批次中的所有样本之后,对每个权重各自的梯度求和,这些和除以batch_size
然后应用于各自的权重。
通过源代码,我看不到它是否以及在哪里被处理。在函数_process_single_batch
中,计算整体\平均批损失,并基于该批梯度计算。这对于没有 Dropout 层的模型效果很好,但是 Dropout 层呢,如何记住每个样本(丢弃了不同的神经元)的单个模型设置,然后在梯度下降计算期间考虑?
我认为我遗漏了一些东西,我想确保在涉及 Dropout 层时正确理解 Keras 对小批量梯度下降的实现。
解决方案
您从论文中描述的是对如何实现 Dropout 的理论解释。它并没有在任何框架中真正实现。
Dropout 实现为在训练期间以给定概率从伯努利分布中采样丢弃掩码的层。这个掩码包含 0 和 1,其中 0 表示这个特定的神经元被丢弃了。
然后使用自动微分计算通过 Dropout 层的梯度,这意味着将来自前一层的输入梯度乘以 drop mask 的分量,这会抵消掉掉的神经元的梯度。
正如您所提到的,放置掩码是获得适当行为的关键。梯度和前向传递是一起计算的,并且为批次中的每个样本采样不同的 drop mask,这意味着这无需框架的额外支持即可工作。
实现删除神经元的完整想法会复杂得多。
推荐阅读
- android - 设备指纹识别(Android 和 iOS)
- stenciljs - 创建多合一捆绑包?
- c# - 如何在 C# 中使用国家/地区的 id 获取当前日期时间?
- wordpress - 如何在wordpress页面中嵌入乳胶
- ios - UICollectionViewCells 在具有恒定高度约束的 ScrollView 中初始化
- java - Java:在控制台中构建和打印网格(无 GUI)
- javascript - Bootstrap 4 DateTimePicker 图标未显示
- git - VSTS Git Object Count 比预期大得多
- c++ - 为什么 boost::asio::udp::socket::async_send_to 因“不允许操作”而失败,我应该如何处理它
- rest - 在 heroku 中将 BD 与 API REST 连接起来