b__ono__ng
CALM(Continuous Autoregressive Language Models) 논문 리뷰 본문

나는 LLM은 아직 잘 몰라서 용어나 구조의 이해를 많이 하지 못했지만,, 중요한 논문이 될 것 같아서 읽어봤다.
Main Idea

기존의 LLM은 다음에 올 단어를 예측하는 구조인데, 단어사전에서 다음 단어를 매번 softmax해서 고른다.
그러면 만약 100 토큰의 output을 내어야 한다면 전체 모델을 100 step 돌아야하는 구조인데, 이게 너무 느리다. 그렇다고 단어를 2개씩 묶어서 학습한다고 해도 라벨링은 어찌 할 것인가.. (단어 개수)² 니까 토큰 종류가 너무 넓어진다. softmax 디멘션이 터져버리니 불가능하다.
그래서 CALM에서는 단어를 k개 묶어서 벡터화하고 이 벡터를 예측하는 구조로 만들었다. 이렇게 되면 100 step을 돌아야 한다고 했을 때 k=4, 그러니까 단어를 4개씩 묶어서 예측한다고 하면 25 step만 돌아도 되는거다. softmax는 동일하게 동작할듯.
Architecture

이 논문은 성능이나 이런 걸 떠나서, LLM을 Classification에서 Regression 문제로 끌고왔다는 것에 의미가 있는 듯 하다.
(실제로도 성능은 말하기 좀 모호하다.)
기존 LM의 일반적인 구조는 이렇다.
Token → Transformer (hidden) → linear → sofrmax(vocab) → 토큰 ID 샘플
CALM에서는 단어들을 벡터화하기 때문에 softmax가 바로 불가능해서, 벡터를 토큰 단위로 디코딩한 뒤 softmax를 해야한다.
Tokens(k개) → Compression MLP (vectorize) → Transformer (hidden) → Generative Head + linear → continuous z → Decoder → softmax → K개 토큰
Important
Classification을 Regression 문제로 가져오면서 발생하는 가장 큰 문제는 Likelihood다.
Likelihood는 Confidence같은 개념이다. 각 클래스에 대해 모델이 어느 정도로 확신했는지에 대한 점수다.
아주 가벼운 예시로,, 다음 토큰을 예측한다고 할 때
- "자동차": 55%
- "자전거": 40%
- "솜사탕": 5%
이런 식으로 나오는 식이다.
LLM 모델은 기본적으로 Classification 모델이기 때문에 이 Likelihood를 활용해서 Loss를 계산하든, 평가를 하든, 샘플링을 하든 사용한다. 그런데 CALM 방식에서의 문제는, 몇 개의 토큰을 뭉쳐서 벡터로 만들어버렸으니 토큰 단위의 Logit도, Likelihood도 없다는 것이다!
Energy-based Scoring
이를 해결하기 위해 CALM에서는 Regression, Contrastive Learning과 같은 방법으로 접근한다.

위 그림은 CLIP 모델을 표현한 도식이다. CLIP은 이미지와 이미지를 표현하는 텍스트(태그)를 의미 공간 (Latent Space)에 두고, 이미지를 잘 표현하는 텍스트와의 거리를 가깝게 하고, 관련 없는 텍스트와는 거리를 멀게 학습하는 Contrastive Learning을 기반으로 한다.
여기에서 정답과 예측 간의 거리(Distance)를 Energy라고 표현하고, 이를 기반으로 다른 기능이 동작한다.

Loss는 크게 두 방향으로 학습되는데, 정확도를 높이기 위한 방향과 다양성을 높이는 방향으로 학습된다.
- 정확도: 모델 예측값과 정답 간의 거리를 좁히는 방향으로 학습
- 다양성: 모델 예측값을 2개 샘플링해서, 두 예측 간의 거리를 좁히는 방향으로 학습
따라서, 높은 정확도로 일관된 답변을 하도록 학습된다.
BrierLM
기존의 LLM은 모델 평가를 위해 Perplexity를 사용했다. 이 방법은 실제 출력해야 하는 토큰에 대해 얼마만큼 확신했는가? 를 평가한다. 수식은 다음과 같다.

출력한 모든 토큰들에 대해 각 토큰 별 Likelihood를 평가한다. 낮아질수록 좋다.

그런데 위에서도 말했듯, CALM 방식은 토큰에 대한 Likelihood가 없기 때문에 Perplexity 기반의 평가가 불가능하다. 그래서 Regression문제와 동일하게, BrierLM이라는 기법을 도입했다.

