활성화 함수(Activation Function).Araboza

100779 단어 ArabozaAIFFELAIFFEL

활성화 함수(Activation Function)란?

특정 행동을 함 → 특정 조건을 만족 → 함수 활성화와 같은 흐름을 가지고 동작하며 신경망 속의 퍼셉트론 혹은 노드도 특정 조건이 만족하면 활성화 되도록 디자인되어 있다.

예를들어 ReLU의 경우 입력값이 음수라면 0을 출력하고 입력값이 0이상이라면 입력값 그대로를 출력하도록 디자인되어 있는데 이를 활성화 또는 비활성화로 표현 하려면 우선 활성화 되는 기준을 정하고 출력값이 0보다 큰 경우를 활성화되었다고 정의한다.

💡Tip 활성화 함수는 모델의 표현력을 왜 향상시켜줄까?

어떤 모델이 w1,b1w_1, b_1

이를 수학적으로 말하면 선형 함수로는 비선형 함수를 표현할 수 없다라고 말한다.

하지만 딥러닝 모델의 parameter(w,b)parameter(w, b)들은 입력값 xx와 선형관계이다. 그리고 아무리 많은 Layer들을 겹쳐도 그 결과는 선형관계인데 sinsin곡선처럼 직선으로는 근사시킬 수 없는 비선형 데이터를 표현하려면 딥러닝 모델도 비선형성을 지니고 있어야 한다. 이때 쓰이는 것이 활성화 함수이고 활성화 함수를 Layer 사이사이에 넣어줌으로써 모델이 비선형 데이터도 표현할 수 있게 되었다.

1. 퍼셉트론(Perceptron) : 활성화 함수는 어디서 기인되었는가?

딥러닝 모델은 보통 여러 개의 층으로 이루어져 있으며 그중에 하나의 층을 가져와 다시 쪼갠다면 보통 Node라고 불리는 것으로 쪼개지는데 이것이 바로 Perceptron이다.

💡Tip 퍼셉트론을 쌓으면 단층 퍼셉트론이 되고 이 단층 퍼셉트론을 쌓으면 다층 퍼셉트론이 된다.


퍼셉트론은 신경세포와 그 구조가 동일하고 퍼셉트론의 입력은 신경세포에서 가지돌기에 해당하고 각 입력 항에 곱해지는 가중치는 시냅스의 발달 정도에 해당하며 xiwix_iw_i

2. 선형 변환(Linear Transformation)

  • 선형 변환의 정의
    VVWW가 어떤 벡터를 그릴 수 있는 공간(좌표평면)이고 둘 모두 실수집합(Field)상에 있다고 가정하면 함수 T:V(정의역)W(공역)T\mathcal{T}: V(정의역) \rightarrow W(공역)T

  • 선형 변환의 성질

3. 비선형(Non-Linear)

  • 왜 비선형 함수를 쓰는가?
    결론적으로 말하면 딥러닝 모델의 표현력을 향상시키기 위해서 사용한다.

  • 선형 활성화 함수를 사용하면 왜 표현력이 떨어지는가?

    위의 그림과 같은 3개의 퍼셉트론으로 구성된 모델이 있다고 가정하고 입력앖 xx가 모델을 거치면 출력값 yy가 된고 수식으로 표현하면 y=f(w3f(w2f(w1x)))y=f(w_3f(w_2f(w_1x)))

    이때 ff가 선형이라면 선형 함수의 정의에 의해 f(w1x)=w1f(x)f(w_1x) = w_1f(x)

    여기서 W=w1,w2,w3W = w_1^′, w_2^′, w_3^′

    w2w_2

    f(f(f(Wx)))f(f(f(Wx)))f(Wx)f*(Wx)

    결론적으로 선형 활성화 함수를 사용한다면 노드의 개수를 아무리 많이 붙여도 결국 하나의 노드를 사용하는 것과 차이가 없기 때문에(= 표현력이 떨어지기 때문에) 비선형 함수를 사용하는 것이다.

4. 활성화 함수의 종류(1) : 이진 계단 함수(Binary Step Function)

이진 계단 함수(Binary Step Function) 는 들어온 입력이 특정 입계점을 넘으면 1(혹은 True)를 출력하고 그렇지 않을 때는 0을 출ㄹ겨하기 때문이다. 이러한 특성 때문에 이 활성화 함수는 간단한 이진 분류 문제에서 유용하게 쓰인다.

이진 계단 함수 예시 코드

def binary_step(x, threshold=0): 
# threshold가 있는 함수를 쓰면 꼭 defualt 값을 설정해주세요
    return 0 if x<threshold else 1

