Main Content

자기 부상 모델링

이 예제에서는 NARX(Nonlinear AutoRegressive with eXternal input) 신경망으로 자기 부상 역학 시스템을 모델링하는 방법을 보여줍니다.

문제: 자기 부상 시스템 모델링하기

이 예제에서는 제어 전류를 사용하여 자기 부상의 역학적 동작을 예측하는 신경망을 만들어 봅니다.

이 시스템은 자석의 위치와 제어 전류로 특징지을 수 있으며, 이 둘이 함께 바로 다음 순간의 자석 위치를 결정합니다.

이것은 시계열 문제로서, 피드백 시계열(자석의 위치)과 외부 입력 시계열(제어 전류)의 과거 값을 사용하여 피드백 시계열의 미래 값을 예측합니다.

신경망을 사용해야 하는 이유

신경망은 시계열 문제를 매우 효과적으로 해결합니다. 신경망은 충분한 수의 요소(뉴런)를 가지고 있으면 임의의 정확도로 역학 시스템을 모델링할 수 있습니다. 특히 비선형 역학 문제를 해결하는 데 적합합니다. 따라서 신경망은 이 문제를 해결하기에 적합합니다.

제어 전류에 반응하여 부상한 자석 위치의 실제 기록을 사용하여 신경망을 설계해 보겠습니다.

데이터 준비하기

함수 피팅 문제의 데이터를 입력 시계열 X와 목표 시계열 T의 두 개 행렬로 구성하여 신경망에 사용할 데이터를 준비합니다.

입력 시계열 X는 셀형 배열의 행으로, 각 요소는 제어 전류의 해당 시간 스텝입니다.

목표 시계열 T는 셀형 배열의 행으로, 각 요소는 부상한 자석 위치의 해당 시간 스텝입니다.

이러한 데이터셋을 다음과 같이 불러옵니다.

[x,t] = maglev_dataset;

입력값 X와 목표값 T의 크기를 확인할 수 있습니다.

X와 T 모두 4001개의 열을 갖는 것을 알 수 있습니다. 이는 제어 전류와 자석 위치의 4001개의 시간 스텝을 나타냅니다.

size(x)
ans = 1×2

           1        4001

size(t)
ans = 1×2

           1        4001

신경망을 사용한 시계열 모델링

다음 단계는 자석이 위치를 변경하는 방식을 모델링하도록 학습하는 신경망을 만드는 것입니다.

신경망은 임의의 초기 가중치로 시작하므로 이 예제의 결과는 매 실행마다 약간씩 달라집니다. 이러한 임의성을 방지하기 위해 난수 시드값이 설정됩니다. 그러나 자신만의 고유한 응용 프로그램인 경우에는 난수 시드값을 설정할 필요가 없습니다.

setdemorandstream(491218381)

2계층(즉, 은닉 계층 1개) NARX 신경망은 은닉 계층에 뉴런이 충분히 주어진다면 어떠한 역학적 입력-출력 관계도 피팅할 수 있습니다. 출력 계층이 아닌 계층은 은닉 계층이라고 부릅니다.

이 예제에서는 뉴런 10개로 구성된 하나의 은닉 계층을 사용해 보겠습니다. 일반적으로 문제가 어려울수록 더 많은 뉴런과, 그리고 경우에 따라 더 많은 계층이 필요합니다. 문제가 단순할수록 필요한 뉴런의 개수도 적어집니다.

또한 외부 입력값(제어 전류)과 피드백(자석 위치)에 대한 2개의 탭 지연을 사용해 보겠습니다. 지연이 많아질수록 신경망에서 보다 복잡한 역학 시스템을 모델링할 수 있게 됩니다.

신경망이 아직 입력 및 목표 데이터에 맞춰 구성되지 않았으므로 입력값과 출력값의 크기는 0입니다. 이 구성 작업은 신경망을 훈련시킬 때 수행됩니다.

출력값 y(t)가 곧 입력값이기도 하기 때문에 이 값의 지연된 버전이 다시 신경망으로 피드백됩니다.

net = narxnet(1:2,1:2,10);
view(net)

신경망을 훈련시키기 전에 먼저 외부 입력값과 피드백 시계열의 처음 두 개의 시간 스텝을 사용하여 신경망의 탭 지연 상태 2개를 채워야 합니다.

또한, 피드백 시계열을 입력 시계열과 목표 시계열로 사용해야 합니다.

함수 PREPARETS는 시뮬레이션과 훈련을 위한 시계열 데이터를 준비합니다. Xs는 이동된 입력 및 목표 시계열로 구성되며 신경망으로 입력됩니다. Xi는 초기 입력 지연 상태입니다. Ai는 계층 지연 상태이고(여기서는 계층과 계층 사이의 지연이 없으므로 비어 있음), Ts는 이동된 피드백 시계열입니다.

[Xs,Xi,Ai,Ts] = preparets(net,x,{},t);

