본문 바로가기

DEVELOP_NOTE/ML

이제 Tabular Data는 MLP 대신 FT-Transformer를 써야하는 이유!

Paper :  https://arxiv.org/abs/2106.11959v5

 

최근 vision과 NLP등 ML Task에서는 거의 모든 task에서 Deep learning Architecture가 활용되며

다양한 아이디어의 모델들이 제안되고, 연일 해당 Task의 SOTA를 갱신하고 있다.

DL architecture의 경우, loss를 통한 weight 와 bias의 미분 값을 계산하고 업데이트하는 방식을 자동으로 구현한, AutoGrad를 통해 End-to-End방식의 다양한 구조의 모델을 유연하게 결합하며 다양한 Task에서 좋은 성능을 내고있다.

 

하지만 Tabular Data를 다루는 분야에서는 여전히 딥러닝 보다는 GBDT계열의 모델들이 여전히 강세를 보이는데, 이따금 GBDT계열의 모델보다 좋은 성능을 보이는 딥러닝 모델이 있다 하더라도, 그 차이가 미미하거나, 다양한 Task에서 안정적으로 성능을 보이지 못하는 경우가 많아, 더더욱 GBDT계열의 모델이 많이 쓰이고 있다. (속도도 GBDT가 더 빠르다)

 

 

다만, LightGBM, XGBoost와 같은 GBDT계열 모델들은 미분계산을 통한 가중치 업데이트가

불가하기때문에, End-To-End 방식의 복수 모델들의 결합 방식의 Architecture 구현이 불가능하다.

이로 인해, 텍스트 데이터를 함께 학습하거나, 다른 모듈(모델)과 결합이 필요한 작업에서는

제한적으로 사용하거나, 다른 딥러닝 계열의 모델로 대체를 고려할 수 밖에 없다.

 

나 또한, 현재 회사가 적재한 데이터의 형태가 대부분 Tabular dataset이라, 

이런 부분에 항상 아쉬움을 느끼는데, 다른 모델과의 End-To-End 방식의 결합 학습을 위해

보통 MLP를 많이 사용하지만, 개별 모델의 성능을 봤을때, 대부분 케이스에서

부스팅 계열의 모델보다 속도와 성능 모두 떨어진다.

 

언뜻 생각하기엔 여러층의 layer를 쌓아올린 MLP 구조와 activation function를 사용한 MLP 모델이,

깊은 레이어에 대해 복잡한 가중치 미분 계산을 통한 업데이트 방식이 가능하고, 비선형적 데이터도 학습이 가능한점으로 인해,

성능이 더 좋을것 같다고 생각할수도 있다. 

그럼에도 GBDT계열의 모델에 비해, 기대만큼 성능이 좋지않은 이유는,

 

구조적으로 '특성간의 복잡한 곱셈적 상호작용'을 직접적으로 모델링하는 것이 힘들기 때문이다.

 

무슨말인지... 아래 예시를 살펴보자.


 

다음과 같이 두가지 feature 값 X_1, X_2가 있다고 가정해보자.

만약 이 두 특성이 각각 판매물건개수와 물건단가라면,두 특성의 곱셈을 통해 '총 상품매출액'이라는 정보를 얻을 수 있고, 

이 정보는 모델이 해결하고자하는 목표에 유의미한 정보가 될 수 있다.

X_1  x  X_2 = '총상품매출액'

 

각 특성정보간의 곱셈을 통해서 관계성에 대한 정보를 추가로 학습할 수 있게 되는데,

가장 대표적으로 Transformer의 scaled-dot product attention 계산과정이 이러한 특성간 곱셈적 상호작용(행렬곱)을

학습할 수 있게끔 한다. 

 

반대로, MLP의 각 layer에서 위와 같은 두 특성을 학습할때는 아래 수식과 같은  '가중합' 과정을 통해 학습을 진행하게 된다.

 

y = w_1 * X_1 + w_2 * X_2 + b

위 수식과 같이, w_1과 w_2는 각 특성에 대한 weight이고, b는 bias를 의미할때, 각 입력 특성에 weight를 곱한 값들을

