Main Content

얕은 신경망 일반화를 개선하고 과적합 방지하기

딥러닝 신경망에 대해 파라미터를 설정하는 방법을 알아보려면 파라미터를 설정하고 컨벌루션 신경망 훈련시키기 항목을 참조하십시오.

신경망 훈련 중에 발생하는 한 가지 문제로 과적합이 있습니다. 훈련 세트에서는 오차가 매우 작은 값으로 유도되지만 새로운 데이터가 신경망에 입력되면 오차가 커지는 경우입니다. 이 문제는 신경망이 새로운 상황으로 일반화하는 방법을 학습하지 못하고 훈련 예제를 기억했기 때문에 발생합니다.

다음 그림은 잡음이 있는 사인 함수를 근사하도록 훈련된 1-20-1 신경망의 응답을 보여줍니다. 기본 사인 함수는 점선으로 표시되었고, 잡음이 있는 측정값은 + 기호로 표시되었으며, 신경망 응답은 실선으로 표시되었습니다. 이 신경망은 데이터를 과적합했기 때문에 잘 일반화되지 않을 것임을 알 수 있습니다.

신경망 일반화를 개선하는 한 가지 방법은 적절한 피팅을 제공할 수 있을 정도로만 큰 신경망을 사용하는 것입니다. 더 큰 신경망을 사용할수록 신경망이 더 복잡한 함수를 만들 수 있습니다. 적절히 작은 신경망을 사용하면 데이터를 과적합할 위험이 생기지 않습니다. 신경망 설계 예제 nnd11gn[HDB96]을 실행하여 신경망의 크기를 줄이는 것이 과적합을 방지하는 데 어떻게 도움이 되는지 알아보십시오.

그러나 특정 응용 분야에서 신경망이 얼마나 큰지 사전에 알기란 쉽지 않습니다. Deep Learning Toolbox™에는 일반화 개선을 위한 두 가지 다른 방법, 즉 정규화와 조기 중지가 구현되어 있습니다. 이어지는 섹션에서는 이 두 기법과 각각을 구현하는 루틴에 대해 설명합니다.

신경망의 파라미터 개수가 훈련 세트의 총 점 개수보다 훨씬 적은 경우에는 과적합될 확률이 낮거나 없습니다. 데이터를 수집하여 훈련 세트의 크기를 늘리는 것이 어렵지 않다면 굳이 다음 기법을 사용하여 과적합을 방지할 필요가 없습니다. 이 섹션의 결과는 한정된 데이터를 최대한 활용해야 하는 경우에만 적용됩니다.

신경망 다시 훈련시키기

일반적으로 각 역전파 훈련 세션은 초기 가중치, 편향, 그리고 데이터가 나뉜 훈련 세트, 검증 세트, 테스트 세트가 세션 간 서로 다르게 설정되어 시작됩니다. 이처럼 조건이 다르기 때문에 동일한 문제일지라도 각 세션에서의 해가 크게 달라질 수 있습니다.

양호한 일반화를 보이는 신경망을 찾았는지 확인하기 위해 여러 개의 신경망을 훈련시키는 것이 좋습니다.

아래에서는 데이터셋을 불러와서 두 부분으로 분할했습니다. 90%는 신경망 설계용이고 10%는 테스트용입니다.

[x, t] = bodyfat_dataset;
Q = size(x, 2);
Q1 = floor(Q * 0.90);
Q2 = Q - Q1;
ind = randperm(Q);
ind1 = ind(1:Q1);
ind2 = ind(Q1 + (1:Q2));
x1 = x(:, ind1);
t1 = t(:, ind1);
x2 = x(:, ind2);
t2 = t(:, ind2);

다음으로, 신경망 아키텍처를 선택하고 데이터셋의 첫 번째 부분에 대해 10회 훈련시켰습니다. 이때 각 신경망의 평균 제곱 오차는 데이터셋의 두 번째 부분에 대해 구했습니다.

net = feedforwardnet(10);
numNN = 10;
NN = cell(1, numNN);
perfs = zeros(1, numNN);
for i = 1:numNN
  fprintf('Training %d/%d\n', i, numNN);
  NN{i} = train(net, x1, t1);
  y2 = NN{i}(x2);
  perfs(i) = mse(net, t2, y2);
end

