본문 바로가기

그 땐 AI했지/그 땐 DeepLearning했지

[TAVE/밑딥] ch03 신경망 | 02 활성화 함수

728x90

참고자료: 밑바닥부터 시작하는 딥러닝

 

💡 활성화 함수는 임계값을 경계로 출력이 바뀌는데, 이런 함수를 계단 함수라고 한다.
그렇다면 계단 함수 이외의 함수를 사용하면 어떻게 될까? 신경망에서 이용하는 활성화 함수를 알아보자!

1.  시그모이드 함수


👉🏻신경망에서 자주 이용하는 활성화 함수이다. 신경망에서 입력을 받으면 해당 함수를 이용해 신호를 변환하고 출력을 돌려주는 변환기이다.

 

2.  계단 함수 구현하기


파이썬으로 계단 함수를 이해해보자!
def step_fuction(x):
    if x > 0:
        return 1
    else:
        return 0

👉🏻계단 함수를 단순하게 구현하면 다음과 같다. 하지만 인수 x는 실수(부동소수점)만 받아들이기 때문에 넘파이 배열도 지원하도록 수정이 필요하다.

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

👉🏻넘파이의 트릭을 이용해 두 줄로 줄였다! 과연 어떤 트릭을 사용했을까? 넘파이 배열의 자료형을 반환할 때는 astype() 메서드를 이용한다. 원하는 자료형을 인수로 지정하면 된다.

 

3.  계단 함수의 그래프


import numpy as np
import matplotlib.pylab as plt

def step_function(x):
  return np.array(x > 0, dtype=np.int)

x = np.arange(-5.0, 5.0, 0.1)
y = step_function(x)
plt.plot(x, y)
plt.ylim(-0.1, 1.1) #y축의 범위 지정
plt.show()

👉🏻앞에서 정의한 계단 함수를 matplotlib 라이브러리를 사용해 그래프로 그려보자!

  • np.arange(-5.0, 5.0, 0.1)는 -5.0에서 5.0 전까지 0.1 간격의 넘파이 배열을 생성한다.
  • step_functions은 받을 배열의 원소 각각을 인수로 계단 함수 실행해 결과를 배열로 만들어 돌려준다.

👉🏻위의 x, y 배열을 그래프로 그리면 위와 같고 모양이 계단 같기 때문에 계단 함수라고 부른다.

 

4.  시그모이드 함수 구현하기


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

👉🏻파이썬으로 시그모이드 함수를 구현해보았다. 넘파이의 브로드캐스트 덕분에 해당 함수가 넘파이 배열을 잘 처리할 수 있다.

  • np.exp(-x)는 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) #y축의 범위 지정
plt.show()

👉🏻시그모이드 함수를 실행하면 다음과 같은 그래프가 나온다!

 

5.  시그모이드 함수와 계단 함수 비교


💡둘의 가장 눈에 띄는 차이점은 매끄러움의 차이이다! 시그모이드가 더 매끄러운데 이러한 점이 신경망 학습에서 매우 중요한 역할을 한다.

👉🏻또 다른 차이점은 계단 함수는 0과 1 중 하나의 값만 돌려주고 시그모이드 함수는 실수를 돌려준다. 다시 말해 퍼셉트론에서는 뉴런 사이에 0 혹은 1이 흘렀다면, 신경망에서는 연속적인 실수가 흐른다.

👉🏻이번에는 둘의 차이점을 보자! 둘 다 입력이 작으면 출력이 0에 가깝고 입력이 커지면 출력이 1에 가까워지는 구조이다.

 

6.  비선형 함수


💡계단 함수와 시그모이드 함수 모두 비선형 함수이다.

✍🏻비선형 함수란? 직선 1개로는 그릴 수 없는 함수를 말한다.

 

👉🏻신경망에서는 신경망의 층을 깊게 하기 위해 비선형 함수를 이용한다. 선형 함수를 사용하면 은닉층이 없는 네트워크에 불과하다.

 

7.  ReLU 함수


📌ReLU 함수: Rectified Linear Unit, 입력이 0을 넘으면 그 입력을 그대로 출력하고, 0 이하이면 0을 출력하는 함수이다.

ReLU 함수 수식

👉🏻최근에 ReLU 함수를 주로 이용한다.

def relu(x):
  return np.maximum(0, x)

👉🏻넘파이의 maximum함수를 이용하면 쉽게 구현할 수 있다.

728x90