DML_ADAM_OPTIMIZER_OPERATOR_DESC構造体 (directml.h)
Adam (ADAptive Moment 推定) アルゴリズムに基づいて、指定された勾配を使用して、更新された重み (パラメーター) を計算します。 この演算子はオプティマイザーであり、通常、勾配降下を実行するためにトレーニング ループの重み更新ステップで使用されます。
この演算子は、次の計算を実行します。
X = InputParametersTensor
M = InputFirstMomentTensor
V = InputSecondMomentTensor
G = GradientTensor
T = TrainingStepTensor
// Compute updated first and second moment estimates.
M = Beta1 * M + (1.0 - Beta1) * G
V = Beta2 * V + (1.0 - Beta2) * G * G
// Compute bias correction factor for first and second moment estimates.
Alpha = sqrt(1.0 - pow(Beta2, T)) / (1.0 - pow(Beta1, T))
X -= LearningRate * Alpha * M / (sqrt(V) + Epsilon)
OutputParametersTensor = X
OutputFirstMomentTensor = M
OutputSecondMomentTensor = V
この演算子は、更新された重みパラメーター ( OutputParametersTensor で返される) を計算するだけでなく、 OutputFirstMomentTensor と OutputSecondMomentTensor で更新された 1 番目と 2 番目のモーメントの推定値をそれぞれ返します。 通常、これらの最初と 2 番目のモーメントの推定値を格納し、後続のトレーニング ステップ中に入力として指定する必要があります。
構文
struct DML_ADAM_OPTIMIZER_OPERATOR_DESC {
const DML_TENSOR_DESC *InputParametersTensor;
const DML_TENSOR_DESC *InputFirstMomentTensor;
const DML_TENSOR_DESC *InputSecondMomentTensor;
const DML_TENSOR_DESC *GradientTensor;
const DML_TENSOR_DESC *TrainingStepTensor;
const DML_TENSOR_DESC *OutputParametersTensor;
const DML_TENSOR_DESC *OutputFirstMomentTensor;
const DML_TENSOR_DESC *OutputSecondMomentTensor;
FLOAT LearningRate;
FLOAT Beta1;
FLOAT Beta2;
FLOAT Epsilon;
};
メンバー
InputParametersTensor
型: const DML_TENSOR_DESC*
このオプティマイザーを適用するパラメーター (重み) を含むテンソル。 グラデーション、第 1、第 2 のモーメント推定値、現在のトレーニング ステップ、およびハイパーパラメーター LearningRate、 Beta1、 Beta2 は、このテンソルで指定された重み値に対して勾配降下を実行するために、この演算子によって使用されます。
InputFirstMomentTensor
型: const DML_TENSOR_DESC*
各重み値の勾配の最初のモーメント推定値を含むテンソル。 通常、これらの値は 、OutputFirstMomentTensor を使用して、この演算子を前回実行した結果として取得されます。
このオプティマイザーを一連の重み付けに初めて適用する場合 (たとえば、最初のトレーニング ステップの間)、このテンソルの値は通常 0 に初期化する必要があります。 後続の実行では、 OutputFirstMomentTensor で返される値を使用する必要があります。
このテンソルの サイズ と DataType は 、InputParametersTensor のものと完全に一致している必要があります。
InputSecondMomentTensor
型: const DML_TENSOR_DESC*
各重み値の勾配の 2 番目のモーメント推定値を含むテンソル。 通常、これらの値は 、OutputSecondMomentTensor を使用して、この演算子を前回実行した結果として取得されます。
このオプティマイザーを一連の重み付けに初めて適用する場合 (たとえば、最初のトレーニング ステップの間)、このテンソルの値は通常 0 に初期化する必要があります。 後続の実行では、 OutputSecondMomentTensor で返される値を使用する必要があります。
このテンソルの サイズ と DataType は 、InputParametersTensor のものと完全に一致している必要があります。
GradientTensor
型: const DML_TENSOR_DESC*
勾配降下の入力パラメーター (重み) に適用するグラデーション。 グラデーションは通常、トレーニング中にバックプロパティ パスで取得されます。
このテンソルの サイズ と DataType は 、InputParametersTensor のものと完全に一致している必要があります。
TrainingStepTensor
型: const DML_TENSOR_DESC*
現在のトレーニング ステップ数を表す 1 つの整数値を含むスカラー テンソル。 この値と Beta1 および Beta2 は、第 1 および第 2 のモーメント推定テンソルの指数減衰を計算するために使用されます。
通常、トレーニング ステップの値はトレーニングの開始時に 0 から始まり、連続するトレーニング ステップごとに 1 ずつインクリメントされます。 この演算子はトレーニング ステップの値を更新しません。DML_OPERATOR_ELEMENT_WISE_ADD を使用するなど、手動で行う必要があります。
このテンソルはスカラー (つまり、1 に等しいすべての サイズ ) であり、データ型 DML_TENSOR_DATA_TYPE_UINT32必要があります。
OutputParametersTensor
型: const DML_TENSOR_DESC*
グラデーション降下が適用された後に更新されたパラメーター (重み) の値を保持する出力テンソル。
バインド中、このテンソルは、このテンソルのインプレース更新を実行するために使用できる、適格な入力テンソルの別名を付けることができます。 詳細については、「 解説 」セクションを参照してください。
このテンソルの サイズ と DataType は 、InputParametersTensor のものと完全に一致している必要があります。
OutputFirstMomentTensor
型: const DML_TENSOR_DESC*
更新された最初の瞬間の推定値を含む出力テンソル。 このテンソルの値を格納し、後続のトレーニング 手順で InputFirstMomentTensor に指定する必要があります。
バインド中、このテンソルは、このテンソルのインプレース更新を実行するために使用できる、適格な入力テンソルの別名を付けることができます。 詳細については、「 解説 」セクションを参照してください。
このテンソルの サイズ と DataType は 、InputParametersTensor のものと完全に一致している必要があります。
OutputSecondMomentTensor
型: const DML_TENSOR_DESC*
更新された 2 番目のモーメント推定値を含む出力テンソル。 このテンソルの値を格納し、後続のトレーニング 手順で InputSecondMomentTensor に指定する必要があります。
バインド中、このテンソルは、このテンソルのインプレース更新を実行するために使用できる、適格な入力テンソルの別名を付けることができます。 詳細については、「 解説 」セクションを参照してください。
このテンソルの サイズ と DataType は 、InputParametersTensor のものと完全に一致している必要があります。
LearningRate
型: float
学習率は、一般に ステップ サイズとも呼ばれます。 学習率は、各トレーニング ステップの勾配ベクトルに沿った重みの更新の大きさを決定するハイパーパラメーターです。
Beta1
型: float
勾配の最初のモーメント推定値の指数減衰率を表すハイパーパラメーター。 この値は 0.0 から 1.0 の間である必要があります。 値 0.9f は一般的です。
Beta2
型: float
勾配の 2 番目のモーメント推定値の指数減衰率を表すハイパーパラメーター。 この値は 0.0 から 1.0 の間である必要があります。 値 0.999f が一般的です。
Epsilon
型: float
ゼロ除算を防ぐことで数値の安定性を向上させるために使用される小さな値。 32 ビット浮動小数点入力の場合、一般的な値には 1e から 8 または FLT_EPSILON
が含まれます。
解説
この演算子はインプレース実行をサポートしています。つまり、各出力テンソルは、バインド中に適格な入力テンソルのエイリアスを設定できます。 たとえば、入力パラメーターのインプレース更新を効果的に実現するために、 InputParametersTensor と OutputParametersTensor の両方に同じリソースをバインドできます。 TrainingStepTensor を除き、この演算子のすべての入力テンソルは、この方法でエイリアス化される資格があります。
可用性
この演算子は で DML_FEATURE_LEVEL_3_0
導入されました。
テンソル制約
GradientTensor、 InputFirstMomentTensor、 InputParametersTensor、 InputSecondMomentTensor、 OutputFirstMomentTensor、 OutputParametersTensor、 OutputSecondMomentTensor は、 同じ DataType、 DimensionCount、および Sizes である必要があります。
Tensor のサポート
テンソル | 種類 | Dimensions | サポートされているディメンション数 | サポートされるデータ型 |
---|---|---|---|---|
InputParametersTensor | 入力 | { D0, D1, D2, D3 } | 4 | FLOAT32、FLOAT16 |
InputFirstMomentTensor | 入力 | { D0, D1, D2, D3 } | 4 | FLOAT32、FLOAT16 |
InputSecondMomentTensor | 入力 | { D0, D1, D2, D3 } | 4 | FLOAT32、FLOAT16 |
GradientTensor | 入力 | { D0, D1, D2, D3 } | 4 | FLOAT32、FLOAT16 |
TrainingStepTensor | 入力 | { 1, 1, 1, 1 } | 4 | FLOAT32、FLOAT16 |
OutputParametersTensor | 出力 | { D0, D1, D2, D3 } | 4 | FLOAT32、FLOAT16 |
OutputFirstMomentTensor | 出力 | { D0, D1, D2, D3 } | 4 | FLOAT32、FLOAT16 |
OutputSecondMomentTensor | 出力 | { D0, D1, D2, D3 } | 4 | FLOAT32、FLOAT16 |
要件
サポートされている最小のクライアント | Windows 10 ビルド 20348 |
サポートされている最小のサーバー | Windows 10 ビルド 20348 |
Header | directml.h |