각 신경망마다 초기 가중치, 편향, 그리고 첫 번째 데이터셋을 나눈 훈련 세트, 검증 세트, 테스트 세트가 다르게 설정되어 훈련됩니다. 테스트 세트는 각 신경망에 대한 일반화를 측정하는 좋은 지표이지만, 하나의 신경망에 대해 테스트 세트인 데이터가 다른 신경망에서는 훈련이나 검증용으로 사용될 수 있으므로 모든 신경망에 대한 일반화를 측정하는 좋은 지표는 아닙니다. 이러한 이유로, 완전히 독립적인 테스트 세트를 보존할 수 있도록 원래 데이터셋을 두 부분으로 분할한 것입니다.

성능이 가장 낮은 신경망은 데이터셋의 두 번째 부분에 대해 가장 잘 일반화된 신경망입니다.

여러 개의 신경망

일반화를 개선하는 또 다른 간단한 방법은, 특히 그 원인이 잡음이 있는 데이터나 작은 데이터셋인 경우, 여러 개의 신경망을 훈련시키고 출력값의 평균을 구하는 것입니다.

예를 들어, 아래에서는 작은 문제에 대해 10개의 신경망을 훈련시키고, 각각의 평균 제곱 오차를 전체 10개 신경망 평균의 평균 제곱 오차와 비교합니다.

먼저, 데이터셋을 불러와서 설계 및 테스트 세트로 분할합니다.

[x, t] = bodyfat_dataset;
Q = size(x, 2);
Q1 = floor(Q * 0.90);
Q2 = Q - Q1;
ind = randperm(Q);
ind1 = ind(1:Q1);
ind2 = ind(Q1 + (1:Q2));
x1 = x(:, ind1);
t1 = t(:, ind1);
x2 = x(:, ind2);
t2 = t(:, ind2);

그런 다음 10개의 신경망을 훈련시킵니다.

net = feedforwardnet(10);
numNN = 10;
nets = cell(1, numNN);
for i = 1:numNN
  fprintf('Training %d/%d\n', i, numNN)
  nets{i} = train(net, x1, t1);
end

다음으로, 각 신경망을 두 번째 데이터셋에 대해 테스트합니다. 이때 개별 성능과 평균 출력값의 성능을 모두 계산합니다.

perfs = zeros(1, numNN);
y2Total = 0;
for i = 1:numNN
  neti = nets{i};
  y2 = neti(x2);
  perfs(i) = mse(neti, t2, y2);
  y2Total = y2Total + y2;
end
perfs
y2AverageOutput = y2Total / numNN;
perfAveragedOutputs = mse(nets{1}, t2, y2AverageOutput) 

평균 출력값의 평균 제곱 오차는 전부는 아니더라도 대부분의 개별 성능에 비해 낮을 가능성이 큽니다. 추가적인 새로운 데이터에 대해 더 잘 일반화될 것입니다.

일부 매우 어려운 문제의 경우, 1백 개의 신경망을 훈련시킨 다음 임의의 입력값에 대한 출력값의 평균을 구할 수 있습니다. 이 방법은 아래에서 설명하는 베이즈 정규화 훈련 함수 trainbr과 함께 잡음이 있고 크기가 작은 데이터셋을 사용하는 경우에 특히 유용합니다.

조기 중지

일반화를 개선하는 디폴트 방법은 조기 중지라고 합니다. 이 기법은 feedforwardnet과 같은 역전파 신경망 생성 함수를 포함하여 모든 지도 신경망 생성 함수에 자동으로 제공됩니다.

이 기법에서는 사용 가능한 데이터가 3개의 서브셋으로 분할됩니다. 첫 번째 서브셋은 기울기를 계산하고 신경망 가중치와 편향을 업데이트하는 데 사용되는 훈련 세트입니다. 두 번째 서브셋은 검증 세트입니다. 훈련 과정 중에 검증 세트의 오차가 모니터링됩니다. 검증 오차는 훈련 세트 오차와 마찬가지로 일반적으로 훈련의 초기 단계가 진행되는 동안 감소합니다. 그러나 신경망이 데이터에 대해 과적합되기 시작하면 일반적으로 검증 세트의 오차가 증가하기 시작합니다. 지정된 반복 횟수(net.trainParam.max_fail) 동안 검증 오차가 증가하면 훈련이 중지되고 검증 오차의 최솟값에서 가중치와 편향이 반환됩니다.