Loss Function과 유사하다. 벡터 레벨에서, 실제 정답과의 거리, 출력 간의 거리를 기반으로 평가한다. 이 또한 낮아질수록 좋다. 그냥 MSE같은 방식이라고 생각하면 편하다.
Exact Temperature Sampling
LLM은 동일한 답변을 내놓지 않기 위해 Temperature 기법을 사용한다.
Object Detection 같은 분야에서는 동일한 이미지에 대해 항상 동일한 출력을 뱉는다. 왜냐면 Softmax에 의해 가장 확률이 높은 클래스만을 출력으로서 사용하기 때문이다. 그런데 LLM에서는 Softmax를 거치더라도 각 클래스의 확률값이 있을텐데, 그 확률을 그대로 사용한다. 예를 들어 "자동차"일 확률이 80%고 "자전거"일 확률이 20%면, 10번 중 2번은 "자전거"가 채택된다.
Temperature는 이 확률값을 좀 더 평탄/뾰족하게 변경하는 기법이다. 분산을 넓히는 느낌이다.

이렇게 각 클래스에 대한 확률이 있으면, temperature를 높일 경우 작은 값을 더 크게 만든다.
그런데 이 또한 각 클래스(단어)에 대한 Likelihood가 없다. 그래서 CALM에서는 다른 방식으로 Randomness Sampling 기법을 조금 다르게 구현했다. 그런데 설명이 어려워서,,, 내가 이해한 바는 이런 방식이다.
우선 Temperature는 아래와 같이 작용한다.

E(x)에 Temperature를 나눈 값을 사용하는데, 이걸 적용한 값이 난수(u, 0~1)보다 높으면 채택하고, 아니면 리젝한다. 아래 차트와 같다.

예를 들어서 Temperature까지 적용한 값이 0.5이고, 난수가 0.4로 결정되었으면 채택한다. 만약 난수가 0.6으로 결정되었으면 리젝되는데, 이 경우 벡터를 재 샘플링한다. 이런 과정을 거쳐서 항상 동일한 벡터가 출력되지 않도록 하는 기능을 구현했다. 내가 이해한 바는 그렇다..
Autoencoder: VAE + Dropout + KL Clipping
Autoencoder를 쓰면 latent space가 너무 빡빡해져서, 이걸 연속적인 latent manifolding 방식으로 풀어주는 VAE를 쓴다. 그리고 Dropout이랑 KL Clipping도 쓴다고 한다. (이게 어떤 신비한 효능이 있는 정확히 모른다.)
Performance
성능은 이렇다.

동일한 백본을 사용했을 때(head만 다를 때) BrierLM 기준 높은 성능을 보이고 FLOPs가 낮다. 그런데 여기서 의문은.. BrierLM이 낮아질수록 좋은건데 모델 크기가 커질수록 BrierLM은 오히려 높아진다. 찾아보기로는 의미 공간이 커져서 동일한 수준의 오차여도 그 수치가 더 커진다고 하는데,, 그러면 동일한 비교가 되나? 기존 모델을 BrierLM 형태로 추출할 수 있도록 하기 위해 수정한 부분도 있을텐데 동일한 비교가 될런지 의문이다.
어쨌든 새로운 구조로 나온 모델이고 Regression LLM에 대한 어떤 평가 방식도 정립되지 않은 상황이니 더 연구가 필요하겠지만, 접근 자체는 좋은 방식인 것 같아서 더 좋은 모델이 계속 나왔으면 좋겠다.

벡터화하는 토큰의 개수는 K=4일 때 제일 좋은 성능을 낸다고 한다. 말하고자 하는건 같은 compute 예산이면 CALM이 더 높은 성능이고, 같은 성능이면 CALM이 compute를 더 아낀다는 느낌같다.
K는 결국 단어를 몇 개씩 묶어서 벡터화 할거냐?인거라서, 많이 묶을수록 성능은 줄어든다. 그런데 K=1이면 단어 하나씩이되 벡터화해서 Energy 기반으로 학습하는 방식만 차용되는건데, 이 때의 성능도 확인되어야 할 것 같다. 새로운 방식이다보니,,, 특히 loss function에서 업데이트가 될 것도 같다.
LLM을 잘 몰라서 그냥 초보자가 이해한대로 쉽게 압축해서 정리했다.
Vision쪽에서는 어떻게 쓰일 수 있을까..
'IT > AI' 카테고리의 다른 글
| onnxruntime-directml 사용하게 되는 경우 (1) | 2026.02.26 |
|---|---|
| AgentDoG: LLM Guard (4) | 2026.02.03 |
| D-Fine 모델 학습 중 (6) | 2025.02.20 |
| Ultralytics + MLflow 사용 시 실험 분리되는 문제 (5) | 2024.12.31 |
| Error - mlflow.exceptions.MlflowException: Cannot set a deleted experiment '/Shared/NAME' as the active experiment. You can restore the experiment, or permanently delete the experiment to create a new one. (4) | 2024.12.19 |