계단 함수 (Step Function)
계단 함수는 퍼셉트론에서의 활성화함수로 아래와 같다.
$$ h(x) = \begin{cases} 0 & (x \leq 0) \\ 1 & (x > 0) \end{cases} $$
즉 단순하게 입력으로 전달받은 값이 $ 0 $을 넘으면 $ 1 $을 출력하는 함수이다. 코드로는 다음과 같다.
def step_function(x):
if x > 0:
return 1
else:
return 0
그러나 위 함수는 넘파이 배열을 받을 수 없기 때문에 아래와 같이 수정하여 넘파이 배열의 입력을 가능하게 만들어주어야 한다.
def step_function(x):
y = x > 0
return y.astype(int)
입력받은 넘파이 배열에서 $ 0 $ 보다 큰 값에 대해서 True
를 넣어주고, 이를 다시 int 형으로 변환하여 $ 1 $로 만들어 반환하는 것이다.
그래프로 그려보면 아래와 같다. 보이듯이 $0$을 경계로 출력을 결정한다.
x = np.arange(-5.0, 5.0, 0.1)
y = step_function(x)
plt.plot(x, y)
plt.ylim(-0.1, 1.1)
plt.show()
시그모이드 함수 (Sigmoid Function)
시그모이드 함수는 아래와 같다.
$$ h(x) = \dfrac{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()
보이듯이 시그모이드 함수는 계단 함수와 다르게 매끄럽다. 즉 입력에 대해 출력이 연속적으로 변화한다. 그렇기에 계단 함수에 비해 극단적이지 않다. 그럼에도 작은 입력에 대해서는 작게, 큰 입력에 대해서는 크게 출력을 유지하는 점이 중요하며, 계단 함수와 공통점이다.
ReLU 함수 (Rectified Linear Unit Function)
시그모이드 함수는 전통적으로 많이 사용되는 활성화함수인데 최근에는 ReLU 함수가 많이 사용된다. 수식으로는 아래와 같다.
$$ h(x) = \begin{cases} x & (x > 0) \\ 0 & (x \leq 0) \end{cases} $$
즉 $ 0$ 보다 크면 그대로, 작거나 같으면 $ 0 $을 출력한다. 코드로 구현하면 아래와 같다.
def ReLU(x):
return np.maximum(0, x)
그래프로 그려보면 아래와 같다.
x = np.arange(-5.0, 5.0, 0.1)
y = ReLU(x)
plt.plot(x, y)
plt.ylim(-1, 5.5)
plt.show()
ReLU 함수를 많이 사용하게 되는 이유는 기울기 소실(vanishing gradient) 문제가 발생하지 않기 때문이다. 시그모이드 함수를 사용하면 매우 큰 값이나 작은 값에 대해서는 기울기가 $ 0 $ 에 가까워지기 때문에 기울기 소실이 발생할 수 있다. 이는 경사하강법(SGD)에 대해 알아야 이해되는 내용이다.
Leaky ReLU 함수 (Leaky Rectified Linear Unit Function)
ReLU 함수는 $0$ 보다 작은 값을 반영하지 못하는 문제가 있었다. 이를 해결하기 위해 Leaky ReLU 함수가 등장하였다. 수식은 아래와 같다.
$$ h(x) = \max(ax, x) $$
이때 $ a $ 는 하이퍼파라미터로 $ 0.01 $ 혹은 $ 0.001 $ 과 같은 작은 값을 사용한다. 코드로는 아래와 같다.
def Leaky_ReLU(a, x):
return np.maximum(a * x, x)
그래프로는 아래와 같다.
x = np.arange(-2.2, 2.2, 0.1)
y = Leaky_ReLU(0.1, x)
plt.plot(x, y)
plt.ylim(-0.4, 2.4)
plt.show()
즉 아주 약하지만 $ 0$ 보다 작은 값에 대해서도 반영한다.
활성화함수 의미
활성화함수는 무조건 비선형 함수이다. 정확히는 비선형 함수여야 활성화함수로서 의미가 있다. 왜냐하면 여러 층으로 이루어진 신경망을 통과하면서 활성화함수를 거치는데, 활성화함수가 선형 함수라면 여러 층으로 신경망을 구성하는 의미가 없기 때문이다. 예를 들어서 활성화함수가 $ h(x) = a x + b $ 이고, $ a , b $ 가 상수라 해보자. 3개의 층을 입력 $ x $ 가 흐른다면 $ h(h(h(x))) $ 와 같은 출력이 나올 것이다. 그런데 이를 다시 쓰면 $ a(a(ax + b)+b)+b $ 이고 풀어보면 $ a^3 x + a^2 b + a b + b $ 이다. 이는 결국 $ h(x) = c x + d $, $( c = a^3, d = a^2 b + ab + b) $ 와 같으므로 여러 층을 흐르는 의미가 없어진다.
'Artificial Intelligence > Deep Learning' 카테고리의 다른 글
[DL] 신경망(neural network)과 활성화함수(activation function) (0) | 2025.02.10 |
---|---|
[DL] 퍼셉트론(perceptron)과 다층퍼셉트론(multi-layer perceptron) (0) | 2025.02.10 |