[Tabular ML (6)] 새로운 패러다임, TabPFN은 무엇일까?

대현·2026년 8월 12일
post-thumbnail

[Tabular ML (6)] 새로운 패러다임, TabPFN은 무엇일까?

이전 글에서는 LLM을 활용해
Tabular Data를 다루는 방법에 대해 정리했다.

LLM이 가지고 있는 Semantic Knowledge를 활용하거나,
테이블을 Text 형태로 Serialization하여 예측하거나,
Feature Engineering이나 Anomaly Detection에 LLM을 활용하는 방식이었다.

그런데 Tabular Foundation Model을 만드는 방법이
LLM만 있는 것은 아니다.

이번 강의에서는 최근 Tabular ML에서 상당히 주목받고 있는
TabPFN이라는 완전히 다른 방향의 Foundation Model을 다뤘다.

처음 이름을 봤을 때는 그냥

"Transformer를 Tabular Data에 적용한 또 다른 모델인가?"

정도로 생각했다.

그런데 공부해보니 핵심 아이디어가 꽤 신기했다.

일반적인 머신러닝은 새로운 데이터셋이 들어올 때마다
모델을 다시 학습한다.

새로운 Dataset
↓
Train / Validation 분리
↓
모델 학습
↓
Hyperparameter Tuning
↓
Test Prediction

그런데 TabPFN은 조금 다르다.

수많은 가상의 머신러닝 문제를 미리 풀어본다.
↓
새로운 Task를 푸는 방법 자체를 학습한다.
↓
실제 새로운 Dataset이 들어온다.
↓
Training Data를 Context로 입력한다.
↓
별도의 Parameter Update 없이 Prediction

처음 들었을 때는

이게 어떻게 가능하지?

라는 생각이 들었다.

이번 글에서는 이 아이디어가 어디에서 출발했고,
TabPFN v1 → v2 → v3로 어떻게 발전했는지,
그리고 최근에는 어떤 방향으로 확장되고 있는지 정리해보고자 한다.


먼저 Tabular Foundation Model이란?

Foundation Model이라고 하면 보통 GPT 같은 LLM을 먼저 떠올린다.

GPT는 엄청나게 많은 Text를 미리 학습해놓고
새로운 문제가 주어졌을 때 이미 학습한 지식을 활용한다.

Tabular Data에서도 비슷한 질문을 할 수 있다.

여러 Table과 Task에서 사용할 수 있는
범용적인 Tabular Foundation Model을 만들 수 없을까?

문제는 Table마다 생김새가 너무 다르다는 것이다.

금융 데이터
→ 소득, 신용점수, 부채, 연체 여부

의료 데이터
→ 나이, 혈압, BMI, 질병 여부

마케팅 데이터
→ 방문 횟수, 클릭 수, 구매 금액, 전환 여부

Column의 개수도 다르고,
Feature의 의미도 다르고,
Classification일 수도 Regression일 수도 있다.

즉, 자연어처럼 모든 데이터를 동일한 Token Sequence로 표현하기가 쉽지 않다.

그래서 Tabular Foundation Model 연구에서는
크게 두 가지 방향이 등장했다.

1. LLM-based Tabular Foundation Models
2. TabPFN-style Foundation Models

지난 글에서 첫 번째를 다뤘다면
이번 글에서는 두 번째를 살펴본다.


TabPFN에서 PFN이란?

TabPFN을 이해하려면 먼저
PFN(Prior-Fitted Network)을 이해해야 한다.

PFN의 핵심 아이디어는 다음과 같다.

실제 문제를 만나기 전에
다양한 가상의 머신러닝 문제를 엄청나게 만들어서 미리 풀어보자.

조금 더 정확하게 말하면
먼저 데이터가 만들어지는 방식에 대한 Prior를 정의한다.


Prior란?

Prior는 우리말로 하면 사전분포라고 번역한다.

처음 보면 상당히 어렵게 느껴지는데
여기서는 그냥 이렇게 생각해도 된다.

"세상에 존재할 법한 데이터셋은 대충 이런 방식으로 만들어질 것이다."

라는 가정이다.

강의에서는 이를 다음과 같이 표현했다.

p(D)

p(D)는 여러 종류의 데이터 생성 분포에 대한 Prior다.

그리고 여기에서 하나를 Sampling한다.

D ~ p(D)

이렇게 뽑힌 D
하나의 데이터 생성 방식, 즉 하나의 Task라고 생각할 수 있다.

예를 들어 어떤 D는 다음과 같은 문제를 만들 수 있다.

공부 시간
출석률
과제 점수
↓
합격 여부

또 다른 D

소득
부채
신용점수
↓
대출 승인

과 같은 관계를 만들 수도 있다.

핵심은 특정 Dataset 하나를 미리 외우는 것이 아니라
다양한 데이터 생성 규칙을 Sampling하면서 수많은 Task를 만든다는 것이다.


Task를 엄청나게 만들어보자

일반적인 머신러닝은 다음과 같다.

Dataset A
↓
Model A 학습

새로운 Dataset이 생기면 다시 학습한다.

Dataset B
↓
Model B 학습

PFN은 조금 다르다.

Prior p(D)
↓
D1 Sampling → Task 1
D2 Sampling → Task 2
D3 Sampling → Task 3
...
↓
수많은 Synthetic Task

그리고 각 Task에서는 다시

Training Dataset

Test Sample

을 만든다.

예를 들어 하나의 Task에서는

(x1, y1)
(x2, y2)
(x3, y3)

x_test → ?

라는 문제가 만들어질 수 있다.

