Main Content

퍼셉트론 신경망

Rosenblatt [Rose61]은 퍼셉트론의 여러 변형을 만들었습니다. 가장 간단한 변형 중 하나는 입력 벡터를 입력했을 때 그에 대응되는 올바른 목표 벡터를 생성하도록 가중치와 편향을 훈련시킬 수 있는 단층 신경망입니다. 이때 사용되는 훈련 기법을 퍼셉트론 학습 규칙이라고 합니다. 퍼셉트론은 훈련 벡터로부터 일반화하고 초기의 무작위로 분포된 연결로부터 학습할 수 있다는 점 때문에 많은 관심을 불러일으켰습니다. 퍼셉트론은 간단한 패턴 분류 문제에 특히 적합합니다. 퍼셉트론은 퍼셉트론으로 풀 수 있는 문제에 대해서는 빠르고 안정적인 신경망입니다. 또한 퍼셉트론의 동작을 이해하는 것은 더욱 복잡한 신경망을 이해하는 데 좋은 토대를 제공합니다.

이 섹션에서는 퍼셉트론을 간략하게 다룹니다. 더욱 심층적인 논의는 [HDB1996]의 4장, “Perceptron Learning Rule”을 참조하십시오. 여기서는 퍼셉트론의 여러 계층을 사용하여 단일 계층의 역량을 넘어서는 까다로운 문제를 푸는 방법을 설명합니다.

뉴런 모델

아래에는 하드 리밋 전달 함수 hardlim을 사용하는 퍼셉트론 뉴런이 나와 있습니다.

각 외부 입력값은 적절한 가중치 w1j로 가중치가 적용되며, 가중 입력값의 합은 하드 리밋 전달 함수로 전달됩니다. 하드 리밋 전달 함수에는 편향을 통해 전송된 입력값 1도 있습니다. 아래에는 0 또는 1을 반환하는 하드 리밋 전달 함수가 나와 있습니다.

퍼셉트론 뉴런은 전달 함수의 순 입력값이 0보다 크거나 같으면 1을 생성하고 그렇지 않으면 0을 생성합니다.

하드 리밋 전달 함수 덕분에 퍼셉트론은 입력 공간을 2개의 영역으로 나누어서 입력 벡터를 분류하는 능력을 갖게 됩니다. 구체적으로, 순 입력값 n이 0보다 작으면 출력값이 0이 되고, 순 입력값 n이 0보다 크거나 같으면 출력값이 1이 됩니다. 다음 그림은 가중치가 w1,1 = −1, w1,2 = 1이고 편향이 b = 1인 2입력값 하드 리밋 뉴런의 입력 공간을 보여줍니다.

Wp + b = 0의 결정 경계 선 L에 의해 2개의
분류 영역이 형성됩니다. 이 선은 가중치 행렬 W에 대해 수직이며 편향 b에 따라 이동됩니다. 선 L 위쪽과 왼쪽에 있는 입력 벡터는 0보다 큰 순 입력값을 생성하므로 하드 리밋 뉴런이 1을 출력하게 됩니다. 선 L 아래쪽과 오른쪽에 있는 입력 벡터의 경우 뉴런이 0을 출력하게 됩니다. 가중치와 편향 값을 선택하여 분할 선을 이동하고 방향을 바꾸어서 입력 공간을 원하는 대로 분류할 수 있습니다.

편향이 없는 하드 리밋 뉴런의 경우 분류 선이 항상 원점을 통과합니다. 편향을 추가하면 뉴런이 두 개의 입력 벡터 세트가 원점의 서로 다른 쪽에 있지 않은 문제를 풀 수 있게 됩니다. 위 플롯에서 볼 수 있듯이 편향은 결정 경계가 원점에서 이동하게 해 줍니다.

예제 프로그램 nnd4db를 실행해 보십시오. 예제 프로그램에서는 결정 경계를 이리저리 이동하고, 분류할 새 입력값을 고르고, 학습 규칙을 반복적으로 적용하여 입력 벡터를 올바르게 분류하는 신경망을 만드는 방법을 확인할 수 있습니다.

퍼셉트론 아키텍처

퍼셉트론 신경망은 아래에 두 가지 형태로 나타난 것처럼 S개의 퍼셉트론 뉴런이 가중치 세트 wi,j를 통해 R개의 입력값에 연결되는 단일 계층으로 구성됩니다. 앞에서와 마찬가지로, 신경망 인덱스 i와 j는 wi,j가 j번째 입력값에서 i번째 뉴런까지의 연결의 강도임을 나타냅니다.

