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, Beta1 및 Beta2의 그라데이션, 첫 번째 및 두 번째 순간 추정값은 이 텐서에 제공된 가중치 값에 대한 그라데이션 하강을 수행하는 데 사용됩니다.
InputFirstMomentTensor
형식: const DML_TENSOR_DESC*
각 가중치 값에 대한 그라데이션의 첫 번째 순간 추정값을 포함하는 텐서입니다. 이러한 값은 일반적으로 OutputFirstMomentTensor를 통해 이 연산자의 이전 실행 결과로 가져옵니다.
이 최적화 프로그램이 처음으로 가중치 집합에 적용할 때(예: 초기 학습 단계 중) 이 텐서의 값은 일반적으로 0으로 초기화되어야 합니다. 후속 실행에서는 OutputFirstMomentTensor에 반환된 값을 사용해야 합니다.
이 텐서의 크기 및 DataType은 InputParametersTensor의 크기와 정확히 일치해야 합니다.
InputSecondMomentTensor
형식: const DML_TENSOR_DESC*
각 가중치 값에 대한 그라데이션의 두 번째 순간 추정값을 포함하는 텐서입니다. 이러한 값은 일반적으로 OutputSecondMomentTensor를 통해 이 연산자의 이전 실행 결과로 가져옵니다.
이 최적화 프로그램이 처음으로 가중치 집합에 적용할 때(예: 초기 학습 단계 중) 이 텐서의 값은 일반적으로 0으로 초기화되어야 합니다. 후속 실행에서는 OutputSecondMomentTensor에 반환된 값을 사용해야 합니다.
이 텐서의 크기 및 DataType은 InputParametersTensor의 크기와 정확히 일치해야 합니다.
GradientTensor
형식: const DML_TENSOR_DESC*
그라데이션 하강에 대한 입력 매개 변수(가중치)에 적용할 그라데이션입니다. 그라데이션은 일반적으로 학습 중에 백프로포지션 패스에서 가져옵니다.
이 텐서의 크기 및 DataType은 InputParametersTensor의 크기와 정확히 일치해야 합니다.
TrainingStepTensor
형식: const DML_TENSOR_DESC*
현재 학습 단계 수를 나타내는 단일 정수 값을 포함하는 스칼라 텐서입니다. 이 값은 Beta1 및 Beta2 와 함께 첫 번째 및 두 번째 순간 추정 텐서의 지수 감쇠를 계산하는 데 사용됩니다.
일반적으로 학습 단계 값은 학습 시작 시 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*
업데이트된 두 번째 순간 추정치를 포함하는 출력 텐서입니다. 이 텐서의 값을 저장하고 후속 학습 단계에서 InputSecondMomentTensor 에 제공해야 합니다.
바인딩하는 동안 이 텐서가 적격 입력 텐서의 별칭을 지정하도록 허용되며, 이 텐서의 현재 위치 업데이트를 수행하는 데 사용할 수 있습니다. 자세한 내용은 설명 섹션을 참조하세요.
이 텐서의 크기 및 DataType은 InputParametersTensor의 크기와 정확히 일치해야 합니다.
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
가 포함됩니다.
설명
이 연산자는 현재 위치 실행을 지원합니다. 즉, 각 출력 텐서가 바인딩 중에 적격 입력 텐서의 별칭을 지정하도록 허용됩니다. 예를 들어 입력 매개 변수의 현재 위치 업데이트를 효과적으로 달성하기 위해 InputParametersTensor 및 OutputParametersTensor 모두에 대해 동일한 리소스를 바인딩할 수 있습니다. TrainingStepTensor를 제외한 이 연산자의 모든 입력 텐서에는 이러한 방식으로 별칭이 지정될 수 있습니다.
가용성
이 연산자는 에서 DML_FEATURE_LEVEL_3_0
도입되었습니다.
텐서 제약 조건
GradientTensor, InputFirstMomentTensor, InputParametersTensor, InputSecondMomentTensor, OutputFirstMomentTensor, OutputParametersTensor 및 OutputSecondMomentTensor 에는 동일한 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 |