본문 바로가기
info : 유용한 정보, 체험기

python 머신 러닝, 딥 러닝 인터뷰 질문 단골 loss function, 손실함수

by 퇴근길에 삼남매가 알려드림 2022. 10. 27.

영어로는 loss function, 한국어로는 손실 함수, 목적 함수라고도 불리는 이 함수는 실제 값과 예측 값을 비교할 때 많이 이용되는 개념이다.

머신 러닝과 딥 러닝뿐만 아니라 regression analysis, 회귀 분석에서도 많이 쓰인다.

기본적으로 어떤 데이터를 분석할 때 수학적으로 데이터를 설명할 수 있는 모델을 만들게 된다.

그리고 그 모델을 통해서, 관측하지 않은 데이터 값의 값도 예측하고자 한다.

그렇기 때문에 데이터 분석을 하는 직군이라면 loss function을 거의 필수적으로 쓰게 된다. 

그렇기 때문에  ai 직군 면접을 볼 때 면접관이라면 기본 적으로 묻는 질문이 손실 함수에 대한 개념이다.

본 글에서 면접 질문 리스트 상위권에 있는 질문인 loss function 에 대해서 소개하고 머신 러닝, 딥 러닝에서 어떻게 이용되는 지 알아보도록 해보겠다. 

Loss function, 손실 함수

앞서 말했듯이 데이터가 있으면 우리는 수학적으로 모델링을 한다.

모델링을 한다는 것은 결국 수학적으로 도출해 낸 결과 값 (또는 예측 값)과 실제 관측 값이 가까워야 이 모델이 잘 만들어진 모델이라고 할 수 있다.

현재 데이터에만 맞고 진짜 본질은 놓쳐 버린 overfitting이라는 개념도 있지만, 그건 다음에 validation을 다룰 때 설명하도록 하겠다.

 

어쨌든 모델로 도출 한 값을 예측값 predicted value 와 실제 관측한 observed value의 차이를 비교하는 함수를 모두 통틀어서 손실 함수, loss function, 목적 함수 라고 할 수 있다. 

안 쓰이는 곳 없는 loss function을 잘 이해해야 python으로 머신 러닝과 딥 러닝을 잘 구현할 수 있다.

딥 러닝 옵티 마이저도 결국은 loss function에서 나오는 값을 바탕으로 loss function의 값을 최소화 (강화 학습은 최대화) 하는 과정에 쓰이는 것이다. 

비 전공자도 머신러닝이나 딥 러닝을 이용한다면, 기본적인 개념은 아는 게 많은 도움이 된다. 

 
크게 보면, loss function 의 편미분값 (기울기 값)을 바탕으로 loss 값을 줄이는 방향으로 모델의 가중치와 오류 weights, bias 를 업데이트 한다. 


 

데이터의 종류

손실 함수에 대해서 이야기 한다고 하고, 데이터의 종류라니!

하지만 이 부분은 손실 함수를 이해하는데 반드시 필요한 개념이다.

정확히 말하면 우리가 예측하고자 하는 값이 어떤 종류인가 하는 점이 중요하다. 

우리가 예측하고 싶은 값이 어떤 종류의 값인지에 따라 이용하는 손실 함수 loss function의 종류가 달라지기 때문이다. 

 

일단 두 가지 종류가 있다.

(1) 연속값인가 : continuous

(2) 범주값인가 : discrete number, categorical. 

또한 범주값에서는 선택지의 개수가

(2-1) 두 가지 인가 :binary classification

(2-2) 세 가지 이상인가 :multi-class classification

(조금 더 나아가면 multi-label 이란 개념도 있는데 이건 중복선택 가능한가 이다.

즉, multi-class classification 이 보통, 선택지를 하나만 선택해야 하는 문제라면, multi-label multiclassification은 "해당하는 것을 모두 고르시오" 문제가 된다.

여기서는 선택지를 하나만 고르시오 에 한해서 이야기를 하겠다.)

 

각 데이터 값의 예시들은 다음과 같다.

(1) 연속 값인가 : continuous

 : 주가, 몸무게, binding affinity (결합 친화도, 물론, 실험값이 "범주" 값으로만 알려지면 -FACS처럼, 카테고리 데이터이다), 기온 등등

(2) 범주 값인가 : discrete number, categorical. 

(2-1) 두 가지 인가 :binary classification

: [파란색, 파란색이 아닐 경우] , [과일, 과일이 아닌 경우] , [ 한글, 한글이 아닌 경우] , [통과, 통과가 아닌 경우]..

(2-2) 세 가지 이상인가 :multi-class classification

: [사자, 호랑이, 고양이] , [1월, 2월, 3월, 4월,... 12월], [월, 화, 수, 목, 금, 토, 일], [0,1,2,3,4,5]..

 

단, 어떤 데이터 값이든, python 머신 러닝, 딥 러닝에 넣어질 때에는 숫자로 표현 (numeric representation)이 되어야 한다.

