이진 계단 함수(binary step function)은 계단처럼 생겨서 붙은 이름이다. 이진 계단 함수는 0과 1 둘 중 하나만 출력한다. 구체적으로는 지정한 임계점(threshold)보다 적으면 0을 출력하고, 크면 1을 출력한다.
예를 들어 임계점이 0일때 이진 계단 함수식은 다음과 같다.
아래처럼 코드로 나타낼 수도 있다.
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