PFN은 이런 문제를 정말 많이 풀어본다.

쉽게 비유하면 코딩테스트와 비슷하다.

한 문제의 정답을 외우는 것이 아니라

그래프 문제
DP 문제
그리디 문제
정렬 문제

를 수없이 풀면서

"처음 보는 문제를 어떻게 풀어야 하는가?"

를 학습하는 것이다.


PFN은 무엇을 학습하는가?

일반적인 머신러닝 모델은
하나의 Dataset에서 Feature와 Label의 관계를 학습한다.

예를 들어 XGBoost라면

D_train
↓
XGBoost 학습
↓
학습된 Model
↓
x_test
↓
y_test

이다.

PFN은 조금 다르다.

PFN이 받는 입력은 다음과 같다.

(x1, y1)
(x2, y2)
(x3, y3)
...
(xn, yn)

그리고

x_test

즉,

Training Dataset 자체가 모델의 입력으로 들어간다.

그리고 모델은 최종적으로

y_test

를 예측한다.

강의에서는 이를 다음처럼 표현한다.

qθ( · | x_test, D_train )

쉽게 풀어쓰면

"여기 Training Example들이 있고 새로운 Test Sample 하나가 있는데,
앞의 Example들을 참고해서 Test Label을 맞혀봐."

라는 것이다.

이 구조는 어디서 많이 본 것 같다.


이거 In-Context Learning 아닌가?

맞다.

나도 이 부분을 들으면서
LLM의 Few-shot Prompting이 바로 떠올랐다.

예를 들어 LLM에게 다음 예시를 준다고 해보자.

2 + 3 = 5
4 + 7 = 11
10 + 2 = 12

20 + 3 = ?

LLM은 앞의 예시를 Context로 사용해
마지막 문제의 답을 추론한다.

PFN도 상당히 비슷하다.

Training Sample 1
Training Sample 2
Training Sample 3
...
↓
Context

새로운 Test Sample
↓
Prediction

즉,

PFN에서는 Training Dataset 자체가 Few-shot Example의 역할을 한다.

그래서 PFN의 구조는
In-Context Learning(ICL)과 상당히 닮아 있다.


그래서 Transformer를 사용한다

그렇다면 Training Sample들 사이의 관계와
Test Sample과 Training Sample 사이의 관계를
어떻게 계산할까?

여기에서 Transformer가 등장한다.

Transformer의 Attention은
여러 입력 사이의 관계를 계산하는 데 강하다.

예를 들어 다음 Training Data가 있다고 해보자.

Sample 1 → Class A
Sample 2 → Class A
Sample 3 → Class B

Test Sample → ?

Test Sample은 Attention을 통해
Training Sample들의 정보를 참고할 수 있다.

물론 이것을 단순히

"가장 비슷한 Sample을 찾는다"

정도로만 이해하면 조금 부족하다.

핵심은 Transformer가 Training Dataset 전체의 패턴을 보면서

이 Task에서 Feature와 Label이 어떤 방식으로 연결되는지

를 Context 안에서 추론한다는 것이다.


Prior Fitting과 Inference

강의 자료에서 이 부분이 PFN을 이해하는 핵심이라고 느꼈다.

PFN은 크게 두 단계로 나뉜다.

1. Prior Fitting
2. Inference

1. Prior Fitting

Prior Fitting은 한 번 Offline에서 수행하는 학습 과정이다.

Prior에서 Synthetic Dataset 생성
↓
D1, D2, D3, ... Dn
↓
수많은 Task 학습
↓
PFN Parameter θ 학습

즉, PFN은 새로운 Dataset마다 처음부터 다시 학습하는 것이 아니라
먼저 수많은 Synthetic Task를 이용해

"Training Data를 보고 새로운 Test Sample을 예측하는 방법"

자체를 미리 학습한다.


2. Inference

이제 실제 Dataset이 들어온다.

예를 들어 처음 보는 고객 이탈 데이터라고 해보자.

Training Dataset

고객 A → 이탈
고객 B → 유지
고객 C → 유지

Test Sample

고객 D → ?

PFN은 다음 정보 전체를 입력으로 받는다.

고객 A + Label
고객 B + Label
고객 C + Label
고객 D

그리고 한 번의 Forward Pass를 통해

고객 D → 이탈 확률

을 계산한다.

여기서 정말 중요한 점이 있다.

Gradient Descent X
Fine-tuning X
Parameter Update X

즉, 새로운 Dataset이 들어왔다고 해서
PFN의 Parameter를 다시 학습하지 않는다.

강의 자료의 그림을 보면
왼쪽은 Synthetic Dataset들을 생성해서 한 번 학습하는 Prior Fitting,
오른쪽은 실제 Dataset과 Test Sample을 넣어 한 번의 Forward Pass로 예측하는 Inference로 나뉘어 있다.

여기에 강의자료 4페이지의 Prior Fitting / Inference 그림을 넣으면 이해하기 좋을 것 같다.


그런데 왜 모델을 다시 학습하지 않아도 될까?

처음에는 이 부분이 가장 이해가 안 됐다.

일반적인 머신러닝에서는 새로운 Dataset이 들어오면

model.fit(X_train, y_train)

을 해야 한다.

그런데 PFN은 왜 이 과정이 필요하지 않을까?

핵심은 다음과 같다.

PFN에게 새로운 Dataset의 Training Data는
Parameter를 업데이트하기 위한 데이터가 아니라
Prediction을 위한 Context다.

일반적인 모델은

Training Data
↓
Parameter에 Dataset의 규칙을 저장
↓
학습이 끝나면 Training Data 없이 Prediction

