주요 콘텐츠

dlgradient

자동 미분을 사용하여 사용자 지정 훈련 루프 기울기 계산

설명

dlgradient 함수는 자동 미분을 사용하여 도함수를 계산합니다.

대부분의 딥러닝 작업의 경우, 사전 훈련된 신경망을 사용하고 이를 사용자 자신의 데이터에 맞게 적응시킬 수 있습니다. 새로운 영상 세트를 분류할 수 있도록 전이 학습을 사용하여 컨벌루션 신경망을 다시 훈련시키는 방법을 보여주는 예제는 Retrain Neural Network to Classify New Images 항목을 참조하십시오. 또는 trainnet 함수와 trainingOptions 함수를 사용하여 신경망을 처음부터 만들고 훈련시킬 수 있습니다.

trainingOptions 함수가 작업에 필요한 훈련 옵션을 제공하지 않는다면 자동 미분을 사용하여 사용자 지정 훈련 루프를 만들 수 있습니다. 자세한 내용은 사용자 지정 훈련 루프를 사용하여 신경망 훈련시키기 항목을 참조하십시오.

trainnet 함수가 작업에 필요한 손실 함수를 제공하지 않는다면 사용자 지정 손실 함수를 trainnet에 함수 핸들로 지정할 수 있습니다. 예측값과 목표값보다 더 많은 입력값이 필요한 손실 함수(예: 신경망 또는 추가 입력값에 액세스해야 하는 손실 함수)의 경우 사용자 지정 훈련 루프를 사용하여 모델을 훈련시킵니다. 자세한 내용은 사용자 지정 훈련 루프를 사용하여 신경망 훈련시키기 항목을 참조하십시오.

Deep Learning Toolbox™가 작업에 필요한 계층을 제공하지 않는다면 사용자 지정 계층을 만들 수 있습니다. 자세한 내용은 사용자 지정 딥러닝 계층 정의하기 항목을 참조하십시오. 계층 신경망으로 지정할 수 없는 모델의 경우 모델을 함수로 정의할 수 있습니다. 자세한 내용은 Train Network Using Model Function 항목을 참조하십시오.

어느 훈련 방법을 어느 작업에 사용해야 하는지에 대한 자세한 내용은 Train Deep Learning Model in MATLAB 항목을 참조하십시오.

[dydx1,...,dydxk] = dlgradient(y,x1,...,xk)는 변수 x1부터 xk까지에 대한 y의 기울기를 반환합니다.

dlfeval에 전달된 함수 내에서 dlgradient를 호출합니다. 자동 미분을 사용하여 기울기 계산하기Use Automatic Differentiation In Deep Learning Toolbox 항목을 참조하십시오.

예제

[dydx1,...,dydxk] = dlgradient(y,x1,...,xk,Name,Value)는 기울기를 반환하고 하나 이상의 이름-값 쌍을 사용하여 추가 옵션을 지정합니다. 예를 들어 dydx = dlgradient(y,x,'RetainData',true)를 사용하면 후속 dlgradient 호출에 재사용할 수 있도록 기울기에 중간값이 유지됩니다. 이 구문은 시간은 절약할 수 있으나, 메모리를 더 많이 사용합니다. 자세한 내용은 항목을 참조하십시오.

예제

모두 축소

로젠브록 함수는 최적화를 위한 표준 테스트 함수입니다. rosenbrock.m 헬퍼 함수는 함수 값을 계산하고, 자동 미분을 사용하여 기울기를 구합니다.

type rosenbrock.m
function [y,dydx] = rosenbrock(x)

y = 100*(x(2) - x(1).^2).^2 + (1 - x(1)).^2;
dydx = dlgradient(y,x);

end

로젠브록 함수를 실행하고 점 [–1,2]에서의 기울기를 계산하려면, 그 점의 dlarray를 만든 다음 함수 핸들 @rosenbrock에 대해 dlfeval을 호출합니다.

x0 = dlarray([-1,2]);
[fval,gradval] = dlfeval(@rosenbrock,x0)
fval = 
  1×1 dlarray

   104

gradval = 
  1×2 dlarray

   396   200

또는 로젠브록 함수를 두 입력값 x1과 x2의 함수로 정의합니다.

type rosenbrock2.m
function [y,dydx1,dydx2] = rosenbrock2(x1,x2)

y = 100*(x2 - x1.^2).^2 + (1 - x1).^2;
[dydx1,dydx2] = dlgradient(y,x1,x2);

end

