brainScript minibatchSize in CNTK
注: BrainScript ユーザーの場合、ミニバッチ サイズのパラメーターは minibatchSize
、Python ユーザーの場合は minibatch_size_in_samples
. Python ユーザーについては、 こちらを参照してください。
CNTKには、パラメーターのminibatchSize
非常に具体的な定義があります。これは、モデルの更新間のサンプルの数を示します。
ここでの サンプル は、システムを流れる 1 つのベクトルまたはテンソルとして定義されています。
たとえば、画像認識タスクでは、1 つの画像が 1 つのサンプルです。
サンプル (動的軸に沿ったテンソル) で指定された各エポックのミニバッチ サイズ。 既定値は 256
です。 (BrainScript の場合) や 128*2 + 1024
(Python の場合) など、エポックごとに異なる値を使用できます。つまり、 128*2:1024
最初の 2 つのエポックに 128、残りのエポックに 1024 のミニバッチ サイズを使用します。
CNTKの "ミニバッチ サイズ" は、モデルの更新間に処理されたサンプルの数を意味します。 この定義は、ワーカー間で並列化する場合にも保持されます (たとえば、worker の場合K
、各ワーカーが処理するサンプルの数)。minibatchSize/K
可変長入力の場合は、 minibatchSize
シーケンスの数 ではなく 、これらのシーケンス内の項目の数を参照します。
SGD は、サンプルの合計を超 minibatchSize
えないミニバッチにできるだけ多くのシーケンスを収めようとします。
複数の入力を指定した場合、いずれかの入力が minibatchSize を超えるまで、テンソルが現在のミニバッチに追加されます。
重要なのは、シーケンシャル データの場合、サンプルはシーケンスの個々の項目です。
したがって、CNTKはminibatchSize
ミニバッチ内のシーケンスの数ではなく、ミニバッチを構成するシーケンス全体のシーケンス項目/トークンの集計数を参照します。
CNTKは可変長シーケンスをネイティブにサポートしています。つまり、バケットなどの回避策を必要とせずに、同じミニバッチ内で非常に多様な長さのシーケンスに対応できます。
(ミニバッチ平均ではなく) サンプルごとの学習率を指定するCNTKの概念と共に、任意の長さのシーケンスのすべての項目がグラデーションに同じ影響を与え、一貫した収束につながります。
(他の多くのツールキットでは、シーケンシャル データのミニバッチ サイズをミニバッチ内のシーケンスの数として定義しています。これは問題です。特に、グラデーションがCNTKのミニバッチ合計ではなくミニバッチ平均として定義されている場合は、シーケンス内の各トークンまたはステップからのグラデーションへの寄与がシーケンス長に反比例するためです。CNTKのアプローチではこれを回避できます。
複数 Input{}
の s を使用する場合、すべての入力のシーケンス長が同じではない可能性があります。
たとえば、シーケンス分類では、各シーケンスのラベルは 1 つのトークンです。
この場合、サンプル数が最も多い入力によってミニバッチ サイズが制御されます。 (一部の入力を指定することで、この動作をdefinesMbSize=True
変更できます。その後、ミニバッチ サイズはこの特定の入力のシーケンスに基づいてカウントされます。複数の入力が指定されている場合は、1 つの入力のみを .) にTrue
設定できますdefinesMbSize
。
モデルの minibatchSize
更新間のサンプル数であるという明確な定義にもかかわらず、定義を緩和する必要がある場合は 2 つあります。
- シーケンシャル データ: 可変長シーケンスは、通常、要求されたミニバッチ サイズと正確には合計されません。 この場合、可能な限り多くのシーケンスが、要求されたミニバッチ サイズを超えずにミニバッチにパックされます (ただし、ランダム化されたコーパス内の次の 1 つのシーケンスがミニバッチ サイズの長さを超える場合、ミニバッチ サイズはこのシーケンスで構成されます)。
- データ並列処理: ここでは、チャンクベースのランダム化アルゴリズムでは、各ワーカーが正確に同じ数のサンプルを受信することを保証できないため、ミニバッチサイズはおおよそのものです。
上記の考慮事項はすべて適用 epochSize
されますが、 epochSize
いくつかの違い があります。こちらを参照してください。