테스트 세트 오차는 훈련 중에는 사용되지 않지만, 여러 모델을 비교하는 데는 사용됩니다. 훈련 과정 중에 테스트 세트 오차를 플로팅하는 것 또한 유용합니다. 테스트 세트의 오차가 최솟값에 도달한 반복 횟수와 검증 세트의 오차가 최솟값에 도달한 반복 횟수가 상당히 다르다면 데이터 세트를 적절하지 않게 분할한 것일 수 있습니다.

데이터를 훈련, 검증 및 테스트 세트로 분할하기 위해 네 가지 함수가 제공됩니다. dividerand(디폴트 값), divideblock, divideintdivideind입니다. 다음 속성을 사용하여 신경망의 분할 함수를 액세스하거나 변경할 수 있습니다.

net.divideFcn

각 함수는 함수의 동작을 사용자 지정하는 파라미터를 받습니다. 이러한 값은 다음 신경망 속성을 사용하여 저장되며 변경할 수 있습니다.

net.divideParam

인덱스 데이터 분할(divideind)

간단한 테스트 문제를 만듭니다. 0.01의 스텝으로 -1부터 1까지의 입력 점을 201개 갖는, 잡음이 있는 사인파를 전체 데이터 세트로서 생성합니다.

p = [-1:0.01:1];
t = sin(2*pi*p)+0.1*randn(size(p));

연속된 샘플이 훈련 세트, 검증 세트 및 테스트 세트에 연속적으로 할당되도록 인덱스를 기준으로 데이터를 분할합니다.

trainInd = 1:3:201
valInd = 2:3:201;
testInd = 3:3:201;
[trainP,valP,testP] = divideind(p,trainInd,valInd,testInd);
[trainT,valT,testT] = divideind(t,trainInd,valInd,testInd);

무작위 데이터 분할(dividerand)

다음과 같이 샘플의 60%는 훈련 세트에 할당되고 20%는 검증 세트에 할당되고 20%는 테스트 세트에 할당되도록 입력 데이터를 무작위로 분할할 수 있습니다.

[trainP,valP,testP,trainInd,valInd,testInd] = dividerand(p);

이 함수는 입력 데이터를 분할할 뿐 아니라, 이후에 divideind를 사용하여 목표 데이터를 분할할 수 있도록 인덱스도 반환합니다.

[trainT,valT,testT] = divideind(t,trainInd,valInd,testInd);

블록 데이터 분할(divideblock)

다음과 같이 샘플의 처음 60%는 훈련 세트에 할당되고, 다음 20%는 검증 세트에 할당되고, 마지막 20%는 테스트 세트에 할당되도록 입력 데이터를 무작위로 분할할 수도 있습니다.

[trainP,valP,testP,trainInd,valInd,testInd] = divideblock(p);

이후에 divideind를 사용하여 목표 데이터를 분할합니다.

[trainT,valT,testT] = divideind(t,trainInd,valInd,testInd);

인터리빙된 데이터 분할(divideint)

입력 데이터를 분할하는 또 다른 방법은 백분율에 따라 훈련 세트, 검증 세트, 테스트 세트 사이에서 샘플을 순환하는 것입니다. 다음과 같이 샘플의 60%는 훈련 세트로 인터리빙하고, 20%는 검증 세트로 인터리빙하고, 20%는 테스트 세트로 인터리빙할 수 있습니다.

[trainP,valP,testP,trainInd,valInd,testInd] = divideint(p);

이후 divideind를 사용하여 목표 데이터를 분할합니다.

[trainT,valT,testT] = divideind(t,trainInd,valInd,testInd);

정규화

일반화를 개선하는 또 다른 방법으로 정규화라는 것이 있습니다. 정규화에는 훈련 세트에서 성능 함수(주로 신경망 오차의 제곱합이 선택됨)를 수정하는 작업이 포함됩니다. 다음 섹션에서는 성능 함수를 수정하는 방법을 설명하고, 그다음 섹션에서는 가장 좋은 일반화를 달성하도록 자동으로 최적의 성능 함수를 설정하는 루틴에 대해 설명합니다.

변형 성능 함수

피드포워드 신경망을 훈련시키는 데 사용되는 일반적인 성능 함수는 신경망 오차의 평균 제곱합입니다.

F=mse=1Ni=1N(ei)2=1Ni=1N(tiαi)2

신경망 가중치 및 편향의 제곱합의 평균으로 이루어진 항 msereg=γ*msw+(1γ)*mse를 추가하여 성능 함수를 수정하면 일반화를 개선할 수 있습니다. 여기서 γ는 성능 비율이고 msw는 다음과 같습니다.

