perceptron

퍼셉트론

퍼셉트론(perceptron)은 가장 오래되고 단순한 형태의 판별함수 기반 이진분류모형이다.

퍼셉트론은 입력값 $x=(1,x_1,\cdots ,x_m)$ 에 대해 1 또는 -1의 값을 가지는 $y$를 출력하는 비선형 함수이다. 1을 포함하는 입력요소 $x_i$ 에 대해 가중치 $w_i$ 를 곱한 값 $a = w^Tx$ 을 활성화값(activations)이라고 하며 이 $a$가 판별함수 역할을 한다.

판별함수 값이 활성화함수(activation function) $h(a)$를 지나면 분류 결과에 해당하는 $\hat{y}$ 가 생성된다.

퍼셉트론의 활성화함수는 단위 계단함수(heaviside step function)이다.

퍼셉트론 손실함수

퍼셉트론은 독립변수 $ x$로부터 종속변수 $y$를 예측하는 예측모형이므로, 예측 오차를 최소화하는 가중치 $w$를 구해야 한다. 가중치 $ w$에 따라 달라지는 전체 예측 오차 $ L$은 $i$번째 개별 데이터에 대한 손실, 즉 실제값과 예측값의 차이 $ L_i(\hat{y}_i, y_i)$ 의 합으로 표현할 수 있다.

회귀분석에서 썼던 손실함수의 일반적 형태 $L(\hat{y},y)= -(y-\hat{y})^2$는 여기서 쓸 수 없다. 예측치와 실제값의 오차를 줄이는 데 너무 많은 에너지를 쓰게 되기 때문이다.

퍼셉트론에서 사용하는 손실함수는 제로-원 손실함수(zero-one loss function)로 다음과 같은 형태로 쓰인다.

제로-원 손실함수 값은 예측치와 실제값이 같으면 0, 다르면 1이다.

$\hat{y} = 1$ $\hat{y} = -1$
$y = 1$ 0 1
$y=-1$ 1 0

전체 손실함수 값은 다음과 같게 된다.

위 식에서 $M$ 은 오분류(misclassification)된 데이터의 집합이다.

그런데 제로-원 손실함수를 쓰면 $\hat{y}(x)$가 $x$에 대한 계단식 그래프가 되므로 대부분의 영역에서 기울기가 0이 되어 최소점을 구할 수 없다. 따라서 퍼셉트론에서는 $\hat{y}$ 대신 활성화값 $w^Tx$ 를 손실함수로 사용한다. 이 때는 손실함수가 연속형 2차함수(peacewise-linear function) 모양이 나오게 된다.

이를 퍼셉트론 손실함수(perceptron loss function), 0-힌지 손실함수(zero-hinge loss function) 라고 한다.

여기서는 그레디언트 디센트 방법을 사용해 최소점의 위치를 구할 수 있게 된다.

가중치 계산

퍼셉트론 손실함수 $L_p(w)$를 최소화하는 $w$ 를 찾기 위해 w로 미분해 그레디언트를 구하면 다음과 같다.

여기서도 위에서 설명했듯이 예측이 틀린 경우에 대해서만 서메이션이 이루어진다.

그레디언트 디센트(gradient descent) 방법을 사용하면 다음과 같이 $w$ 를 갱신할 수 있다.

여기서 $\eta$ 는 스텝사이즈(step size) 또는 학습속도(learning rate)라고 한다.

그런데 퍼셉트론 손실함수는 원래의 손실함수와 정확하게 같지 않기 때문에 이러한 방식으로 학습을 했을 때 매 단계마다 반드시 원래의 손실함수가 감소한다는 보장은 없다. 다만, 퍼셉트론 수렴 정리(perceptron convergence theorem)로부터 데이터가 선형분리(linearly separable)가능한 경우에만 완전분류모형으로 수렴한다.

선형분리란, 한 기준점을 중심으로 완벽히 두 개의 값으로 데이터가 구분될 수 있는 것을 의미한다.

Scikit-Learn 에서 제공하는 퍼셉트론 모형 클래스 Perceptron 은 다음과 같은 입력 인수를 갖는다.

  • max_iter: 최적화를 위한 반복 횟수
  • eta0: learning rate $\eta $

퍼셉트론의 학습성능

퍼셉트론에서는 위에서 설명했듯 손실값이 계속 줄어든다는 보장이 있지는 않다. 전체적으로 기울기는 하락하는 방향이지만 실제 값들을 보면 진동(oscillation)이 일어난다. 즉, 성능이 나빠졌다가 더 좋아졌다가 조금 더 나빠졌다가 더 좋아졌다가를 계속해서 반복한다.

그리고 막판에는 값이 완전히 0에 도달하거나 값이 더 낮아지지 않고 같은 값에서 맴돈다. 물론 계속 횟수를 늘려가면 값이 더 내려갈 수도 있지만 장담할 수 없고, 현실적으로 횟수를 무한히 해보는 것은 불가능하기 때문에 적당한 수준에서 만족하고 임의로 멈춰준다. 이걸 early-stopping이라고 한다.

SGD

SGD(Stochastic Gradient Descent) 방법은 손실함수 자체가 아니라 손실함수의 추정치(기댓값)을 최소화하는 방법이다.

전체 손실함수 L은 퍼셉트론처럼 개별데이터의 손실함수값의 합이다.

SGD 최적화 방법은 손실함수의 그래디언트의 기댓값 추정치를 이용해 $w$ 를 구한다. 이 때 모든 학습용 데이터를 다 사용하지 않고 일부 데이터만 사용해 그레디언트 추정치를 구한다. 따라서 계산량이 많거나 학습데이터가 많은 딥러닝에서 많이 쓰이는 방법이다.

퍼셉트론은 오분류된 데이터들만 사용하는 SGD의 일종이라고 보면 된다.

SGD 방법이 기댓값이 최소화되도록 수렴한다는 것은 다양한 논문에서 증명이 되어 있다. 다만 손실함수 자체를 최적화하는 것이 아니라 손실함수의 기댓값의 추정치를 최대화하기 때문에 손실함수값이 전반적으로 감소하는 추세를 보이는 것 뿐이고 항상 절대적으로 감소한다는 보장은 없다.

SGD에서는 손실함수값이 $\hat{y}$ 가 1보다 클 때는 0이고 1보다 작아지면 계속 증가하는(convex) 형태이기만 하면 손실함수의 조건을 만족한다.

Share