CNTK 中的 BrainScript minibatchSize
注意:對於 BrainScript 使用者,minibatch 大小的參數為 minibatchSize
,對於 Python 使用者而言,其為 minibatch_size_in_samples
。 針對 Python 使用者,請參閱 這裡。
CNTK有非常特定的參數定義 minibatchSize
:它代表模型更新之間的樣本數目。
此處 的範例 定義為一個向量或張量流經系統。
例如,在影像辨識工作中,一個影像是一個範例。
每個 epoch 的迷你批次大小,在動態軸) (張量 範例中提供 。 預設值是 256
。 您可以將不同的值用於不同的 Epoch,例如 128*2:1024
,在 BrainScript) 中使用 (, (或在 128*2 + 1024
Python) 中使用迷你碼大小 128 表示前兩個 Epoch 使用迷你批次大小,然後針對其餘兩個 Epoch 使用 1024。
請注意,CNTK中的 「Minibatch 大小」表示模型更新之間處理的樣本數目。 當跨背景工作角色平行處理時,此定義也會保留 (例如,對於 K
背景工作角色而言,每個背景工作角色會處理的樣本數目) minibatchSize/K
。
如果是可變長度的輸入, minibatchSize
則是指這些序列中的專案數目, 而不是 序列數目。
SGD 會嘗試盡可能容納最多數個序列到不超過 minibatchSize
總樣本的迷你批次。
如果有數個輸入,則張量會新增至目前的迷你批次,直到其中一個輸入超過 minibatchSize 為止。
重要的是,對於循序資料,範例是序列的個別專案。
因此,CNTK minibatchSize
不會參考 minibatch 中的序列數目,而是構成迷你批次之序列中的序項/標記匯總數目。
CNTK具有可變長度序列的原生支援,亦即它可以容納相同迷你批次內高度不同長度的序列,而不需要貯體之類的因應措施。
除了 CNTK指定每個樣本的學習率 (而非迷你批次平均) 的概念,任何長度的每個序列專案都會對漸層造成相同的貢獻,進而產生一致的聚合。
(許多其他工具組會將循序資料的 minibatch 大小定義為 minibatch 中的序列數目。這會造成問題,特別是當漸層也定義為迷你批次平均,而不是CNTK的迷你批次總和時,因為序列中每個標記或步驟對漸層的貢獻會與序列長度相反。CNTK的方法可避免這種情況。)
使用多個 Input{}
時,並非所有輸入都有相同的序列長度。
例如,在序列分類中,每個序列的標籤都是單一標記。
在此情況下,具有最大樣本數目的輸入會控制迷你批次大小。 (您可以藉由指定 definesMbSize=True
某些輸入來變更此行為,然後會根據來自這個特定輸入的序列來計算迷你批次大小。指定數個輸入時,只有單一輸入可以 definesMbSize
設定為 True
.)
儘管我們清楚定義 minibatchSize
模型更新之間的樣本數目,但有兩種情況必須放寬定義:
- 循序資料:可變長度序列通常不會加總到要求的迷你批次大小。 在此情況下,盡可能將多個序列封裝到 minibatch 中,而不會超過要求的迷你批次大小 (,但有一個例外:如果隨機化主體中的下一個序列超過迷你批次大小的長度,minibatch 大小將會包含此序列) 。
- 資料平行處理原則:在這裡,迷你批次大小是近似的,因為我們的區塊式隨機化演算法無法保證每個背景工作角色都會收到完全相同的樣本數目。
上述所有考慮也適用于 epochSize
,但 epochSize
有一些差異,請參閱 這裡。