dlfeval을 호출하여, 입력값 –12를 나타내는 두 dlarray 인수에 대해 rosenbrock2를 실행합니다.

x1 = dlarray(-1);
x2 = dlarray(2);
[fval,dydx1,dydx2] = dlfeval(@rosenbrock2,x1,x2)
fval = 
  1×1 dlarray

   104

dydx1 = 
  1×1 dlarray

   396

dydx2 = 
  1×1 dlarray

   200

단위 정사각형 내의 여러 점에 대한 로젠브록 함수 기울기를 플로팅합니다. 먼저, 계산 지점과 함수 출력값을 나타내는 배열을 초기화합니다.

[X1 X2] = meshgrid(linspace(0,1,10));
X1 = dlarray(X1(:));
X2 = dlarray(X2(:));
Y = dlarray(zeros(size(X1)));
DYDX1 = Y;
DYDX2 = Y;

루프에서 함수를 실행합니다. quiver를 사용하여 결과를 플로팅합니다.

for i = 1:length(X1)
    [Y(i),DYDX1(i),DYDX2(i)] = dlfeval(@rosenbrock2,X1(i),X2(i));
end
quiver(extractdata(X1),extractdata(X2),extractdata(DYDX1),extractdata(DYDX2))
xlabel('x1')
ylabel('x2')

Figure contains an axes object. The axes object with xlabel x1, ylabel x2 contains an object of type quiver.

dlgradientdlfeval을 사용하여, 복소수가 포함된 함수의 값과 기울기를 계산합니다. 복소수 기울기를 계산하거나, 기울기를 실수로만 한정할 수 있습니다.

함수 complexFun을 정의합니다(이 예제의 끝에 나와 있음). 이 함수는 다음 복소수 식을 구현합니다.

f(x)=(2+3i)x

함수 gradFun을 정의합니다(이 예제의 끝에 나와 있음). 이 함수는 complexFun을 호출하고, dlgradient를 사용하여 입력값에 대한 결과 기울기를 구합니다. 자동 미분의 경우, 미분하려는 값(즉, 입력값에서 계산된 함수 값)은 실수형 스칼라여야 합니다. 따라서 이 함수는 기울기를 계산하기 전에 결과값의 실수부 합을 취합니다. 이 함수는 함수 값의 실수부와 기울기(복소수일 수 있음)를 반환합니다.

복소 평면 위의 샘플 점을 -2에서 2 사이, 그리고 -2i에서 2i 사이로 정의한 다음, dlarray로 변환합니다.

functionRes = linspace(-2,2,100);
x = functionRes + 1i*functionRes.';
x = dlarray(x);

각 샘플 점에서의 함수 값과 기울기를 계산합니다.

[y, grad] = dlfeval(@gradFun,x);
y = extractdata(y);

기울기를 표시할 샘플 점을 정의합니다.

gradientRes = linspace(-2,2,11);
xGrad = gradientRes + 1i*gradientRes.';

그러한 샘플 점에서의 기울기 값을 추출합니다.

[~,gradPlot] = dlfeval(@gradFun,dlarray(xGrad));
gradPlot = extractdata(gradPlot);

결과를 플로팅합니다. imagesc를 사용하여 복소 평면 상에 함수 값을 표시합니다. quiver를 사용하여 기울기의 방향과 크기를 표시합니다.

imagesc([-2,2],[-2,2],y);
axis xy
colorbar
hold on
quiver(real(xGrad),imag(xGrad),real(gradPlot),imag(gradPlot),"k");
xlabel("Real")
ylabel("Imaginary")
title("Real Value and Gradient","Re$(f(x)) = $ Re$((2+3i)x)$","interpreter","latex")

함수 기울기가 전체 복소 평면에서 동일합니다. 자동 미분으로 계산된 기울기 값을 추출합니다.

grad(1,1)
ans = 
  1×1 dlarray

   2.0000 - 3.0000i

관찰해 볼 때, 이 함수의 복소수 도함수 값은 다음과 같습니다.

df(x)dx=2+3i

하지만 함수 Re(f(x))가 해석적이지 않으므로, 아무런 복소수 도함수도 정의되지 않습니다. MATLAB의 자동 미분에서는 미분하려는 값이 항상 실수여야 하므로, 이 함수는 복소 해석적 함수가 될 수 없습니다. 대신 플롯에 표시된 것처럼, 반환되는 기울기가 가장 가파르게 상승하는 방향을 가리키도록 도함수가 계산됩니다. 이는 함수 Re(f(x)): C R을 함수 Re(f(xR+ixI)): R × R R로 해석하여 수행됩니다.

