인공지능 공부/딥러닝 기초

[딥러닝 기초] 활성화함수

부농쿼카 2023. 8. 30. 23:27
728x90

해당 카테고리에 올라오는 포스팅들은 딥러닝호형님의 「실전 인공지능으로 이어지는 딥러닝 개념 잡기」 인프런 강의와, 「밑바닥부터 시작하는 딥러닝」을 공부하며 작성하였음을 알려드립니다.

 

활성화함수

활성화 함수는 입력신호의 총 합을 출력신호로 바꿔주는 함수를 말합니다. 활성화 함수 없이, 퍼셉트론들의 연결로만 이루어진 인공 신경망은 오직 선형으로만 나타낼 수 있습니다. 그러나, 대부분의 사회 현상들은 모두 비선형적으로 이루어집니다. 현실에 접목할 수 있는 인공 신경망을 만들기 위해선 비선형으로 이루어져 있어야 했고, 이를 위해 도입된 것이 바로 활성화 함수입니다.

 

우선, 활성화함수가 없는 인공신경망이 왜 선형으로 이루어지는지부터 알아보겠습니다. 이 부분은 바로 앞 포스팅인 인공 신경망 부분을 보면 이해가 빠른데요, 

인공 신경망 수식

앞선 포스팅에서도 보았듯이, 인공신경망은 이렇게 1차식으로 이루어집니다. 그리고, 모든 1차식은 선형 그래프를 나타냅니다. 

 

그러나 단순 분류(Classifier)문제에서도 이런 선형 그래프는 문제를 가져옵니다. 예를 들어 개와 고양이를 구분하기 위해 개를 0, 고양이를 1로 컴퓨터에게 입력했다고 생각해봅시다. 그런데, 저런 선형 함수의 경우 결과값이 천차 만별로 나옵니다.  그렇기 때문에 우리는 특정 조건에서 0과 1을 나눠줍니다. 제일 흔하게는 음수일 경우 0으로 양수일 경우 1로 나눠 주기도 하죠. 해당 내용을 수식으로 나타내면 다음과 같습니다.

이와 같은 식을 계단함수라고 합니다. 파이썬을 사용하여 계단함수를 구현해보도록 하겠습니다.

import numpy as np
import matplotlib.pyplot as plt

def step_function(x):
    if x>=0 : return 1
    elif x<1: return 0

def step_function_np(x):
    '''x가 0보다 크면 true, 작으면 False 반환 -> 숫자로 바꾸면 True:1 False:0이기 때문에 이렇게도 사용 가능함
        이 경우 위에 정의한 일반 계단 함수와는 다르게 배열이 들어가도 출력할 수 있다는 장점이 있음'''
    y = x>0
    return y.astype(np.int)

x = np.arange(-5.0, 5.0, 0.1) # -5.0~5.0 사이를 0.1 간격의 숫자로 잘라서 넘파이 배열에 저장함
y = step_function_np(x)

plt.plot(x,y)
plt.ylim(-0.1, 1.1)
plt.show()

계단 함수 그래프

matplotlib을 활용해서 그래프로 시각화를 해보면 이렇게 계단 모형으로 함수가 정의되었음을 알 수 있습니다. 이렇게, 입력 신호의 총 합이 활성화를 일으키는지 아닌지 정하는 역할을 하는 것이 바로 활성화함수(activation function)입니다.

 

이어서 다른 활성화함수들에 대해 살펴보겠습니다. 

 

시그모이드 함수

신경망에서 자주 이용되는 함수인 시그모이드 함수(sigmoid function)에 대해 알아봅시다.  시그모이드는 모든 입력값을 0~1 사이로 변환해주는 역할을 합니다. 일반적으로 σ(sigma) 로 표기합니다. 

import numpy as np
import matplotlib.pyplot as plt
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()

sigmoid function graph

그렇다면, 위의 계단함수와 시그모이드 함수를 비교해볼까요? 계단함수와 시그모이드는 생긴 것은 아주 비슷합니다.

계단 함수와 시그모이드

두 함수 모두 0을 기점으로 값이 변화합니다. 계단함수는 0을 기점으로 확 변화하고, 시그모이드는 매끈하게 연속적으로 변화한다는 차이점이 있습니다. 큰 차이가 아닌 것 같아보이지만 딥러닝에서는 이 차이가 굉장히 중요합니다. 계단함수를 활성화함수로 사용한 모델에선 0과 1만이 흐를 수 있지만, 시그모이드의 경우 0과 1 사이에 있는 실수들이 다 흐를 수 있기 때문입니다.

 

ReLU 함수

ReLU(Rectified Linear Unit)함수는 현재 제일 많이 쓰이는 활성화 함수입니다. 입력이 0이 넘으면 그 입력을 그대로 출력하고, 0이하이면 0을 출력해주는 함수입니다. 

이와 같은 간단한 수식으로 표현할 수 있습니다.

import numpy as np
import matplotlib.pyplot as plt

def relu(x):
    return np.maximum(0,x) #0과 x중 큰 값 출력하기

x = np.arange(-5.0, 5.0, 0.1)
y = relu(x)

plt.plot(x, y)
plt.ylim(-0.1, 1.1)
plt.show()

ReLU 함수

 

728x90