말랑말랑제리스타일

딥러닝 활성화 함수 중 ReLU 쓰는 이유 본문

프로그래밍/딥러닝

딥러닝 활성화 함수 중 ReLU 쓰는 이유

제리제리 2024. 3. 19. 16:33

딥러닝 활성화 함수에는 크게 Sigmoid(시그모이드),Tanh(하이퍼블릭 탄젠트), ReLU(렐루) 세가지 함수가 있습니다.

이 중 대세는 ReLU라고 하고 자료를 찾아봐도 ReLU를 많이 사용하기에 이유를 알아봤습니다.

세가지 활성화 함수(Sigmoid, Tanh, ReLU)의 특징

일단 세가지 활성화 함수의 특징을 알아봤습니다.

Sigmoid의 경우 1/(1 + e^(-z))로 값을 만들어냅니다.

Sigmoid 활성화 함수 그래프
Sigmoid 함수 그래프

그래프는 이렇게 되는데요. 0보다 작은 값이 들어가면 0에서 0.5 사이의 값이, 0보타 큰 값이 들어가면 0.5~1 사이의 값으로 대치되겠네요. 세부적으로 설명하면 무지하게 복잡하니까 이쯤 하고 넘어갑니다.

다음으로 tanh 함수의 경우 tanh(x)로 계산이 됩니다. Sigmoid 함수에 입력값을 두배로 주고 결과를 두배로 돌린 뒤 1을 빼주는 연산을 하죠.

Tanh 활성화 함수 그래프
Tanh 함수 그래프

결과 값은 -1.0에서 1.0의 값으로 나옵니다. Sigmoid 함수와 비슷하죠?

마지막으로 ReLU 함수입니다.

ReLU 함수는 0보다 작은 입력은 0으로, 큰 값은 해당 값으로 대치됩니다.

ReLU 활성화 함수 그래프
ReLU 함수 그래프

되게 간단하죠. 

그러다 보니 ReLU 함수는 다른 두개의 활성화 함수에 비해 일단 속도가 매우 빠릅니다.

그리고 성능도 우수한데요.

세가지 활성화 함수(Sigmoid, Tanh, ReLU)의 성능 비교

성능이 왜 우수한지 명확히 답변을 제시하기에는 제가 역량이 부족해 mnist 데이터를 이용해 테스트해봤습니다.

for f in ['sigmoid', 'tanh', 'relu']:
    tf.random.set_seed(14)
    model = Sequential()
    model.add(Dense(64, activation = f, input_shape = (28*28,)))
    
    #레이어
    model.add(Dense(32, activation = f))
    model.add(Dense(16, activation = f))
    model.add(Dense(10, activation = 'softmax'))
    
    model.compile(optimizer= 'adam', loss = 'categorical_crossentropy', metrics = ['acc'])
    
    model.fit(train_x, train_y, epochs=10, batch_size=50, validation_data=(valid_x,valid_y))

활성화 함수별로 모델을 만들어 확인해봤는데요.

epoch 10번째(최종) 기준으로 아래와같은 결과를 얻었습니다.

Sigmoid 함수 사용

acc: 0.9810 - loss: 0.0774 - val_acc: 0.9639 - val_loss: 0.1323

Tanh 함수 사용

acc: 0.9910 - loss: 0.0339 - val_acc: 0.9647 - val_loss: 0.1382

ReLU 함수 사용

acc: 0.9889 - loss: 0.0393 - val_acc: 0.9661 - val_loss: 0.1302

보시다 시피 성능에서 별 차이가 나지 않고 미세하게 ReLU가 좋게 나옵니다.

사실 이정도면 성능이 좋다고는 말할 수 없지만 걸리는 시간 대비 성능은 ReLU가 빠르기에 좋다고 할 수 있죠.

 

이런 쉽고 빠르고 성능상 별 차이가 없다는 점에서 현재는 학습용으로는 Sigmoid나 Tanh 함수보다는 ReLU 함수를 많이 사용하고 있습니다.

 

반응형
Comments