알고리즘은 크게 분류(Classification)과 회기(Regression)으로 나눌 수 있다.
이러한 알고리즘을 사용하여 데이터를 학습하고, 서비스하기 위해서는 임베딩 작업과 손실함수를 선택하는 것이 필수다.
다만 임베딩을 위한 인코딩 방법이나 손실함수의 종류가 다양하기 때문에 Case에 따라 선택방법을 정리해 본다.
"Classification vs Regression"
분류와 회기는 N개의 입력값을 M개로 출력값으로 변환한다는 점에서 유사하다.
하지만, 분류는 출력값(y1, y2 ... ym)을 "0~1" 사이값으로 출력하며, 모든 출력값의 합이 "1"된다.
즉 분류 알고리즘의 출력값은 확률값으로 이해해도 무방하다.
이와는 다르게 회기 알고리즘의 출력값(y1, y2 ... ym)은 범위가 없는 연속된 값으로 출력된다.
만약 누군가의 키를 예측하려 할때 분류와 회기 중 어떤 알고리즘을 사용해야할까?
누군가의 키가 180cm가 넘을지? 넘지않을지? 를 예측하고 싶다면 "분류" 알고리즘을 사용하면 되고,
누군가의 키가 몇 cm인지를 예측하고 싶다면 "회기" 알고리즘을 사용하면 되는 것이다.
어떤 알고리즘을 사용할지 결정했다면 이제 본격적으로 "임베딩"과 "손실함수"를 선택해야 한다.
"분류, Classification을 위한 손실함수"
이진분류(Binary Classification), 다중분류(Multi-Classification)에서는 3가지 손실함수를 사용할 수 있다.
기억해야 할 점은 이진 분류는 "binary_crossentorpy"를 사용하고,
다중 분류는 "sparse_categorical_crossentropy"나 "categorical_crossentropy"를 사용한다는 것이다.
다만 "categorical_crossentropy" 를 손실함수로 사용하기 위해서는 "원 핫 인코딩"이 선행되야한다는 점을 기억하자.
결론적으로는 이진분류=binary_crossentropy, 다중분류=sparse_categorical_crossentropy 사용이 가장 적합해 보인다. (원 핫 인코딩은 자칫 인코딩 후 데이터가 매우 커질 염려가 있으므로)
"회기, Regression을 위한 손실함수"
회기 알고리즘 역시 3가지 손실함수를 사용할 수 있다.
실제값(target)과 예측값(predict)의 차이를 오차(손실)라고 하는데, 3가지 손실함수의 차이는 이 오차값을 어떻게 계산하느냐에 있다.
"MSE는 오차값을 제곱하여 산출하고, RMSE는 오차값을 제곱하고, 루트를 취하여 산출한다. 마지막으로 MAE는 오차값의 절대값을 사용한다" 고 한다.
오차값을 계산하는 방법이 다른 이유는 알고리즘의 잘못된 예측으로 인하여 특정 오차값이 매우 크게 발생할 수 있고, 그로 인해 모델(알고리즘) 학습이 불안정해 질 수 있기 때문이다. 따라서 이런 Outlier(오차값이 매우 커서 신뢰할 수 없는) 때문에 모델 fitting 시 악영향을 발생할 수 있다.
이를 최소화하기 위해 여러가지 계산 방식을 도입한 것으로 보인다.
결론적으로 현실세계에서는 수많은 이상치(Outlier)가 존재할 수 밖에 없기 때문에 회기 알고리즘에서는 "MAE" 손실함수를 사용하는것이 가장 적합해 보인다.
"인코딩과 임베딩(Encoding & Embedding)"
컴퓨터는 현실 세계의 언어나 그림, 소리를 직접 처리할 수 없다. 컴퓨터는 수치 연산을 통해서만 데이터를 처리할 수 있다. 따라서 언어, 그림, 소리와 같은 정보를 컴퓨터가 인식하고 구분할 수 있도록 수치화하는 것을 인코딩(Encoding)이라 한다.
언어(Character)는 ASCII, UTF 등 다양한 방식으로 인코딩할 수 있다. 이러한 인코딩을 통해 각 문자는 수치화되고, 이 수치를 통해 컴퓨터는 특정한 문자들을 구분할 수 있다.
그림(Image) 역시 Base64, JPG, GIF 등으로 다양하게 인코딩할 수 있고, 소리(Audio) 정보는 MP3, WAV 등으로 인코딩된다. 그림이나 소리 역시 이렇게 인코딩을 통해 데이터를 수치화해야만 컴퓨터가 비로소 그림을 Rendering하거나 소리를 Play할 수 있는 것이다.
크게 보면 머신러닝(ML)과 딥러닝(DL)의 궁극적인 목적은 다양한 연산을 통해 데이터 간 유사도를 측정하거나, 새로운 확률을 계산하는 것이라 할 수 있다.
인코딩된 데이터는 기계가 이해할 수는 있지만 연산하기에 적합한 형태는 아니다. 따라서 ML/DL 모델을 통해 확률을 계산하거나 유사도를 측정할 수 있도록 자료 구조를 맞춰야할 필요가 있으며, 연산을 단순화하기 위해 데이터를 함축(압축)할 필요가 있는데 이러한 자료구조를 벡터(Vector), 텐서(Tensor)라 부른다.
이렇게 모델에서 사용할 수 있도록 데이터를 수치화(인코딩)하고 연산 가능한 자료구조로 변경하는 것을 임베딩(Embedding)이라 하며, 인코딩을 거쳐 임베딩된 데이터를 임베딩 벡터라고 부르는 것이다.
모델을 사용하기 위한 임베딩 방법 역시 우리가 사용하는 AI모듈 개발 라이브러리(Tensorflow, Keras, Pytoch 등)에 따라 여러가지 방법이 있다.
인코딩과 임베딩은 그 자체로 광범위한 개념과 이론이 존재한다.
이렇게 글로 정리하는 지금까지도 완벽한 이해가 어려운 것 같다.
다소 잘못 이해한 부분도 있겠지만 내 나름의 이해를 바탕으로 모델을 개발하면서 차차 해소될 것으로 기대한다.
사실... 분류와 회기 알고리즘에서 사용할 손실함수와 그에 필요한 인코딩 방법을 기록하는 것이 목적이었는데,
작성하다보니 여러 개념도 같이 정리가 되는 것 같다.
어쨌든 임베딩 방법에 대한 정리도 필요해 보인다.
[참고] MSE, RMSE, MAE를 계산하는 파이썬 함수
'ML & AI > Algorithm' 카테고리의 다른 글
[알고리즘] ChatGPT - fine tuning #1 (0) | 2023.03.22 |
---|---|
[알고리즘] ChatGPT - API 활용 #1 (0) | 2023.03.22 |
[알고리즘] Merge를 통한 데이터 Filtering & Mapping #3 (0) | 2022.09.30 |
[알고리즘] 알고리즘을 활용한 AI모듈 개발 방법 #2 (0) | 2022.09.23 |