Main Content

시계열 NARX 피드백 신경망 설계하기

개루프 형태, 폐루프 형태 및 개/폐 루프 다중 스텝 예측에 적용되는 NARX 신경망의 사용 예제를 보려면 다중 스텝 신경망 예측 항목을 참조하십시오.

지금까지 설명한 모든 동적 신경망은 동적 요소가 입력 계층에만 존재하는 집중 신경망이었거나 피드포워드 신경망이었습니다. 외생적인 입력을 갖는 비선형 자기회귀 신경망(NARX)는 순환 동적 신경망으로, 피드백 연결이 신경망의 여러 계층을 포함하고 있습니다. NARX 모델은 시계열 모델링에서 널리 사용되는 선형 ARX 모델을 기반으로 합니다.

NARX 모델의 정의 방정식은 다음과 같습니다.

y(t)=f(y(t1),y(t2),,y(tny),u(t1),u(t2),,u(tnu))

여기서 종속 출력 신호 y(t)의 다음 값은 출력 신호의 이전 값들과 독립(외생) 입력 신호의 이전 값들에서 회귀됩니다. 함수 f를 근사하는 피드포워드 신경망을 사용하여 NARX 모델을 구현할 수 있습니다. 다음은 결과 신경망의 도식입니다. 여기서는 근사를 위해 2계층 피드포워드 신경망이 사용되었습니다. 입력값과 출력값이 다차원일 수 있는 벡터 ARX 모델에 대해서도 이 구현을 사용할 수 있습니다.

Diagram of a two-layer feedforward network

NARX 신경망은 다양한 방식으로 응용됩니다. 입력 신호의 다음 값을 예측하는 예측 변수로 사용할 수 있습니다. 입력 신호에서 잡음을 제거한 결과가 목표 출력값인 비선형 필터링에도 사용할 수 있습니다. NARX 신경망의 용도는 비선형 동적 시스템의 모델링이라는 또 다른 중요 응용 분야에서 설명합니다.

NARX 신경망의 훈련을 살펴보기 전에, 훈련에 유용한 중요한 구성을 먼저 설명하겠습니다. 모델링하고자 하는 비선형 동적 시스템에서 추정하는 출력값이 NARX 신경망의 출력값이라고 생각할 수 있습니다. 왼쪽 그림에서 볼 수 있듯이, 출력값은 표준 NARX 아키텍처의 일부로서 피드포워드 신경망의 입력값으로 피드백됩니다. 신경망 훈련 중에 참 출력값이 있을 수 있으므로, 아래의 오른쪽 그림에서 볼 수 있는 것처럼 추정된 출력값을 피드백하는 대신 참 출력값이 사용되는 직렬-병렬 아키텍처([NaPa91] 참조)를 만들 수 있습니다. 여기에는 두 가지 이점이 있습니다. 첫 번째는 피드포워드 신경망에 대한 입력값이 더 정확하다는 것입니다. 두 번째는 결과 신경망이 순수한 피드포워드 아키텍처를 가지므로 정적 역전파를 훈련에 사용할 수 있다는 것입니다.

Comparison of a feedforward network with parallel architecture and a feedforward network with series-parallel architecture

다음은 동적 시스템을 모델링하도록 NARX 신경망을 훈련시키기 위해 직렬-병렬 아키텍처를 사용하는 경우를 보여줍니다.

NARX 신경망의 예제는 Use the NARMA-L2 Controller Block의 시작 부분에서 설명하는 자기 부상 시스템입니다. 다음 그림의 하단 그래프는 전자석에 가해진 전압을 보여주고, 상단 그래프는 영구 자석의 위치를 보여줍니다. 데이터는 샘플링 간격 0.01초로 수집하여 2개의 시계열을 구성했습니다.

목표는 이 자기 부상 시스템에 대한 NARX 모델을 개발하는 것입니다.

Plots of the position of the permanent magnet (top) and the voltage applied to the electromagnet (bottom)

먼저 훈련 데이터를 불러옵니다. 훈련이 세 번째 데이터 점에서 시작하도록 입력값과 출력값 양쪽에 대해 2개의 지연값을 갖는 탭 지연선을 사용합니다. 직렬-병렬 신경망에는 u(t) 시퀀스와 y(t) 시퀀스, 두 개의 입력값이 있습니다.

[u,y] = maglev_dataset;

함수 narxnet을 사용하여 직렬-병렬 NARX 신경망을 만듭니다. 은닉 계층에 10개의 뉴런을 사용하고 훈련 함수로 trainlm을 사용한 다음 preparets를 사용하여 데이터를 준비합니다.

d1 = [1:2];
d2 = [1:2];
narx_net = narxnet(d1,d2,10);
narx_net.divideFcn = '';
narx_net.trainParam.min_grad = 1e-10;
[p,Pi,Ai,t] = preparets(narx_net,u,{},y);

(y 시퀀스는 입력값이자 출력값(목표값)인 피드백 신호로 간주됩니다. 나중에 루프를 닫으면 적절한 출력값이 적절한 입력값에 연결됩니다.) 이제 신경망을 훈련시킬 준비가 되었습니다.

narx_net = train(narx_net,p,t,Pi);

이제 신경망을 시뮬레이션하고 직렬-병렬 구현에 대해 결과 오차를 플로팅할 수 있습니다.

yp = sim(narx_net,p,Pi);
e = cell2mat(yp)-cell2mat(t);
plot(e)