한다.

반면 PFN은

미리 학습된 Parameter
+
현재 Dataset의 Training Data
+
Test Sample
↓
Prediction

을 수행한다.

즉 Dataset의 정보를 Parameter 안에 새로 저장하는 것이 아니라
Inference 시점에 Training Data를 직접 입력으로 넣어 참고한다.

PFN은 Prior Fitting 과정에서 이미

Training Data가 이렇게 주어졌을 때
↓
어떤 규칙을 읽어야 하는지
↓
Test Label을 어떻게 예측해야 하는지

를 수많은 Task를 통해 반복적으로 학습해두었다.

그래서 실제 Dataset에서는
Parameter Update 없이도 새로운 Task에 적응할 수 있다.

이 부분이 PFN을 이해하는 가장 중요한 포인트라고 생각한다.


TabPFN v1

이 PFN 아이디어를
Tabular Data에 적용한 것이 TabPFN이다.

TabPFN v1은 ICLR 2023에 발표되었다.

초기 논문의 제목부터 상당히 직관적이다.

TabPFN:
A Transformer That Solves Small Tabular
Classification Problems in a Second

즉 초기 TabPFN은
작은 Tabular Classification 문제를 빠르게 해결하는 것에 초점을 맞췄다.


하나의 Row를 하나의 Token으로

TabPFN v1의 핵심 아이디어는 단순하다.

하나의 Row를 하나의 Token으로 만들자.

예를 들어 다음 Table이 있다고 해보자.

AgeIncomeDebtTarget
2530005000
42700020001
31500010000

각 Row 전체를 하나의 Token처럼 취급한다.

Row 1 → Token 1
Row 2 → Token 2
Row 3 → Token 3

Training Sample은 Feature x와 Label y를 모두 알고 있다.

그래서 다음처럼 표현한다.

MLP_x(x) + MLP_y(y)

반면 Test Sample은 Label을 모른다.

MLP_x(x_test) + MLP_y([MASK])

처럼 Label 위치를 Mask 처리한다.

또한 Dataset마다 Column 수가 다른 문제는
Zero Padding으로 맞춘다.


TabPFN v1의 Attention은 어떻게 동작할까?

강의 자료의 그림에서 Training Row와 Test Row가 함께 Transformer에 들어간다.

Training Row들은 Training Row끼리 정보를 주고받을 수 있고,
Test Row는 Training Row를 참고해 Prediction을 만든다.

개념적으로는 다음과 같이 이해하면 된다.

Training ↔ Training

Test → Training

Training → Test X

Test → Test X

왜 Test Token끼리는 서로 참고하지 않도록 할까?

각 Test Sample은 기본적으로

D_train + x_test

만 주어진 하나의 독립적인 Query라고 생각해야 하기 때문이다.

Test Sample끼리 정보를 공유하게 만들면
다른 Test Sample의 존재 여부에 따라 Prediction이 달라질 수 있다.

그래서 각 Test Sample은
현재 Training Dataset을 Context로 사용해 독립적으로 예측한다.


최종 예측은 어떻게 할까?

Transformer를 통과하고 나면
각 Test Token에는 마지막 Hidden State가 만들어진다.

Test Token
↓
Transformer
↓
Final Hidden State

그리고 이 값을 MLP Classifier에 넣는다.

Final Hidden State
↓
MLP Classifier
↓
Class Prediction

즉 v1의 전체 흐름은 다음과 같다.

Training Rows + Labels
+
Test Row
↓
Row Token 생성
↓
Transformer
↓
Training Dataset을 Context로 활용
↓
Test Token Hidden State
↓
MLP Classifier
↓
Prediction

그런데 Synthetic Dataset은 어떻게 만들까?

여기까지 이해하고 나니
가장 중요한 의문이 생겼다.

수많은 Synthetic Task를 만든다고 했는데
그 데이터는 도대체 어떻게 만드는 걸까?

TabPFN v1에서는 대표적으로 두 가지 Prior를 사용한다.

1. SCM
2. BNN

SCM

SCM은 Structural Causal Model이다.

쉽게 생각하면

변수들이 서로 어떤 구조적인 관계를 가지도록
가상의 Graph를 만든 뒤 데이터를 생성하는 방식

이라고 보면 된다.

예를 들어 다음과 같은 관계를 생각해보자.

나이
 ↓
소득
 ↓
대출 승인

부채 ─────→ 대출 승인

TabPFN에서는 Random Graph를 생성하고
그 Graph에서 일부 Node를 관측 Feature로,
특정 Node를 Target으로 선택한다.

Random Graph 생성
↓
Feature Node 선택
↓
Target Node 선택
↓
Graph를 따라 값 생성
↓
Synthetic Dataset 완성

네 필기에서 적었던

"사이클이 없는 그래프를 만든다"

라는 이해는 방향은 맞다.

SCM은 보통 인과관계를 표현하기 위해
DAG(Directed Acyclic Graph) 형태를 사용할 수 있다.

중요한 것은 단순히 랜덤 숫자를 만드는 것이 아니라
Feature 사이에 구조적인 Dependency를 넣어준다는 것이다.


BNN

두 번째는 BNN(Bayesian Neural Network) Prior다.

처음 들었을 때는

"랜덤하게 Input을 넣는다는 말인가?"

싶었는데 핵심은 조금 다르다.

먼저 Neural Network 자체를 하나 Sampling한다.

Random Neural Network

그리고 Input x를 넣는다.

x
↓
Sampling된 Neural Network
↓
y

즉, 이 Neural Network 하나가
하나의 데이터 생성 함수가 된다.

