"활성화함수"의 두 판 사이의 차이

 
(같은 사용자의 중간 판 6개는 보이지 않습니다)
1번째 줄: 1번째 줄:
 +
= 개요 =
 +
기본적으로 딥러닝에서 층의 연산은 행렬의 선형계산이다. 활성화함수는 신경세포의 시냅스가 보여주는 임계점을 모방하여, 비선형 계산도 처리할 수 있게 해준다.
 +
 
== 계단함수 ==
 
== 계단함수 ==
퍼셉트론에서 사용하는 기본적인 함수. 0을 넘으면 1, 0과 같거나 작으면 0을 반환한다.
+
퍼셉트론에서 사용하는 기본적인 함수. 0을 넘으면 1, 0과 같거나 작으면 0을 반환한다.(혹은 -1을 반환하기도 한다.)
  
 
=== 구현 ===
 
=== 구현 ===
10번째 줄: 13번째 줄:
  
 
[생각. 그렇다면..훈련은 다른 함수로 하고, 검증은 이 함수로 하면 어떻게 될까?]
 
[생각. 그렇다면..훈련은 다른 함수로 하고, 검증은 이 함수로 하면 어떻게 될까?]
 +
 +
== 렐루 함수(ReLU 함수) ==
 +
Rectfied(정류된) Linear Unit. 0 이하라면 0을 출력하고 0을 넘는다면 입력을 그대로 출력하는 함수. 즉, -흐름만을 차단한 함수이다. 선형함수이지만, 정류되었다는 점에서 구분된다.
 +
 +
=== 구현 ===
 +
<syntaxhighlight lang="python">
 +
def relu_function(x):  # 일반적으로 넘파이 배열을 받는다.
 +
    return np.maximum(0, x)
 +
</syntaxhighlight>
 +
 +
=== 사용에서의 유의 ===
 +
 +
===='''Batch Normalization.'''====
 +
ReLU와 같은 비선형 함수를 사용할 때 ReLU와 ReLU 사이에 데이터가 전달될 때 batch normalizaion이 없다면 굳이 인접한 두 층의 활성화 함수를 ReLU로 지정할 이유가 없다.
 +
 +
한 층을 지나면서 어차피 양수가 되기 때문에 다음 층의 ReLU는 딱히 역할을 하지 않는다. 때문에 다음층으로 보내는 신호를 정규화하면 더 좋은 성능을 기대할 수 있다.(p91. 손글씨 숫자 인식에서 더 빠른 학습이 이루어지게 한다. 학습이 진행될수록 배치 정규화를 쓰고 안쓰고의 차이는 감소했지만.. 이는 시간과 물량으로 압도한 것일 뿐, 배치정규화 전략이 필수적으로 보인다..)
 +
 +
=== 아류 ===
 +
리키렐루 등 0보다 작으면 0을 반환하는 게 아니라 특정 값을 곱해 반환한다든가 다른 처리를 하는 전략도 있다.
  
 
== 시그모이드 함수 ==
 
== 시그모이드 함수 ==
 
sigmoid(S자 모양이라는 의미) function. <math>h(x) = \frac{1}{1+\exp(-x)}</math> 신경망에서 사용하는 함수. 신경망과 퍼셉트론의 차이는 활성화 함수의 차이 뿐이다.
 
sigmoid(S자 모양이라는 의미) function. <math>h(x) = \frac{1}{1+\exp(-x)}</math> 신경망에서 사용하는 함수. 신경망과 퍼셉트론의 차이는 활성화 함수의 차이 뿐이다.
 +
 +
로지스틱함수라고도 한다.
 +
 +
0에서부터 벗어나면 값이 급격히 변하지만, 2.5가 넘으면 거의 변하지 않는 특성이 있다.
  
 
=== 구현 ===
 
=== 구현 ===
20번째 줄: 46번째 줄:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
== 렐루 함수(ReLU 함수) ==
+
=== 한계 ===
Rectfied(정류된) Linear Unit. 0 이하라면 0을 출력하고 0을 넘는다면 입력을 그대로 출력하는 함수. 즉, -흐름만을 차단한 함수이다. 선형함수이지만, 정류되었다는 점에서 구분된다.\
+
은닉층이 늘어날수록 함수의 미분값이 0에 수렴해 학습이 잘 되지 않는다.(왜?)
 
+
다른 값들을 곱해서?
=== 구현 ===
 
<syntaxhighlight lang="python">
 
def relu_function(x):  # 일반적으로 넘파이 배열을 받는다.
 
    return np.maximum(0, x)
 
</syntaxhighlight>
 
  
 
== 소프트맥스 함수 ==
 