모두 더한 다음, bias를 더해 출력 y를 계산하게 된다.

그리고, 출력된 y는 비선형 activatioin function을 통과하게 된다. 

 

자. 이와 같이, 계산과정에서 보듯, MLP의 layer단에서는 가중합(선형조합)과 비선형 activation function을 적용할 뿐,

곱셈적 상호작용에 대한 연산과정이 없는것을 볼 수 있다.

따라서, MLP architecture에서는 각 feature간의 관계성에 대한 학습이 어려울 수밖에 없는것이다.

 

 

자, MLP의 문제점을 설명하고, 결국, 미분계산이 가능한 딥러닝 모델이 필요한 이유를 정리하다보니,,, 서론이 길어졌다.

이제 위 문제들을 해결할 DL Architecture를 알아보도록 하자.

오늘은 Tabular dataset을 학습할 수 있는 DL Architecture중 Feature Tokenizer개념과 Transformer Architecture를 적용하여

SOTA 수준의 성능을 보이는 'FT-Transformer'에 대해 알아보려한다.

 


 

FT-Transformer란?

FT-Transformer는 'Feature Tokenizer'와 Transformer 두 부분으로 이루어진 아키텍처로,

정형 데이터를 위한 transformer 아키텍처의 간단한 변형 버전이다.

FT-Transformer Architecture

 

위 그림을 보면 input되는 각 특성에 대해서 'Feature Tokenizer'라는 과정을 거친 출력값을

Transformer에 input하여 관계성을 학습하게 된다.

먼저 Feature Tokenizer 개념에 대해 알아보자.


(1) Feature Tokenizer

Feature Tokenizer라는 개념은 수치형(numerical) feature와 범주형(categorical)feature를 다루기 위해

설계된 개념이다. 수치형과 범주형같은 다양한 유형의 데이터를 Transformer에서 효율적으로 학습할 수 있도록

인코딩(임베딩) 하는 역할을 수행한다. 결국 Feature Tokenizer를 통해 각 특성은 각각 고유한 방식으로 '토큰화'되어

Transformer의 입력으로 사용할 수 있는 형태로 변환된다.

Feature Tokenizer

 

위 그림은 Feature Tokenizer 프로세스의 모식도이다.

먼저 왼쪽의 붉은 블럭들은 numerica feature의 value를 의미하고, 초록색 블럭은

categorical feature의 value를 의미한다.

위 Feature Tokenizer의 진행순서대로 따라가보자.


[진행순서]

 

1) Numerical Feature

numerical feature의 경우 일반적으로 먼저, 정규화나 표준화 과정을 거친 후에 들어오게된다.

즉, FT-Transformer에 input되기전에 scailing은 선행되어야한다는 뜻이다.

이렇게 정규화가 완료된 numerical feature value에 '*임베딩 행렬'을 곱해서

해당 numerical feature에 대응되는(임베딩한) 'd차원의' dence vector를 생성하는 과정을 진행하게 된다.

* 여기서 '임베딩 행렬'은 지난번에 포스팅 했던 Weight initialization으로 생성된 기초 매트릭스를 의미한다. 잊지말자!

이 과정이 위 그림에서 붉은색 블럭들의 계산과정에 해당한다.

 

 

2) Categorical Feature

Categorical Feature는 조금 다른 방식으로 임베딩을 진행하게 된다.

먼저, 마찬가지로 Feature Tokenizer에 들어오기 전에 Categorical Feature의 value또한

label encoding또는 onehot-encoding을 먼저 선행해야 한다.

 

그리고 Feature Tokenizer에서 각 범주형 feature의 unique값들에 대해 index를 부여한다.

예를들어, '병명'이라는 범주형 변수에서 unique value는 '당뇨병'과 '심근경색', '고혈압' 이라고 가정하자.

이 당뇨병과 심근경색, 고혈압이라는 Value에 0(당뇨병), 1(심근경색), 2(고혈압)과 같은 index를 부여한다.

그리고 마찬가지로 임베딩 행렬을 통해 범주형 변수를 임베딩하게 되는데, numerical feature와는 조금 방식이 다르다.

 