function y = complexFun(x)
    y = (2+3i)*x;    
end

function [y,grad] = gradFun(x)
    y = complexFun(x);
    y = real(y);

    grad = dlgradient(sum(y,"all"),x);
end

입력 인수

모두 축소

미분하려는 변수로, 스칼라 dlarray 객체로 지정됩니다. 미분의 경우, y는 입력값 dlarray를 갖는 추적되는 함수(추적되는 dlarray 참조)여야 하고, dlarray를 지원하는 함수(List of Functions with dlarray Support 참조)로 구성되어야 합니다.

이름-값 옵션 'AllowComplex'true로 설정된 경우에도 미분하려는 변수는 실수여야 합니다.

예: 100*(x(2) - x(1).^2).^2 + (1 - x(1)).^2

예: relu(X)

데이터형: single | double | logical

함수에 있는 변수로, dlarray 객체, 셀형 배열, 구조체, 또는 dlarray 객체를 포함하는 테이블이나 이러한 인수를 재귀적으로 조합한 형태로 지정됩니다. 예를 들어 인수는 셀형 배열이고, 그 셀형 배열에 셀형 배열이 포함되고, 포함된 셀형 배열에 구조체가 포함되고, 그 구조체에 dlarray 객체가 포함될 수 있습니다.

x1,...,xk를 테이블로 지정하는 경우 테이블은 다음 변수를 포함해야 합니다.

  • Layer — 계층 이름으로, string형 스칼라로 지정됩니다.

  • Parameter — 파라미터 이름으로, string형 스칼라로 지정됩니다.

  • Value — 파라미터 값으로, dlarray를 포함하는 셀형 배열로 지정됩니다.

예: dlarray([1 2;3 4])

데이터형: single | double | logical | struct | cell
복소수 지원 여부:

이름-값 인수

모두 축소

선택적 인수 쌍을 Name1=Value1,...,NameN=ValueN으로 지정합니다. 여기서 Name은 인수 이름이고 Value는 대응값입니다. 이름-값 인수는 다른 인수 뒤에 와야 하지만, 인수 쌍의 순서는 상관없습니다.

R2021a 이전 릴리스에서는 쉼표를 사용하여 각 이름과 값을 구분하고 Name을 따옴표로 묶으십시오.

예: dydx = dlgradient(y,x,'RetainData',true)를 사용하면 후속 dlgradient 호출에 재사용할 수 있도록 기울기에 중간값이 유지됩니다.

기울기 계산에 사용되는 데이터를 유지할지 지정하는 플래그로, 다음 값 중 하나로 지정됩니다.

  • false 또는 0 — 기울기 계산에 사용되는 데이터를 유지하지 않습니다.

  • true 또는 1dydx1,...,dydxk의 기울기 계산에 사용되는 데이터를 유지합니다. dlgradient에 대한 후속 호출에서 그러한 값을 다시 계산하지 않고 재사용할 수 있습니다. dlfeval 함수가 평가를 완료하면 그러한 값은 폐기됩니다. 이 옵션은 dlfeval 호출에 두 개 이상의 dlgradient 함수 호출이 포함된 경우에만 유용합니다. 여러 dlgradient 호출에서 일부 동일한 추적을 사용할 때 이 옵션을 사용하면 시간을 절약할 수 있습니다. 단, 메모리 사용이 더 늘어납니다.

EnableHigherDerivativestrue이면 기울기 계산에 사용되는 데이터가 유지되고 RetainData 인수는 아무런 영향을 미치지 않습니다.

예: dydx = dlgradient(y,x,'RetainData',true)

데이터형: logical

고계 도함수를 활성화할지 지정하는 플래그로, 다음 값 중 하나로 지정됩니다.

  • 숫자형 또는 논리값 1(true) — 고계 도함수를 활성화합니다. 자동 미분을 사용하여 도함수를 계산하는 함수(예: dlgradient, dljacobian, dldivergence, dllaplacian)를 이후에 호출할 때 여기서 반환된 값을 추가 계산에 사용할 수 있도록, 역방향 통과를 추적합니다.

  • 숫자형 또는 논리값 0(false) — 고계 도함수를 비활성화합니다. 역방향 통과를 추적하지 않습니다. 1계 도함수만 계산하려는 경우 이 옵션이 대체로 속도가 빠르고 필요한 메모리가 더 적습니다.

