[딥러닝] 이진 계단 함수

Ethan·2022년 8월 13일
0

이진 계단 함수란?

이진 계단 함수(binary step function)은 계단처럼 생겨서 붙은 이름이다. 이진 계단 함수는 0과 1 둘 중 하나만 출력한다. 구체적으로는 지정한 임계점(threshold)보다 적으면 0을 출력하고, 크면 1을 출력한다.

예를 들어 임계점이 0일때 이진 계단 함수식은 다음과 같다.

f(x)={0for x<01for x0f(x)=\begin{cases}0 \quad for\ x<0\\1\quad for\ x\geq0\end{cases}

아래처럼 코드로 나타낼 수도 있다.

def binary_step(x, threshold=0):
	return 0 if x < threshold else 1

해당 함수의 그래프를 그리면 아래와 같이 나타난다.

def visualize(function):
    plt.figure(figsize=(12,12))
    X = [-10 + x/100 for x in range(2000)]
    y = [function(y) for y in X]

    # 함수 그래프
    plt.subplot(3,2,1)
    plt.title('function')
    plt.plot(X,y)

visualize(binary_step)

이진 계단 함수는 초기 단층 퍼셉트론에서 사용된 아주 원시적인 형태의 활성화 함수이다.

class Perceptron(object):
    def __init__(self, input_size, activation_ftn, threshold=0, learning_rate=0.01):
        self.weights = np.random.randn(input_size)
        self.bias = np.random.randn(1)
        self.activation_ftn = np.vectorize(activation_ftn)
        self.learning_rate = learning_rate
        self.threshold = threshold

    def train(self, training_inputs, labels, epochs=100, verbose=1):
        '''
        verbose : 1-매 에포크 결과 출력, 
                  0-마지막 결과만 출력 
        '''
        for epoch in range(epochs):
            for inputs, label in zip(training_inputs, labels):
                prediction = self.__call__(inputs)
                self.weights += self.learning_rate * (label - prediction) * inputs
                self.bias += self.learning_rate * (label - prediction)
            if verbose == 1:
                pred = self.__call__(training_inputs)
                accuracy = np.sum(pred==labels)/len(pred)
                print(f'{epoch}th epoch, accuracy : {accuracy}')
        if verbose == 0:
            pred = self.__call__(training_inputs)
            accuracy = np.sum(pred==labels)/len(pred)
            print(f'{epoch}th epoch, accuracy : {accuracy}')
    
    def get_weights(self):
        return self.weights, self.bias
                
    def __call__(self, inputs):
        summation = np.dot(inputs, self.weights) + self.bias
        return self.activation_ftn(summation, self.threshold)

그렇다면 이진 계단 함수는 선형일까 아니면 비선형일까?

굳이 선형이냐 비선형이냐 둘 중 하나로 따지자면 이진 계단 함수는 비선형에 속하지만, 좀 더 엄밀히 분류하면 극성 함수에 속한다. 위에서 살펴본 0과 1을 출력하는 경우에는 단극성, -1과 1처럼 0이 아닌 특정한 값 2개를 출력하는 경우에는 양극성으로 분류한다.

물론 그렇다고 해서 단층 퍼셉트론이 모든 비선형 문제를 풀 수 있는 것은 아니다. 단층 퍼셉트론으로 구현할 수 없는 대표적인 사례로 XOR gate가 있다.

이진 계단 함수는 역전파가 일어나지 않는다

이진 계단 함수는 0 아니면 1만을 출력하기 때문에 0인 부분은 미분이 불가능하고 1인 부분은 미분 시 모두 0값으로 바뀐다. 따라서 역전파 알고리즘을 통한 학습이 불가능하다.

물론 다른 방법을 쓰면 학습이 가능하지만 애초에 이진 계단 함수 자체가 별로 효율적이지 않다. 풀 수 없는 문제가 너무 많기 때문이다. 예를 들어 이진 계단 함수를 사용하여 2개 이상의 다중 카테고리 분류기를 구현할 수는 없다.

현재는 분류 모델 제작에는 거의 사용하지 않는다.

단층 퍼셉트론의 학습 방법
https://en.wikipedia.org/wiki/Perceptron

profile
재미있게 살고 싶은 대학원생

0개의 댓글