굴러가는 분석가의 일상

딥러닝의 구조 #3 [손실 함수] 본문

Deep Learning 이해

딥러닝의 구조 #3 [손실 함수]

G3LU 2023. 11. 20. 19:28

본 게시물은 공부목적으로 작성되었으며, 딥러닝 파이토치 교과서 참고하였습니다.  

딥러닝의 구조 및 정의 (복습)

 

 

 

  • 입력층: 데이터를 받아드리는 충 
  • 은닉층: 모든 뉴런으로 부터 값을 받아 가중합을 계산하고, 이 값을 활성화 함수에 적용하여 출력층에 전달
  • 출력층: 신경망의 최종 출력 값 

 

사진 출처: 길벗

  • 가중치: 뉴런과 뉴런 간 연결 강도 
  • Bias : 가중합에 더해 주는 상수; 하나의 뉴런에서 활성화 함수를 통해 최종적으로 출력되는 값 조정 
  • 가중합: 가중치와 신호의 곱을 합한 것
  • 활성화 함수: 신호를 입력/처리하여 출력해 주는 함수 
  • 손실함수: 가중치 학습을 위해 함수의 결과와 실제 값 간의 오차 측정하는 함수 

손실함수 

 

 

신경망에서의 가장 큰 이점은 데이터에서 숨겨진 인사이트와 관계를 나타내는 것입니다. 이를 이루기 위해서, 신경망 (Neural Net)은 더 좋은 방향으로 나아가고자 개선하며 학습하게 됩니다. 그렇다면, "더 좋은 방향"은 무엇을 의미할까요? 

사람이 더 빠르고 효율적인 "최적의 루트"를 탐색하듯, 신경망도 "하나의 지표"를 기준으로 최적의 매개변수 값을 탐색하게 됩니다. 이때 "하나의 지표"를 결정하는데 사용되는 것이 Loss Function (손실함수) 입니다. 

 

즉, 손실함수는 학습을 통해 얻은 데이터의 추정치가 실제 데이터와 얼마나 차이가 나는지 평가하는 지표입니다. 

 


 

Mean Squared Error (평균 제곱 오차)

 

평균 제곱 오차는 주로 회귀에서 주로 사용됩니다. 평균 제곱 오차는 실제 값과 예측 값의 차이를 제곱하여 평균을 낸 것을 뜻하며, 수식은 다음과 같습니다. 

 

 

이와 같이, 평균 제곱 오차는 직관적이고 알아보기 쉽습니다. 이에 구체적으로 다루진 않겠습니다.

Regression Line과 데이터의 차이 (Error)를 모두 더하고 평균을 내준다면, MSE를 도출할 수 있습니다. 다음은 파이토치에서 MSE 구현 방법입니다. 

 

import torch 

loss_fn = torch.nn.MSELoss(reduction = 'sum')
y_pred = model(x)
loss = loss_fn(y_pred,x)

 

Cross Entropy Error (크로스 엔트로피 오차)

 

크로스 엔트로피는 분류 문제에서 One-Hot Encoding 하였을 때만 사용할 수 있는 오차 계산법입니다. 노드에서 출력되는 값과 정답을 비교하여 오류를 계산하기 때문에 형태를 비슷하게 만들어줘야 할 필요가 있습니다. 즉, 일반적인 분류 문제에서는 데이터의 출력을 0과 1로 구분하기 때문입니다.  

 

 

크로스 엔트로피 오차의 수식은 다음과 같습니다. "정답"과 "예측" 한 값에서 얼마나 차이가 발생하는지를 계산하므로 MSE와 비슷한 개념이라고 생각하시면 될거 같습니다. 

 

 

 

 

이렇게 수식으로만 보면 이해가 안가실 수 있습니다. 이해를 돕기 위해 아래 그림과 예시를 참조 부탁드릴게요. 

 

정답 레이블 [0   0   1]인 마운틴 버나즈 독이라고 가정하고, 예측 값이 [ 0.3   0.2   0.5]이라고 해보겠습니다. 

그렇다면, 위에 언급되었던 수식을 통해 이와 같이 정의할 수 있습니다.

 

Cross Entropy Error_버나즈 마운틴 독 = - [0 log(0.3) + 0 log(0.2) + 1 log(0.5)] = 0.30103 


손실함수를 사용하는 이유

딥러닝을 통한 회귀 및 분류의 궁극적인 목표는 "정확도"를 최대한 끌어내는 매개변수 값을 찾는 것 입니다. 그런데 굳이 왜 "정확도"라는 지표를 사용하지 않고, "손실함수"를 사용하게 되는 것일까요? 

 

그 이유는 "정확도"를 지표로 삼게 되면, 매개변수의 미분이 거의 대부분 0이 되기 때문 입니다.  

 

이에 대한 구체적인 예를 들어보도록 하겠습니다. 만약 100장의 훈련 데이터 중 45장을 올바르게 인식하였다고 가정을 해봅시다. 그렇다면, 이에 대한 모델의 정확도는 45%입니다. 만약 "정확도"가 지표였다면 가중치 매개변수의 값을 조정한다고 해도, 정확도는 개선되지 않고 일정하게 유지될 것입니다. 

 

그렇다면, 손실함수를 지표로 사용하게 된다면 어떻게 될까요?  현재의 손실함수의 값이 0.92456.... 같은 수치가 도출되었습니다. 그리고 매개변수의 값을 조정하다면 이에 반응하여 손실함수의 값도 0.93148... 처럼 연속적으로 변화하게 됩니다.

 

정확도는 매개변수의 미소한 변화에는 거의 반응을 보이지 않고, 반응이 있더라도 불연속적으로 변화하게 됩니다. 이는 "계단함수"를 활성화 함수로 사용하지 않는 이유와 비슷합니다. 아래의 사진 참고 부탁드리겠습니다. 

 

 

계단 함수는 대부분의 장소에서 기울기가 0이지만, 시그모이드 함수의 기울기는 0이 아닙니다. 이에 계단함수를 사용하게 되면 손실함수를 지표로 삼는게 아무런 의미가 없어집니다. 매겨변수의 작은 변화가 주는 파장을 계단함수가 말살하여 손실함수의 값에 아무런 변화가 나타나지 않게 되는 것 입니다.