활성화함수

1 개요

기본적으로 딥러닝에서 층의 연산은 행렬의 선형계산이다. 활성화함수는 세포의 임계점을 모방하여, 비선형 계산도 처리할 수 있게 해준다.

1.1 계단함수

퍼셉트론에서 사용하는 기본적인 함수. 0을 넘으면 1, 0과 같거나 작으면 0을 반환한다.

1.1.1 구현

def step_function(x):  # 일반적으로 넘파이 배열을 받는다.
    y = x > 0  # 들어온 배열에서 0보다 큰 경우만 골라 1을 반환한다.(True 반환)
    return y.astype(np.int)  # bool형을 반환하기 때문에 int형으로 바꾸어준다.

계단함수는 잘 사용되지 않는데, 그 이유는 훈련이 진행됨에 따라(매개변수가 변함에 따라) 정확도나 손실함수가 매끄럽지 않고 불연속적으로 갑작스레 변화한다. 이렇게 되면 학습이 잘 이루어지고 있는지 확인하기 어렵다. 때문에 계단함수는 잘 사용되지 않는다.

[생각. 그렇다면..훈련은 다른 함수로 하고, 검증은 이 함수로 하면 어떻게 될까?]

1.2 시그모이드 함수

sigmoid(S자 모양이라는 의미) function.   신경망에서 사용하는 함수. 신경망과 퍼셉트론의 차이는 활성화 함수의 차이 뿐이다.

1.2.1 구현

def sigmoid_function(x):  # 일반적으로 넘파이 배열을 받는다.
    return 1 / (1 + np.exp(-x))  # 그냥 모양 그대로 반환한다.

1.2.2 한계

은닉층이 늘어날수록 함수의 미분값이 0에 수렴해 학습이 잘 되지 않는다.(왜?) 다른 값들을 곱해서?

1.3 렐루 함수(ReLU 함수)

Rectfied(정류된) Linear Unit. 0 이하라면 0을 출력하고 0을 넘는다면 입력을 그대로 출력하는 함수. 즉, -흐름만을 차단한 함수이다. 선형함수이지만, 정류되었다는 점에서 구분된다.\

1.3.1 구현

def relu_function(x):  # 일반적으로 넘파이 배열을 받는다.
    return np.maximum(0, x)

1.4 소프트맥스 함수

softmax function. 출력층에서 사용하는 활성화함수 중 문류 문제에 주로 쓰이는 함수이다.  형태로, 분모가 모든 신호의 지수함수합으로 이루어져 해당 분류의 확률을 나타낼 수 있다.

이 형태는 오차역전파에서 역전파의 크기를 염두로 설계되었다.(궁금한 사람은 링크 참조)

최종적으로 확률을 표현하기 위해 사용하는 함수로, 지수함수의 연산낭비를 줄이기 위해 생략하기도 한다.(다만, 학습시킬 땐 사용했다가 실 사용에선 제외해 점수로 활용하기도 한다. 확률을 계산하기 때문에 모든 신경망을 한꺼번에 교육할 수 있다.)

1.4.1 구현

def softmax_function(x):  # 일반적으로 넘파이 배열을 받는다.
    c = np.max(x)  # 오버플로우에 대한 대책.
    exp_x = np.exp(x-c)  # 최댓값을 뺀 후에 지수값을 계산한다.
    sum_exp_x = np.sum(exp_x)  # 지수값을 모두 더한 값.(스칼라)
    y = exp_x / sum_exp_x  # 배열을 스칼라로 나누어 새로운 배열 생성.
    return y

exp는 지수함수이기 때문에 조금만 숫자가 커져도 숫자가 너무 커져서 컴퓨터가 다루는 수의 한계를 넘어버리고 만다.(이를 오버플로우라 한다.) 때문에  의 관계에 있음을 이용하여 전체에서 가장 큰 값을 빼주고 실행한다. 보통 최종 값의 정류를 위한 함수로, 연산 자체엔 영향을 미치지 않는다.