간략하게 기술된 퍼셉트론 학습 규칙은 단일 계층에서만 훈련이 가능합니다. 따라서 여기서는 단층 신경망만 다룹니다. 이 제한 사항은 퍼셉트론이 수행할 수 있는 계산을 제한합니다. 제한 사항 및 주의 사항에서는 퍼셉트론이 풀 수 있는 문제의 유형을 설명합니다.

퍼셉트론 만들기

다음과 같은 방법으로 퍼셉트론을 만들 수 있습니다.

net = perceptron;
net = configure(net,P,T);

여기서 입력 인수는 다음과 같습니다.

  • P는 각각 R개의 요소를 갖는 입력 벡터 Q개로 구성된 R×Q 행렬입니다.

  • T는 각각 S개의 요소를 갖는 Q개의 목표 벡터로 구성된 S×Q 행렬입니다.

일반적으로 퍼셉트론에는 hardlim 함수가 사용되므로 이것이 디폴트 함수가 됩니다.

다음 명령은 값이 0과 2인, 요소를 1개 가진 단일 입력 벡터와, 출력값이 0 또는 1이 될 수 있는 1개의 뉴런을 갖는 퍼셉트론 신경망을 만듭니다.

P = [0 2];
T = [0 1];
net = perceptron;
net = configure(net,P,T);

다음 명령을 실행하여 어떤 신경망이 생성되었는지 확인할 수 있습니다.

inputweights = net.inputweights{1,1}

이 명령은 다음을 출력합니다.

inputweights = 
        delays: 0
       initFcn: 'initzero'
         learn: true
      learnFcn: 'learnp'
    learnParam: (none)
          size: [1 1]
     weightFcn: 'dotprod'
   weightParam: (none)
      userdata: (your custom info)

디폴트 학습 함수는 퍼셉트론 학습 규칙(learnp)에서 설명하는 learnp입니다. hardlim 전달 함수의 순 입력값은 dotprod로, 입력 벡터와 가중치 행렬의 곱을 생성하고 편향을 더하여 순 입력값을 계산합니다.

디폴트 초기화 함수 initzero는 가중치의 초기값을 0으로 설정하는 데 사용됩니다.

마찬가지로,

biases = net.biases{1}

이 명령은 다음을 출력합니다.

biases = 
       initFcn: 'initzero'
         learn: 1
      learnFcn: 'learnp'
    learnParam: []
          size: 1
      userdata: [1x1 struct]

편향의 디폴트 초기화도 0인 것을 확인할 수 있습니다.

퍼셉트론 학습 규칙(learnp)

퍼셉트론은 원하는 동작의 예를 기반으로 훈련됩니다. 원하는 동작은 입력값과 출력값 쌍 세트로 요약될 수 있습니다.

p1t1,p2t1,,pQtQ

여기서 p는 신경망에 대한 입력값이고 t는 이에 대응하는 올바른(목표) 출력값입니다. 목표는 뉴런 응답 a와 목표 벡터 t 사이의 차이 ta인 오차 e를 줄이는 것입니다. 퍼셉트론 학습 규칙 learnp는 입력 벡터 p와 이에 대응되는 오차 e가 주어졌을 때 퍼셉트론의 가중치와 편향의 원하는 변화를 계산하는 것입니다. (전달 함수가 hardlim인) 퍼셉트론은 값 0과 1만 출력할 수 있으므로 목표 벡터 t는 값 0 또는 1을 포함해야 합니다.

learnp가 실행될 때마다 퍼셉트론이 올바른 출력값을 생성할 확률이 높아집니다. 퍼셉트론 규칙은 해가 존재하는 경우 유한한 반복 횟수 안에 하나의 해로 수렴한다고 증명된 바 있습니다.

편향을 사용하지 않을 경우, learnp는 가중 벡터 w만을 변경해 이 벡터가 1로 분류되어야 할 입력 벡터만 가리키고 0으로 분류되어야 할 벡터는 가리키지 않도록 하여 해를 구하려고 합니다. 그 결과 w에 대해 수직이고 입력 벡터를 올바르게 분류하는 결정 경계가 생성됩니다.

입력 벡터 p가 제공되고 신경망의 응답 a가 계산된 후에는 하나의 뉴런에 대해 세 가지 조건이 발생할 수 있습니다.

