次の方法で共有


CNTKでのepoch_size、minibatch_size_in_samples、MinibatchSource.next_minibatchの解釈

この記事では、Python での次のパラメーターと関数の解釈と使用方法について説明します。

epoch_size

各エポック内の ラベル サンプル (動的軸に沿ったテンソル) の数。 epoch_size in CNTK は、特定の追加アクションが実行された後のラベル サンプルの数です。

  • チェックポイント モデルの保存 (ここからトレーニングを再開できます)
  • クロス検証
  • 学習率の制御
  • minibatch-scaling

ラベル サンプルの数の定義は、minibatch_size_in_samplesに使用されるサンプルの数に似ている点に注意 してください。 の定義epoch_sizeは、入力サンプルではなくラベルサンプルであるというepoch_size意味での定義minibatch_size_in_samplesとは異なります。

したがって、重要なのは、シーケンシャル データの場合、サンプルはシーケンスの個々の項目です。 したがって、CNTKは多数のepoch_sizeシーケンスではなく、ミニバッチを構成するシーケンス ラベル全体のシーケンス項目の数を参照します

同様に重要なのは、 epoch_size 入力サンプルではなく ラベル サンプルを指し、シーケンスあたりのラベルの数が必ずしも入力サンプルの数であるとは限りません。 たとえば、シーケンスごとに 1 つのラベルを持ち、各シーケンスに多数のサンプル (その場合 epoch_size はシーケンスの数のように機能) を持つことも可能であり、シーケンス内のサンプルごとに 1 つのラベルを持つことができます。その場合 epoch_size 、すべてのサンプル (シーケンスではなく) がカウントされる場合とまったく同じように minibatch_size_in_samples 機能します。

データセット サイズが小さい場合、多くの場合、 epoch_size データセット のサイズと同じ値が設定されます。 Python では、これを指定 cntk.io.INFINITELY_REPEAT できます。 Python でのみ、データ サイズ全体を cntk.io.FULL_DATA_SWEEP1 回渡した後に処理が停止するように設定することもできます。

大規模なデータ セットの場合は、チェックポイント処理を使用して選択 epoch_size をガイドすることができます。 たとえば、停電やネットワーク障害が発生した場合に最大 30 分の計算を失う場合は、約 30 分ごとにチェックポイントを作成する必要があります (そこからトレーニングを再開できます)。 計算に約 30 分かかるサンプルの数を選択 epoch_size します。

minibatch_size_in_samples

注: BrainScript ユーザーの場合、ミニバッチ サイズのパラメーターは minibatchSize、Python ユーザーの場合は > です minibatch_size_in_samples

CNTKには、パラメーターのminibatch_size_in_samples非常に具体的な定義があります。これは、モデルの更新間のサンプル数を示します。 ここでの サンプル は、システムを流れる 1 つのベクトルまたはテンソルとして定義されています。 たとえば、画像認識タスクでは、1 つの画像が 1 つのサンプルです。

各エポックのミニバッチ サイズは 、サンプル (動的軸に沿ったテンソル) で指定されます。 既定値は 256 です。 エポックごとに異なる値を使用できます。たとえば、 128*2 + 1024 (Python では) 最初の 2 つのエポックに 128、残りのエポックに 1024 のミニバッチ サイズを使用します。 CNTKの "ミニバッチ サイズ" は、モデルの更新間に処理されたサンプルの数を意味します。 この定義は、ワーカー間で並列化する場合にも保持されます (たとえば、worker の場合K、各ワーカーが処理するサンプルの数)。minibatch_size_in_samples/K 可変長入力の場合は、 minibatch_size_in_samples シーケンスの数 ではなく 、これらのシーケンス内の項目の数を参照します。 SGD は、サンプルの合計を超 minibatch_size_in_samples えないミニバッチにできるだけ多くのシーケンスを収めようとします。 複数の入力を指定した場合、いずれかの入力が 1 つを超えるまで、テンソルが現在のミニバッチに minibatch_size_in_samples追加されます。