msw=1nj=1nwj2

이 성능 함수를 사용하면 신경망이 더 작은 가중치와 편향을 갖게 되며, 이로 인해 신경망 응답이 매끄러워지고 과적합될 확률이 낮아집니다.

다음 코드는 이전 신경망을 다시 초기화한 다음 정규화된 성능 함수와 함께 BFGS 알고리즘을 사용하여 다시 훈련시킵니다. 여기서 성능 비율은 0.5로 설정되었으며, 평균 제곱 오차와 평균 제곱 가중치에 동일한 가중치가 주어집니다.

[x,t] = simplefit_dataset;
net = feedforwardnet(10,'trainbfg');
net.divideFcn = '';
net.trainParam.epochs = 300;
net.trainParam.goal = 1e-5;
net.performParam.regularization = 0.5;
net = train(net,x,t);

정규화에서 발생하는 문제는 성능 비율 파라미터에 대한 최적의 값을 판단하기가 어렵다는 데 있습니다. 이 파라미터를 너무 크게 설정하면 과적합이 발생할 수 있습니다. 이 비율이 너무 작으면 신경망이 훈련 데이터를 적절하게 피팅하지 않습니다. 다음 섹션에서는 정규화 파라미터를 자동으로 설정하는 루틴에 대해 설명합니다.

자동 정규화(trainbr)

최적의 정규화 파라미터를 자동화된 방식으로 결정하는 것이 바람직합니다. 이러한 방식을 위한 한 가지 방법은 David MacKay의 베이즈 프레임워크[MacK92]입니다. 이 프레임워크에서는 신경망의 가중치와 편향이 지정된 분포를 갖는 확률 변수라고 가정합니다. 정규화 파라미터는 이러한 분포와 관련 있는 알려지지 않은 변수와 관계가 있습니다. 그런 다음 통계적 기법을 사용하여 이러한 파라미터를 추정할 수 있습니다.

베이즈 정규화에 대한 상세한 설명은 본 사용자 안내서의 범위를 벗어납니다. 베이즈 정규화의 사용에 대한 상세한 설명과 Levenberg-Marquardt 훈련에 대한 설명은 [FoHa97]에서 확인할 수 있습니다.

베이즈 정규화는 함수 trainbr에 구현되어 있습니다. 다음 코드는 이 함수를 사용하여 1-20-1 신경망이 얕은 신경망 일반화를 개선하고 과적합 방지하기 항목의 그림에 나와 있는 잡음이 있는 사인파를 근사하도록 훈련시키는 방법을 보여줍니다. (trainbr의 영향이 조기 중지로부터 격리되도록 net.divideFcn을 설정하여 데이터 분할이 취소되었습니다.)

x = -1:0.05:1;
t = sin(2*pi*x) + 0.1*randn(size(x));
net = feedforwardnet(20,'trainbr');
net = train(net,x,t);

