Main Content

이 페이지의 최신 내용은 아직 번역되지 않았습니다. 최신 내용은 영문으로 볼 수 있습니다.

얕은 신경망으로 데이터 피팅

신경망은 함수 피팅에 효과적입니다. 사실, 아주 단순한 신경망으로도 임의의 실용적인 함수를 피팅할 수 있다는 증거가 있습니다.

예를 들어, 진료소의 데이터가 있다고 가정하겠습니다. 13가지 해부학적 측정값을 통해 사람의 체지방 비율을 예측할 수 있는 신경망을 설계하고 싶습니다. 총 252명에 대한 13가지 항목의 데이터와 관련 체지방 비율의 표본을 가지고 있습니다.

다음 두 가지 방법으로 이 문제를 해결할 수 있습니다.

일반적으로 GUI로 시작한 다음 GUI를 사용하여 명령줄 스크립트를 자동으로 생성하는 것이 가장 좋습니다. 두 방법 중 하나를 사용하기 전에 먼저 데이터 세트를 선택하여 문제를 정의하십시오. 각 GUI는 툴박스를 실험하는 데 쓸 수 있는 여러 샘플 데이터 세트에 액세스할 수 있습니다(얕은 신경망을 위한 샘플 데이터 세트 항목 참조). 해결하려는 특정한 문제가 있는 경우, 자신의 데이터를 작업 공간으로 불러올 수 있습니다. 다음 섹션에서는 데이터 형식을 설명합니다.

문제 정의하기

툴박스의 피팅 문제를 정의하려면 Q 입력 벡터의 세트를 행렬의 열로 정렬하십시오. 그런 다음 또 하나의 세트인 Q 목표 벡터 세트(각 입력 벡터에 대한 올바른 출력 벡터)를 두 번째 행렬로 정렬합니다. (정적 및 시계열 데이터의 데이터 형식 지정에 대한 자세한 설명은 “데이터 구조”를 참조하십시오.) 예를 들어, 다음과 같이 요소를 2개 가진 입력 벡터들의 세트 4개와 요소를 1개 가진 목표값들로 부울 AND 게이트에 대한 피팅 문제를 정의할 수 있습니다.

inputs = [0 1 0 1; 0 0 1 1];
targets = [0 0 0 1];

다음 섹션에서는 Neural Network Fitting 앱 nftool을 사용하여 데이터 세트에 맞게 신경망을 훈련시키는 방법을 보여줍니다. 이 예제에서는 툴박스와 함께 제공된 체지방 데이터 세트를 사용합니다.