사례 1. 입력 벡터가 제공되었고 뉴런의 출력값이 올바르면(a = t, e = ta = 0), 가중 벡터 w는 변경되지 않습니다.

사례 2. 뉴런 출력값이 0인데 1이었어야 한다면(a = 0, t = 1, e = ta = 1), 입력 벡터 p를 가중 벡터 w에 더합니다. 이로 인해 가중 벡터가 입력 벡터를 더 가깝게 가리키게 되며 향후 입력 벡터가 1로 분류될 확률이 높아집니다.

사례 3. 뉴런 출력값이 1인데 0이었어야 한다면 (a = 1, t = 0, e = ta = –1), 입력 벡터 p를 가중 벡터 w에서 뺍니다. 이로 인해 가중 벡터가 입력 벡터를 더 멀리 가리키게 되며 향후 입력 벡터가 0으로 분류될 확률이 높아집니다.

퍼셉트론 학습 규칙은 오차 e = ta와 가중 벡터에 적용할 변화량 Δw를 사용하여 더욱 간결하게 작성할 수 있습니다.

사례 1. e = 0이면 변화량 Δw를 0과 같게 만듭니다.

사례 2. e = 1이면 변화량 ΔwpT와 같게 만듭니다.

사례 3. e = –1이면 변화량 Δw를 –pT와 같게 만듭니다.

세 가지 사례 전부를 다음과 같은 하나의 표현식으로 작성할 수 있습니다.

Δw=(tα)pT=epT

편향은 입력값이 항상 1인 가중치라는 사실을 바탕으로 뉴런 편향의 변화량에 대한 표현식을 구할 수 있습니다.

Δb=(tα)(1)=e

뉴런 한 계층에서 가중 벡터의 변화량은 다음과 같습니다.

ΔW=(ta)(p)T=e(p)T

Δb=(ta)=e

퍼셉트론 학습 규칙은 다음과 같이 요약할 수 있습니다.

Wnew=Wold+epT

bnew=bold+e

여기서 e = ta입니다.

이번에는 간단한 예제를 살펴보겠습니다. 단 2개의 요소를 가진 입력 벡터를 갖는 단일 뉴런으로 시작합니다.

net = perceptron;
net = configure(net,[0;0],0);

문제를 단순화하기 위해 편향을 0으로 설정하고 가중치를 1과 -0.8로 설정합니다.

net.b{1} =  [0];
w = [1 -0.8];
net.IW{1,1} = w;

입력값 목표값 쌍은 다음과 같이 지정됩니다.

p = [1; 2];
t = [1];

다음을 사용하여 출력값과 오차를 계산할 수 있습니다.

a = net(p)
a =
     0
e = t-a
e =
     1

함수 learnp를 사용하여 가중치 변화량을 구할 수 있습니다.

dw = learnp(w,p,[],[],[],[],e,[],[],[],[],[])
dw =
     1     2

새 가중치는 다음과 같이 구할 수 있습니다.

w = w + dw
w =
    2.0000    1.2000

새 가중치(그리고 편향)를 구하는 과정은 오차가 없을 때까지 반복할 수 있습니다. 퍼셉트론 학습 규칙은 퍼셉트론으로 풀 수 있는 모든 문제에서 유한한 스텝 수 안에 수렴하는 것이 보장된다는 사실을 기억하십시오. 여기에는 선형 분리가 가능한 모든 분류 문제도 포함됩니다. 이 경우 분류하려는 사물은 선 하나로 구분할 수 있습니다.

예제 nnd4pr을 시도해 보십시오. 이 예제에서는 새 입력 벡터를 고른 다음, 학습 규칙을 적용하여 분류해 볼 수 있습니다.

훈련(train)

simlearnp를 반복적으로 사용하여 퍼셉트론에 입력값을 제공하고 오차에 따라 퍼셉트론 가중치 및 편향을 변경한 경우, 퍼셉트론이 이 문제를 풀 수 있다는 전제하에 언젠가는 퍼셉트론이 문제를 푸는 가중치 및 벡터 값을 구하게 됩니다. 모든 훈련 입력 벡터와 목표 벡터를 통과하는 각각의 종주를 통과(pass)라고 합니다.

함수 train은 이러한 계산 루프를 실행합니다. 각 통과에서 함수 train은 지정된 입력 시퀀스를 통해 진행하고, 입력값이 입력됨에 따라 시퀀스의 각 입력 벡터에 대한 출력, 오차 및 신경망 조정을 계산합니다.