이럴 때 embedding, one-hot encoding의 개념이 이용되는데 이는 또 다음 글에서 다루도록 하자.

 

본 글에서는 categorical classification 즉 범주 값 분류에 자주 이용하는 손실 함수에 대해서 알아보겠다.

continuous problem에서 쓰는 loss function 은 다음 글에 다루도록 하겠다. 


 

 

범주 값 카테고리 데이터 분류 : classification loss function

(2) 범주 값인가 : discrete number, categorical.

(2-1) 두 가지 인가 :binary classification

(2-2) 세 가지 이상인가 :multi-class classification

 

이렇게 나눈 이유는 중 하나는 딥 러닝 라이브러리인 텐서 플로우 (tensor flow)나 pytorch 파이 토치 패키지 등 에서 쓰는 불러오는 코드가 다르고 (BinaryCrossentropy(), CategoricalCrossentropy()... )  더 나아가서, 수학식도 조금씩 다르기 때문이다!

 

하지만 큰 개념만 보면,  classification 문제의 loss function 은 cross entropy을 쓴다.

진짜 값의 확률 분포와 모델로 예측한 확률 분포가 얼마나 가까운지를 확인하는 법이다.

 

조금 더 나아가서, 

 Cross Entropy와 Cross Entropy의 확장판(?)인 Focal Loss 이 두 가지를 언급해보겠다.

 

 

크로스 엔트로피는 불확실성 정도를 측정한다,라고 보통 많이 이야기한다. 즉, 얼마나 확신을 가지고 예측하냐,라고 할 수 있다.

Focal loss는 크로스 엔트로피의 변형식으로, (1-p)^ gamma 부분이 추가되어있다. 이 추가된 부분이 '쉬운 문제'를 맞추는 걸 별로 안 중요하게 여기도록 하는 역할을 한다,라고 한다 (so called Down weighting). 문제를 틀렸을 때, loss 값이 더 커진다. 

 

 

각 데이터 범주마다 같은 양의 데이터가 있는 것은 아니라서 이런 문제를 극복하기 위해 '가중/ weight'을 추가한다. 

이때 이 weight은 1/해당 범주 데이터 비율 이거나, cross-validation으로 배운 값이다.

즉, weighted focal loss, weighted cross entropy (balanced cross- entropy)를 이용하는 것이다.

 

이 외에도 문제에 맞추어서 다양한 loss function을 정의해서 쓴다.

 


 

코드에서 적용

  encoding  tensor flow keras
binary classification  숫가나 one-hot encoding 
([0],[1] or [1,0],[0,1])
tf.keras.losses.BinaryCrossentropy()
multi-class classification 각 범주를 one-hot encoding 
(예시, [1,0,0].[0,1,0],[0,0,1])
tf.keras.losses.CategoricalCrossentropy()
  각 범주를 한가지 숫자로 표현
예시, [1],[2],[3]
tf.keras.losses.SparseCategoricalCrossentropy()
  encoding pytorch
binary classification  0, 1 로 두 범주표현 torch.nn.BCELoss()
multi-class classification n 개의 범주면, 0,1,2,3,..,(n-1) 로 범주 표현 torch.nn.CrossEntropyLoss()

만약, torch.nn.functional 을 이용해서 cross_entropy 를 쓴다면, optimizer 를 이용해 weight update 하는 걸 직접 써줘야함.  

그럼, 위에서 말한 (weighted) focal loss는? 

함수를 써주어서 써야 한다. 

 

 

참고로, loss function 은 최적화와 함께 다닌다. 어떤 최적화 방법이 가능한지는 다음에..

 

 

그냥 끝내긴 아쉬우니.

multi-lable classification에서는 

위의

  • (weighted) Cross-entropy loss
  • (weighted) focal loss 

외에도

  • Hamming loss 
  • Huber loss 
  • Ranking loss
  • SparseMax loss

등을 이용할 수 있다.


 

마무리

일단, 위 글에서 가장 큰 take-home 은

  •  범주로 나누는 데이터에서 크로스 엔트로피를 손실 함수를 쓴다.
  •  가장 기초적인 크로스 엔트로피의 확장판은 (1) 데이터 범주별 비중을 적용하는 것 (weighted) (2) 더 어려운 문제를 잘 풀도록 하는 것 (aka. focal loss)가 있다.
  •  keras와 pytorch에서 대충 저런 형태의 함수를 불러서 쓰면 되는구나  (자세한 건 안 다루었지만), 

일 듯.

수학적으로 정확히 개념을 잡았기보다는, 얼렁뚱땅 설명한 느낌이긴 하다. 

일단 대에충 이런 느낌이구나, 로 알아두고 다음에 진짜 rigorous 하게 설명... 되는 글을 쓰면 좋겠다.

그러려면 공부를 열심히 해야..

 

 

댓글


TOP