오늘은 딥러닝의 인공신경망에서 활용되는 활성화 함수 중 가장 많이 사용되는 ReLU와 Softmax 함수에 대해서 정리해보고자 한다.
참고자료:
ReLU
ReLU는 대표적인 활성화함수다. ReLU는 엄밀히 따지면 비선형함수긴 하지만 양수에 대해선 선형인 함수다.
https://pytorch.org/docs/stable/generated/torch.nn.ReLU.html
pytorch의 공식적인 설명란이다. 사실 ReLU 함수는 아주 간단하다. 0보다 작으면 0을, 0보다 크면 그대로 반환해주는 것이다.
pytorch 내에서 ReLU가 어떻게 구현되어 있는지 살펴보고자 소스코드를 열어봤다.
각각 modules의 activation 파트와 nn.functinoal에서 찾은 코드인데 직접 작성해두질 않았다.
그래서 챗지피티의 도움을 좀 받은 결과 C++로 작성되어있다는 사실을 발견하여 코드를 찾을 수 있었다.
C++이 파이썬보다 속도가 빠른 탓인지 이렇게 C++로 작성해둔 모습이다. 사실 C 쪽 코드는 아예 몰라서 100퍼센트 해석은 안되지만 min(self, 0) 을 걸어놓은 것으로 ReLU를 구현했다는 사실은 알 수 있었다. (relu_는 relu의 inplace 버전이라고 한다. 코드 내부적으로 사용할 때 쓰는 함수같다.)
ReLU함수는 그 변형도 어마어마하게 많다. leaky_relu, prelu, selu, rrelu 등등... 그만큼 인기가 많은 활성화 함수라고 생각된다. 인기가 많은 이유는 단연 그 속도 때문일 것이다. 0보다 큰지, 작은지만 체크하면 되기 때문에 안그래도 연산이 오래 걸리는 딥러닝에서 인기가 많을 수밖에 없다.
하지만 그 점 자체가 ReLU의 단점이 될 수 있다고도 한다.
https://www.linkedin.com/pulse/top-10-activation-functions-advantages-disadvantages-dash
위 글에 따르면 ReLU의 장점은 기울기 소실(Gradient Vanishing) 문제는 없어지지만, 음수일 때 값과 기울기가 모두 0이 된다는 점에서 한 번 음수인 입력값이 들어오면 그 파라미터는 가중치 업데이트가 일어나지 않게 된다. (inactive 나 dead 라는 표현을 사용한다.) 역전파의 개념을 생각해보면 되는데, 기울기가 0이기 때문에 학습 과정에서 아무 기여도 하지 못하고 가중치 업데이트가 일어나지도 않게 된다.
이런 단점이 있긴 해도 여전히 인기 있는 활성화 함수로 꼽힌다. 아마 ReLU를 먼저 사용해보고, 데이터와 모델에 따라 문제가 발생하면 그때 ReLU의 변형 함수들로 사용하는 것 같다. (대부분 트랜스포머 모델들이 활성화 함수로 ReLU를 채택 중이다.)
Softmax
ReLU가 신경망의 은닉층에서 많이 사용된다면, Softmax는 출력층에서 다중 분류 문제를 풀 때 많이 사용되는 활성화 함수다.
참고자료의 plot은 softmax함수의 개형을 위처럼 설명하지만 정확히 따지자면 이렇다.
어떻게 쓰이는지 구체적인 예시는 다음 포스팅에서 확인 가능하다.
https://www.analyticsvidhya.com/blog/2021/04/introduction-to-softmax-for-neural-network/
class 3개로 분류해야하는 상황이라고 가정하자. 출력층의 3개의 노드들은 각각 클래스에 입력값 x가 소속될 확률을 나타내주어야 한다. 하지만 활성화 함수가 적용되기 전엔 그 값들은 그저 logit, 즉 어떤 값으로만 존재할 뿐이다.
이를 위해 softmax 함수를 적용하면 확률로 변환이 가능하다. (일부/전체합 이기 때문) 이때 지수함수 안에 값을 넣어준다는 것이 softmax의 핵심이 되겠다.
여담으로 시그모이드 함수와 유사한 그래프 개형을 갖는데, 시그모이드 함수는 이진 분류, softmax 함수는 다중 분류에서 주로 사용된다고 한다.
'딥러닝' 카테고리의 다른 글
[딥러닝] 역전파를 단 한 줄로 가능하게 해주는 backward() 함수 탐구 (1) | 2024.11.20 |
---|---|
[딥러닝] 생성형 AI (LLM) 에서 Loss는 어떻게 계산될까 (0) | 2024.06.22 |
Colab 에서 cuda error: device-side assert triggered 등 CUDA error 해결 (huggingface 관련) (0) | 2023.09.30 |
Trainer API 에서 compute_metrics 사용할 때 CUDA out of memory 해결법 (0) | 2023.09.05 |
딥러닝 - Pytorch 의 Sampler 정리 (0) | 2023.08.11 |