다른 Network를 Sampling하면
완전히 다른 관계를 가진 Task가 만들어진다.

BNN 1 → Task 1
BNN 2 → Task 2
BNN 3 → Task 3

초기 TabPFN v1은 Classification을 목표로 했기 때문에
Continuous Target은 Class Label로 변환해 사용한다.

SCM과 BNN의 목적은 결국 동일하다.

현실에 존재할 법한 다양한 Feature-Target 관계를 가진
Synthetic Task를 최대한 많이 만들어내는 것

이다.


그런데 가상의 문제만 학습해서 실제 문제도 풀 수 있을까?

여기까지 이해하고 나니 또 의문이 생겼다.

TabPFN은 실제 Dataset 하나하나를 학습한 것이 아니라
SCM과 BNN으로 만든 Synthetic Task를 엄청나게 학습했다.

그렇다면

"가짜로 만든 문제만 풀어봤는데
실제 금융, 의료, 마케팅 데이터도 잘 풀 수 있을까?"

라는 질문이 자연스럽게 생긴다.

강의에서는 TabPFN이 실제 Dataset에서도 동작할 수 있는 이유를
크게 세 가지로 설명했다.


1. Synthetic Prior가 충분히 다양하다

첫 번째는 Prior의 다양성이다.

SCM과 BNN을 이용하면

Feature 관계가 다른 Dataset
선형적인 관계
비선형적인 관계
Feature 간 Dependency가 존재하는 Dataset
다양한 Target 결정 규칙

등 상당히 다양한 Task를 만들 수 있다.

실제 세상의 모든 Dataset을
완벽하게 복제할 필요는 없다.

대신 충분히 다양한 Task를 만들어두면

실제 Dataset
≈
Pretraining에서 경험했던 Task 중 어떤 형태와 비슷함

이 될 가능성이 높아진다.

코딩테스트로 비유하면
실제 시험 문제를 미리 정확하게 알고 있을 필요는 없다.

DFS, BFS, DP, Greedy 같은 다양한 유형을 충분히 풀어봤다면
처음 보는 문제도 기존 문제와의 구조적 유사성을 바탕으로 접근할 수 있다.


2. Transformer가 그 규칙을 학습한다

Synthetic Task를 많이 만들어도
모델이 그 관계를 제대로 학습하지 못하면 의미가 없다.

강의에서는 Transformer가
주어진 Prior에 대한 Bayesian Posterior를 학습할 수 있을 만큼
충분히 유연한 Function Approximator라고 설명한다.

처음 보면 상당히 어려운 말이다.

지금 단계에서는 조금 단순하게

수많은 Synthetic Task를 경험
↓
Training Data가 이런 모습일 때
어떤 Label이 나올 가능성이 높은지 학습
↓
새로운 Dataset에서도
Training Data를 보고 적절한 규칙을 추론

정도로 이해했다.

즉,

Prior
→ 어떤 문제들을 경험할지 결정

Transformer
→ 그 문제들에서 어떻게 답을 추론할지 학습

한다고 볼 수 있다.


3. 실제 새로운 Dataset의 Training Data도 직접 본다

그리고 가장 직관적인 이유가 이것이다.

TabPFN은 Pretraining에서 배운 지식만으로
아무 정보 없이 답을 찍는 모델이 아니다.

실제 새로운 Dataset이 들어오면

현재 Dataset의 Training Data
+
Test Sample

을 함께 본다.

Pretraining
→ 다양한 Tabular Task를 푸는 방법 학습

+

Inference
→ 지금 풀고 있는 Dataset의 Training Data 확인

이 합쳐지는 것이다.

이렇게 생각하면

왜 별도의 Parameter Update 없이도
새로운 Dataset에 적응할 수 있는지

조금 더 이해가 된다.


그래서 TabPFN v1의 성능은 어땠을까?

강의 자료에서는 TabPFN v1이
작은 Dataset에서 MLP와 GBDT 계열 Baseline보다 좋은 성능을 보였고, Runtime도 매우 빨랐다고 설명한다.

여기에서 특히 중요한 조건은

Small Dataset

이다.

TabPFN은 이미 Prior Fitting을 끝낸 모델이기 때문에
새 Dataset이 들어와도

Model Training
Hyperparameter Search
Cross Validation

을 매번 처음부터 다시 할 필요가 없다.

Inference에서는

Training Data + Test Sample
↓
Forward Pass
↓
Prediction

으로 끝난다.

그래서 작은 Dataset에서는
성능뿐 아니라 속도 측면에서도 강점이 있었다.


TabPFN v1의 한계

당연히 좋은 점만 있는 것은 아니었다.

강의 자료에서 정리한 v1의 제약은 다음과 같다.

Training Sample
→ 1,000개 미만

Column
→ 100개 미만

Multiclass Classification
→ 10개 Class 미만

Missing Value
→ 별도 Preprocessing 필요

Categorical Value
→ 별도 Preprocessing 필요

그리고 Architecture 측면에서도
더 근본적인 문제가 하나 있었다.

바로

Tabular Data의 2차원 구조를 제대로 활용하지 못한다는 것

이다.

v1에서는 Row 전체를 하나의 Token으로 만든다.

Age | Income | Debt | Job
          ↓
      Row Token 하나

하지만 Table은 원래

Row × Column

이라는 2차원 구조다.

예를 들어 하나의 Row 안에서는

Income ↔ Debt
Age ↔ Income

같은 Feature 간 관계가 존재할 수 있다.

그리고 하나의 Column을 기준으로 보면

