Main Content

다중 스텝 신경망 예측

개루프 모드 설정하기

narxnetnarnet 신경망과 같이 피드백이 있는 동적 신경망은 함수 openloopcloseloop를 사용하여 개루프 모드와 폐루프 모드 사이에서 전환될 수 있습니다. 폐루프 신경망은 다중 스텝 예측을 수행합니다. 다시 말해 폐루프 신경망은 외부 피드백이 없을 때 내부 피드백을 사용하여 계속해서 예측을 수행합니다.

아래에서는 자기 부상 시스템을 모델링하는 신경망을 훈련시키고 디폴트 개루프 모드에서 시뮬레이션합니다.

[X,T] = maglev_dataset;
net = narxnet(1:2,1:2,10);
[x,xi,ai,t] = preparets(net,X,{},T);
net = train(net,x,t,xi,ai);
y = net(x,xi,ai);
view(net)

초기 조건으로부터 다중 스텝 폐루프 예측

폐루프 형태로만 신경망을 시뮬레이션하도록 할 수도 있습니다. 그러면 외부 입력 시계열과 초기 조건이 주어졌을 때 입력 시계열에 있는 시간 스텝 개수만큼 예측을 수행하게 됩니다.

netc = closeloop(net);
view(netc)

여기서는 훈련 데이터를 사용하여 입력값 x, 초기 입력값과 계층 지연 상태 xiai를 정의했습니다. 하지만 임의의 입력 시계열과 초기 상태에 대해 여러 번의 예측을 수행하도록 정의할 수도 있습니다.

[x,xi,ai,t] = preparets(netc,X,{},T);
yc = netc(x,xi,ai);

알려진 시퀀스에 이어서 다중 스텝 폐루프 예측하기

또 다른 유용한 시뮬레이션 방법은 훈련된 신경망을 현재 시점까지 알려진 모든 시계열 값을 사용하여 개루프 모드에서 시뮬레이션한 다음 폐루프 모드로 전환하여 원하는 미래 시점까지 필요한 만큼 예측을 이어서 수행하는 것입니다.

openloopcloseloop가 개루프 신경망과 폐루프 신경망 사이를 전환하는 데 사용될 수 있듯이 이 두 함수는 개루프 신경망과 폐루프 신경망의 상태를 변환할 수 있습니다. 이들 함수의 전체 인터페이스는 다음과 같습니다.

[open_net,open_xi,open_ai] = openloop(closed_net,closed_xi,closed_ai);
[closed_net,closed_xi,closed_ai] = closeloop(open_net,open_xi,open_ai);

자기 부상 시스템의 동작 기록을 20개의 시간 스텝만큼 가지고 있고 추가로 향후 20개의 시간 스텝에 대한 사전 예측을 수행한다고 가정하겠습니다.

먼저 입력값과 목표값의 처음 20개 스텝을 정의합니다. 이 20개 스텝은 목표값 t에 의해 정의된 알려진 출력값의 시간 스텝을 나타냅니다. 입력값의 다음 20개 시간 스텝을 정의한 상태에서 신경망을 사용하여 20개의 출력값을 예측합니다. 이때 신경망은 각 예측값의 피드백을 다음 예측을 수행하는 데 사용합니다.

x1 = x(1:20);
t1 = t(1:20);
x2 = x(21:40);

이 데이터에서 개루프 신경망을 시뮬레이션합니다.

[x,xi,ai,t] = preparets(net,x1,{},t1);
[y1,xf,af] = net(x,xi,ai);

이제 신경망에서 반환한 마지막 입력 상태와 계층 상태를 이 신경망과 함께 폐루프 형태로 변환합니다. 개루프 신경망의 마지막 입력 상태 xf와 계층 상태 af는 폐루프 신경망의 초기 입력 상태 xi와 계층 상태 ai가 됩니다.

[netc,xi,ai] = closeloop(net,xf,af);

일반적으로는 preparets를 사용하여 초기 입력 상태와 계층 상태를 정의합니다. 하지만 개루프 시뮬레이션의 마지막에 이미 초기 입력 상태와 계층 상태를 획득했으므로 계속해서 폐루프 신경망의 20개 스텝 예측을 수행하기 위해 preparets를 사용할 필요가 없습니다.

[y2,xf,af] = netc(x2,xi,ai);

x2를 다른 입력값 시퀀스로 설정하여 예측을 수행하길 원하는 개수의 시간 스텝만큼 여러 시나리오를 테스트해 볼 수 있습니다. 예를 들어, 10개의 무작위 입력값이 사용된 경우 자기 부상 시스템의 동작을 예측하려면 다음을 수행합니다.

x2 = num2cell(rand(1,10));
[y2,xf,af] = netc(x2,xi,ai);

폐루프 시뮬레이션에 이어서 개루프 시뮬레이션하기

폐루프 형태에서 신경망을 시뮬레이션한 후라면 그 상태에서 개루프 형태로 시뮬레이션을 계속할 수 있습니다. 아래에서는 폐루프 상태가 개루프 상태로 다시 변환됩니다. (원래 개루프 신경망을 이미 갖고 있으므로 신경망을 다시 개루프 형태로 변환할 필요가 없습니다.)

[~,xi,ai] = openloop(netc,xf,af);

이제 외부 입력값 및 개루프 피드백의 계속적인 진행을 정의하고 개루프 신경망을 시뮬레이션할 수 있습니다.

x3 = num2cell(rand(2,10));
y3 = net(x3,xi,ai);

이렇게 하면 개루프 방식과 폐루프 방식 간에 시뮬레이션을 전환할 수 있습니다. 이를 활용한 한 가지 예로 센서의 시계열 예측을 수행하는 것을 들 수 있습니다. 이때 보통 마지막 센서 값이 알려져 있으므로 다음 스텝의 개루프 예측을 수행할 수 있습니다. 하지만 센서 측정값을 사용할 수 없거나 측정값에 오류가 있는 것으로 알려져 있어서 폐루프 예측 스텝이 필요한 경우가 있습니다. 마지막 스텝의 센서 측정값을 사용 가능한지 여부에 따라 예측이 개루프 형태와 폐루프 형태 사이를 오갈 수 있습니다.