Neural Network Fitting 앱 사용하기

  1. 다음 명령을 사용하여 Neural Network Start GUI를 엽니다.

    nnstart
    

  2. Fitting app을 클릭하여 Neural Network Fitting App을 엽니다. (nftool 명령을 사용할 수도 있습니다.)

  3. Next를 클릭하여 계속 진행합니다.

  4. Select Data 창에서 Load Example Data Set를 클릭합니다. Fitting Data Set Chooser 창이 열립니다.

    참고

    MATLAB® 작업 공간에서 데이터를 불러오려면 Select Data 창의 InputsTargets 옵션을 사용하십시오.

  5. Chemical을 선택한 다음 Import를 클릭합니다. 그러면 Select Data 창으로 돌아갑니다.

  6. Next를 클릭하여 다음 그림과 같이 Validation and Test Data 창을 표시합니다.

    검증 데이터 세트와 테스트 데이터 세트는 각각 원본 데이터의 15%로 설정되어 있습니다.

    이러한 설정을 사용하면 입력 벡터와 목표 벡터가 다음과 같이 임의로 세 세트로 나뉩니다.

    • 70%는 훈련에 사용됩니다.

    • 15%는 신경망이 일반화되고 있음을 검증하고 과적합 전에 훈련을 중지하는 데 사용됩니다.

    • 마지막 15%는 신경망 일반화를 완전히 독립적으로 테스트하는 데 사용됩니다.

    (데이터 분할 과정에 대한 자세한 논의는 “데이터 분할하기”를 참조하십시오.)

  7. Next를 클릭합니다.

    함수 피팅에 사용되는 표준 신경망은 은닉 계층에 시그모이드 전달 함수가 있고 출력 계층에 선형 전달 함수가 있는 2계층 피드포워드 신경망입니다. 은닉 뉴런의 디폴트 개수는 10으로 설정됩니다. 신경망 훈련 성능이 떨어지면 이 수를 나중에 늘려야 할 수도 있습니다.

  8. Next를 클릭합니다.

  9. 훈련 알고리즘을 선택한 다음 Train을 클릭합니다. Levenberg-Marquardt(trainlm)가 대부분의 문제에 권장되지만, 잡음이 있고 규모가 작은 일부 문제의 경우 베이즈 정규화(Bayesian Regularization)(trainbr)가 시간이 더 오래 걸리더라도 더 좋은 해를 얻을 수 있습니다. 그러나 규모가 큰 문제의 경우, 이 두 알고리즘이 사용하는 야코비 행렬 계산보다 메모리 효율이 높은 기울기 계산을 사용한다는 점에서 스케일링된 켤레 기울기(Scaled Conjugate Gradient)(trainscg)를 사용하는 것이 좋습니다. 이 예제에서는 디폴트 값인 Levenberg-Marquardt를 사용합니다.

    검증 오차가 6회 반복 동안 감소하지 않을 때까지(즉, 검증이 중지될 때까지) 훈련이 계속되었습니다.

  10. Plots에서 Regression을 클릭합니다. 이는 신경망 성능을 검증하는 데 사용됩니다.

    다음 회귀 플롯은 훈련, 검증 및 테스트 세트의 목표값에 대한 신경망 출력값을 표시합니다. 완벽한 피팅이 되려면 데이터가 45도 직선에 있어야 하며, 이 직선에 있는 신경망 출력값은 목표값과 같습니다. 이 문제의 경우 피팅 결과가 모든 데이터 세트에서 상당히 우수하며, 각 경우의 R 값은 0.93 이상입니다. 훨씬 더 정확한 결과가 필요한 경우 nftool에서 Retrain을 클릭하여 신경망을 다시 훈련시킬 수 있습니다. 이렇게 하면 신경망의 초기 가중치와 편향이 변경되고, 재훈련 후 향상된 신경망이 생성될 수 있습니다. 다른 옵션은 다음 창에서 제공됩니다.

  1. 오차 히스토그램을 보고 신경망 성능을 추가로 검증합니다. Plots 창에서 Error Histogram을 클릭합니다.

    파란색 막대는 훈련 데이터를 나타내고, 녹색 막대는 검증 데이터를 나타내고, 빨간색 막대는 테스트 데이터를 나타냅니다. 히스토그램은 피팅이 대다수 데이터보다 현저하게 나쁜 데이터 점인 이상값을 표시할 수 있습니다. 이 사례에서는 대부분의 오차가 -5에서 5 사이인 반면 오차가 17인 훈련 점과 오차가 12와 13인 검증 점이 있는 것을 확인할 수 있습니다. 이러한 이상값은 테스트 회귀 플롯에서도 볼 수 있습니다. 첫 번째는 목표값이 50이고 출력값이 33에 가까운 점에 해당합니다. 이상값을 확인하여 데이터가 불량인지 또는 데이터 점이 나머지 데이터 세트와 다른지 확인하는 것이 좋습니다. 이상값이 유효한 데이터 점이지만 나머지 데이터와 다른 경우, 신경망은 이 점에 대해 외삽법을 적용합니다. 이상값 점처럼 보이는 더 많은 데이터를 수집하고 신경망을 다시 훈련해야 합니다.

  2. Neural Network Fitting 앱에서 Next를 클릭하여 신경망을 평가합니다.

    이 점에서 새 데이터에 대해 신경망을 테스트할 수 있습니다.

    원본 데이터 또는 새 데이터에 대한 신경망 성능에 만족하지 못하는 경우 다음 중 하나를 수행할 수 있습니다.

    • 다시 훈련시킵니다.

    • 뉴런 수를 늘립니다.

    • 더 큰 훈련 데이터 세트를 가져옵니다.

    훈련 세트에서의 성능은 좋은데 테스트 세트 성능이 현저하게 나쁘면 과적합을 의미할 수 있으며, 그런 경우 뉴런 수를 줄이면 결과가 향상될 수 있습니다. 훈련 성능이 나쁘다면 뉴런 수를 늘려 보는 게 좋을 수 있습니다.

  3. 신경망 성능에 만족하면 Next를 클릭합니다.

  4. 이 패널을 사용하여 신경망 시뮬레이션을 위한 MATLAB 함수 또는 Simulink® 다이어그램을 생성합니다. 생성된 코드 또는 도식을 사용하여 신경망이 입력값에서 출력값을 계산하는 방법을 더 명확히 이해하고, 신경망과 함께 MATLAB Compiler™ 툴과 그 밖의 MATLAB 코드 생성 툴을 배포할 수 있습니다.

  5. 이 화면의 버튼을 사용하여 스크립트를 생성하거나 결과를 저장합니다.

    • Simple Script 또는 Advanced Script를 클릭하여 명령줄에서 이전 단계를 모두 재현하는 데 사용할 수 있는 MATLAB 코드를 만들 수 있습니다. 툴박스의 명령줄 기능을 사용하여 훈련 과정을 사용자 지정하는 방법을 배우려면 MATLAB 코드 만들기가 유용할 수 있습니다. 명령줄 함수 사용하기에서, 생성된 스크립트를 자세히 조사해야 합니다.

    • 신경망을 작업 공간에 net으로 저장할 수도 있습니다. 신경망에 대해 추가로 테스트를 수행하거나 새로운 입력값에 대해 작업을 수행할 수 있습니다.

  6. MATLAB 코드를 만들어 결과를 저장했으면 Finish를 클릭합니다.

