你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
注意:对于 BrainScript 用户,小块大小的参数是 minibatchSizePython 用户的参数, 是 minibatch_size_in_samples。 对于 Python 用户,请参阅 此处。
CNTK具有非常具体的参数定义minibatchSize:它表示模型更新之间的样本数。
此处 的示例 定义为一个向量或张量流经系统。
例如,在图像识别任务中,一个图像是一个示例。
每个纪元的迷你小块大小,在 样本 中 (张量沿动态轴) 。 默认值是 256。 可以将不同的值用于不同的纪元,例如 128*2:1024 ,在 BrainScript) 中使用 (,或者在 128*2 + 1024 Python) 中 (意味着对于前两个纪元使用 128 的微型batch 大小,然后对其余时间使用 1024。
请注意,CNTK中的“Minibatch 大小”表示模型更新之间处理的示例数。 当跨辅助角色并行化 ((例如对于 K 辅助角色)时,每个辅助角色将处理的示例数) minibatchSize/K 。
对于可变长度输入, minibatchSize 是指这些序列中的项数, 而不是 序列数。
SGD 将尝试容纳尽可能多的序列到不超过 minibatchSize 总样本的迷你块中。
如果给定了多个输入,则张量将添加到当前微分量,直到其中一个输入超过 minibatchSize。
重要的是,对于顺序数据,示例是序列的各个项。
因此,CNTK minibatchSize不指小块中的序列数,而是构成迷你块的序列中的序列项/标记的聚合数。
CNTK对可变长度序列具有本机支持,例如,它可以容纳同一个迷你块中高度不同长度的序列,而无需使用存储桶等解决方法。
除了CNTK指定每个样本的学习速率的概念 (而不是小块平均) ,任何长度的每个序列项都对渐变的贡献相同,从而导致一致收敛。
(许多其他工具包将顺序数据的微型batch 大小定义为迷你包中的序列数。这是有问题的,特别是如果渐变也定义为迷你batch平均值,而不是CNTK的小块总和,因为对序列中每个标记或步骤的渐变的贡献与序列长度成反比。CNTK的方法避免了这种情况。)
使用多个 Input{}s 时,并非所有输入都具有相同的序列长度。
例如,在序列分类中,每个序列的标签都是一个标记。
在这种情况下,具有最大样本数的输入控制小块大小。 (可以通过指定 definesMbSize=True 某些输入来更改此行为,然后根据此特定输入中的序列对小块大小进行计数。指定多个输入时,只能将单个 definesMbSize 输入设置为 True.)
尽管我们明确定义了 minibatchSize 模型更新之间的样本数,但有两次必须放宽定义:
- 顺序数据:可变长度序列通常不完全求和所请求的小块大小。 在这种情况下,尽可能多的序列被打包到迷你包中,而不超过所请求的迷你包大小 (,但有一个例外:如果随机化料库中的下一个序列超过小块大小的长度,则小块大小将包含此序列) 。
- 数据并行度:此处,小块大小是近似的,因为我们的基于区块的随机化算法无法保证每个辅助角色接收的样本数完全相同。
上述所有注意事项也适用于 epochSize,但 epochSize 存在一些差异,请参阅 此处。