오차가 매우 작은 것을 확인할 수 있습니다. 그러나 직렬-병렬 구성이기 때문에 이는 오직 향후 1-스텝 사전 예측에 대한 오차일 뿐입니다. 보다 엄격한 테스트를 수행하려면 신경망을 원래의 병렬 형식(폐루프)으로 배열한 다음 여러 시간 스텝에 대해 반복된 예측을 수행하면 됩니다. 이제 보여 줄 내용은 병렬 연산에 관한 것입니다.

직렬-병렬 구성(개루프)에서 NARX와 여러 다른 신경망을 변환하는 툴박스 함수(closeloop)가 있습니다. 이 함수는 병렬 구성(폐루프)으로 훈련할 때 유용하며, 병렬 구성은 향후 다중 스텝 사전 예측에 유용합니다. 다음 명령은 방금 훈련시킨 신경망을 병렬 형식으로 변환하는 방법을 보여줍니다.

narx_net_closed = closeloop(narx_net);

두 신경망 사이의 차이를 보려면 view 명령을 사용할 수 있습니다.

view(narx_net)

view(narx_net_closed)

모든 훈련은 검증 및 테스트 단계를 포함해 개루프(직렬-병렬 아키텍처라고도 함)에서 수행됩니다. 일반적인 워크플로는 개루프에서 신경망을 완전히 생성한 다음, (검증 및 테스트 단계를 포함해) 신경망의 훈련이 끝났을 때에만 이를 다중 스텝 사전 예측을 위한 폐루프로 변환하는 것입니다. 마찬가지로 GUI의 R 값은 개루프 훈련 결과를 기반으로 계산됩니다.

이제 폐루프(병렬) 구성을 사용하여 900개의 타임 스텝에 대해 반복 예측을 수행할 수 있습니다. 이 신경망에서는 두 초기 입력값과 두 초기 출력값을 초기 조건으로 불러와야 합니다. preparets 함수를 사용하여 데이터를 준비할 수 있습니다. 이 함수는 신경망 구조를 사용하여 데이터를 적절하게 분할하고 이동할 방법을 판단합니다.

y1 = y(1700:2600);
u1 = u(1700:2600);
[p1,Pi1,Ai1,t1] = preparets(narx_net_closed,u1,{},y1);
yp1 = narx_net_closed(p1,Pi1,Ai1);
TS = size(t1,2);
plot(1:TS,cell2mat(t1),'b',1:TS,cell2mat(yp1),'r')

위 그림은 반복 예측을 보여줍니다. 파란색 선은 자석의 실제 위치이고, 빨간색 선은 NARX 신경망이 예측한 위치입니다. 신경망이 향후 900개의 시간 스텝을 사전 예측하고 있음에도 불구하고 예측이 매우 정확합니다.

병렬 응답(반복 예측)이 정확하기 위해서는 직렬-병렬 구성(향후 1-스텝 사전 예측)의 오차가 매우 작도록 신경망을 훈련시키는 것이 중요합니다.

또는, narxnet 명령의 네 번째 입력 인수를 'closed'로 설정하여 병렬(폐루프) NARX 신경망을 만들고 이 신경망을 직접 훈련할 수도 있습니다. 일반적으로 훈련이 상대적으로 오래 걸리며 결과 성능이 직렬-병렬 훈련에서 얻은 결과만큼 좋지 않습니다.

신경망을 훈련시킬 때마다 초기 가중치와 편향 값이 달라지고 데이터를 훈련 세트, 검증 세트, 테스트 세트로 분할하는 게 달라지므로 해가 다를 수 있습니다. 그 결과, 같은 문제에 대해 훈련받은 여러 신경망이 같은 입력에 대해 서로 다른 출력값을 제공할 수 있습니다. 정확도가 양호한 신경망을 발견한 것인지 확인하려면 여러 번 다시 훈련시키십시오.

더 높은 정확도를 원하는 경우 초기 해를 개선하기 위한 몇 가지 다른 기법이 있습니다. 자세한 내용은 얕은 신경망 일반화를 개선하고 과적합 방지하기 항목을 참조하십시오.

여러 개의 외부 변수

자기 부상 예제는 시간에 따른 외부 입력값이 하나인 시계열을 모델링하는 방법을 보여줍니다. NARX 신경망은 여기에 더해 여러 개의 외부 입력 요소가 있는 문제에서 사용할 수 있으며 여러 개의 요소를 갖는 계열을 예측합니다. 이 경우 입력값과 목표값은 시간을 나타내는 셀형 배열의 행으로 구성되나, 각 셀 요소는 입력 또는 목표 신호의 N개 요소에 대한 N×1 벡터가 됩니다.

예를 들어, 다음은 요소를 1개 가진 계열을 예측하는, 요소를 2개 가진 외부 변수로 구성된 데이터셋입니다.

[X,T] = ph_dataset;

외부 입력값 X는 요소를 2개 가진 벡터로 구성된 셀형 배열의 행으로 형식이 지정되어 있으며, 각 벡터는 산성 용액과 염기성 용액의 흐름을 나타냅니다. 목표값은 시간에 따른 용액의 결과 pH를 나타냅니다.

함수 con2seq를 사용하여 사용자 고유의 요소를 여러 개 가진 계열 데이터를 행렬 형식에서 신경망 시계열 형식으로 형식을 다시 지정할 수 있습니다.

신경망을 훈련시키는 절차는 자기 부상 문제와 동일하게 진행됩니다.

net = narxnet(10);
[x,xi,ai,t] = preparets(net,X,{},T);
net = train(net,x,t,xi,ai);
y = net(x,xi,ai);
e = gsubtract(t,y); 

개루프 형태, 폐루프 형태 및 개/폐 루프 다중 스텝 예측에 적용되는 NARX 신경망의 사용 예제를 보려면 다중 스텝 신경망 예측 항목을 참조하십시오.