이 포스트는 Do it 딥러닝 교과서 (윤성진 저)를 참고하여 만들어졌음!
이번에는 Activation functions(활성화 함수)에 대해서 알아본다.
계단함수 (step function) $f(x) = \begin{cases}1, & \text{if } x \geq 0 \\0, & \text{otherwise} \end{cases}$
Step function은 딥러닝 개발 극 초창기 퍼셉트론에서 사용되었다고 한다. 하지만 현대 딥러닝에서는 사용이 불가능한 방식이다. 역전파가 개발된 이후에는 역전파 알고리즘을 사용하기 위해 반드시 미분가능한 함수만을 사용하여야 하는데 계단함수는 모든 구간에서 기울기가 0인 함수이기 때문이다.
시그모이드 (Sigmoid) $f(x)=\frac{1}{1+e^{-x}}$
위와 같은 이유로 Step function을 사용하지 못하게 되어 고안된 것이 Sigmoid이다. Sigmoid는 step function을 부드럽게 늘여 어느 구간에서든 미분이 가능하도록 설계되었다. 하지만 몇 가지 문제점을 가진다.
- 지수를 미분하는 것이 컴퓨터에게는 다소 복잡한 일이다. 연산량이 크다
- 입력값의 절댓값이 큰 경우 기울기가 0에 가까워지는 Gradient saturation이 발생한다.
- 양수만 출력하기 때문에 최적화가 비효율적이다. (이유는 나중에 나온다고 한다.)
하이퍼볼릭 탄젠트 (Hyperbolic tangent) $f(x)=\frac{e^x - e^{-x}}{e^x + e^{-x}}$
Sigmoid의 '양수만 출력'하는 문제를 해결하기 위해 치역의 범위를 [-1, 1]로 만든 함수가 바로 하이퍼볼릭 탄젠트이다. 하지만 지수함수로 표현된다는 점과 Gradient saturation의 문제점은 여전히 존재한다.
ReLU(Rectified Linear Unit) $f(x) = \begin{cases}x, & \text{if } x \geq 0 \\0, & \text{otherwise} \end{cases}$
ReLU는 이름에서 알 수 있듯이 0보다 작은 입력이 들어오면 rectifying(정류)하여 0으로 만들고, 0 이상의 값이 들어오면 Linear한 출력을 내보낸다. ReLU는 2011년 제프리 힌턴 연구실에서 Sigmoid보다 성능이 좋다는 것이 입증된 후로 가장 인기있게 사용되고 있는 activation function이다.
- 장점1 : 연산이 없다. forward 연산에서 입력값이 0 이상인지 미만인지만 판단하면 된다. 0 이상이면 입력값을 그대로 내보내고 0 미만이면 출력으로 0을 내보낸다. 또한 backward 연산에서는 기울기가 항상 1이기 때문에 연산할 필요가 없는 것이다. 따라서 빠른 학습이 가능하다.
- 장점2 : 양수구간에서 Gradient saturation이 발생하지 않기 때문에 안정적인 학습이 가능하다.
- 단점1 : 양수만 출력하므로 양수, 음수 모두를 출력하는 경우보다 학습이 비효율적이다.
- 단점2 : 뉴런이 한 번 음의 값을 가지게 되면 ReLU 출력으로 0을 반환하므로 일부 뉴런이 학습 도중에 사용되지 않게 되는 문제가 발생한다. 값이 0인 뉴런은 기울기 역시 0이 되므로 학습이 멈추는 문제가 발생할 수 있다.
Leaky ReLU $f(x) = \begin{cases}x, & \text{if } x \geq 0 \\0.01x, & \text{otherwise} \end{cases}$
Leaky ReLU는 기존 ReLU의 입력값이 음수일 때 기울기 소실 문제를 방지하기 위해 등장하였다. Leaky ReLU는 기울기가 음수일 때 $0.01x$를 가지므로 입력값이 음수일 때도 약간의 기울기를 가진다. 이를 그리면 위와 같은데, 기울기 0.01이 티가 너무 안나서 대부분의 교과서나 강의자료에서는 기울기 0.1 등으로 설정하여 그린다.
ELU $f(x) = \begin{cases}x, & \text{if } x \geq 0 \\ \alpha(e^x -1), & \text{otherwise} \end{cases}$
Leaky ReLU의 경우 입력값이 매우 큰 음수값이면 출력 또한 매우 큰 음수가 될 수 있다는 문제를 가진다. ELU (Exponential Linear Units)는 입력값이 음수인 구간에서 지수함수 형태로 정의되어 입력값이 매우 큰 음수값일 때 출력이 발산하지 않는다.
Swish $f(x)=\frac{x}{1+e^{-x}}$
Swish함수는 구글의 Ramachandran 등의 연구원들에 의해 2017년에 제안되었다. ReLU를 대체하기 위해 고안된 Swish는 입력값이 음수일 때도 어느정도 기울기를 가져 기울기 소실 문제를 완화한다. 더하여 비선형성을 더 부드럽게 표현할 수 있으므로 Swish를 이용했을 때 우수한 성능을 기대할 수 있다. 하지만 지수함수 형태로 표현되기 때문에 ReLU에 비하여 연산량이 많다는 문제점이 존재한다. 현재 HW의 발전과 함께 연산량을 감당 혹은 줄일 수 있는 연구가 이루어지고 있다고 한다.
이번에는 활성화 함수에 대해 알아보았다. 아주 초창기에는 Step function을 사용했지만 역전파의 도입 이후로 미분가능한 활성화 함수가 요구되어 Sigmoid와 Hyperbolic tangent를 고안하였다. 하지만 이것들은 지수함수 형태로 표현되므로 연산이 어렵다는 문제를 가진다. 따라서 연산량이 매우 적은 ReLU를 사용하게 되었는데, ReLU는 입력값이 음수일 때 출력값이 0이 되어 기울기가 소실된다는 단점이 존재한다. 이를 개선하기 위해 Leaky ReLU, ELU등이 개발되었다. 그 이후 Swish나 SELU, GELU등의 활성화 함수들이 연구, 개발되고 있다.
'딥러닝' 카테고리의 다른 글
4. 시그모이드와 크로스엔트로피, 양수출력문제, 죽은 ReLU (0) | 2023.09.14 |
---|---|
Optuna document 읽어보기 (0) | 2023.09.14 |
2. 분류와 회귀 (0) | 2023.09.13 |
1. 순방향 신경망 (0) | 2023.09.13 |
K means, 계층 군집화를 이용한 팀원 짜기 (0) | 2023.09.12 |