명령줄 함수 사용하기

툴박스의 명령줄 기능 사용법을 학습하는 가장 쉬운 방법은 GUI에서 스크립트를 생성한 다음 이를 수정하여 신경망 훈련을 사용자 지정하는 것입니다. 예를 들어, 이전 섹션의 단계 14에서 작성된 간단한 스크립트를 보십시오.

% Solve an Input-Output Fitting problem with a Neural Network
% Script generated by NFTOOL
%
% This script assumes these variables are defined:
%
%   houseInputs - input data.
%   houseTargets - target data.
 
inputs = houseInputs;
targets = houseTargets;
 
% Create a Fitting Network
hiddenLayerSize = 10;
net = fitnet(hiddenLayerSize);

% Set up Division of Data for Training, Validation, Testing
net.divideParam.trainRatio = 70/100;
net.divideParam.valRatio = 15/100;
net.divideParam.testRatio = 15/100;
 
% Train the Network
[net,tr] = train(net,inputs,targets);
 
% Test the Network
outputs = net(inputs);
errors = gsubtract(outputs,targets);
performance = perform(net,targets,outputs)
 
% View the Network
view(net)
 
% Plots
% Uncomment these lines to enable various plots.
% figure, plotperform(tr)
% figure, plottrainstate(tr)
% figure, plotfit(targets,outputs)
% figure, plotregression(targets,outputs)
% figure, ploterrhist(errors)

