我目前正在Spark 2.3.0
运行sparkling-water 2.3.1
. 我通过查看链接到此的更改日志找到了底层 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 表示每次迭代处理最大数据量。如果启用“复制训练数据”,
据此,我解释说批量大小实际上固定为 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
参数的工作原理以及它与批量大小的关系。有人可以对此有所了解吗?