다음을 통해 공유


DML_ADAM_OPTIMIZER_OPERATOR_DESC 구조체(directml.h)

Adam(ADAptiveMoment estimation) 알고리즘을 기반으로 제공된 그라데이션을 사용하여 업데이트된 가중치(매개 변수)를 계산합니다. 이 연산자는 최적화 프로그램이며 일반적으로 학습 루프의 가중치 업데이트 단계에서 그라데이션 하강을 수행하는 데 사용됩니다.

이 연산자는 다음 계산을 수행합니다.

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 에서 업데이트된 첫 번째 및 두 번째 순간 추정치를 반환 합니다. 일반적으로 이러한 첫 번째 및 두 번째 순간 추정치를 저장하고 후속 학습 단계에서 입력으로 제공해야 합니다.

구문

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*

이 최적화 프로그램에 적용할 매개 변수(가중치)를 포함하는 텐서입니다. 현재 학습 단계뿐만 아니라 하이퍼 매개 변수 LearningRate, Beta1Beta2의 그라데이션, 첫 번째 및 두 번째 순간 추정값은 이 텐서에 제공된 가중치 값에 대한 그라데이션 하강을 수행하는 데 사용됩니다.

InputFirstMomentTensor

형식: const DML_TENSOR_DESC*

각 가중치 값에 대한 그라데이션의 첫 번째 순간 추정값을 포함하는 텐서입니다. 이러한 값은 일반적으로 OutputFirstMomentTensor를 통해 이 연산자의 이전 실행 결과로 가져옵니다.

이 최적화 프로그램이 처음으로 가중치 집합에 적용할 때(예: 초기 학습 단계 중) 이 텐서의 값은 일반적으로 0으로 초기화되어야 합니다. 후속 실행에서는 OutputFirstMomentTensor에 반환된 값을 사용해야 합니다.

이 텐서의 크기 및 DataTypeInputParametersTensor크기와 정확히 일치해야 합니다.

InputSecondMomentTensor

형식: const DML_TENSOR_DESC*

각 가중치 값에 대한 그라데이션의 두 번째 순간 추정값을 포함하는 텐서입니다. 이러한 값은 일반적으로 OutputSecondMomentTensor를 통해 이 연산자의 이전 실행 결과로 가져옵니다.

이 최적화 프로그램이 처음으로 가중치 집합에 적용할 때(예: 초기 학습 단계 중) 이 텐서의 값은 일반적으로 0으로 초기화되어야 합니다. 후속 실행에서는 OutputSecondMomentTensor에 반환된 값을 사용해야 합니다.

이 텐서의 크기 및 DataTypeInputParametersTensor크기와 정확히 일치해야 합니다.

GradientTensor

형식: const DML_TENSOR_DESC*

그라데이션 하강에 대한 입력 매개 변수(가중치)에 적용할 그라데이션입니다. 그라데이션은 일반적으로 학습 중에 백프로포지션 패스에서 가져옵니다.

이 텐서의 크기 및 DataTypeInputParametersTensor크기와 정확히 일치해야 합니다.

TrainingStepTensor

형식: const DML_TENSOR_DESC*

현재 학습 단계 수를 나타내는 단일 정수 값을 포함하는 스칼라 텐서입니다. 이 값은 Beta1Beta2 와 함께 첫 번째 및 두 번째 순간 추정 텐서의 지수 감쇠를 계산하는 데 사용됩니다.

일반적으로 학습 단계 값은 학습 시작 시 0에서 시작하여 각 연속 학습 단계에서 1씩 증가합니다. 이 연산자는 학습 단계 값을 업데이트하지 않습니다. 예를 들어 DML_OPERATOR_ELEMENT_WISE_ADD 사용하여 수동으로 수행해야 합니다.

이 텐서는 스칼라(즉, 모든 크기가 1과 같음)여야 하며 데이터 형식 이 DML_TENSOR_DATA_TYPE_UINT32.

OutputParametersTensor

형식: const DML_TENSOR_DESC*