이제 신경망을 훈련시킬 준비가 되었습니다. 시간 스텝은 자동으로 훈련 세트, 검증 세트, 테스트 세트로 나뉩니다. 훈련 세트는 신경망을 가르치는 데 사용됩니다. 훈련은 신경망이 검증 세트에 대해 계속해서 향상되는 한 지속됩니다. 테스트 세트는 신경망의 정확도를 가늠하는 완전히 독립적인 척도를 제공합니다.

Neural Network Training 툴은 훈련 중인 신경망과 훈련에 사용되는 알고리즘을 표시합니다. 또한 훈련 중의 상태를 표시하며 훈련을 중지시킨 기준을 녹색으로 강조 표시합니다.

하단의 버튼을 클릭하면 유용한 플롯이 열립니다. 플롯은 훈련하는 도중과 훈련을 마친 후에 열 수 있습니다. 알고리즘 이름과 플롯 버튼 옆에 있는 링크를 클릭하면 해당 항목에 대한 문서가 열립니다.

[net,tr] = train(net,Xs,Ts,Xi,Ai);

훈련하는 동안 신경망의 성능이 얼마나 향상되는지 보려면 "Performance" 버튼을 클릭하거나 PLOTPERFORM을 호출하십시오.

성능은 평균 제곱 오차로 측정되어 로그 스케일로 표시됩니다. 신경망이 훈련됨에 따라 오차가 빠르게 감소했습니다.

훈련 세트, 검증 세트, 테스트 세트 각각에 대해 성능이 표시됩니다.

plotperform(tr)

신경망 테스트하기

이제 훈련된 신경망의 평균 제곱 오차를 모든 시간 스텝에 대해 측정할 수 있습니다.

Y = net(Xs,Xi,Ai);

perf = mse(net,Ts,Y)
perf = 2.9245e-06

PLOTRESPONSE는 신경망의 응답 변수를 실제 자석 위치와 비교해서 보여줍니다. 모델이 정확하다면 '+' 점이 다이아몬드 점을 따라가며 하단 좌표축의 오차가 매우 작을 것입니다.

plotresponse(Ts,Y)

PLOTERRCORR는 다양한 지연값 e(t+lag)에 대해 시간 t에서의 오차 상관 e(t)를 보여줍니다. 가운데 선은 평균 제곱 오차를 나타냅니다. 신경망이 잘 훈련되었으면 다른 모든 선은 훨씬 짧을 것이며, 전부는 아니더라도 대부분의 선이 빨간색 신뢰한계 내에 있을 것입니다.

함수 GSUBTRACT는 오차 계산에 사용됩니다. 이 함수는 뺄셈을 일반화하여 셀형 배열 데이터 사이의 차분을 지원합니다.

E = gsubtract(Ts,Y);

ploterrcorr(E)

마찬가지로, PLOTINERRCORR은 다양한 범위의 지연값에서 입력값에 대한 오차의 상관관계를 보여줍니다. 이 경우에는 가운데 선을 포함한 모든 선 또는 대부분의 선이 신뢰한계 안에 들어갑니다.

plotinerrcorr(Xs,E)

이 신경망은 목표값이 피드백 입력값으로 사용되는 개루프 형태로 훈련되었습니다. 신경망을 폐루프 형태로 변환하여 예측값을 피드백 입력값으로 사용할 수도 있습니다.

net2 = closeloop(net);
view(net2)

신경망을 폐루프 형태로 시뮬레이션할 수 있습니다. 이 경우에는 신경망에 초기 자석 위치만 주어지므로 새 위치를 예측하기 위해 자체의 예측된 위치를 반복적으로 사용해야 합니다.

따라서 예측된 응답 변수와 실제 응답 변수 사이의 피팅이 빠른 속도로 나빠집니다. 이 현상은 모델을 잘 만든 경우에도 발생합니다. 그러나 이 두 변수가 분리되기까지 몇 개의 스텝이 일치하는지 살펴보는 것은 흥미로운 일입니다.

앞에서 설명했듯이 PREPARETS는 변경된 신경망을 고려하여 시계열 데이터를 준비합니다.

[Xs,Xi,Ai,Ts] = preparets(net2,x,{},t);
Y = net2(Xs,Xi,Ai);
plotresponse(Ts,Y)

자석 위치 예측값을 실제 발생 시점보다 한 개 시간 스텝 전에 구해야 하는 경우에는 신경망에서 지연을 제거하면 됩니다. 이렇게 하면 어떤 시간 t가 주어졌을 때 그 출력값이 시간 t+1에서의 위치에 대한 추정값입니다.

net3 = removedelay(net);
view(net3)

이번에도 PREPARETS를 사용하여 시뮬레이션을 위한 시계열을 준비합니다. 신경망이 개루프 예측을 수행하고 있으므로 이번에도 매우 정확하지만, 출력값은 시간 스텝 하나만큼 이동됩니다.

[Xs,Xi,Ai,Ts] = preparets(net3,x,{},t);
Y = net3(Xs,Xi,Ai);
plotresponse(Ts,Y)

이 예제에서는 자기 부상 역학 시스템의 동작을 모델링하는 신경망을 설계하는 방법을 살펴보았습니다.

신경망과 그 응용 분야에 대해 더 알아보려면 다른 예제와 문서를 살펴보십시오.