이 알고리즘의 한 가지 특징은 신경망에서 몇 개의 신경망 파라미터(가중치와 편향)를 실질적으로 사용하는지에 대한 측정값을 제공한다는 것입니다. 여기서는 마지막 훈련된 신경망이 1-20-1 신경망의 총 61개의 가중치와 편향 중에서 약 12개의 파라미터(printout의 #Par에서 확인)를 사용합니다. 유효한 파라미터의 개수는 신경망의 파라미터 개수가 얼마만큼 커지든 관계없이 대략적으로 동일하게 유지되어야 합니다. (이것은 신경망이 수렴하도록 충분한 반복 횟수에 대해 훈련되었음을 가정합니다.)

trainbr 알고리즘은 신경망 입력값과 목표값이 대략적으로 범위 [−1,1] 내에 오도록 스케일링된 경우에 일반적으로 가장 잘 작동합니다. 이 테스트 문제도 그런 경우입니다. 입력값과 목표값이 이 범위 내에 들어가지 않는다면 신경망 입력-출력 처리 함수 선택하기에서 설명하는 바와 같이 mapminmax 또는 mapstd를 사용하여 스케일링을 수행할 수 있습니다. feedforwardnet을 사용하여 만든 신경망은 기본적으로 입력값 및 출력값 처리 함수로 mapminmax를 포함합니다.

다음 그림은 훈련된 신경망의 응답을 보여줍니다. 1-20-1 신경망이 데이터에 과적합되었던 앞 그림과 달리, 여기서는 신경망 응답이 기본 사인 함수(점선)와 매우 가까우며 따라서 신경망이 새로운 입력값에 대해 잘 일반화될 것을 알 수 있습니다. 이보다 큰 신경망을 사용해 볼 수도 있었지만, 그래도 신경망 응답이 데이터에 과적합되지 않았을 것입니다. 이로 인해 최적의 신경망 크기를 추측해야 할 필요가 없어졌습니다.

trainbr을 사용할 때는 유효한 파라미터 개수로 수렴될 때까지 알고리즘이 실행되도록 하는 것이 중요합니다. 훈련이 "Maximum MU reached" 메시지와 함께 중지될 수 있습니다. 이는 전형적인 동작으로, 알고리즘이 정말로 수렴되었음을 나타냅니다. 오차 제곱합(SSE)과 가중치 제곱합(SSW)이 몇 회의 반복에서 상대적으로 일정한 경우에도 알고리즘이 수렴했음을 알 수 있습니다. 이 경우 훈련 창의 중지 버튼을 클릭해야 할 수 있습니다.

조기 중지와 정규화에 대한 요약 및 설명

조기 중지와 정규화는 올바르게 적용할 경우 신경망을 일반화합니다.

조기 중지를 사용할 때는 너무 빠르게 수렴하는 알고리즘을 사용하지 않도록 주의해야 합니다. trainlm과 같은 빠른 알고리즘을 사용할 경우에는 상대적으로 느리게 수렴되도록 훈련 파라미터를 설정하십시오. 예를 들어, mu를 1과 같이 상대적으로 큰 값으로 설정하고 mu_decmu_inc를 각각 0.8 및 1.5와 같이 1에 가까운 값으로 설정합니다. 훈련 함수 trainscgtrainbr은 일반적으로 조기 중지와 잘 작동합니다.

조기 중지에서는 검증 세트를 올바르게 선택하는 것도 중요합니다. 검증 세트는 훈련 세트의 모든 점을 대표해야 합니다.

베이즈 정규화를 사용할 때는 신경망이 수렴할 때까지 훈련시키는 것이 중요합니다. 신경망이 수렴하면 오차 제곱합, 가중치 제곱합 및 유효한 파라미터 개수가 일정한 값에 도달합니다.

조기 중지와 정규화를 모두 사용하는 경우에는 몇 가지 다른 초기 조건으로 신경망을 훈련시키는 것이 좋습니다. 두 방법 모두 특정 상황에서 실패할 수 있습니다. 몇 가지 다른 초기 조건을 테스트해 보면 로버스트 신경망 성능을 확인할 수 있습니다.

크기가 작은 데이터 세트로 함수 근사 신경망을 훈련시키는 경우에는 조기 중지보다 베이즈 정규화가 더 나은 성능의 일반화를 제공합니다. 베이즈 정규화에서는 검증 데이터 세트를 훈련 데이터 세트와 분리할 필요 없이 모든 데이터를 사용하기 때문입니다.

알고리즘의 성능에 대해 알아볼 수 있도록 다음 표에 나열된 몇 가지 벤치마크 데이터 세트에 대해 조기 중지와 베이즈 정규화가 테스트되었습니다.

데이터 세트 제목

점 개수신경망설명

BALL

672-10-1공 위치 측정값에 대한 이중 센서 보정

SINE (5% N)

411-15-1가우스 잡음이 5% 수준인 단일 주기 사인파

SINE (2% N)

411-15-1가우스 잡음이 2% 수준인 단일 주기 사인파

ENGINE (ALL)

11992-30-2엔진 센서—전체 데이터 세트

ENGINE (1/4)

3002-30-2엔진 센서—데이터 세트의 1/4

CHOLEST (ALL)

2645-15-3콜레스테롤 측정값—전체 데이터 세트

CHOLEST (1/2)

1325-15-3콜레스테롤 측정값—데이터 세트의 1/2

위의 데이터 세트는 모두 다양한 크기를 가지며 입력값과 출력값의 개수가 서로 다릅니다. 이 중에서 2개의 데이터 세트의 경우 한 번은 모든 데이터를 사용하여 신경망을 훈련시켰고 또 한 번은 데이터의 일부만 사용하여 신경망을 다시 훈련시켰습니다. 이것은 데이터 세트가 비교적 작을 때 베이즈 정규화의 이점이 더욱 뚜렷해지는 것을 보여줍니다. SINE 데이터 세트를 제외한 모든 데이터 세트는 실제 시스템에서 얻었습니다. 두 SINE 데이터 세트는 단일 주기의 사인파에 다양한 수준의 잡음을 추가하여 인공적으로 생성되었습니다. 이 두 데이터 세트에 대한 알고리즘의 성능은 잡음의 효과를 보여줍니다.

다음 표에는 7가지 테스트 세트에 대한 조기 중지(ES)와 베이즈 정규화(BR)의 성능이 요약되어 있습니다. (조기 중지 테스트에서는 trainscg 알고리즘이 사용되었습니다. 나머지 알고리즘도 비슷한 성능을 제공합니다.)

제곱평균 테스트 세트 오차

방법BallEngine (All)Engine (1/4)Choles (All)Choles (1/2)Sine (5% N)Sine (2% N)
ES1.2e-11.3e-21.9e-21.2e-11.4e-11.7e-11.3e-1
BR1.3e-32.6e-34.7e-31.2e-19.3e-23.0e-26.3e-3
ES/BR925411.55.721

대부분의 경우 베이즈 정규화가 조기 중지보다 성능이 높은 것을 확인할 수 있습니다. 성능 개선은 데이터 세트가 작거나 데이터 세트에 있는 잡음이 적은 경우에 가장 뚜렷합니다. 예를 들어 BALL 데이터 세트는 잡음이 매우 적은 센서에서 얻었습니다.

베이즈 정규화의 일반화 성능이 조기 중지보다 높은 경우가 많긴 하지만 항상 그런 것은 아닙니다. 또한, 툴박스에 구현된 베이즈 정규화 형식은 패턴 인식 문제에서는 함수 근사 문제에서만큼의 높은 성능을 보이지 않습니다. 패턴 인식 문제에서처럼 신경망 출력값이 포화되면 Levenberg-Marquardt 알고리즘에 사용된 헤세 행렬에 대한 근사의 정확도가 떨어지기 때문입니다. 베이즈 정규화 방법의 또 다른 단점은 일반적으로 조기 중지보다 수렴하는 데 더 오래 걸린다는 것입니다.

훈련 후 분석(회귀)

훈련된 신경망의 성능은 훈련 세트, 검증 세트, 테스트 세트에 대한 오차로 어느 정도 측정할 수 있긴 하지만 신경망 응답을 보다 상세히 살펴보는 것이 유용한 경우가 많습니다. 한 가지 옵션은 신경망 응답과 그에 대응되는 목표값 사이의 회귀 분석을 수행하는 것입니다. 루틴 regression은 이 분석을 수행하도록 설계되었습니다.

다음 명령은 훈련된 신경망에 대해 회귀 분석을 수행하는 방법을 보여줍니다.

x = [-1:.05:1];
t = sin(2*pi*x)+0.1*randn(size(x));
net = feedforwardnet(10);
net = train(net,x,t);
y = net(x);
[r,m,b] = regression(t,y)
r =
    0.9935
m =
    0.9874
b =
   -0.0067

신경망 출력값과 그에 대응되는 목표값이 regression으로 전달됩니다. regression은 3개의 파라미터를 반환합니다. 처음 2개의 파라미터 mb는 목표값과 신경망 출력값의 관계를 정의하는 가장 좋은 선형 회귀의 기울기와 y 절편에 대응됩니다. 피팅이 완벽하다면(출력값이 목표값과 정확하게 일치) 기울기는 1이 되고 y 절편은 0이 됩니다. 이 예제에서는 값이 1과 0에 매우 가까운 것을 확인할 수 있습니다. regression이 반환하는 세 번째 변수는 출력값과 목표값 사이의 상관 계수(R-값)입니다. 이 값은 출력값의 변동이 목표값에 의해 얼마나 잘 설명되는지를 측정합니다. 이 값이 1이면 목표값과 출력값 사이에 완벽한 상관이 있는 것입니다. 이 예제에서는 값이 1에 매우 가깝습니다. 이는 양호한 피팅을 나타냅니다.

다음 그림은 regression이 제공하는 그래픽 출력을 보여줍니다. 신경망 출력값이 목표값에 대해 빈 원으로 플로팅되었습니다. 최적(Best)의 선형 피팅은 파선으로 표시되어 있습니다. 완벽한 피팅(출력값이 목표값과 동일함)은 실선으로 표시되어 있습니다. 이 예제에서는 피팅이 너무 좋기 때문에 최적의 선형 피팅 선과 완벽한 피팅 선을 구분하기가 어렵습니다.