train은 결과로 나오는 신경망이 목표를 달성한다고 보장하지 않습니다. 각 입력 벡터에 대한 신경망 출력값 계산을 통해 모든 목표값이 도달되었는지 살펴봄으로써 Wb의 새 값을 확인해야 합니다. 신경망이 목표를 달성하지 못한 경우 새 가중치 및 편향으로 train을 다시 호출하여 훈련을 더 많이 통과하거나 문제를 분석하여 이것이 퍼셉트론에 적합한 문제인지 살펴볼 수 있습니다. 퍼셉트론 신경망으로 풀 수 없는 문제는 제한 사항 및 주의 사항에서 설명합니다.

훈련 절차를 설명하기 위해 간단한 문제를 차근차근 살펴보겠습니다. 요소를 2개 가진 단일 벡터 입력값을 갖는 1개 뉴런 퍼셉트론이 있다고 가정하겠습니다.

이 신경망과 여기서 살펴볼 문제는 원한다면 계산기 없이 수계산으로 따라해 볼 수 있을 만큼 간단합니다. 지금부터 살펴볼 문제는 [HDB1996]에 나온 문제를 따릅니다.

다음과 같은 분류 문제를 단일 벡터 입력값과 요소를 2개 가진 퍼셉트론 신경망으로 풀려고 한다고 가정하겠습니다.

{p1=[22],t1=0}{p2=[12],t2=1}{p3=[22],t3=0}{p4=[11],t4=1}

초기 가중치와 편향을 사용합니다. 변수 뒤에 숫자를 쓰고 괄호로 묶어서 이 계산의 각 스텝에서의 변수를 표기합니다. 이에 따라 위의 초기값은 W(0)과 b(0)으로 표기할 수 있습니다.

W(0)=[00]b(0)=0

먼저 초기 가중치와 편향을 사용하여 첫 번째 입력 벡터 p1에 대한 퍼셉트론의 출력값 a를 계산합니다.

α=hardlim(W(0)p1+b(0))=hardlim([00][22]+0)=hardlim(0)=1

출력값 a가 목표값 t1과 같지 않으므로 퍼셉트론 규칙을 사용하여 오차를 바탕으로 가중치와 편향의 증분 변화량을 구합니다.

e=t1α=01=1ΔW=ep1T=(1)[22]=[22]Δb=e=(1)=1

퍼셉트론 업데이트 규칙을 사용하여 새 가중치와 편향을 계산할 수 있습니다.

Wnew=Wold+epT=[00]+[22]=[22]=W(1)bnew=bold+e=0+(1)=1=b(1)

이번에는 다음 입력 벡터 p2를 입력합니다. 출력값은 다음과 같이 계산됩니다.

α=hardlim(W(1)p2+b(1))=hardlim([22][12]1)=hardlim(1)=1

이번에는 목표값이 1이므로 오차는 0입니다. 즉, 가중치와 편향의 변화량이 0이므로 W(2) = W(1) = [−2 −2]이고 b(2) = b(1) = −1입니다.

이런 식으로 진행하며 다음으로 p3을 입력하여 출력값과 오차를 계산하고 가중치와 편향에 변화량을 적용하면 됩니다. 4개의 입력값을 모두 한 번 통과하면 W(4) = [−3 −1]이 되고 b(4) = 0이 됩니다. 만족스러운 해를 구했는지 확인하려면 모든 입력 벡터를 한 번 통과하여 모두 원하는 목표값을 생성하는지 확인하십시오. 네 번째 입력값은 원하는 목표값을 생성하지 않지만, 입력값을 6번째 입력하니 알고리즘이 수렴합니다. 최종 값은 다음과 같습니다.

W(6) = [−2 −3] 및 b(6) = 1.

이로써 수계산이 끝났습니다. 그렇다면 train 함수를 사용하여 이 작업을 수행하려면 어떻게 해야 할까요?

다음 코드는 퍼셉트론을 정의합니다.

net = perceptron;

다음과 같은 단일 입력값과

p = [2; 2];

목표값을 갖는 응용 사례를 살펴보겠습니다.

t = [0];

train이 입력 벡터(여기서는 단 1개)를 한 번만 통과하도록 epochs를 1로 설정합니다.

net.trainParam.epochs = 1;
net = train(net,p,t);

새 가중치와 편향은 다음과 같습니다.

w = net.iw{1,1}, b = net.b{1}
w =
    -2    -2
b =
    -1