고객 A의 Income
고객 B의 Income
고객 C의 Income

처럼 Sample 간 관계도 생각할 수 있다.

v1은 Row 전체를 하나의 Token으로 압축했기 때문에
이런 2차원 구조를 직접 모델링하기 어렵다.

그래서 다음 버전에서는 아주 자연스러운 질문이 생긴다.

"Table이 2차원이라면
그 2차원 구조 자체를 모델이 보게 만들면 되지 않을까?"

여기서 TabPFN v2가 등장한다.


TabPFN v2: Row 하나가 아니라 Table의 2차원 구조를 보자

v2의 첫 번째 큰 변화는
Row Token 중심에서 2D Table Modeling으로 넘어간 것이다.

강의 자료에서는

Represent each cell as one token

이라고 설명한다.

즉 v1에서는

한 Row 전체
↓
Token 하나

였다면

v2에서는 각 Cell의 Feature-level 정보를 더 직접적으로 표현한다.

그리고 두 가지 Attention을 번갈아 사용한다.

Feature-wise Attention

Sample-wise Attention

Feature-wise Attention

Feature-wise Attention은
같은 Row 안의 Feature들이 서로 어떤 관계가 있는지 본다.

예를 들어

Age
Income
Debt

가 있다면

Income이 높은데 Debt도 높은가?

Age와 Income은 어떤 관계가 있는가?

같은 Feature 사이의 관계를 모델링할 수 있다.


Sample-wise Attention

Sample-wise Attention은
여러 Row 사이의 관계를 본다.

예를 들어

고객 A
고객 B
고객 C

가 있을 때

비슷한 Feature 패턴을 가진 고객들은
어떤 Target을 가지는가?

를 참고할 수 있다.

즉 v2는

Column 방향
+
Row 방향

을 모두 본다.

이게 v1과 가장 큰 차이다.

여기에 강의자료 11페이지의 2D Attention 그림을 넣으면 좋을 것 같다.


v2에서는 Synthetic Prior도 더 현실적으로 바뀌었다

v2의 변화는 Architecture만이 아니다.

Pretraining에 사용하는 Synthetic Task도
현실 Table에 더 가까워졌다.

강의 자료에서는 다음 요소들을 추가했다고 설명한다.

Categorical Features
Missing Values
Quantization
...

또 Synthetic Task 자체도 더 큰 규모로 확장됐다.

최대 약 10,000 Samples
최대 약 500 Features

그리고 Synthetic Data를 생성할 때도
단순한 Neural Network뿐만 아니라

Neural Network
Tree
Discretization

등 여러 형태의 구조를 활용해
더 다양한 Task를 만든다.

즉 v2는 두 가지 방향으로 발전했다고 볼 수 있다.

1. Table Architecture를 더 잘 본다.
2. Pretraining Task도 실제 Table에 더 가깝게 만든다.

v2의 성능

강의 자료에서는 TabPFN v2 역시
작은 Dataset에서 MLP와 GBDT Baseline보다 좋은 성능을 보였다고 설명한다.

특히 v2부터는 Classification뿐 아니라
Regression 결과도 함께 제시된다.

그래서

"TabPFN은 원래 Classification만 가능한 모델이다"

라고 일반화하면 정확하지 않다.

그 설명은 v1의 초기 제약에 더 가깝다.

v2는 Regression까지 범위를 넓혔다.


하지만 v2도 문제가 있다

Cell-level Representation과 2D Attention을 사용하면
당연히 계산량이 늘어난다.

예를 들어

10,000 Rows
×
500 Columns

의 Table이라면
굉장히 많은 Cell 정보를 처리해야 한다.

그리고

Feature-wise Attention
+
Sample-wise Attention

을 반복한다.

따라서 v2의 주요 한계는 다음과 같다.

Computational Cost 증가

Memory 사용량 증가

큰 Context Table 처리 어려움

Classification Evaluation은
최대 10개 Class 수준으로 제한

즉,

Table을 더 잘 이해하게 되었지만
그만큼 계산 비용이 비싸졌다.

그래서 다음 질문이 생긴다.

"Cell 수준의 정보를 활용하되
모든 정보를 끝까지 들고 다니지 않으면 안 될까?"

이 질문에서 v3가 등장한다.


TabPFN v3: 다시 Row로 압축하자

v3의 핵심 변화는 두 가지다.

1. Row Compression
2. Retrieval-based Prediction

Row Compression

v2에서는 Feature-level 정보를 상당히 오래 유지했다.

v3에서는 먼저 Feature-level 정보를 처리한 뒤
이를 Compact Row Embedding으로 압축한다.

강의 그림에는

4 CLS per row

라고 표시되어 있다.

즉 한 Row의 많은 Feature 정보를
몇 개의 CLS Token에 압축하는 형태다.

하지만 여기에서 중요한 것은
"정확히 4개를 사용한다"는 사실을 외우는 것이 아니다.

핵심은

Feature-level 정보를 ICL 전에 작은 Row Representation으로 압축한다.

는 것이다.

많은 Feature 정보
↓
Feature Aggregation
↓
Compact Row Embedding
↓
Row-level ICL

v2가

Cell 정보를 많이 유지해서 비싸다

라는 문제가 있었다면,

v3는

Feature 정보를 먼저 압축해서
Row 수준에서 효율적으로 ICL하자

라는 방향으로 바뀐 것이다.


Retrieval-based Prediction

v3의 두 번째 변화는
최종 Prediction 방식이다.

기존에는 Fixed Classification Head를 사용하는 방식이었다면
v3에서는