스크립트를 저장한 다음 명령줄에서 실행하여 이전 GUI 세션의 결과를 재현할 수 있습니다. 스크립트를 편집하여 훈련 과정을 사용자 지정할 수도 있습니다. 이 사례에서는 스크립트의 각 단계를 따르십시오.

  1. 이 스크립트는 입력 벡터와 목표 벡터를 이미 작업 공간에 불러온 상태라고 가정합니다. 데이터를 불러오지 않은 경우 다음과 같이 불러올 수 있습니다.

    load bodyfat_dataset
    inputs = bodyfatInputs;
    targets = bodyfatTargets;
    

    이 데이터 세트는 툴박스의 일부인 샘플 데이터 세트 중 하나입니다(얕은 신경망을 위한 샘플 데이터 세트 참조). help nndatasets 명령을 입력하여 사용 가능한 모든 데이터 세트 목록을 볼 수 있습니다. load 명령으로 사용자 자신의 변수 이름을 사용해 이러한 데이터 세트에서 변수를 불러올 수도 있습니다. 예를 들어, 다음 명령은

    [inputs,targets] = bodyfat_dataset;
    

    체지방 입력값을 배열 inputs로 불러오고 체지방 목표값을 배열 targets로 불러옵니다.

  2. 신경망을 만듭니다. 함수 피팅(또는 회귀) 문제에 대한 디폴트 신경망 fitnet은 은닉 계층에 디폴트 탄젠트-시그모이드 전달 함수가 있고 출력 계층에 선형 전달 함수가 있는 피드포워드 신경망입니다. 이전 섹션에서 하나의 은닉 계층에 (다소 임의적으로) 10개의 뉴런을 할당했습니다. 신경망에는 하나의 출력 뉴런이 있습니다. 각 입력 벡터와 관련된 목표값이 하나뿐이기 때문입니다.

    hiddenLayerSize = 10;
    net = fitnet(hiddenLayerSize);
    

    참고

    뉴런이 많을수록 많은 계산이 필요하고 너무 높게 설정한 뉴런 개수로 인해 데이터를 과적합하는 경향이 발생하지만, 신경망으로 더 복잡한 문제를 해결할 수 있습니다. 계층이 많을수록 계산이 많이 필요하지만, 많은 계층을 사용하면 복잡한 문제를 더 효율적으로 해결할 수 있습니다. 두 개 이상의 은닉 계층을 사용하려면 fitnet 명령에 은닉 계층의 크기를 배열의 요소로 입력하십시오.

  3. 데이터 분할을 설정합니다.

    net.divideParam.trainRatio = 70/100;
    net.divideParam.valRatio = 15/100;
    net.divideParam.testRatio = 15/100;
    

    이러한 설정을 사용하면 입력 벡터와 목표 벡터가 임의로 나뉘어, 70%는 훈련, 15%는 검증, 15%는 테스트에 사용됩니다. (데이터 분할 과정에 대한 자세한 논의는 “데이터 분할하기”를 참조하십시오.)

  4. 신경망을 훈련시킵니다. 신경망은 훈련용으로 디폴트 값인 Levenberg-Marquardt 알고리즘(trainlm)을 사용합니다. Levenberg-Marquardt가 원하는 만큼 정확한 결과를 내지 못하거나 큰 데이터 문제가 발생하는 경우, 다음 중 하나를 사용하여 신경망 훈련 함수를 베이즈 정규화(Bayesian Regularization)(trainbr) 또는 스케일링된 켤레 기울기(Scaled Conjugate Gradient)(trainscg)로 설정하는 것이 좋습니다.

    net.trainFcn = 'trainbr';
    net.trainFcn = 'trainscg';

    신경망을 훈련시키려면 다음과 같이 입력하십시오.

    [net, tr] = train(net, inputs, targets);
    

    훈련 중에 다음 훈련 창이 열립니다. 이 창에는 훈련 진행 상황이 표시되며 Stop Training을 클릭하여 언제든지 훈련을 중단할 수 있습니다.

    이 훈련은 6회 반복 동안 검증 오차가 증가했을 때 중지되었으며, 20회째 반복에서 중지되었습니다. 훈련 창에서 Performance를 클릭하면 다음 그림과 같이 훈련 오차, 검증 오차 및 테스트 오차의 플롯이 나타납니다. 이 예제에서는 다음과 같은 이유로 결과가 합리적입니다.

    • 최종 평균 제곱 오차가 작습니다.

    • 테스트 세트 오차와 검증 세트 오차의 특성이 유사합니다.

    • 14회째 반복(최상의 검증 성능이 발생하는 곳)에서 과적합이 발생하지 않았습니다.

  5. 신경망을 테스트합니다. 훈련을 마친 신경망을 사용하여 신경망 출력값을 계산할 수 있습니다. 다음 코드는 신경망 출력값, 오차 및 전체 성능을 계산합니다.

    outputs = net(inputs);
    errors = gsubtract(targets, outputs);
    performance = perform(net, targets, outputs)
    
    performance =
    
       19.3193
    
    

    훈련 기록에 있는 테스트 인덱스를 사용하여 테스트 세트에서만 신경망 성능을 계산할 수도 있습니다. (훈련 기록에 대한 전체 설명은 훈련 후에 얕은 신경망 성능 분석하기 항목을 참조하십시오.)

    tInd = tr.testInd;
    tstOutputs = net(inputs(:, tInd));
    tstPerform = perform(net, targets(tInd), tstOutputs)
    
    tstPerform =
    
       53.7680
    
    
  6. 신경망 응답에 대한 분석을 수행합니다. 훈련 창에서 Regression을 클릭하면 신경망 출력값과 해당 목표값 간에 선형 회귀를 수행할 수 있습니다.

    다음 그림이 결과를 보여줍니다.

    출력은 훈련, 테스트 및 검증에서 목표를 아주 잘 추종하며, R-값은 총 응답에 대해 0.96을 초과합니다. 훨씬 더 정확한 결과가 필요한 경우 다음 방법 중 하나를 시도해 볼 수 있습니다.

    • init을 사용하여 초기 신경망 가중치와 편향을 새 값으로 재설정하고 다시 훈련시킵니다(“가중치 초기화하기”(init) 참조).

    • 은닉 뉴런 수를 늘립니다.

    • 훈련 벡터 수를 늘립니다.

    • 더 많은 관련 정보를 사용할 수 있으면 입력값 개수를 늘립니다.

    • 다른 훈련 알고리즘을 사용해 봅니다(“훈련 알고리즘” 참조).

    이 사례에서는 신경망 응답이 만족스러우므로 신경망을 새로운 입력에 사용할 수 있습니다.

  7. 신경망 도식을 확인합니다.

    view(net)
    

명령줄 연산에 대한 더 많은 경험을 얻으려면 다음 작업 중 일부를 수행해 보십시오.

  • 훈련 중에 플롯 창(예: 회귀 플롯)을 열고 애니메이션을 확인합니다.

  • plotfit, plotregression, plottrainstateplotperform과 같은 함수로 명령줄에서 플로팅합니다. (이러한 함수 사용에 대한 자세한 내용은 해당 함수 도움말 페이지를 참조하십시오.)

또한, 명령줄에서 훈련시킬 때 여러 옵션에 대한 고급 스크립트를 살펴보십시오.

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

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