import matplotlib.pyplot as plt
from PIL import Image
import numpy as np

def plot_and_visulize(image_url, function, derivative=False):
    X = [-10 + x/100 for x in range(2000)]
    y = [function(y) for y in X]
   
    plt.figure(figsize=(12,12))
  
    # 함수 그래프
    plt.subplot(3,2,1)
    plt.title('function')
    plt.plot(X,y)
  
    # 함수의 미분 그래프
    plt.subplot(3,2,2)
    plt.title('derivative')
    if derivative:
        dev_y = [derivative(y) for y in X]
        plt.plot(X,dev_y)
  
    # 무작위 샘플들 분포
    samples = np.random.rand(1000)
    samples -= np.mean(samples)
    plt.subplot(3,2,3)
    plt.title('samples')
    plt.hist(samples,100)
  
    # 활성화 함수를 통과한 샘플들 분포
    act_values = [function(y) for y in samples]
    plt.subplot(3,2,4)
    plt.title('activation values')
    plt.hist(act_values,100)
  
    # 원본 이미지
    image = np.array(Image.open(image_url), dtype=np.float64)[:,:,0]/255. # 구분을 위해 gray-scale해서 확인
    image -= np.median(image)
    plt.subplot(3,2,5)
    plt.title('origin image')
    plt.imshow(image, cmap='gray')
  
    # 활성화 함수를 통과한 이미지
    activation_image = np.zeros(image.shape)
    h, w = image.shape
    for i in range(w):
        for j in range(h):
            activation_image[j][i] += function(image[j][i])
    plt.subplot(3,2,6)
    plt.title('activation results')
    plt.imshow(activation_image, cmap='gray')
  
    return plt
  
import os
img_path = os.getenv('HOME')+'/aiffel/activation/jindo_dog.jpg'
ax = plot_and_visulize(img_path, binary_step)
ax.show()    

📄Output

💡Tip 이진 계단 함수의 한계

1. XOR Gate를 구현할 수 없다.
XOR Gate의 진릿값 그래프를 하나의 선으로 구분을 할 수 없기 때문에 구현할 수 없지만 이를 해결하기 위해 다층 퍼셉트론(Multi-Layer Perceptron,MLP)를 사용한다.

2. 역전파 알고리즘을 사용하지 못한다.
계단 함수는 0에서는 미분이 안 되고 0인 부분을 제외하고 미분을 한다고 해도 미분 값이 전부 0이 나온다. 따라서 가중치들이 업데이트됮 않아 역전파 알고리즘을 사용하지 못한다.

5. 활성화 함수의 종류(2) : 선형 활성화 함수(Linear Activation Function)

선형 활성화 함수를 사용한 모델은 이진 계단 함수를 사용한 모델과 다르게 다중 출력이 가능하기 때문에 이진 분류와 간단한 다중 분류 문제도 해결할 수 있다.

또한 미분이 가능해서 역전파 알고리즘도 사용가능하다.

f(x)=xf(x) = x

import os
img_path = os.getenv('HOME')+'/aiffel/activation/jindo_dog.jpg'

# 선형 함수
def linear(x):
    return x

def dev_linear(x):
    return 1

# 시각화
ax = plot_and_visulize(img_path, linear, dev_linear)
ax.show()

📄Output

💡Tip 선형 활성화 함수의 한계
1. 모델에 선형 활성화 함수를 사용한다면 비선형적 특성을 지닌 데이터를 예측하지 못한다.

6. 활성화 함수의 종류(3) : 비선형 활성화 함수(Non-Linear Activation Function)

비선형 활성화 함수는 활성화 함수로써 나왔던 문제점을 해결한 함수로 역전파 알고리즘을 사용할 수 있으며 다중 출력도 가능하고 비선형적 특성을 지닌 데이터도 예측할 수 있다.

6-1. Sigmoid Function


시그모이드는 위와 같은 식으로 표현되며 함수의 치역은 (0,1)(0, 1)인데 이것이 시그모이드 함수를 쓰는 가장 주된 이유이다.

💡Tip Sigmoid 함수는 확률을 예측해야 하는 모델에서 자주 사용된다.

Sigmoid Function의 미분과 예시 코드
1. 미분 과정

  1. 예시 코드
import os
img_path = os.getenv('HOME')+'/aiffel/activation/jindo_dog.jpg'

# 시그모이드 함수
def sigmoid(x):
    return 1/(1+np.exp(-x).astype(np.float64))

def dev_sigmoid(x):
    return sigmoid(x)*(1-sigmoid(x))

# 시각화
ax = plot_and_visulize(img_path, sigmoid, dev_sigmoid)
ax.show()