초기 가중치와 편향은 0이고, 첫 번째 벡터에 대해서만 훈련시킨 후에는 수계산한 것처럼 값이 [−2 −2]와 −1이 됩니다.

이번에는 두 번째 입력 벡터 p2를 적용합니다. 출력값은 1이며, 가중치와 편향이 바뀌기 전까지는 계속 1이 됩니다. 그런데 이때 목표값이 1이므로 오차는 0이 되고 변화량은 0이 됩니다. 이렇게 이전 결과에서 시작하여 새 입력 벡터를 반복해서 적용하는 식으로 계속 진행할 수 있습니다. train을 사용하여 이 작업을 자동으로 수행할 수도 있습니다.

입력 벡터 4개로 구성된 시퀀스를 한 번 통과하도록, 즉 Epoch 1회에 대해 train을 적용합니다. 신경망 정의부터 시작합니다.

net = perceptron;
net.trainParam.epochs = 1;

입력 벡터와 목표값은 다음과 같습니다.

p = [[2;2] [1;-2] [-2;2] [-1;1]]
t = [0 1 0 1]

이번에는 다음을 사용하여 신경망을 훈련시킵니다.

net = train(net,p,t);

새 가중치와 편향은 다음과 같습니다.

w = net.iw{1,1}, b = net.b{1}
w =
    -3    -1
b =
     0

앞에서 손으로 계산한 결과와 같은 결과입니다.

마지막으로, 훈련된 신경망을 각 입력값에 대해 시뮬레이션합니다.

a = net(p)
a = 
      0     0     1     1

출력값이 아직 목표값과 같지 않으므로 두 번 이상 통과하도록 신경망을 훈련시켜야 합니다. Epoch를 늘려 보십시오. 다음을 실행하면 Epoch 2회 후에 평균 절대 오차 성능이 0이 됩니다.

net.trainParam.epochs = 1000;
net = train(net,p,t);

따라서, 세 번째 Epoch에 입력값이 입력된 시점에 신경망은 이미 훈련이 되어 있습니다. (수계산을 통해 이미 알고 있듯이, 신경망은 6번째 입력 벡터를 입력받을 때 수렴합니다. 이는 2번째 Epoch가 진행되는 중간에 발생하지만, 신경망 수렴을 관찰하려면 세 번째 Epoch까지 진행이 되어야 합니다.) 최종 가중치와 편향은 다음과 같습니다.

w = net.iw{1,1}, b = net.b{1}
w =
    -2    -3
b =
     1

여러 입력값에 대해 시뮬레이션된 출력값과 오차는 다음과 같습니다.

a = net(p)
a =
             0             1             0             1
error = a-t
error =
             0             0             0             0

훈련 절차가 성공적이었음을 확인할 수 있습니다. 신경망이 수렴하고 4개의 입력 벡터에 대해 올바른 목표 출력값을 생성합니다.

perceptron을 사용하여 만든 신경망의 디폴트 훈련 함수는 trainc입니다. (net.trainFcn을 실행하면 이를 확인할 수 있습니다.) 훈련 함수는 퍼셉트론 학습 규칙을 순수한 형태로 적용합니다. 순수한 형태라 함은 개별 입력 벡터가 개별적으로 순서대로 적용되며 각 입력 벡터가 입력된 후에 매번 가중치와 편향이 수정된다는 것을 의미합니다. 따라서 train을 사용한 퍼셉트론 훈련은 제시된 문제가 단순 퍼셉트론으로 풀 수 없는 문제인 경우가 아닌 이상 유한한 스텝 수 안에 수렴합니다.

다른 신경망에서도 함수 train을 다양한 방식으로 사용할 수 있습니다. 이 기본적인 함수에 대해 자세히 알아보려면 help train을 입력하십시오.

몇 가지 예제 프로그램을 살펴보는 것도 좋습니다. 예를 들어, 2-입력 퍼셉트론을 사용한 분류에서는 단순 퍼셉트론의 분류와 훈련을 살펴볼 수 있습니다.

제한 사항 및 주의 사항

퍼셉트론 신경망은 adapt를 사용하여 훈련시켜야 합니다. adapt는 신경망에 입력 벡터를 한 번에 하나씩 입력하고, 각 입력의 결과에 따라 신경망을 수정합니다. adapt를 이런 방식으로 사용하면 선형 분리 가능한 모든 문제를 유한한 횟수의 훈련 입력 안에 풀 수 있다고 보장할 수 있습니다.