AcceleratedFunction 객체 내에서 dlgradient 함수를 사용하는 경우 디폴트 값은 true입니다. 그 외의 경우 디폴트 값은 false입니다.

EnableHigherDerivativestrue이면 중간값이 유지되고 RetainData 인수는 아무런 영향을 미치지 않습니다.

고계 도함수를 계산해야 하는 모델을 훈련시키는 방법을 보여주는 예제는 Train Wasserstein GAN with Gradient Penalty (WGAN-GP) 항목을 참조하십시오.

함수에서 복소 변수와 복소수 기울기를 허용할지 지정하는 플래그로, 다음 중 하나로 지정됩니다.

  • true — 함수에서 복소 변수와 복소수 기울기를 허용합니다. 함수 내의 변수를 복소수로 지정할 수 있습니다. 모든 변수가 실수이더라도 기울기는 복소수일 수 있습니다. 미분하려는 변수는 실수여야 합니다.

  • false — 복소 변수와 복소수 기울기를 허용하지 않습니다. 미분하려는 변수와 함수의 모든 변수는 실수여야 합니다. 기울기는 항상 실수입니다. 중간값은 복소수일 수 있습니다.

이름-값 옵션 'AllowComplex'true로 설정된 경우에도 미분하려는 변수는 실수여야 합니다.

데이터형: logical

출력 인수

모두 축소

기울기로, dlarray 객체, 셀형 배열, 구조체 또는 dlarray 객체를 포함하는 테이블이나 이러한 인수를 재귀적으로 조합한 형태로 반환됩니다. dydx1,...,dydxk의 크기 및 데이터형은 연결된 입력 변수 x1,…,xk의 크기 및 데이터형과 동일합니다.

제한 사항

  • dlgradient 함수는 사용자 지정 계층이 포함된 dlnetwork 객체를 사용자 지정 역방향 함수와 함께 사용할 경우 고계 도함수의 계산을 지원하지 않습니다.

  • dlgradient 함수는 다음 계층이 포함된 dlnetwork 객체를 사용할 경우 고계 도함수의 계산을 지원하지 않습니다.

    • gruLayer

    • lstmLayer

    • bilstmLayer

  • dlgradient 함수는 다음 함수에 종속된 고계 도함수의 계산을 지원하지 않습니다.

    • gru

    • lstm

    • embed

    • prod

    • interp1

세부 정보

모두 축소

  • dlgradient 호출은 함수 내에 있어야 합니다. 기울기의 숫자형 값을 구하려면 dlfeval을 사용하여 함수를 계산해야 하고 함수에 대한 인수는 dlarray여야 합니다. Use Automatic Differentiation In Deep Learning Toolbox 항목을 참조하십시오.

  • 기울기가 올바로 계산되도록 하려면 y 인수에는 dlarray를 지원하는 함수만 사용해야 합니다. List of Functions with dlarray Support 항목을 참조하십시오.

  • 'RetainData' 이름-값 쌍 인수를 true로 설정하면, 도함수 계산 후 즉시 추적이 지워지는 대신 dlfeval 함수 호출이 지속되는 동안 추적이 보존됩니다. 이 보존 덕분에 동일한 dlfeval 호출 내에서 후속 dlgradient 호출할 때 더 빠르게 실행될 수 있지만, 메모리가 더 많이 사용됩니다. 예를 들어 적대 신경망을 훈련시킬 때 'RetainData' 설정이 유용한데, 이는 훈련 중에 두 신경망이 데이터와 함수를 공유하기 때문입니다. 생성적 적대 신경망(GAN) 훈련시키기 항목을 참조하십시오.

  • 1계 도함수의 계산만 필요한 경우, 'EnableHigherDerivatives' 옵션이 false로 설정되어 있는지 확인하십시오. 이 설정이 대체로 속도가 더 빠르고 필요한 메모리가 더 적기 때문입니다.

  • 복소수 기울기는 Wirtinger 도함수를 사용하여 계산됩니다. 복소수 기울기는 미분하려는 함수의 실수부가 증가하는 방향으로 정의됩니다. 이는 함수가 복소수이더라도 미분하려는 변수(예: 손실)는 실수여야 하기 때문입니다.

  • 딥러닝 함수(예: 모델 함수와 모델 손실 함수)에 대한 호출의 속도를 높이려면 dlaccelerate 함수를 사용하면 됩니다. 이 함수는 추적을 자동으로 최적화하고 캐시하며 재사용하는 AcceleratedFunction 객체를 반환합니다.

확장 기능

모두 확장

버전 내역

R2019b에 개발됨