머신러닝 기초공부를 정리를 어떻게 할까 생각하고있었는데,
마침 보이저엑스 남세동대표님이 딥러닝개발자에게 묻는 면접질문을 페북에 포스팅해주셨다.
딥러닝을 업무에 이용하고는 있었지만 이론적으로 깊이있게 다루지않다보니
기초적인 질문에 대해 자신있게 답변하기는 어렵더라...
기초적인 내용인 만큼 정리하면서 다시 공부해보자
1. sigmoid 대신 ReLU를 사용하는 이유가 뭔가요?
가장 먼저 sigmoid, tanh, ReLU, Leaky ReLU 등의 정의와 그래프부터 파악하자

뉴럴넷에서는 입력된 값을 weight 와 bias로 연산하고, 연산결과를 활성함수(activation function) 으로 처리한다.
sigmoid function 은 모든 실수를 0과 1사이의 값으로 변환하는 활성함수이다. 따라서, 각 노드의 결과값은 y=sigmoid(Wx+b) 로 나타난다.
뉴럴넷은 학습과정에서 backpropagation 이라는 방법을 이용해서 결과값의 오차를 역전파해서 노드의 가중치 w를 수정한다. 이 때 chain rule에 의한 미분식은 다음과 같이 전개된다
(출처: https://ayearofai.com/rohan-4-the-vanishing-gradient-problem-ec68f76ffb9b)

여기서 "output"은 2번째 히든레이어의 결과에 활성함수를 적용한 결과, 즉 sigmoid(z1) 이다.
2번째 히든레이어의 입력값인 "hidden2"은 1번째 히든레이어의 결과에 활성함수를 적용한 결과, 즉 sigmoid(z2) 이다.
![]() |
![]() |
이처럼 sigmoid를 활성함수로 사용하는 뉴럴넷은 Backpropagation 학습 시, sigmoid 미분값이 chain rule 에 의해 곱해진다.

여기서 sigmoid function 의 미분값은 (0, 0.25) 범위에 존재한다. sigmoid functioin 의 그래프를 보기만 해도 미분값이 굉장히 작다는 것을 쉽게 알 수 있다. 따라서 레이어의 층수가 깊어질수록 레이어의 미분값인 d(error)/d(w1)는 매우 작아진다. 즉, 최종 값의 오차가 앞에있는 레이어까지 전달되지 않아서 뉴럴넷의 학습이 저하되는 vanishing gradient 문제가 발생한다.
(간혹 sigmoid의 출력값인 (0,1) 사이 값이 곱해지므로 gradient가 작아진다고 설명하는 자료를 볼 수 있는데,
sigmoid 함수의 미분값인 (0, 0.25) 값이 곱해지는 것이 좀더 정확한 설명인 듯하다....)
반면, ReLU는 max(0,x)로 음수는 모두 0으로 반환하고 양수는 값을 그대로 반환하는 활성함수이다.
그래서 ReLU 함수의 미분은 다음과 같다

따라서 sigmoid 대신 ReLU를 사용하면, 위와 똑같이 chain rule 이 적용될 때 레이어의 갯수가 늘어나더라도 최종결과의 오차를 레이어에 그대로 전달할 수 있다.
1-a. ReLU는 미분 불가능한데 BP가 어떻게 가능한가요?
ReLU가 미분 불가능한 지점은 x=0일 때뿐인데, 실제 연산에서 x=0이 되는 경우는 극히 드물기때문에 이를 무시하고 사용할 수 있다는 것이 일반적인 견해이다.
★심화★ ReLU의 미분불가능한 영역(x=0)이 backpropagation 연산에 미치는 영향에 대한 최신의 연구결과도 있다.
(Bertoin et al., 2021. Numerical influence of ReLU’(0) on backpropagation @ NeurIPS 2021)
TensorFlow와 PyTorch 와 같은 상용라이브러리에서는 ReLU'(0) = 0 으로 두고 전체 학습에 영향이 없을 것으로 가정한다.
하지만 저자인 Bertoin의 실험결과에 따르면 TF와 Torch의 기본셋팅인 32비트 연산에서는 x=0이 되는 지점(bifurcation zone)이 실제로 발생할 수 있고, 이 때 ReLU'(0)=0 또는 ReLU'(0)=1 으로 할 떄 학습결과에서 유의미한 차이가 발생할 수 있다고 주장한다. 동일한 학습을 16비트에서 할때는 결과가 더 안좋아지고, 64비트에서는 문제가 없어진다.
결론적으로, x=0인 minima가 거의 발생하지 않으므로 BP 자체는 문제가 없다고 가정할 수 있다. 그러나 이론적인 생각과 달리 컴퓨팅 과정에서 x=0 이 문제를 야기할 수도 있다.
1-b. Leaky-ReLU는 무엇인가요?
ReLU에서는 0보다 작은 입력값의 반환값과 미분값이 모두 0으로 반환되기 때문에 많은 많은 뉴런들이 0으로 비활성화 된다는 단점이 있다 (dying ReLU 문제). 이를 보완하기 위해서 Leaky-ReLU(x) = max(0.01x,x) 와 같이 ReLU 의 음수구간에서 x보다 작은 값을 취할 수 있도록 정의한 함수이다. 이 외에도 ELU, PReLU 등 ReLU의 음수구간을 보완하기 위한 방안들이 존재한다.
그러나 ReLU를 통해서 뉴런이 0으로 변하는 것은 네트워크의 Sparsity 를 높이는 장점으로 보기도 한다. 벤지오랩에서 Rectifier 에 대해 제안한 2009년 논문 (Glorot et al., 2009. Deep Sparse Rectifier Neural Networks) 에서 일찍이 논한 것 처럼 이미 Sparsity의 장점은 잘 알려져 있다.
그러므로 어떤게 더 좋냐는 질문보다는 해결해야할 문제, 뉴럴넷의 구조, 그 외 학습환경 등을 종합적으로 고려해서 가장 적합한 활성함수를 찾는게 베스트라는... 딥러닝연구스러운 결론에 도달할 수 있다 ㅎㅎ;;
'데이터 사이언스 or 엔지니어링 > 머신러닝' 카테고리의 다른 글
| 모델의 Loss Surface (0) | 2022.02.23 |
|---|---|
| mini-batch 를 사용하는 이유 (0) | 2022.02.22 |
| Transformer 의 기초 이해하기 (0) | 2022.02.21 |
| Softmax 알아보기 (0) | 2022.02.20 |
| 이미지 처리에서 CNN과 max pooling (0) | 2022.02.09 |