Attention-based Soft Nearest-Neighbor Decoder

를 사용한다.

이름만 보면 어렵지만
아이디어는 꽤 직관적이다.

Test Row가 들어오면

어떤 Training Row들이
이 Test Row와 관련이 있는가?

를 Attention Weight로 계산한다.

그리고 그 Training Row들의 Label 정보를 이용해
최종 Prediction을 만든다.

쉽게 비유하면 kNN과 조금 닮았다.

하지만

가장 가까운 K개를 딱 잘라서 동일하게 보는 것

이 아니라

Training Row마다 얼마나 참고할지를
Attention Weight로 부드럽게 결정

한다고 이해하면 된다.


v3의 성능과 확장성

강의 자료에서는 v3가
빠른 Inference Speed와 SOTA 성능을 보여준다고 설명한다.

특히 더 중요한 것은 Scalability다.

v3의 Benchmark에는

100K ~ 1M Training Samples

규모의 Classification과 Regression Task가 등장한다.

즉 초기 v1의

1,000 Samples 미만

수준에서 시작했던 모델이
v3에서는 훨씬 큰 Dataset까지 확장되고 있는 것이다.


Relational Table까지 확장: TabPFN-REL

v3에서는 단순한 Flat Table뿐 아니라
Relational Data에도 적용하려는 시도가 등장한다.

예를 들어 데이터베이스에는

User Table
Order Table
Product Table

처럼 여러 Table이 관계를 맺는 경우가 많다.

TabPFN-REL은 이러한 Relational Table을
자동으로 Flatten한 뒤 TabPFN-3를 적용한다.

강의 자료에서는

Relational Foundation Model 중에서는 SOTA

라고 설명하지만,

전체적으로는 Supervised RelGNN이 여전히 더 좋은 성능을 보인다는 한계도 함께 언급한다.

즉 Foundation Model 방식이 Relational Data까지 확장되고 있지만
아직 모든 상황에서 기존 Supervised Model을 압도하는 것은 아니다.


v1, v2, v3를 한 번에 정리하면

여기까지 내용을 가장 단순하게 정리하면 다음과 같다.

버전핵심 변화의미
v1Row Token + Synthetic Pretraining작은 Tabular Task에서 빠른 In-Context Prediction
v22D Table Modeling + Richer Synthetic PriorTable 구조를 더 잘 이해
v3Row Compression + Retrieval Decoder더 큰 Dataset으로 확장

조금 더 직관적으로 보면

v1
"Row 하나를 Token으로 만들자"
↓
문제:
Table의 2차원 구조를 잘 못 본다.

v2
"그러면 Cell과 Row/Column 관계를 모두 보자"
↓
문제:
좋은데 너무 비싸다.

v3
"Feature 정보를 먼저 압축하고
Row 수준에서 효율적으로 ICL하자"

이라고 이해할 수 있다.


여기서 끝이 아니다: 최근 TabPFN 스타일 연구

강의 후반부에서는
TabPFN v1, v2, v3뿐 아니라 최근 변형 모델들을 꽤 많이 소개한다.

모델 이름은 많지만
하나씩 외우기보다는

"기존 TabPFN의 어떤 문제를 해결하려고 하는가?"

라는 관점으로 보면 이해하기 쉽다.


TabDPT: 전체 Dataset을 다 볼 필요가 있을까?

TabDPT의 핵심 아이디어는 매우 직관적이다.

Test Sample을 예측할 때
전체 Training Dataset을 모두 볼 필요가 있을까?

오히려 Test Sample과 관련 있는 Row만 보는 것이
더 좋을 수도 있다.

그래서 TabDPT는

Test Sample
↓
Training Data에서 비슷한 Row 검색
↓
Top-K Row 선택
↓
그 Row들만 Context로 사용
↓
ICL Prediction

을 수행한다.

즉 네 필기에서 적었던

"K개만 뽑아서 한다"

가 맞다.

정확히는 K개의 가장 비슷한 Row를 Retrieval해서 Context로 사용한다.

TabDPT는 Row를 하나의 Token으로 본다는 점에서는
TabPFN v1과 비슷하다.


TabDPT의 또 다른 차이: 실제 Table로 Pretraining

기존 TabPFN은 Synthetic Prior가 굉장히 중요했다.

TabDPT는 조금 다른 방향도 시도한다.

실제 Real-world Tabular Data를 이용해 Pretraining하자.

그리고 Masked Column Self-Supervised Learning을 사용한다.

쉽게 말하면

Table의 일부 Column 값을 가린다.
↓
나머지 정보를 보고
가려진 값을 맞혀본다.

와 비슷하다.

강의 자료에서는

Real-world Pretraining
+
ICL Retrieval
+
SSL

의 조합이 Robust한 Downstream Generalization을 만든다고 설명한다.

또 실제 데이터로 Pretraining했을 때
순수 Synthetic Data Generator만 사용한 것보다
더 빠른 Convergence와 좋은 Downstream Accuracy를 보였다고 소개한다.


Semi-supervised 상황에서도 활용할 수 있다

TabDPT에서는 Semi-supervised Setting도 다룬다.

즉 Training Data 중 일부에만 Label이 있는 상황이다.

Label 있음
Label 있음
Label 없음
Label 없음
...

이때 모델이 Unlabeled Data에 대해
자신의 Prediction을 만들어

Pseudo-label

로 사용한다.

그리고 그 데이터를 다시 Context에 추가한다.

즉,

Label이 적다
↓
모델이 Unlabeled Data를 예측
↓
Pseudo-label 생성
↓
Context 확장
↓
더 나은 ICL