앞에서 언급했듯이 퍼셉트론은 함수 train을 사용하여 훈련시킬 수도 있습니다. 퍼셉트론을 위해 train이 사용된 경우, train은 신경망에 입력값을 배치 단위로 입력하고, 모든 개별 수정 사항의 합을 기반으로 신경망을 수정합니다. 안타깝게도 퍼셉트론에서 이러한 훈련 알고리즘이 수렴한다는 증거는 없습니다. 따라서 퍼셉트론에서 train을 사용하는 것은 권장되지 않습니다.

퍼셉트론 신경망에는 몇 가지 제한 사항이 있습니다. 첫째, 하드 리밋 전달 함수 때문에 퍼셉트론의 출력값은 0과 1 중 하나만 취할 수 있습니다. 둘째, 퍼셉트론은 선형 분리가 가능한 벡터 세트들만 분류할 수 있습니다. 직선이나 평면을 그려서 입력 벡터를 올바른 범주로 분리할 수 있다면 입력 벡터가 선형 분리 가능한 것입니다. 벡터가 선형 분리 가능하지 않다면 학습을 통해 모든 벡터가 올바르게 분류되는 단계에 도달할 수 없습니다. 그러나 벡터가 선형 분리 가능하다면 적응적인 방식으로 훈련된 퍼셉트론은 항상 유한한 시간 안에 해를 구한다고 증명된 바 있습니다. Linearly Non-separable Vectors 항목을 살펴보십시오. 이 예제에서는 선형 분리가 가능하지 않은 입력 벡터를 분류하는 일의 어려움을 보여줍니다.

둘 이상이 퍼셉트론이 있는 신경망은 더 까다로운 문제를 푸는 데 사용할 수 있다는 점도 언급하고 넘어가겠습니다. 예를 들어, 서로 다른 그룹으로 분류하려는 4개의 벡터로 구성된 세트가 있고, 선 2개를 그려서 이들을 분리할 수 있다고 가정하겠습니다. 2개 뉴런 신경망의 결정 경계 2개로 입력값을 4개의 범주로 분류할 수 있습니다. 퍼셉트론에 대해 자세히 알아보고 더 복잡한 퍼셉트론 문제를 살펴보려면 [HDB1996]을 참조하십시오.

이상값과 정규화된 퍼셉트론 규칙

다른 입력 벡터보다 길이가 훨씬 길거나 짧은 이상값 입력 벡터가 존재하면 훈련 시간이 길어질 수 있습니다. 퍼셉트론 학습 규칙을 적용할 때는 오차에 대한 응답으로 현재 가중치와 편향에서 입력 벡터를 더하고 빼는 작업이 이루어집니다. 따라서 큰 값의 요소를 갖는 입력 벡터가 있는 경우 가중치 및 편향의 변화에 소요되는 시간이 너무 길어져 이보다 훨씬 작은 값을 갖는 입력 벡터가 이를 극복하기 어려울 수 있습니다. Outlier Input Vectors에서 이상값이 훈련에 어떻게 영향을 미치는지 살펴보십시오.

퍼셉트론 학습 규칙을 약간 변경하면 매우 크거나 작은 이상값 입력 벡터에 훈련 시간이 민감하게 영향받지 않도록 할 수 있습니다.

다음은 가중치 업데이트를 위한 원래 규칙입니다.

Δw=(tα)pT=epT

위에서 볼 수 있듯이 입력 벡터 p가 클수록 가중 벡터 w에 미치는 영향이 커집니다. 따라서 다른 입력 벡터보다 훨씬 큰 입력 벡터가 있을 경우, 작은 입력 벡터가 효과를 가지려면 여러 차례 입력해야 합니다.

해결 방법은 각 입력 벡터가 가중치에 미치는 영향이 동일한 크기가 되도록 규칙을 정규화하는 것입니다.

Δw=(tα)pTp=epTp

정규화된 퍼셉트론 규칙은 함수 learnpn으로 구현되어 있습니다. 이 함수는 learnp와 동일한 방식으로 호출됩니다. 정규화된 퍼셉트론 규칙 함수 learnpn은 실행되는 데 약간 더 많은 시간이 소요되긴 하나 이상값 입력 벡터가 존재하는 경우 Epoch 횟수를 상당한 정도로 줄여 줍니다. Normalized Perceptron Rule에서 이 정규화된 훈련 규칙이 어떤 식으로 작용하는지 살펴보십시오.