📄Output

  • Sigmoid Function의 단점
  1. Sigmoid Function은 00 또는 11에서 포화(Saturate) 된다. 이는 입력값이 아무리 커져도 함수의 출력은 11에 더 가까워질 뿐 11이상으로 높아지지 않고 반대로 입력값이 아무리 작아져도 함수의 출력은 00에 가까워지기만 하고 00이하로 떨어지지 않는다.

    이렇게 포화가 발생하는 것을 Gradient00에 근접한다는 뜻으로 이는 역전파에서 앞에서 온 역전파 값에 곱해지는 과정에서 이후의 역전파 값이 00에 근접하게 되는 사실상 가중치의 업데이트가 일어나지 않는 Kill the Gradient상태가 된다.

    따라서 아무리 훈련을 많이 해도 훈련의 효과가 거의 없다.

  2. Sigmoid Function의 출력은 0이 중심(zero-centered)이 아니다.
    이는 훈련의 시간이 지나치게 오래 걸리게 된다는 문제가 발생하며 만약 입력값으로 들어오는 데이터의 값이 모두 양수라고 가정하고 모델에 있는 어떠한 노드의 출력값이 σ(iwixi+b)σ(∑_iw_ix_i + b)

    여기서 LLlossloss이고 ww는 노드 하나의 가중치 인데 σ(iwixi+b)(1σ(iwixi+b))xσ(∑_iw_ix_i + b)(1−σ(∑_iw_ix_i + b))x

이러한 이유로 현재 Sigmoid Function은 잘 사용되지 않는다.

6-2. Softmax

Softmax는 사진을 구분하고 불류하는 문제에서 많이 쓰이는 함수로 Sigmoid와 다르게 Class수의 제한이 없기 때문에 각 Class의 확률을 구할 때 쓰이는 함수이다.

6-3. tanh(Hyperbolic Tangent)

tanh는 쌍곡선 함수 중 하나로 아래와 같이 표현된다.

tanh의 치역은 (1,1)(-1, 1)이며 Sigmoid Function이 00이 중심이 아니였던 것과 다르게 00을 중심으로 하고 있기 때문에 Sigmoid Function보다 더 빨리 훈련이 이루어진다.

tanh의 미분과 예시 코드
1. 미분 과정

2. 예시 코드

import os
img_path = os.getenv('HOME')+'/aiffel/activation/jindo_dog.jpg'

# 하이퍼볼릭 탄젠트 함수
def tanh(x):
    return (np.exp(x)-np.exp(-x))/(np.exp(x)+np.exp(-x))

def dev_tanh(x):
    return 1-tanh(x)**2

# 시각화
ax = plot_and_visulize(img_path, tanh, dev_tanh)
ax.show()

📄Output

  • tanh 함수의 단점
    그래프에서 보이듯이 -1과 1에서 포화가 되는 단점을 극복하지 못했다.

6-4. ReLU(Rectified Linear Unit)

ReLU는 최근 가장 많이 사용되는 활성화 함수로 아래와 같이 표현된다.

ReLU의 치역은 (0,)(0, ∞)이며 tanh보다 훨씬 빠르게 훈련이 가능하다.


위의 그래프는 훈련 에러 비율을 나태내고 있으며 실선이 ReLU이고 점선이 tanh이다.
ReLU는 비용이 높은 exp와 같은 연산을 사용하지 않기 때문에 처리 속도가 빠르다.

  • ReLU의 단점
    ReLU의 출력값은 00이 중심이 아니기에 일어나는 문제점들과 Dying ReLU의 문제이다. Dying ReLU는 사용한 노드가 비활성화되며 출력을 00으로만 하게 되는 것이다.
    이는 학습률을 조절하면서 발생 빈도를 낮출 수 있는데 학습률을 줄여준다면 이 문제는 적게 발생한다.

6-5. ReLU의 단점을 극복하기 위한 시도

  • Leaky ReLU
    Dying LeLU를 발생시켰던 0을 출력하던 부분을 아죽 작은 음수값을 출력하게 만들어 해당 문제를 해결했으며 이 부분을 제외하고 ReLU와 같은 특성을 가진다.

  • PReLU(Parametric ReLU)
    Leaky ReLU와 유사하지만 새로운 파라미터를 추가하여 00미만일 때의 기울기가 훈련되게 했다.

  • ELU(Exponential Linear Unit)
    ReLU의 모든 장점을 포함하며 00이 중심점이 아니었던 단점과 Dying ReLU문제를 해결한 활성화 함수이다.
    하지만 이 함수는 exponential 연산이 들어가서 계산 비용이 높다라는 단점이 있다.

좋은 웹페이지 즐겨찾기