重要なのは、シーケンシャル データの場合、サンプルはシーケンスの個々の項目です。 したがって、CNTKはminibatch_size_in_samplesミニバッチ内のシーケンスの数ではなく、ミニバッチを構成するシーケンス全体のシーケンス項目/トークンの集計数を参照します。 CNTKは可変長シーケンスをネイティブにサポートしています。つまり、バケットなどの回避策を必要とせずに、同じミニバッチ内で非常に多様な長さのシーケンスに対応できます。 (ミニバッチ平均ではなく) サンプルごとの学習率を指定するCNTKの概念と共に、任意の長さのシーケンスのすべての項目がグラデーションに同じ影響を与え、一貫した収束につながります。 (他の多くのツールキットでは、シーケンシャル データのミニバッチ サイズをミニバッチ内のシーケンスの数として定義しています。これは問題です。特に、グラデーションがCNTKのミニバッチ合計ではなくミニバッチ平均として定義されている場合は、シーケンス内の各トークンまたはステップからのグラデーションへの寄与がシーケンス長に反比例するためです。CNTKのアプローチではこれを回避できます。

複数の入力を使用する場合、すべての入力のシーケンス長が同じではない可能性があります。 たとえば、シーケンス分類では、各シーケンスのラベルは 1 つのトークンです。 この場合、サンプル数が最も多い入力によってミニバッチ サイズが制御されます。 (一部の入力を指定することで、この動作をdefines_mb_size=True変更できます。その後、ミニバッチ サイズはこの特定の入力のシーケンスに基づいてカウントされます。複数の入力が指定されている場合は、1 つの入力のみを .) にTrue設定できますdefines_mb_size

モデルの minibatch_size_in_samples 更新間のサンプル数であるという明確な定義にもかかわらず、定義を緩和する必要がある場合は 2 つあります。

  • シーケンシャル データ: 可変長シーケンスは、通常、要求されたミニバッチ サイズと正確には合計されません。 この場合、可能な限り多くのシーケンスが、要求されたミニバッチ サイズを超えずにミニバッチにパックされます (ただし、ランダム化されたコーパス内の次の 1 つのシーケンスがミニバッチ サイズの長さを超える場合、ミニバッチ サイズはこのシーケンスで構成されます)。
  • データ並列処理: ここでは、チャンクベースのランダム化アルゴリズムでは、各ワーカーが正確に同じ数のサンプルを受信することを保証できないため、ミニバッチサイズはおおよそのものです。

上記の考慮事項はすべて適用 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

実装により、時間 (場所N = number_of_training_samples/minibatch_size_in_samples) と呼ばれるNときにnext_minibatch、トレーニング データセット全体が呼び出しnext_minibatchの最後にNカバーされるようになります。 これは、時間と呼ばれる2*Nnext_minibatchき、データセット全体が 2 回カバーされることを意味します。

追加情報:

  • データを循環するたびに、ランダムな順序が異なります。
  • ミニバッチのサイズを 2 倍にすると、1 つのミニバッチに、対応する 2 つの連続するミニバッチが含まれるサンプルが正確に含まれるようになります (可変長シーケンスがある場合は近似値になる可能性があります)。 つまり、ミニバッチ サイズのみが異なる 2 回の実行では、データが同じ順序で処理されます。
  • チェックポイントを中断して再起動すると、トレーニングを中断しなかった場合と同じランダムな順序が得られます。 これは、この単純なアルゴリズムを使用して、標準時間軸で読み取り/ランダム化プロセスを接地することによって実装されます。
    • トレーニングは、わずかな無限時間軸で進行します。 サイズ 256 のミニバッチをフェッチすると、標準時間は 256 ずつ進行します。
    • トレーニング コーパスは、この時間軸で無限の回数だけレプリケートされます。 サンプルがある M 場合、最初のレプリカは標準時間 0..M-1、2 番目 M..2M-1のレプリカなどです。
    • 各レプリカは、レプリカの境界を越えてではなく、ランダムにシャッフルされます。 つまり、正確に M サンプルを処理したら、各サンプルを正確に 1 回見てきました。
    • 呼び出すと next_minibatch(K) 、この再シャッフされた無限タイムラインの次 K のサンプルが提供されます。 これは、時間の呼び出しnext_minibatch(1)Kと同じです。
    • これはすべて遅く行われます。
    • チェックポイントからの再開は、標準時間をチェックポイントが作成された標準時刻にリセットするのと同じくらい簡単です。