그라데이션 하강이 적용된 후 업데이트된 매개 변수(가중치) 값을 보유하는 출력 텐서입니다.

바인딩하는 동안 이 텐서가 적격 입력 텐서의 별칭을 지정하도록 허용되며, 이 텐서의 현재 위치 업데이트를 수행하는 데 사용할 수 있습니다. 자세한 내용은 설명 섹션을 참조하세요.

이 텐서의 크기 및 DataTypeInputParametersTensor크기와 정확히 일치해야 합니다.

OutputFirstMomentTensor

형식: const DML_TENSOR_DESC*

업데이트된 첫 번째 순간 추정치를 포함하는 출력 텐서입니다. 이 텐서의 값을 저장하고 후속 학습 단계에서 InputFirstMomentTensor 에 제공해야 합니다.

바인딩하는 동안 이 텐서가 적격 입력 텐서의 별칭을 지정하도록 허용되며, 이 텐서의 현재 위치 업데이트를 수행하는 데 사용할 수 있습니다. 자세한 내용은 설명 섹션을 참조하세요.

이 텐서의 크기 및 DataTypeInputParametersTensor크기와 정확히 일치해야 합니다.

OutputSecondMomentTensor

형식: const DML_TENSOR_DESC*

업데이트된 두 번째 순간 추정치를 포함하는 출력 텐서입니다. 이 텐서의 값을 저장하고 후속 학습 단계에서 InputSecondMomentTensor 에 제공해야 합니다.

바인딩하는 동안 이 텐서가 적격 입력 텐서의 별칭을 지정하도록 허용되며, 이 텐서의 현재 위치 업데이트를 수행하는 데 사용할 수 있습니다. 자세한 내용은 설명 섹션을 참조하세요.

이 텐서의 크기 및 DataTypeInputParametersTensor크기와 정확히 일치해야 합니다.

LearningRate

형식: float

일반적으로 단계 크기라고도 하는 학습 속도입니다. 학습 속도는 각 학습 단계의 그라데이션 벡터를 따라 가중치 업데이트의 크기를 결정하는 하이퍼 매개 변수입니다.

Beta1

형식: float

그라데이션의 첫 번째 순간 추정값의 기하급수적 감쇠 속도를 나타내는 하이퍼 매개 변수입니다. 이 값은 0.0에서 1.0 사이여야 합니다. 0.9f 값은 일반적입니다.

Beta2

형식: float

그라데이션의 두 번째 순간 추정값의 기하급수적 감쇠율을 나타내는 하이퍼 매개 변수입니다. 이 값은 0.0에서 1.0 사이여야 합니다. 0.999f 값은 일반적입니다.

Epsilon

형식: float

0으로 나누기를 방지하여 숫자 안정성을 돕는 데 사용되는 작은 값입니다. 32비트 부동 소수점 입력의 경우 일반적인 값에는 1e-8 또는 FLT_EPSILON가 포함됩니다.

설명

이 연산자는 현재 위치 실행을 지원합니다. 즉, 각 출력 텐서가 바인딩 중에 적격 입력 텐서의 별칭을 지정하도록 허용됩니다. 예를 들어 입력 매개 변수의 현재 위치 업데이트를 효과적으로 달성하기 위해 InputParametersTensorOutputParametersTensor 모두에 대해 동일한 리소스를 바인딩할 수 있습니다. TrainingStepTensor를 제외한 이 연산자의 모든 입력 텐서에는 이러한 방식으로 별칭이 지정될 수 있습니다.

가용성

이 연산자는 에서 DML_FEATURE_LEVEL_3_0도입되었습니다.

텐서 제약 조건

GradientTensor, InputFirstMomentTensor, InputParametersTensor, InputSecondMomentTensor, OutputFirstMomentTensor, OutputParametersTensorOutputSecondMomentTensor 에는 동일한 DataType, DimensionCount크기가 있어야 합니다.

텐서 지원

텐서 Kind 차원 지원되는 차원 수 지원되는 데이터 형식
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
머리글 directml.h