我目前正在运行Spark 2.3.0
sparkling-water 2.3.1
.我通过查看链接到此库的更改日志找到了底层 H2O 库的文档。所以显然它使用H2O 3.18
.
通过查看 DNN,我注意到缺少batch_size
参数,而是提供了一个实际上没有记录的mini_batch_size
参数。我找到的有关此参数的唯一文档在这里,它指的是H2O 2.4
,我假设它仍然适用于我正在使用的版本(我不知道这个假设是否正确(。
小批量
每次迭代要处理的训练数据行数。请注意,与此参数无关,每一行都会立即用于使用(在线(随机梯度下降来更新模型。小批大小控制分布式环境中节点之间的同步周期以及评分和模型取消发生的频率。例如,如果在 4 个节点上运行的 H2O 上将迷你批处理设置为 10,000,则每个节点每次迭代将处理 2,500 行,从其本地数据中随机采样。然后,在节点之间进行模型平均,并且可以进行评分(取决于评分间隔和占空因数(。特殊值为 0 表示每次迭代一个纪元,-1 表示每次迭代处理最大数据量。如果启用了"复制训练数据",则每次迭代将在 N 个节点上训练 N 个 epoch,否则将训练一个 epoch。
由此我解释为批量大小实际上固定为 1,因为它始终执行在线梯度下降。
我也开始深入研究 H2O 的源代码,看看它的默认值是什么,AFAIU 默认参数包含在这个类中。
从第 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 是没有意义的。
此外,从第 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
参数的工作原理以及它与批量大小的关系。有人可以对此有所了解吗?
这个参数实际上不应该被用户使用,这里有一个票证可以隐藏它。现在,请将mini_batch_size
保留为 1(默认值(,以免遇到任何警告或错误。