위에서 각 unique value에 지정했던 index를 '행'으로 간주한다.

그리고, 임베딩 행렬의 index에 해당하는 '행'의 vector가 바로 그 unique value의 '임베딩 벡터'가 된다.

 

예를들어 위 0(당뇨병), 1(심근경색), 2(고혈압)으로 부여된 index에 아래 임베딩 행렬을 적용한다고 한다면,

심근경색(index : 1)의 임베딩 벡터는 행 '1'에 해당하는 [0.4, 0.5, 0.6]이 된다.

이 과정이 바로 위 그림의 초록색 블럭들의 계산과정에 해당한다.

 

 

자, 이제 Transformer에 input하기 위한 Feature Tokenizer 과정이 모두 끝났다.

마지막으로 Feature Tokenizer의 효과에 대해서 간략하게 정리하고 넘어가도록 하자.

<Feature Tokenizer의 효과>
1) Feature Tokenizer를 사용함으로써, 모델은 다양한 유형의 feature를 효율적으로 처리할 수 있다.
2) Transformer가 처리할 수 있는 통합된 input 데이터 형태로 변환할 수 있게 된다. (핵심)
3) 특히, 범주형 데이터의 풍부한 의미적 표현을 학습할 수 있게 된다.

 


(2) Transformer

"FT-Transformer내부의 Transformer는 전통적인 Transformer와는 조금 다르게 구성된다"


-> Position Embedding 이 없다!

일반적인 Transformer 모델에서는 각 token들에 대해 Position Embedding을 적용하여,

입력된 시퀀스의 순서정보를 모델에 투입한다.

하지만, 이미 정형데이터로 구조화된 Tabular데이터에는 입력 특성간의 순서 정보는 사실 별로 중요하지않거나,

고정되어있고, 의미도 가지지 않는 경우가 많다.

따라서 FT-Transformer에는 Position Embedding 과정은 생략된다.


-> Feature-wise Self-Attention을 통해 Feature간의 관계성을 학습한다.

이 부분은, 일반적인 Transformer의 scaled-dot self-attention과 동일하다.

token이 feature의 value로 대체된다는 점만 바뀐다.

 

예를들어, 특성벡터가 ['나이', '성별', 'BMI']이고 각 특성을 스칼라 값으로 표현한다고 가정하자.

[10, 20, 30]으로 표현하자.

 

Feature-wise Attention Score를 계산하기 위해 '나이'가 '성별', 'BMI'에 미치는 영향을 계산하기 위해,

나이와 성별, 나이와 BMI간의 '내적'을 계산한다.

ex)
- 나이 x 성별 = 10 x 20 = 200
- 나이 x BMI = 10 x 30 = 300

이후, Softmax를 적용(계산 생략하고)하면,
'성별'에 대한 attention score는 0.4
'BMI'에 대한 attention score 는 0.6 으로 구하는 가정을 세워볼 수 있다.

 

결국, 일반적인 Self-Attention은 시퀀스내의 위치에 기반한 관계(예:문장 내 단어 순서)를 모델링한다면, 

Feature-wise Self-Attention은 각 feature가 다른 feature에 미치는 영향을 직접 계산함을 통해서,

각 feature간의 상호작용을 학습할 수 있게 되는것이다.

 


 

 

마치며

오늘은 FT-Transformer에 대해 알아보는 시간을 가졌다.

numerical feature와 categorical feature가 혼용되어 있는 Tabular Dataset을 학습할때 매우 유용한 모델이라고 생각되고,

실제로 테스트해본 결과, GBDT계열의 모델모다 거의 대부분의 케이스에서 좀 더 좋은 성능을 보이는것을 확인할 수 있었다.

MLP를 확실히 대체할만한 DL architecture인것 같아, 앞으로 많이 사용하게 될 것 같다.

 

 

Reference

Paper : https://arxiv.org/abs/2106.11959v5

https://velog.io/@kyyle/%EC%BD%94%EB%93%9C-%EA%B5%AC%ED%98%84-FT-Transformer