共用方式為


在 CNTK 中解譯epoch_size、minibatch_size_in_samples和MinibatchSource.next_minibatch

在本文中,我們將厘清 Python 中下列參數和函式的解譯和使用方式:

epoch_size

每個 epoch 中的動態軸) (張量卷 樣本數目。 CNTK epoch_size 中的 是卷範例數目,之後會採取特定的其他動作,包括

  • 您可以從這裡重新開機儲存檢查點模型 (定型)
  • 交叉驗證
  • learning-rate 控制項
  • minibatch-scaling

請注意,標籤樣本數目的定義類似于 用於minibatch_size_in_samples的樣本數目。 的定義 epoch_size 與 卷樣本的定義 minibatch_size_in_samplesepoch_size 不同,而不是輸入樣本。

因此,重要的是,對於循序資料,範例是序列的個別專案。 因此,CNTK epoch_size不會參考數個序列,而是構成迷你批次之序列卷上的序數目。

同樣重要的是, epoch_size 是指 標籤 樣本,而非輸入樣本,而每個序列的標籤數目不一定是輸入樣本的數目。 例如,每個序列都有一個標籤,而且每個序列都有一個標籤, (在此情況下 epoch_size 會像序列數目一樣) ,而且序列中每個樣本都有一個標籤,在此情況下 epoch_sizeminibatch_size_in_samples ,每個樣本 (不算序列) 的計算方式完全相同。

對於較小的資料集大小, epoch_size 通常會設定為等於資料集大小。 在 Python 中,您可以為此指定 cntk.io.INFINITELY_REPEAT 。 在 Python 中,您也可以將它設定為 cntk.io.FULL_DATA_SWEEP ,其中處理會在整個資料大小的一次傳遞之後停止。

針對大型資料集,您可以藉由檢查點來引導您選擇的 epoch_size 。 例如,如果您想要在發生電源中斷或網路問題時遺失最多 30 分鐘的計算,您會想要每隔 30 分鐘建立一個檢查點, (一次,讓定型能夠繼續) 。 選擇 epoch_size 為大約需要 30 分鐘計算的樣本數目。

minibatch_size_in_samples

注意:對於 BrainScript 使用者,迷你批次大小的參數為 minibatchSize ;對於 Python 使用者,則為 minibatch_size_in_samples

CNTK參數具有非常特定的定義 minibatch_size_in_samples :它代表模型更新之間的樣本數目。 此處 的範例 定義為一個向量或張量流經系統。 例如,在影像辨識工作中,一個影像是一個範例。

每個 epoch 的迷你批次大小都會在動態 軸) ( 張量範例中提供。 預設值是 256。 您可以將不同的值用於不同的 Epoch;例如, 128*2 + 1024 Python) 中的 (表示使用前兩個 Epoch 的迷你批次大小 128,然後針對其餘部分使用 1024。 請注意,CNTK中的 'minibatch size' 表示模型更新之間處理的樣本數目。 當跨背景工作角色平行處理時,此定義也會保留 (例如,對於 K 背景工作角色而言,每個背景工作角色會處理的樣本數目) minibatch_size_in_samples/K 。 如果是可變長度的輸入, minibatch_size_in_samples 則是指這些序列中的專案數目, 而不是 序列數目。 SGD 會嘗試盡可能容納最多數個序列到不超過 minibatch_size_in_samples 總樣本的迷你批次。 如果有數個輸入,則張量會新增至目前的迷你批次,直到其中一個輸入超過 minibatch_size_in_samples 為止。

重要的是,對於循序資料,範例是序列的個別專案。 因此,CNTK minibatch_size_in_samples不會參考 minibatch 中的序列數目,而是構成迷你批次之序列中的序項/標記匯總數目。 CNTK具有可變長度序列的原生支援,亦即它可以容納相同迷你批次內高度不同長度的序列,而不需要貯體之類的因應措施。 除了 CNTK指定每個樣本的學習率 (而非迷你批次平均) 的概念,任何長度的每個序列專案都會對漸層造成相同的貢獻,進而產生一致的聚合。 (許多其他工具組會將循序資料的 minibatch 大小定義為 minibatch 中的序列數目。這會造成問題,特別是當漸層也定義為迷你批次平均,而不是CNTK的迷你批次總和時,因為序列中每個標記或步驟對漸層的貢獻會與序列長度相反。CNTK的方法可避免這種情況。)

使用多個輸入時,並非所有輸入都有相同的序列長度。 例如,在序列分類中,每個序列的標籤都是單一標記。 在此情況下,具有最大樣本數目的輸入會控制迷你批次大小。 (您可以藉由指定 defines_mb_size=True 某些輸入來變更此行為,然後會根據來自這個特定輸入的序列來計算迷你批次大小。指定數個輸入時,只有單一輸入可以 defines_mb_size 設定為 True .)

儘管我們清楚定義 minibatch_size_in_samples 模型更新之間的樣本數目,但有兩種情況必須放寬定義:

  • 循序資料:可變長度序列通常不會加總到要求的迷你批次大小。 在此情況下,盡可能將多個序列封裝到 minibatch 中,而不會超過要求的迷你批次大小 (,但有一個例外:如果隨機化主體中的下一個序列超過迷你批次大小的長度,minibatch 大小將會包含此序列) 。
  • 資料平行處理原則:在這裡,迷你批次大小是近似的,因為我們的區塊式隨機化演算法無法保證每個背景工作角色都會收到完全相同的樣本數目。

上述所有考慮也適用于 epoch_size ,但 epoch_size 有一些差異,請參閱 上方

MinibatchSource.next_minibatch

方法 MinibatchSource.next_minibatch () 會讀取包含所有輸入資料流程資料的迷你批次。 在定型期間呼叫 時, MinibatchSource.next_minibatch(minibatch_size_in_samples, input_map) 會從訓練資料集中挑選隨機樣本 k 子集,其中 k=minibatch_size_in_samples

實作可確保當 next_minibatch 呼叫 N 時間 () 時 N = number_of_training_samples/minibatch_size_in_samples ,整個訓練資料集都會涵蓋在 的呼叫 next_minibatch 結尾 N 。 這也表示呼叫 2*N 時間時 next_minibatch ,整個資料集會涵蓋兩次。

其他資訊:

  • 每個資料迴圈都會有不同的隨機順序。
  • 如果您將 minibatch 大小加倍,則一個 minibatch 現在會包含完全相同的樣本,之前對應的兩個連續 minibatche 會包含 (如果您有可變長度序列) ,這可能是近似的。 亦即,兩個執行只會以相同連續處理資料的迷你批次大小。
  • 如果您中斷並從檢查點重新開機,您會收到與未中斷定型相同的隨機順序。 這是藉由將讀取/隨機化程式放在具名時間軸上,使用這個簡單的演算法來實作:
    • 定型會以無限時間軸進行定型。 如果您擷取大小為 256 的迷你批次,則表示時間會以 256 為單位。
    • 定型主體會在此時間軸上複寫無限次數。 如果您有 M 範例,則第一個複本會跨越名義時間 0..M-1 ;第二個 M..2M-1 等。
    • 每個複本會在複本界限內隨機隨機隨機顯示,但不跨複本界限。 亦即,一旦您精確地 M 處理樣本,就剛好看到每個樣本一次。
    • 呼叫 next_minibatch(K) 可讓您在此重新緩衝的無限時間軸上下一個 K 範例。 這與呼叫 next_minibatch(1)K 時間相同。
    • 這全都延遲完成。
    • 從檢查點重新開機就像將名義時間重設為建立檢查點時所指定時間一樣簡單。