== 소프트맥스 함수 ==
softmax function. 출력층에서 사용하는 활성화함수 중 문류 문제에 주로 쓰이는 함수이다. <math>y_k = \frac{\exp(a_k)}{\sum_{i=1}^n\exp(a_i)}</math>형태로, 분모가 모든 신호의 지수함수합으로 이루어져 해당 분류의 확률을 나타낼 수 있다.
+
softmax function. 출력층에서 사용하는 활성화함수 중 문류 문제에 주로 쓰이는 함수이다. <math>y_k = \frac{\exp(a_k)}{\sum_{i=1}^n\exp(a_i)}</math>형태로, 분모가 모든 신호의 지수함수합으로 이루어져 해당 분류의 확률을 나타낼 수 있다. 즉, 다항분류문제에서 출력값을 확률화하기 위해 자주 사용된다. 
  
 
이 형태는 오차역전파에서 역전파의 크기를 염두로 설계되었다.(궁금한 사람은 [http://id8436.iptime.org:2786/mediawiki/index.php/%EC%98%A4%EC%B0%A8%EC%97%AD%EC%A0%84%ED%8C%8C%EB%B2%95#softmax 링크] 참조)
 
이 형태는 오차역전파에서 역전파의 크기를 염두로 설계되었다.(궁금한 사람은 [http://id8436.iptime.org:2786/mediawiki/index.php/%EC%98%A4%EC%B0%A8%EC%97%AD%EC%A0%84%ED%8C%8C%EB%B2%95#softmax 링크] 참조)
45번째 줄: 66번째 줄:
 
     return y
 
     return y
 
</syntaxhighlight>exp는 지수함수이기 때문에 조금만 숫자가 커져도 숫자가 너무 커져서 컴퓨터가 다루는 수의 한계를 넘어버리고 만다.(이를 오버플로우라 한다.) 때문에 <math>y_k = \frac{\exp(a_k)}{\sum_{i=1}^n\exp(a_i)}= \frac{C\exp(a_k)}{C\sum_{i=1}^n\exp(a_i)}= \frac{\exp(a_k-c)}{\sum_{i=1}^n\exp(a_i-c)}</math>의 관계에 있음을 이용하여 전체에서 가장 큰 값을 빼주고 실행한다. 보통 최종 값의 정류를 위한 함수로, 연산 자체엔 영향을 미치지 않는다.
 
</syntaxhighlight>exp는 지수함수이기 때문에 조금만 숫자가 커져도 숫자가 너무 커져서 컴퓨터가 다루는 수의 한계를 넘어버리고 만다.(이를 오버플로우라 한다.) 때문에 <math>y_k = \frac{\exp(a_k)}{\sum_{i=1}^n\exp(a_i)}= \frac{C\exp(a_k)}{C\sum_{i=1}^n\exp(a_i)}= \frac{\exp(a_k-c)}{\sum_{i=1}^n\exp(a_i-c)}</math>의 관계에 있음을 이용하여 전체에서 가장 큰 값을 빼주고 실행한다. 보통 최종 값의 정류를 위한 함수로, 연산 자체엔 영향을 미치지 않는다.
 +
 +
== tanh 함수 ==
 +
시그모이드 함수가 (0, 0.5)에서 대칭인 반면, tanh는 0에서 대칭인 곡선이다. 활성화 함수용으로는 원점에서 대칭인 함수가 바람직하다 알려져 있다. 시그모이드는 매끄러운 분포를 가진 초깃값이 층이 깊어지면서 형태가 일그러진다. 이는 tanh함수를 이용하면 해소된다.
 +
 +
=== 아류 ===
 +
쌍곡탄젠트를 사용하기도 한다.
 
[[분류:딥러닝 이론]]
 
[[분류:딥러닝 이론]]

2022년 2월 23일 (수) 17:38 기준 최신판

1 개요편집

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

1.1 계단함수편집

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

1.1.1 구현편집

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

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

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

1.2 렐루 함수(ReLU 함수)편집

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

1.2.1 구현편집

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

1.2.2 사용에서의 유의편집

1.2.2.1 Batch Normalization.편집

ReLU와 같은 비선형 함수를 사용할 때 ReLU와 ReLU 사이에 데이터가 전달될 때 batch normalizaion이 없다면 굳이 인접한 두 층의 활성화 함수를 ReLU로 지정할 이유가 없다.

한 층을 지나면서 어차피 양수가 되기 때문에 다음 층의 ReLU는 딱히 역할을 하지 않는다. 때문에 다음층으로 보내는 신호를 정규화하면 더 좋은 성능을 기대할 수 있다.(p91. 손글씨 숫자 인식에서 더 빠른 학습이 이루어지게 한다. 학습이 진행될수록 배치 정규화를 쓰고 안쓰고의 차이는 감소했지만.. 이는 시간과 물량으로 압도한 것일 뿐, 배치정규화 전략이 필수적으로 보인다..)

1.2.3 아류편집

리키렐루 등 0보다 작으면 0을 반환하는 게 아니라 특정 값을 곱해 반환한다든가 다른 처리를 하는 전략도 있다.

1.3 시그모이드 함수편집

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

로지스틱함수라고도 한다.

0에서부터 벗어나면 값이 급격히 변하지만, 2.5가 넘으면 거의 변하지 않는 특성이 있다.

1.3.1 구현편집

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

1.3.2 한계편집

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

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

1.5 tanh 함수편집

시그모이드 함수가 (0, 0.5)에서 대칭인 반면, tanh는 0에서 대칭인 곡선이다. 활성화 함수용으로는 원점에서 대칭인 함수가 바람직하다 알려져 있다. 시그모이드는 매끄러운 분포를 가진 초깃값이 층이 깊어지면서 형태가 일그러진다. 이는 tanh함수를 이용하면 해소된다.

1.5.1 아류편집

쌍곡탄젠트를 사용하기도 한다.