다중 스텝 신경망 예측
개루프 모드 설정하기
narxnet
및 narnet
신경망과 같이 피드백이 있는 동적 신경망은 함수 openloop
와 closeloop
를 사용하여 개루프 모드와 폐루프 모드 사이에서 전환될 수 있습니다. 폐루프 신경망은 다중 스텝 예측을 수행합니다. 다시 말해 폐루프 신경망은 외부 피드백이 없을 때 내부 피드백을 사용하여 계속해서 예측을 수행합니다.
아래에서는 자기 부상 시스템을 모델링하는 신경망을 훈련시키고 디폴트 개루프 모드에서 시뮬레이션합니다.
[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
, 초기 입력값과 계층 지연 상태 xi
와 ai
를 정의했습니다. 하지만 임의의 입력 시계열과 초기 상태에 대해 여러 번의 예측을 수행하도록 정의할 수도 있습니다.
[x,xi,ai,t] = preparets(netc,X,{},T); yc = netc(x,xi,ai);
알려진 시퀀스에 이어서 다중 스텝 폐루프 예측하기
또 다른 유용한 시뮬레이션 방법은 훈련된 신경망을 현재 시점까지 알려진 모든 시계열 값을 사용하여 개루프 모드에서 시뮬레이션한 다음 폐루프 모드로 전환하여 원하는 미래 시점까지 필요한 만큼 예측을 이어서 수행하는 것입니다.
openloop
와 closeloop
가 개루프 신경망과 폐루프 신경망 사이를 전환하는 데 사용될 수 있듯이 이 두 함수는 개루프 신경망과 폐루프 신경망의 상태를 변환할 수 있습니다. 이들 함수의 전체 인터페이스는 다음과 같습니다.
[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);
이렇게 하면 개루프 방식과 폐루프 방식 간에 시뮬레이션을 전환할 수 있습니다. 이를 활용한 한 가지 예로 센서의 시계열 예측을 수행하는 것을 들 수 있습니다. 이때 보통 마지막 센서 값이 알려져 있으므로 다음 스텝의 개루프 예측을 수행할 수 있습니다. 하지만 센서 측정값을 사용할 수 없거나 측정값에 오류가 있는 것으로 알려져 있어서 폐루프 예측 스텝이 필요한 경우가 있습니다. 마지막 스텝의 센서 측정값을 사용 가능한지 여부에 따라 예측이 개루프 형태와 폐루프 형태 사이를 오갈 수 있습니다.