이라는 구조다.


TabICL: v2의 2D Attention이 너무 비싸다면?

TabPFN v2의 문제는
Row/Column Attention을 반복하면서 비용이 커진다는 것이다.

TabICL은 이를 두 단계로 나눈다.

Stage 1
Feature 정보를 처리
↓
Fixed-dimensional Row Embedding 생성

Stage 2
Row Embedding들 사이에서 ICL

Feature 관계를 먼저 Row 하나에 압축하고
그다음 Row끼리 In-Context Learning을 한다.

는 것이다.

이렇게 하면 큰 Dataset에서 계산량을 줄일 수 있다.

강의 자료의 Complexity를 보면

TabICL
O(m²n + n²)

TabPFN v2
O(m²n + mn²)

로 정리된다.

여기서

n = Row 수
m = Column 수

다.

특히 Row 수가 커질수록
mn²에서 로 줄어드는 차이가 커진다.

강의에서는 TabICL이 TabPFN v2와 경쟁력 있는 성능을 유지하면서
더 큰 Dataset에 잘 Scaling된다고 설명한다.


TabICLv2

TabICLv2는 TabICL을 더 발전시킨 모델이다.

강의에서는 다음 변화들을 소개한다.

Richer Synthetic Data Generation Engine

Circular-shift Feature Grouping

Target-aware Embedding

QASSMax

Optimized Pretraining Protocol

Muon Optimizer

각각을 깊게 들어가면 꽤 복잡하지만
큰 방향은 명확하다.

더 다양한 Task를 만들고,
Feature Representation이 무너지는 것을 줄이고,
Label 정보를 더 일찍 활용하고,
긴 Context에서도 Attention을 효율적으로 처리하자.

강의 자료에서는 TabICLv2가
최근 Baseline보다 Overall Performance가 좋고,
큰 Dataset에서도 좋은 Scalability를 보이며,
여러 Hardware에서 TabPFN-2.5보다 빠른 Inference를 보였다고 소개한다.


TACO: Context 자체를 압축하면?

TACO의 아이디어는 더 단순하다.

Tabular ICL에서 가장 비싼 것 중 하나가
긴 Context 전체에 Attention을 수행하는 것이다.

그렇다면

Context 자체를 미리 압축하면 안 될까?

라는 생각이다.

Large Training Context
↓
Compressor
↓
Compact Latent Representation
↓
Predictor

Training Sample 전체를 그대로 들고 다니는 대신
중요한 정보를 작은 Latent Representation에 압축한다.

강의 자료에서는 Predictor-only Transformer와 비교해

53× Speedup

94% Memory Reduction

을 달성하면서도 큰 성능 저하는 없었다고 소개한다.

이 수치만 봐도
최근 Tabular Foundation Model 연구에서
Compression과 Scalability가 얼마나 중요한지 알 수 있다.


MITRA: 좋은 Architecture만큼 Prior도 중요하다

PFN을 공부하면서 계속 등장하는 것이 있다.

바로 Prior다.

MITRA는 이 부분을 직접 다룬다.

기존처럼 하나의 Synthetic Prior에만 의존하지 않고

Prior A
Prior B
Prior C
...

처럼 여러 Synthetic Task Generator를 섞는다.

핵심 아이디어는 다음과 같다.

Prior Design은 Model Architecture만큼 중요하다.

강의 결과에서도 SCM Prior 자체가 강력한 Standalone Prior였고,
여러 Prior를 혼합했을 때 Robustness가 향상되는 모습을 보였다.

즉 아무리 좋은 Transformer를 만들어도
Pretraining에서 경험하는 Task가 너무 단순하거나 편향되어 있다면
좋은 Generalization을 기대하기 어렵다는 것이다.


ConTextTab: Column 이름의 의미도 활용하자

기존 TabPFN 계열은
주로 Table의 값과 구조에 집중한다.

하지만 실제 Table에서는 Column 이름 자체에도
굉장히 중요한 정보가 들어 있다.

예를 들어

25

라는 값만 보면 아무 의미가 없다.

하지만

Age = 25

라고 하면 의미가 생긴다.

Price = 25

라면 완전히 다른 뜻이다.

ConTextTab은 이런 Semantic Information
In-Context Learning에 넣는다.

강의에서는

Column Name

Text / Categorical Value

에 Pretrained Text Embedding을 사용한다고 설명한다.

Text/Categorical Feature에는

all-MiniLM-L6-v2

를 사용하고,

날짜는

Day
Month
Year

를 각각 Embedding한 뒤 합친다.

강의 자료에서는 ConTextTab이
Semantic Information이 풍부한 CARTE Benchmark에서 SOTA 결과를 보였다고 소개한다.


MultiModalPFN: Table에 이미지와 텍스트까지 있다면?

현실의 데이터가 항상 순수한 Table만으로 구성되는 것은 아니다.

예를 들어 쇼핑 데이터라면

상품 가격
상품 카테고리
상품 판매량
+
상품 이미지
+
상품 설명 Text

가 함께 존재할 수 있다.

MultiModalPFN은 TabPFN을
이런 Multimodal Setting으로 확장한다.

Tabular Feature
Image
Text
↓
각 Modality Encoder
↓
TabPFN이 사용할 수 있는 Representation으로 변환
↓
함께 Prediction

Table + Image + Text

를 동시에 사용하도록
TabPFN의 범위를 확장하는 것이다.


nanoTabPFN

nanoTabPFN은
완전히 새로운 모델이라기보다

TabPFN v2를 쉽게 공부하고 실험할 수 있도록 만든 Lightweight Reimplementation

