我目前正在Spark 2.3.0
上运行sparkling-water 2.3.1
。我通过查看链接到changelog的this找到了底层H2O库的文档。因此显然它使用了H2O 3.18
。
通过查看DNN,我注意到缺少一个batch_size
参数,但是它提供了一个mini_batch_size
参数,但实际上并没有记录。我发现的关于此参数的唯一文档是here,它指向H2O 2.4
,并且我假设它仍然适用于我使用的版本(我不知道此假设是否正确)。
小批量
每次迭代要处理的训练数据行数。请注意,独立于此参数,每行都将立即使用(在线)随机梯度下降来更新模型。最小批处理大小控制分布式环境中节点之间的同步周期以及评分和模型取消可能发生的频率。例如,如果在4个节点上运行的H2O上将mini-batch设置为10,000,则每个节点每次迭代将处理2500行,并从其本地数据中随机采样。然后,在节点之间进行模型平均,并可能发生评分(取决于评分间隔和占空比)。特殊值是每次迭代一个时期为0,而对于每次迭代处理最大数据量则为-1。如果启用“复制训练数据”,则每次迭代将在N个节点上训练N个时期,否则一个时期。
据此,我认为批次大小实际上固定为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;
因此,从注释看来,它似乎实际上没有执行Online Gradient Descent,但实际上似乎与批处理大小相同。如果我们假设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
参数的工作原理以及它与批处理大小的关系。有人可以阐明这一点吗?