주요 콘텐츠

dlode45

딥러닝을 통한 비경직성 상미분 방정식(ODE)의 해

R2021b 이후

    설명

    신경망 상미분 방정식(ODE) 연산은 지정된 ODE의 해를 반환합니다.

    dlode45 함수는 신경망 ODE 연산을 dlarray 데이터에 적용합니다. dlarray 객체를 사용하면 차원에 레이블을 지정할 수 있기 때문에 차원이 높은 데이터로 작업하기가 더 쉽습니다. 예를 들어 "S", "T", "C", "B" 레이블을 사용하여 어떤 차원이 각각 공간 차원, 시간 차원, 채널 차원, 배치 차원에 해당하는지 레이블을 지정할 수 있습니다. 지정되지 않은 차원과 기타 자원에는 "U" 레이블을 사용하십시오. 특정 차원에 대해 연산을 수행하는 dlarray 객체 함수에는 직접 dlarray 객체 형식을 지정하거나 DataFormat 옵션을 사용하여 차원 레이블을 지정할 수 있습니다.

    참고

    이 함수는 함수로 정의된 딥러닝 모델 내 또는 사용자 지정 계층 함수 내 dlarray 데이터에 신경망 ODE 연산을 적용합니다. dlnetwork 객체 또는 Layer 배열 내에서 신경망 ODE 연산을 적용하려면 neuralODELayer를 사용하십시오. 다른 워크플로에서 ODE를 풀려면 ode45를 사용하십시오.

    Y = dlode45(net,tspan,Y0)tspan의 첫 번째 요소와 마지막 요소로 정의된 시간 구간에서, 초기 조건 Y0을 사용하여 dlnetwork 객체 net으로 나타낸 연립 ODE를 적분합니다. (R2023a 이후)

    예제

    Y = dlode45(odefun,tspan,Y0,theta)tspan의 첫 번째 요소와 마지막 요소로 정의된 시간 구간에서, 초기 조건 Y0과 파라미터 theta를 사용하여 함수 핸들 odefun으로 지정된 연립 ODE를 적분합니다.

    예제

    Y = dlode45(___,DataFormat=FMT)는 형식이 지정되지 않은 초기 조건 Y0에 대해 데이터 형식을 지정합니다. 형식은 "S"(공간), "C"(채널), "B"(배치) 차원 레이블만 포함해야 합니다.

    Y = dlode45(___,Name=Value)는 하나 이상의 이름-값 인수를 사용하여 추가 옵션을 지정합니다. 예를 들어 Y = dlode45(odefun,tspan,Y0,theta,GradientMode="adjoint")odefun으로 지정된 연립 ODE를 적분하고, 연결된 수반(adjoint) 연립 ODE를 풀어 기울기를 계산합니다.

    예제

    모두 축소

    초기 조건에 대해, 4개의 채널이 있는 숫자형 특징 데이터로 구성된 128개의 관측값을 포함하는 형식 지정 dlarray 객체를 만듭니다. "CB"(채널, 배치) 형식을 지정합니다.

    miniBatchSize = 128;
    numChannels = 4;
    Y0 = rand(numChannels,miniBatchSize);
    Y0 = dlarray(Y0,"CB");

    초기 조건의 크기와 형식을 확인합니다.

    size(Y0)
    ans = 1×2
    
         4   128
    
    
    dims(Y0)
    ans = 
    'CB'
    

    tanh 활성화 계층이 사이에 있는 2개의 완전 연결 연산으로 표현되는 ODE 함수를 나타내는 dlnetwork 객체를 만듭니다.

    layers = [
        featureInputLayer(4)
        fullyConnectedLayer(10)
        tanhLayer
        fullyConnectedLayer(4)];
    net = dlnetwork(layers);

    적분 구간을 [0 0.1]로 지정합니다.

    tspan = [0 0.1];

    신경망 ODE 연산을 적용합니다.

    Y = dlode45(net,tspan,Y0);

    출력값의 크기와 형식을 확인합니다.

    size(Y)
    ans = 1×2
    
         4   128
    
    
    dims(Y)
    ans = 
    'CB'
    

    초기 조건에 대해, 64개의 채널이 있는 128개의 28×28 영상 배치를 포함하는 형식이 지정된 dlarray 객체를 만듭니다. "SSCB"(공간, 공간, 채널, 배치) 형식을 지정합니다.

    miniBatchSize = 128;
    inputSize = [28 28];
    numChannels = 64;
    Y0 = rand(inputSize(1),inputSize(2),numChannels,miniBatchSize);
    Y0 = dlarray(Y0,"SSCB");

    초기 조건의 크기와 형식을 확인합니다.

    size(Y0)
    ans = 1×4
    
        28    28    64   128
    
    
    dims(Y0)
    ans = 
    'SSCB'
    

    ODE 함수를 지정합니다. 이 예제의 ODE 함수 섹션에 나와 있는, 입력 데이터에 컨벌루션 연산과 쌍곡탄젠트 연산을 차례로 적용하는 함수 odeModel을 정의합니다.

    odefun = @odeModel;

    ODE 함수의 컨벌루션 연산에 대한 파라미터를 초기화합니다. ODE 함수의 출력 크기는 초기 조건의 크기와 일치해야 하므로, 입력 채널 개수와 동일한 개수의 필터를 지정합니다.

    filterSize = [3 3];
    numFilters = numChannels;
    
    parameters = struct;
    parameters.Weights = dlarray(rand(filterSize(1),filterSize(2),numChannels,numFilters));
    parameters.Bias = dlarray(zeros(1,numFilters));

    적분 구간을 [0 0.1]로 지정합니다.

    tspan = [0 0.1];

    신경망 ODE 연산을 적용합니다.

    Y = dlode45(odefun,tspan,Y0,parameters);

    출력값의 크기와 형식을 확인합니다.

    size(Y)
    ans = 1×4
    
        28    28    64   128
    
    
    dims(Y)
    ans = 
    'SSCB'
    

    ODE 함수

    ODE 함수 odeModel은 함수 입력값 t(사용되지 않음)와 y, 그리고 컨벌루션 가중치와 편향을 포함하는 ODE 함수 파라미터 p를 입력값으로 받고, convolution-tanh 블록 연산의 출력값을 반환합니다. 컨벌루션 연산은 출력 크기가 입력 크기와 일치하도록 채우기를 적용합니다.

    function z = odeModel(t,y,p)
    
    weights = p.Weights;
    bias = p.Bias;
    z = dlconv(y,weights,bias,Padding="same");
    z = tanh(z);
    
    end

    입력 인수

    모두 축소

    R2023a 이후

    신경망 ODE 함수를 나타내는 신경망으로, 초기화된 dlnetwork 객체로 지정됩니다.

    net에 입력값이 한 개 있으면 predict(net,Y)가 연립 ODE를 정의합니다. net에 입력값이 2개 있으면 predict(net,T,Y)가 연립 ODE를 정의합니다. 여기서 T는 배치 차원에 대해 반복되는 시간 스텝입니다.

    첫 번째 인수가 dlnetwork 객체이고 GradientMode"adjoint"이면, 신경망 State 속성은 비어 있어야 합니다. State 속성이 비어 있지 않은 상태로 신경망을 사용하려면 GradientMode"direct"로 설정하십시오.

    풀려는 함수로, 적분할 함수를 정의하는 함수 핸들로 지정됩니다.

    구문 z = fcn(t,y,p)를 사용하여 odefun을 함수 핸들로 지정합니다. 여기서 t는 스칼라이고, ydlarray이며, ptheta로 지정된 파라미터 세트입니다. 이 함수는 y와 동일한 크기와 형식을 가진 dlarray를 반환합니다. 입력 인수 t, y, p가 모두 이 함수에 사용되지는 않더라도 함수는 입력 인수 3개를 모두 받아야 합니다. ODE 함수 출력값 z의 크기는 초기 조건 크기와 일치해야 합니다.

    예를 들어 컨벌루션 연산과 tanh 연산을 차례로 적용하는 ODE 함수를 지정합니다.

    function z = dlconvtanh(t,y,p)
    
    weights = p.Weights;
    bias = p.Bias;
    z = dlconv(y,weights,bias,Padding="same");
    z = tanh(z);
    
    end
    참고로, 여기서는 t 인수가 사용되지 않았습니다.

    데이터형: function_handle

    적분 구간으로, 요소를 두 개 이상 가진 숫자형 벡터 또는 형식이 지정되지 않은 dlarray 벡터로 지정됩니다. tspan의 요소는 모두 증가하거나 모두 감소해야 합니다.

    솔버는 Y0으로 주어지는 초기 조건을 초기 시간 tspan(1)에 적용한 다음, ODE 함수를 tspan(1)에서 tspan(end)까지 적분합니다.

    • tspan이 2개의 요소([t0 tf])를 가지면 솔버는 지점 tf에서 평가된 해를 반환합니다.

    • tspan이 3개 이상의 요소([t0 t1 t2 ... tf])를 가지면 솔버는 지정된 지점 [t1 t2 ... tf]에서 평가된 해를 반환합니다. 솔버는 tspan에 지정된 각 지점을 정확히 스텝으로 사용하지 않습니다. 대신 솔버는 자체 내부 스텝을 사용하여 해를 계산한 다음, tspan에 지정된 지점에서 해를 평가합니다. 지정된 지점에서 구해진 해는 각 내부 스텝에서 계산된 해와 동일한 정도의 정확성을 가집니다.

      중간 지점을 여러 개 지정해도 계산의 효율성에는 거의 영향을 미치지 않지만 대규모 시스템의 경우에는 메모리 관리에 영향을 미칠 수 있습니다.

    참고

    dlode45 함수의 동작은 ode45 함수와 다릅니다.

    InitialStep 또는 MaxStep[]이면 값을 초기화하는 데 tspan의 값이 사용됩니다.

    • InitialStep[]이면 tspan의 요소를 사용하여 작업의 크기를 나타냅니다. 요소 개수가 다른 tspan을 지정하면 솔버의 해가 달라질 수 있습니다.

    • MaxStep[]이면 tspan의 첫 번째 요소와 마지막 요소를 사용하여 최대 스텝 크기가 계산됩니다. tspan의 초기값 또는 최종 값을 변경하면 솔버가 다른 스텝 시퀀스를 사용하므로 솔버의 해가 달라질 수 있습니다.

    초기 조건으로, 형식이 지정된 또는 형식이 지정되지 않은 dlarray 객체로 지정됩니다.

    Y0이 형식이 지정되지 않은 dlarray이면 DataFormat 옵션을 사용하여 형식을 지정해야 합니다.

    신경망 ODE 연산의 경우 데이터 형식은 "S", "C""B" 차원 레이블만 포함해야 합니다. 초기 조건은 "T" 또는 "U" 차원을 가져서는 안 됩니다.

    ODE 함수의 파라미터로, 다음 값 중 하나로 지정됩니다.

    • dlnetwork 객체 (R2023a 이후)

    • dlarray 객체

    • 다음 값 중 하나 이상으로 구성된 구조체 또는 중첩 구조체:

      • dlnetwork 객체 (R2023a 이후)

      • dlarray 객체

      • 모든 MATLAB® 데이터형 (R2023b 이후)

    • 다음 값 중 하나 이상으로 구성된 셀형 배열:

      • dlnetwork 객체 (R2023a 이후)

      • dlarray 객체

      • 모든 MATLAB 데이터형 (R2023b 이후)

    • 다음 변수를 갖는 테이블:

      • Layer — 계층 이름

      • Parameter — 파라미터 이름

      • Value — 파라미터 값으로, 다음 값 중 하나로 지정됩니다.

        • dlarray 객체

        • 모든 MATLAB 데이터형 (R2023b 이후)

    자동 미분 워크플로(예: 사용자 지정 계층을 정의하거나 dlgradient 함수와 dlfeval 함수를 사용하는 경우)에서는 theta로 지정된 객체에 포함되어 있는 dlarray 객체에 대해서만 기울기가 계산됩니다.

    파라미터가 odefun에 세 번째 입력 인수로 전달됩니다.

    이름-값 인수

    모두 축소

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

    예: Y = dlode45(odefun,tspan,Y0,theta,GradientMode="adjoint")odefun으로 지정된 연립 ODE를 적분하고, 연결된 수반 연립 ODE를 풀어 기울기를 계산합니다.

    데이터 차원에 대한 설명으로, 문자형 벡터 또는 string형 스칼라로 지정됩니다.

    데이터 형식은 문자들로 구성된 문자열로, 각 문자는 대응되는 데이터 차원의 유형을 설명합니다.

    문자는 다음을 나타냅니다.

    • "S" — 공간

    • "C" — 채널

    • "B" — 배치

    • "T" — 시간

    • "U" — 지정되지 않음

    예를 들어, 첫 번째, 두 번째, 세 번째 차원이 각각 채널, 관측값, 시간 스텝에 대응되는 시퀀스 배치를 나타내는 배열이 있다고 가정하겠습니다. 데이터를 "CBT"(채널, 배치, 시간) 형식으로 설명할 수 있습니다.

    신경망 ODE 연산의 경우 데이터 형식은 "S", "C""B" 차원 레이블만 포함해야 합니다. 초기 조건은 "T" 또는 "U" 차원을 가져서는 안 됩니다.

    Y0이 형식이 지정된 dlarray 객체가 아닌 경우 DataFormat 옵션을 지정해야 합니다.

    자세한 내용은 Deep Learning Data Formats 항목을 참조하십시오.

    예: DataFormat="SSCB"

    데이터형: char | string

    dlgradient 함수를 사용할 경우 초기 조건과 파라미터에 대한 기울기를 계산하는 방법으로, 다음 값 중 하나로 지정됩니다.

    • "direct" — 수치 솔버로 수행하는 연산을 역전파(backpropagate)해 나가는 방식으로 기울기를 구합니다. 이 옵션은 미니 배치 크기가 크거나 tspan에 값이 많이 포함된 경우에 가장 적합합니다.

    • "adjoint" — 연결된 수반 연립 ODE를 풀어 기울기를 계산합니다. 이 옵션은 미니 배치 크기가 작거나 tspan에 값이 적게 포함된 경우에 가장 적합합니다.

    • "adjoint-seminorm" (R2023b 이후) — 수반 반노름 계산을 사용하여 기울기를 계산합니다[4]. 일반적으로 이 옵션은 근사오차 계산에서 더 적은 개수의 항을 사용하며, 일부 신경망 ODE 모델 속도를 높일 수 있습니다.

    첫 번째 인수가 dlnetwork 객체이고 GradientMode"adjoint"이면, 신경망 State 속성은 비어 있어야 합니다. State 속성이 비어 있지 않은 상태로 신경망을 사용하려면 GradientMode"direct"로 설정하십시오.

    GradientMode 옵션이 "direct"인 경우 dlaccelerate 함수는 dlode45 함수의 실행 속도를 높이는 것을 지원하지 않습니다. dlode45 함수를 호출하는 코드의 실행 속도를 높이려면, GradientMode 옵션을 "adjoint"로 설정하거나 dlode45 함수를 호출하지 않는 일부 코드의 속도를 높이십시오.

    경고

    GradientMode"adjoint"인 경우 odefun은 함수 가속을 지원해야 합니다. 그렇지 않으면 함수는 예기치 않은 결과를 반환할 수 있습니다.

    GradientMode"adjoint"인 경우 ODE 함수 입력값을 추적하여 자동 미분에 사용할 계산 그래프를 결정합니다. 이 추적 과정은 얼마간의 시간이 걸릴 수 있으며 동일한 추적을 다시 계산하게 될 수도 있습니다. 추적을 최적화하고 캐시하고 재사용하여 기울기 계산 속도를 높일 수 있습니다.

    추적 캐시는 그 특성상 모든 함수에 대해 가속을 지원하지는 않습니다.

    캐시 과정에서는 변경이 예상되거나 외부 요인의 영향을 받는 값을 캐시할 수 있습니다. 다음과 같은 함수의 속도를 높일 때는 주의를 기울여야 합니다.

    • 입력값의 값이 임의적이거나 자주 변하는 경우

    • 출력값의 값이 자주 변하는 경우

    • 난수를 생성하는 경우

    • if 조건문과 while 루프를 사용하며 조건이 dlarray 객체의 값에 종속되는 경우

    • 입력값이 핸들이거나 핸들에 종속되는 경우

    • 외부 소스에서 데이터를 읽어오는 경우(예: 데이터저장소 또는 minibatchqueue 객체 사용)

    딥러닝 함수 가속화에 대한 자세한 내용은 Deep Learning Function Acceleration for Custom Training Loops 항목을 참조하십시오.

    초기 스텝 크기로, 양의 스칼라 또는 []로 지정됩니다.

    InitialStepSize[]인 경우, 함수는 적분 구간과 초기 조건에 대응되는 ODE 함수의 출력값에 따라 자동으로 초기 스텝 크기를 결정합니다.

    데이터형: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

    최대 스텝 크기로, 양의 스칼라 또는 []로 지정됩니다.

    MaxStepSize[]인 경우, 함수는 적분 구간 크기의 1/10을 사용합니다.

    데이터형: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

    상대 허용오차로, 양의 스칼라로 지정됩니다. 이 허용오차는 각 해 성분 크기에 상대적인 오차를 측정합니다. 간단히 말하면 상대 허용오차는 절대 허용오차 AbsoluteTolerance보다 작은 성분을 제외한 모든 해 성분에서 정확한 자릿수를 제어합니다.

    각 스텝에서, ODE 솔버는 해의 i번째 성분에서 국소 오차 e를 추정합니다. 성공하려면, 상대 허용오차와 절대 허용오차에서 결정된 오차 범위를 둘 다 충족해야 합니다.

    |e(i)| <= max(RelativeTolerance*abs(y(i)),AbsoluteTolerance(i))

    데이터형: single | double

    절대 허용오차로, 양의 스칼라 또는 벡터로 지정됩니다. 이 허용오차보다 작은 해의 값은 중요하지 않은 것으로 간주됩니다. 해 |y|AbsoluteTolerance보다 작으면 솔버는 |y|의 정확한 자릿수를 구할 필요가 없습니다. 이러한 이유로, AbsoluteTolerance의 값은 해 성분의 크기를 고려해야 합니다.

    AbsoluteTolerance가 벡터이면 해와 길이가 동일해야 합니다. AbsoluteTolerance가 스칼라이면 값이 모든 해 성분에 적용됩니다.

    각 스텝에서, ODE 솔버는 해의 i번째 성분에서 국소 오차 e를 추정합니다. 성공하려면, 상대 허용오차와 절대 허용오차에서 결정된 오차 범위를 둘 다 충족해야 합니다.

    |e(i)| <= max(RelativeTolerance*abs(y(i)),AbsoluteTolerance(i))

    데이터형: single | double

    출력 인수

    모두 축소

    tspan(2:end)에 지정된 시간에서의 신경망 ODE의 해로, Y0과 기본 데이터형이 같은 dlarray 객체로 반환됩니다.

    Y0이 형식이 지정된 dlarray이고 tspan이 정확히 2개의 요소를 포함하는 경우, YY0과 동일한 형식을 갖습니다. Y0이 형식이 지정된 dlarray가 아니고 tspan이 정확히 2개의 요소를 포함하는 경우, YY0과 차원 순서가 같은, 형식이 지정되지 않은 dlarray입니다.

    Y0이 형식이 지정된 dlarray이고 tspan이 3개 이상의 요소를 포함하는 경우, YY0과 동일한 형식을 가지며 "T"(시간) 차원을 추가로 갖습니다. Y0이 형식이 지정된 dlarray가 아니고 tspan이 3개 이상의 요소를 포함하는 경우, YY0과 차원 순서가 같은, 형식이 지정되지 않은 dlarray이고 시간에 대응하는 차원을 추가로 갖습니다.

    알고리즘

    모두 축소

    참고 문헌

    [1] Chen, Ricky T. Q., Yulia Rubanova, Jesse Bettencourt, and David Duvenaud. “Neural Ordinary Differential Equations.” Preprint, submitted June 19, 2018. https://arxiv.org/abs/1806.07366.

    [2] Dormand, J. R., and P. J. Prince. “A Family of Embedded Runge-Kutta Formulae.” Journal of Computational and Applied Mathematics 6, no. 1 (March 1980): 19–26. https://doi.org/10.1016/0771-050X(80)90013-3.

    [3] Shampine, Lawrence F., and Mark W. Reichelt. “The MATLAB ODE Suite.” SIAM Journal on Scientific Computing 18, no. 1 (January 1997): 1–22. https://doi.org/10.1137/S1064827594276424.

    [4] Kidger, Patrick, Ricky T. Q. Chen, and Terry Lyons. “‘Hey, That’s Not an ODE’: Faster ODE Adjoints via Seminorms.” arXiv, May 10, 2021. https://doi.org/10.48550/arXiv.2009.09457.

    확장 기능

    모두 확장

    버전 내역

    R2021b에 개발됨

    모두 확장