ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [밑.시.딥.1] 활성화 함수
    AI 2024. 7. 2. 08:35

     

    앞서 말했듯 딥러닝은 공간상에서 데이터를 분류하는 작업을 자동으로 하는 도구이며, 데이터를 분류하기 위해선 활성화 함수를 사용한다. 활성화 함수를 쓰는 이유는 선형 식이 있을 때 그 직선을 비선형화 시키는 거다. 곡선으로 만들어 주기도 하고, 직선은 무한하기 때문에 어느 순간 끊어주는 게 필요할 때도 있다. 어떤 활성화 함수들이 있는지 살펴보자.

     

     

    1. 계단 함수

    단층 퍼셉트론은 활성화 함수로 계단 함수를 이용하고 있다. 임계값을 경계로 출력이 바뀐다는 특징이 있다.

    def step_function(x):
        y = x > 0
        return y.astype(int)

     

    계단 함수를 그래프로 그려보자.

    import numpy as np
    import matplotlib.pylab as plt
    
    def step_function(x):
        return np.array(x > 0, dtype=int)
    
    x = np.arange(-5.0, 5.0, 1) # 0.1 간격의 넘파이 배열 생성
    y = step_function(x) # 넘파이 배열에 대해 계단 함수 실행
    plt.plot(x,y)
    plt.ylim(-0.1, 1.1) # y축의 범위 쥐정
    plt.show()

     

     

    2. 시그모이드 함수

    시그모이드 함수를 나타내는 식은 아래와 같다.

    $$h(x)=\frac{1}{1+exp(-x)}$$

    def sigmoid(x):
        return 1 / (1 + np.exp(-x))

     

    마찬가지로 시그모이드 함수를 그래프로 그려보자.

    x = np.arange(-5.0, 5.0, 0.1)
    y = sigmoid(x)
    plt.plot(x, y)
    plt.ylim(-0.1, 1.1)
    plt.show()

     

    위 그래프를 참고해서 식을 이해해보자. 시그모이드 함수는 x가 0보다 작을 때 값이 굉장히 작았으면 좋겠고, x가 0보다 클 때 값이 매우 컸으면 좋겠을 때 사용한다. x가 0에 가까울 땐 경사가 급하나, 절대값이 커질 수록 경사가 완만하다. 다시 말하면, 시그모이드 함수는 입력이 중요하면 큰 값을 출력하고 입력이 중요하지 않으면 작은 값을 출력하기 때문에, 이진 분류에 사용된다.

    더보기

    그래서 $exp(x)$가 아닌 $exp(-x)$ 인 것이다. 대칭을 위해서


    시그모이드 함수는 입력이 아무리 작거나 커도 출력은 항상 0에서 1 사이 이다. 즉, 입력값을 0부터 1 사이의 확률 값으로 변환할 수 있다. 이진 분류를 위해 출력값을 확률화 하기 위함이다.

     

    그렇다면 왜 밑을 e로 사용할까? 뉴런 네트워크가 학습하는 방식은 미분을 사용한다. $e6(-x)$을 미분하면 $-e^(-x)$이 된다. 즉 미분 방정식이 간단하기 때문에 e를 사용한다.

     

     

    3. 비선형 함수

    계단 함수와 시그모이드 함수는 모두 비선형 함수이다. 신경망에서는 활성화 함수로 비선형 함수를 사용해야 한다. 선형 함수를 이용하면 신경망의 층을 깊게하는 의미가 없어지기 때문이다.

     

    신경망에서 layer를 깊게하는 이유는 바로 공간을 변화시키기 위해서이다. 공간을 비틀면서 잘 구분되지 않는 데이터를 잘 분류해야하는데, 선형 함수를 사용하면 줌 인되거나 줌 아웃되거 회전하는 등의 역할밖에 안된다. 즉, 공간이 실제로 변형되지 않기 때문에 선형 함수를 이용해서는 여러 층으로 구성하는 이점을 살릴 수 없다.

     

     

    4. ReLU 함수

    ReLU 함수는 입력이 0을 넘으면 그 입력을 그대로 출력하고, 0이하이면 0을 출력하는 함수이다. 계단 함수와 비슷하지만 다르다. 계단함수는 1을 리턴하지만, ReLU는 x를 리턴한다고 보면 된다.

    $$h(x)=\left\{\begin{matrix}0\,(x\leq 0) \\ㅌ\,(x>0)\end{matrix}\right.$$

    def relu(x):
        return np.maximum(0, x) # 두 입력 중 큰 값을 선택해 반환

     

    이후에 나오게 배우게 될 내용이지만, 딥러닝은 미분을 사용해서 학습을 한다. 시그모이드 함수는 그래프를 보면 알 수 있듯이, 입력값의 절대갑이 커질수록 기울기가 0으로 수렴한다. 즉, 절대값이 커질수록 학습하기 어려운 형태이다. 이런 시그모이드 함수의 기울기 소실 문제를 해결해주기 때문에 ReLU 함수를 많이 사용한다.

    더보기

    렐루의 등장을 얘기하자면, 뉴런 네트워크는 원래 뉴런을 모방한 거다. 딥러닝에서 인공지능을 연구하면서 뭔가 학습이 안되면 "우리가 뉴런의 동작을 잘 모방하지 못했나?"에 대한 고민을 많이 한다. 잘 안되는 이유는 뉴런을 잘 모방하지 않을 거야 라고 생각하면서 등장한 게 바로 렐루이다. 렐루를 만들고 보니 데이터를 잘 구분했다. 그래서 최근에 자주 사용되고 있다.

     

     

    5. 항등 함수

    입력을 그대로 출력한다. 그래서 출력층에서 항등 함수를 사용하면 입력 신호가 그대로 출력 신호가 된다.

    def identity_function(x):
        return x

     

     

    6. 소프트맥스 함수

    소프트맥스 함수는 분류에서 사용한다. 소프트맥스 함수의 분자는 입력신호의 지수 함수, 분모는 모든 입력 신호의 지수 함수의 합으로 구성된다. 분모에서 보듯, 출력층의 각 뉴런이 모든 입력 신호의 영향을 받는다.

    $$h(x)=\frac{exp(a_k)}{\sum_{i=1}^{n}exp(a_i)}$$

    def softmax(a):
        exp_a = np.exp(a)
        sum_exp_a = np.sum(exp_a)
        y = exp_a / sum_exp_a
        
        return y

     

    위의 softmax() 함수의 코드는 소프트맥스 함수를 제대로 표현하고 있지만, 컴퓨터로 계산할 땐 오버플로 문제가 발생한다. (∵ 지수 함수의 결과는 매우 큼). 이 문제를 해결하기 위해 소프트맥스 함수의 식을 아래와 같이 바꿀 수 있다.

    $$h(x)=\frac{exp(a_k)}{\sum_{i=1}^{n}exp(a_i)} = \frac{exp(a_k+C)}{\sum_{i=1}^{n}exp(a_i+C)}$$

     

    위의 식으로 알 수 있는 것은 소프트맥스의 지수 함수를 계산할 때 어떤 정수를 더해도 결과는 바뀌지 않는다는 것이다. 버퍼오버플로 문제를 해결하기 위해선 입력 신호 중 최대값을 빼줘야 한다.

    def softmax(a):
        c = np.max(a)  # 입력 신호 중 최댓값
        exp_a = np.max(a - c)  # 오버 플로 대책
        sum_exp_a = np.sum(exp_a)
        y = exp_a / sum_exp_a
        
        return y

     

    소프트맥스 함수의 출력은 0에서 1.0 사이의 실수이며, 소프트맥스 함수 출력의 총합은 1이다. 즉, 소프트 맥스 함수의 출력은 '확률'로 해석할 수 있다.

     

    하지만 소프트맥스 함수를 적용해도 각 원소의 대소 관계는 변하지 않는다. (∵ 지수함수가 단조 증가 함수이기 때문) 즉, 소프트맥수 함수를 적용하든 안하든 출력이 가장 큰 뉴런의 위치는 달라지지 않기 때문에, 신경망으로 분류할 때는 출력층의 소프트맥스 함수를 생략한다.추론 단계에서는 소프트맥스 함수를 생략하지만, 학습 단계에서는 출력층에서 소프트맥수 함수를 사용한다.

     

     


    출력층의 활성화 함수는 풀고자하는 문제의 성질에 맞게 정한다.

    • 회귀: 항등 함수
    • 2클래스 분류: 시그모이드 함수
    • 다중 클래스 분류: 소프트맥스 함수

    'AI' 카테고리의 다른 글

    [밑.시.딥.1] 신경망의 개요  (0) 2024.07.02
    [밑.시.딥.1] 퍼셉트론  (0) 2024.07.01

    댓글

Designed by Tistory.