에 가깝다.

강의에서는

500줄 이하의 코드

로 TabPFN v2의 핵심 Architecture와 Training Loop를 구현했다고 소개한다.

그리고 Single GPU에서도
몇 분 안에 Pretraining을 실험할 수 있도록 했다.

개인적으로는 TabPFN 내부 동작을 직접 공부하고 싶다면
이런 프로젝트가 오히려 가장 도움이 될 것 같았다.


결국 최근 연구는 어디로 가고 있을까?

강의 마지막에서는 Tabular Foundation Model의 Open Direction을
크게 네 가지로 정리한다.


1. Scalability and Efficiency

TabPFN은 처음에는 작은 Dataset에 강한 모델이었다.

하지만 최근에는

100K
1M

규모의 Dataset까지 확장되고 있다.

그럼에도

Memory
Latency
Long-context Processing

은 여전히 중요한 Bottleneck이다.

그래서

Row Compression
Context Compression
Retrieval
Efficient Attention

같은 방법이 계속 등장하고 있다.


2. Pretraining Distribution

또 하나 중요한 문제는

무엇으로 Pretraining할 것인가?

이다.

한쪽에는

Synthetic Prior

가 있고,

다른 한쪽에는

Real-world Table

이 있다.

Synthetic Data는 원하는 만큼 다양한 Task를 만들 수 있다는 장점이 있고,
Real-world Data는 실제 Table의 복잡한 특성을 직접 반영한다는 장점이 있다.

강의에서는 이 두 방향이 경쟁 관계라기보다
서로 보완적인 Signal이라고 설명한다.


3. Semantic and Heterogeneous Tables

현실 Table에는 숫자만 존재하지 않는다.

Column Name
Text
Categorical Value
Missingness
Date
Mixed Feature Types

같은 정보가 존재한다.

ConTextTab처럼
이런 의미 정보를 어떻게 활용할지 역시 중요한 연구 방향이다.


4. Beyond Standard Flat Tables

마지막으로 앞으로는
단순한 하나의 Flat Table만 다루지 않을 가능성이 크다.

Relational
Temporal
Multimodal
Causal

구조까지 Tabular Foundation Model이 확장되고 있다.

TabPFN-REL과 MultiModalPFN이
이미 그 방향을 보여주고 있다고 생각한다.


이번 강의를 들으며 느낀 점

처음에는 Foundation Model이라고 하면
GPT처럼 엄청나게 많은 데이터를 학습한 거대한 모델만 떠올렸다.

그런데 PFN은 조금 다른 관점을 보여준다.

다양한 문제를 미리 만들어서 많이 풀어본다.
↓
"문제를 푸는 방법"을 학습한다.
↓
새로운 Dataset이 들어오면
그 Training Data를 Context로 본다.
↓
별도의 재학습 없이 Prediction한다.

이 아이디어가 가장 인상 깊었다.

또 v1 → v2 → v3의 발전 과정도 재미있었다.

v1
Row 하나를 Token으로 만들자.
↓
문제:
Table의 2차원 구조를 잘 못 본다.

v2
그러면 Row와 Column 방향을 모두 보자.
↓
문제:
계산량과 Memory가 너무 커진다.

v3
Feature 정보를 먼저 압축하고
Row 수준에서 효율적으로 ICL하자.

결국 모델이 발전하는 과정은
무조건 더 복잡하게 만드는 것이 아니라

표현력을 높이면서 계산 비용을 다시 줄이는 과정

처럼 느껴졌다.

그리고 이번 강의를 통해
Architecture만큼 Pretraining Task를 어떻게 만들 것인가도 중요하다는 점을 알게 됐다.

좋은 Transformer를 만드는 것만으로 끝나는 것이 아니라

어떤 Prior를 사용할 것인가?

Synthetic Data를 얼마나 현실적으로 만들 것인가?

실제 Table도 Pretraining에 사용할 것인가?

같은 질문들이 성능에 직접적인 영향을 준다.


결론

TabPFN의 핵심을 한 문장으로 정리하면 다음과 같다.

수많은 Tabular Task를 미리 학습해두고,
새로운 Dataset의 Training Data를 Context로 사용하여
별도의 Parameter Update 없이 예측하는 Tabular Foundation Model이다.

전체 흐름은 다음과 같다.

Prior 설계
↓
수많은 Synthetic Task 생성
↓
Transformer 기반 PFN 사전학습
↓
새로운 Dataset 등장
↓
Training Data를 Context로 입력
↓
In-Context Learning
↓
Parameter Update 없이 Prediction

그리고 TabPFN은 계속 발전하고 있다.

v1
Row Token

↓

v2
2D Table Modeling
+ Richer Synthetic Prior

↓

v3
Row Compression
+ Retrieval-based Prediction

최근 연구는 여기에

Top-K Retrieval
Real-world Pretraining
Context Compression
Mixed Synthetic Priors
Semantic Information
Multimodal Data

까지 결합하고 있다.

이전까지 Tabular ML에서는
새로운 Dataset이 주어지면 그 Dataset에 맞는 모델을 학습하고
Hyperparameter를 튜닝하는 것이 당연하다고 생각했다.

TabPFN은 이 전제를 바꾼다.

"모델을 데이터셋마다 다시 학습하는 대신,
데이터셋을 보고 문제를 푸는 방법 자체를 미리 학습할 수는 없을까?"

아마 이 질문이
TabPFN이라는 새로운 패러다임의 가장 핵심적인 아이디어가 아닐까 싶다.

profile
도전을 멈추지 않는 개발자

0개의 댓글