CNTK v2.2 リリース ノート
- このイテレーション では 、拡張畳み込みと決定論的プールをサポートするために cuDNN 6.0 が必要です。 cuDNN を更新してください。
- このイテレーション では、 TensorBoard Image 機能をサポートするために OpenCV が必要です。 CNTKをインストールする前に OpenCV をインストールしてください。
Python ドキュメントを使用して、チュートリアルとマニュアルの HTML バージョンを追加しました。 これにより、 チュートリアル ノートブック とマニュアルも検索可能になります。
モデルの評価に関連するドキュメントが更新されました。 最新のドキュメント はこちらでご確認ください。
この作業は、テスト インフラストラクチャの更新に依存するため、次のリリースにロールオーバーされます。
NCCL を複数のマシンで使用できるようになりました。 ユーザーは、次のようにビルド構成で NCCL を有効にする必要 があります。 メモ:
- ダウンロードした NCCL 2 パッケージをインストールした後、次の 2 つのパッケージがあります。
/var/nccl-repo-2.0.4-ga/libnccl2_2.0.4-1+cuda8.0_amd64.deb
/var/nccl-repo-2.0.4-ga/libnccl-dev_2.0.4-1+cuda8.0_amd64.deb.
両方をインストールして、NCCL 2 を使用してCNTKを構築します。
- システム構成の問題により、NCCL の初期化中にエラーが発生する可能性があります。 エラーに関する詳細情報を取得するには、環境変数
NCCL_DEBUG=INFO
を設定してください。 - INFiniBand デバイスが混合 IB モードと IPoIB モードで実行されているシステムで構成されている NCCL 2 の現在のリリースでは、既知の問題があります。 IB モード デバイスのみを使用するには、IB モードで実行されている環境変数
NCCL_IB_HCA=devices
を設定してください(例:
export NCCL_IB_HCA=mlx5_0,mlx5_2
この更新プログラムにより、学習者 API が簡略化され、unitType.minibatch
UnitType.sample
および . 目的は、すべての N サンプルの平均勾配が実際のデータ ミニバッチ サイズに関係なく、モデルの更新にほぼ同じように寄与CNTK ---、固有のモデル更新手法を維持しながら、学習者のハイパー パラメーターを直感的に指定できるように API を作成することです。 詳細な説明については、CNTK学習者の使用方法に関するマニュアルを参照してください。
新しい API では、 AdaDelta、 AdaGrad、 FSAdaGrad、 Adam、 MomentumSGD、 Nesterov、 RMSProp、 SGD など、サポートされているすべての学習者を指定できるようになりました。
cntk.<cntk_supporting_learner>(parameters=model.parametes,
lr=<float or list>,
[momentum=<float or list>], [variance_momentum=<float or list>],
minibatch_size=<None, int, or cntk.learners.IGNORE>,
...other learner parameters)
次の 2 つの大きな変更があります。
lr
: 学習率のスケジュールは、float、float のリスト、またはペアのリスト (float、int) として指定できます ( learning_parameter_scheduleのパラメーター定義を参照)。 同じ仕様は、このようなハイパーパラメーターが必要な学習者、 FSAdaGrad、 Adam、 MomentumSGD、 Nesterov のモメンタムとvariance_momentにも適用されます。minibatch_size
: データの実際のミニバッチ サイズが N と異なる場合でも、すべての N (minibatch_size=N) サンプルの平均勾配が同じ学習レートでモデルの更新に寄与することを保証するために、minibatch_sizeを指定できます。これは、データ ミニバッチ のサイズが異なる場合に便利です。特に、可変長シーケンスを使用したトレーニングのシナリオや、分散トレーニングでのデータ パーティションの不均等な場合に役立ちます。- 設定
minibatch_size=cntk.learners.IGNORE
した場合、文献の動作を回復します。ミニバッチ全体の平均勾配は、同じ学習率でモデルの更新に寄与します。 データ ミニバッチ データ サイズを無視する動作は、データ ミニバッチ サイズが指定されたミニバッチ サイズと等しい場合に、学習者のミニバッチ サイズを指定する場合と同じです。
- 設定
新しい API を使用する場合:
- 従来のディープ ラーニングの文献と同じ方法でモデルの更新を行うために、ミニバッチ サイズを無視するように設定
minibatch_size=cntk.learners.IGNORE
することで、学習者を指定できます(例:
sgd_learner_m = C.sgd(z.parameters, lr = 0.5, minibatch_size = C.learners.IGNORE)
note
- 実際のミニバッチ サイズに関係なく、すべての N サンプルの平均勾配に同じ学習率を適用するCNTK特定の手法を有効にするには、設定、設定、設定など、
minibatch_size=N
学習者を指定できます。minibatch_size=2
sgd_learner_s2 = C.sgd(z.parameters, lr = 0.5, minibatch_size = 2)
FSAdaGrad、Adam、MomentumSGD、Nesterov の学習者のmomentum_scheduleについては、同様の方法で指定できます。 例として使用 momentum_sgd
してみましょう。
momentum_sgd(parameters, lr=float or list of floats, momentum=float or list of floats,
minibatch_size=C.learners.IGNORE, epoch_size=epoch_size)
momentum_sgd(parameters, lr=float or list of floats, momentum=float or list of floats,
minibatch_size=N, epoch_size=epoch_size)
同様に learning_rate_schedule
、引数は同じ方法で解釈されます。
では
minibatch_size=C.learners.IGNORE
、減衰momentum=beta
は、そのサイズに関係なく、ミニバッチ全体の平均勾配に適用されます。 たとえば、ミニバッチのサイズが N または 2N (または任意のサイズ) に関係なく、このようなミニバッチの平均勾配は同じ減衰係数ベータになります。では
minibatch_size=N
、すべての N サンプルの平均勾配に減衰momentum=beta
が適用されます。 たとえば、サイズ N、2N、3N、kN のミニバッチは、それぞれベータ、pow(ベータ、2)、pow(ベータ、3)、pow(beta、k) の減衰 ---を持ち、減衰は、指定されたミニバッチ サイズに対する実際のミニバッチ サイズの割合で指数関数的です。
これにより、既存の CNTK C# 評価 API に加えて、.NET 開発者は完全に統合されたディープ ラーニング エクスペリエンスを楽しむことができます。 ディープ ニューラル ネットワークは、C# で構築、トレーニング、検証を行いながら、CNTKパフォーマンスの強さを活かすことができます。 ユーザーはCNTKソース コードに直接デバッグして、DNN のトレーニングと評価方法を確認できます。 新機能は次のとおりです。
計算ネットワークを構築するために、100 を超える基本的な関数がサポートされています。 これらの関数には、Sigmoid、Tanh、ReLU、Plus、Minus、Convolution、Pooling、BatchNormalization などがあります。
たとえば、ロジスティック回帰損失関数を構築するには、次のようにします。
Function z = CNTKLib.Times(weightParam, input) + biasParam;
Function loss = CNTKLib.CrossEntropyWithSoftmax(z, labelVariable);
DNN は、基本的な操作構成によって構築されます。 たとえば、ResNet ノードを構築するには、次のようにします。
Function conv = CNTKLib.Pooling(CNTKLib.Convolution(convParam, input),
PoolingType.Average, poolingWindowShape);
Function resNetNode = CNTKLib.ReLU(CNTKLib.Plus(conv, input));
データの効率的な読み込みとバッチ処理に役立つ MinibatchSource ユーティリティと MinibacthData ユーティリティを提供しています。
私たちは、DNN文献で一般的に見られる多くの確率的勾配降下オプティマイザをサポートしています:MomentumSGDLearner、AdamLearner、AdaGradLearnerなど。たとえば、ADAM 確率オプティマイザーを使用してモデルをトレーニングするには、次のようにします。
var parameterLearners = new List<Learner>() { Learner.AdamLearner(classifierOutput.Parameters(),
learningRate, momentum) };
var trainer = Trainer.CreateTrainer(classifierOutput, trainingLoss,
prediction, parameterLearners);
トレーニングの例では、DNN の広範なユース ケースについて説明します。
- C#/API を使用してロジスティック回帰モデルをトレーニングおよび評価する hello-world の例: https://github.com/Microsoft/CNTK/tree/release/latest/Examples/TrainingCSharp/Common/LogisticRegression.cs
- MNIST データセットの画像分類のための畳み込みニューラル ネットワーク: https://github.com/Microsoft/CNTK/tree/release/latest/Examples/TrainingCSharp/Common/MNISTClassifier.cs
- C#/.NET API を使用して ResNet モデルを構築、トレーニング、評価します。
https://github.com/Microsoft/CNTK/tree/release/latest/Examples/TrainingCSharp/Common/CifarResNetClassifier.cs - C#/.NET API を使用した学習の転送:
https://github.com/Microsoft/CNTK/tree/release/latest/Examples/TrainingCSharp/Common/TransferLearning.cs - C#/.NET API を使用して LSTM シーケンス分類子を構築してトレーニングします。 https://github.com/Microsoft/CNTK/tree/release/latest/Examples/TrainingCSharp/Common/LSTMSequenceClassifier.cs
トレーニングと評価の両方を可能にするCNTKの R バインディングは、まもなく別のリポジトリに公開されます。
- Fast R-CNN での境界ボックス回帰と VGG モデルのサポート。
- 高速 R-CNN オブジェクト検出に関するドキュメントの新しいチュートリアルと、高速 R-CNN に関する更新されたチュートリアル。
- さまざまな検出機能、基本モデル、データ セットを選択できるオブジェクト検出デモ スクリプト。
新しい C++ の例と CNTKLibraryCPPEvalCPUOnlyExamples
CNTKLibraryCPPEvalGPUExamples
. C++ CNTK ライブラリを使用して CPU と GPU のモデル評価を行う方法について説明します。 もう 1 つの新しい例として、UWPImageRecognition があります。これは、モデル評価CNTK UWP ライブラリを使用する例です。
非同期評価の例を追加しました。 EvaluationSingleImageAsync()
1 つは、評価が CPU バインド操作であるため、C# API に Evaluate() の非同期メソッドがないCNTKです (詳細については、この記事を参照してください)。 ただし、応答性のためのオフロードなど、一部のユース ケースでは評価を非同期的に実行することが望まれます。この例 EvaluationSingleImageAsync()
では、拡張メソッド EvaluateAsync()
を使用してそれを実現する方法を示します。 詳細については、「C#/.NET マネージ API を使用する」ページで「評価を非同期に実行する」セクションを参照してください。
- 中間レイヤーの評価:
EvaluateIntermediateLayer()
- 複数のノードからの出力の評価:
EvaluateCombinedOutputs()
これにより、クラスの数が非常に多い場合にネットワークのトレーニングに使用される効率的な (ただし近似的な) 損失関数が組み込まれています。 たとえば、数十から数十万の単語の語彙から次の単語を予測する場合に使用できます。
これを使用するには、損失を次のように定義します。
loss = nce_loss(weights, biases, inputs, labels, noise_distribution)
トレーニングが完了したら、次のような予測を行うことができます
logits = C.times(weights, C.reshape(inputs, (1,), 1)) + biases
ノイズの対照的な推定損失は、推論コストを削減するのに役立つことはできません。コスト削減はトレーニング中のみです。
AttentionModel レイヤーのバグが修正され、このペーパーを忠実に実装するようになりました
アラインメントと翻訳を共同でラーニングするニューラル機械翻訳 (Bahdanau ら)
さらに、引数 attention_span
と attention_axis
AttentionModel は 非推奨となりました。 これらは既定値のままにする必要があります。この場合、シーケンス全体に対して注意が計算され、出力は 2 番目の引数の軸に対する最初の引数と同じ次元のベクトルのシーケンスになります。
これはまた、大幅な速度向上につながります(CNTK 204チュートリアルは2倍以上速く実行されるようになりました)。
この変更により、ボキャブラリ のサイズを埋め込むときに、グラデーション集計の前にコストのかかる変換がスパースから高密度に節約されます。 現在、非量子化データ並列 SGD を使用した GPU でのトレーニング時に GPU ビルドに対して有効になっています。 他の分散学習者と CPU ビルドの場合、既定では無効になっています。 これは、Python cntk.cntk_py.use_sparse_gradient_aggregation_in_data_parallel_sgd(False)
で手動でオフにすることができます. GPU ビルドで CPU デバイスを使用して分散トレーニングを実行するまれなケースでは、実装されていない例外を回避するために手動でオフにする必要があることに注意してください
convolution
convolution_transpose
1 ではなく 0 に設定reductionRank
して、チャネルディメンションまたは深度ディメンションのないデータをサポートするようになりました。 この変更の目的は、形状変更を通じてダミー チャネル ディメンションを挿入することなく、ジオメトリ データをネイティブにサポートする機能を追加することです。
BrainScript、C++、Python API によって公開される GPU での拡張畳み込みのサポートが追加されました。 拡張畳み込みでは、実際には大きなカーネルを必要とせずに、カーネルサイズを効果的に増加させます。 拡張畳み込みを使用するには、少なくとも cuDNN 6.0 が必要です。 拡張畳み込みにより、画像セグメント化 https://arxiv.org/pdf/1511.07122.pdfの結果が改善され、必要なメモリを増やすことなく受け入れフィールドが指数関数的に増加しました。 注意すべき点の1つは、現在、CPUに拡張畳み込みの実装がないため、CPU上の拡張畳み込みを含むモデルを評価することはできません。
- 畳み込み用の無料の静的軸
FreeDimension
のサポートを追加しました。 これにより、入力テンソルサイズをミニバッチからミニバッチに変更できます。 たとえば、CNN の場合、これにより、各ミニバッチの基になるイメージ サイズが異なる可能性があります。 プール ノードでも同様のサポートが有効になっています。 - 物体検出の高速 R-CNN の例では、畳み込みの無料の静的軸のサポートがまだ活用されていないことに注意してください (つまり、入力画像を固定サイズにスケーリングして埋め込みます)。 この例は、任意の入力イメージ サイズに空き静的軸を使用するように更新されており、次のリリースを対象としています。
これで、呼び出し cntk.debug.force_deterministic()
は最大および平均プール決定論的になります。この動作は cuDNN バージョン 6 以降に依存します。
画像セグメント化ネットワークをサポートする動機として、トリミング ノードを C++ と Python API に追加しました。 トリミング ノードは、空間軸に沿って最初の入力をトリミングし、結果が 2 番目の (参照) 入力の空間サイズと一致するようにします。 非空間ディメンションはすべて変更されません。 トリミング オフセットは、ネットワークを走査し、2 つの入力のアクティブ化間で受け入れフィールドの中心を照合することによって、直接指定するか、自動的に計算できます
この作業は、テスト インフラストラクチャの更新に依存するため、次のリリースにロールオーバーされます。
Keras とCNTKに対して並列トレーニングを実施する方法を詳しく説明する記事を追加しました。 詳細 はこちらをご覧ください。
TensorBoard のイメージ機能のサポートを追加しました。 CNTKユーザーは TensorBoard を使用して画像を表示できるようになりました。 詳細と例 については、こちらを参照してください。
私たちは、彼らの貢献のために次のコミュニティメンバーに感謝します:+
- @arturl
- @chentaMS
- @cijianzy
- @DaveyBiggers
- @duli2012
- @eldakms
- @FDecaYed
- @junjieqian
- @karolzak
- @KGWANGMIN
- @mnidza
- @ottolu
- @raaaar
- @StillKeepTry
- @taehoonlee
- @vmazalov
これらのリリース ノートで見過ごした可能性のあるコミュニティへの投稿についてお詫び申し上げます。