【发布时间】:2019-03-03 10:33:53
【问题描述】:
我目前正在运行 Spark 2.3.0 和 sparkling-water 2.3.1。我通过查看链接到this 的changelog 找到了底层H2O 库的文档。所以显然它使用H2O 3.18。
通过查看 DNN,我注意到缺少 batch_size 参数,但它提供了一个实际上没有记录的 mini_batch_size 参数。我找到的关于这个参数的唯一文档是here,它指的是H2O 2.4,我假设它仍然适用于我正在使用的版本(我不知道这个假设是否正确)。
小批量
每次迭代要处理的训练数据行数。请注意,与此参数无关,每一行都会立即使用(在线)随机梯度下降来更新模型。小批量大小控制分布式环境中节点之间的同步周期以及评分和模型取消可能发生的频率。例如,如果在 4 个节点上运行的 H2O 上将 mini-batch 设置为 10,000,则每个节点每次迭代将处理 2,500 行,从其本地数据中随机抽样。然后,在节点之间进行模型平均,并且可以进行评分(取决于评分间隔和占空因数)。特殊值是 0 表示每次迭代一个 epoch,-1 表示每次迭代处理最大数据量。如果启用“复制训练数据”,每次迭代将在 N 个节点上训练 N 个 epoch,否则为一个 epoch。
据此,我认为批量大小实际上固定为 1,因为它总是执行在线梯度下降。
我也开始钻研H2O的源代码,看看它的默认值是多少,而AFAIU的默认参数都包含在this class中。
来自line 1694:
// stochastic gradient descent: mini-batch size = 1
// batch gradient descent: mini-batch size = # training rows
public int _mini_batch_size = 1;
所以从评论看来,它实际上并没有执行在线梯度下降,但它似乎实际上表现为批量大小。如果我们假设H2O 2.4 的文档仍然适用,那么值 1 是没有意义的。
另外来自line 2173,它设置用户给定的参数:
if (fromParms._mini_batch_size > 1) {
Log.warn("_mini_batch_size", "Only mini-batch size = 1 is supported right now.");
toParms._mini_batch_size = 1;
实际上我只是快速锁定了源代码,我可能遗漏了一些东西,但我真的无法理解mini_batch_size 参数的工作原理以及它与批量大小的关系。有人可以对此有所了解吗?
【问题讨论】:
标签: apache-spark neural-network deep-learning h2o sparkling-water