ORPO을 공부하면서 logit 조절이 나오는데,
이러한 logit을 제대로 파악하지 못하고 있는 것 같아
logit에 대해서 좀 더 정리를 해본다.
Temperature
값을 조절하면 로짓 값이 변형되어 모델의 생성 스타일이 달라진다. 낮은 Temperature는 높은 logit 값에 더 집중해서 더 확신있는 답변, 높은 Temperature를 사용시 다양한 단어를 더 고려해서 창의적인 답변을 한다. 예를 들어 GPT가 "I love" 다음에 올 단어를 예측한다고 가정하면
가능한 후보들의 logit 값은 "you" 2.3, "this" 1.1, "it" 0.2 라면 소프트맥스를 적용했을 때 "you"의 확률이 가장 높아져 "I love you"가 생성될 가능성이 크다는 것이다.
언어 모델은 크게 3단계를 거쳐 로짓 생성
step 1. 입력 문장을 토큰화(tokenization)
step 2. 토큰을 임베딩(embedding) 벡터로 변환
step 3. 트랜스포머(Transformer) 블록을 통과한 후, 마지막에 로짓 점수 출력
step 1. 입력 문장을 토큰화
I, love
step 2. 토큰을 임베딩(embedding) 벡터로 변환
"I" [0.2, 0.5, -0.1, ... ]
"love" [0.7, -0.3, 0.9, ...]
step 3. 트랜스포머 신경망 통과
self-attention
매커니즘이 문맥을 분석하고, 중요한 정보들을 반영해 새로운 벡터를 만들어냄step 3-1. 출력층 (최종 선형 변환 + 로짓 값 계산)
마지막으로 출력층(Linear Layer)을 통과하면서 모델이 학습한 단어 사전(Vocabulary)의 모든 단어에 대한 logit 점수를 계산함
예를 들어, LLM의 단어 사전이 50,000개 라면 "I love" 뒤에 올 수 있는 모든 단어(50,000)개에 대한 logit 값이 계산됨
이 logit 값은 단어별 점수일 뿐, 아직 확률이 아님
모델이 "I love"라는 문장을 입력받고, 그 뒤에 올 수 있는 후보 단어들에 대한 logit 값을 계산한다고 가정. 이를 통해 각 단어의 예측 점수(logit score)를 구한다.
"you"의 logit 값: 3.1
"this"의 logit 값: 1.8
"it"의 logit 값: 2.3
"dogs"의 logit 값: 0.5
이 값들은 단순히 예시. 실제 모델에서는 수천, 수만 개의 단어가 후보가 될 수 있으며, 이 값들은 문맥, 모델 학습 상태, 파라미터에 따라 달라짐
step 3-2. 소프트맥스 적용 -> 확률 변환
즉, Logit 값은 고정된 값이 아니라 매번 문맥과 입력에 따라 달라짐
모델이 학습한 파라미터(가중치)에 의해 계산되지만, 입력 문장에 따라 실시간으로 변함
"I love" 라는 문장이 입력되었을 때 "you"의 logit 값은 높은 확률 이지만 "I hate"라고 입력하면 "you"의 logit 값이 낮아지고 "this"나 "it" 같은 단어의 logit 값이 높아질 수 있음
LLM에서 logit은 다음 단어를 예측할 때 사용되는 원본 점수,
최종적으로 소프트맥스를 거쳐 확률로 변환되어 단어가 선택된다.
logit 값은 매번 모델이 예측하는 과정에서 계산되며, 특정한 입력 문장에 대해 정해진 값이 아니라 모델의 학습된 지식과 문맥에 따라 달라지는 동적인 값
logit 값은 우리가 직접 계산하기 어려움. LLM의 내부 구조는 매우 복잡하고, 모델이 학습한 수많은 파라미터(가중치와 편향)에 기반하여 계산되기 때문임. 개념적으로 이해하면 됨!
그러나 이렇게 계산된 값을 추출하거나 확인할 수 있다.
from transformers import GPT2LMHeadModel, GPT2Tokenizer
import torch
# 모델과 토크나이저 로드
model = GPT2LMHeadModel.from_pretrained('gpt2')
tokenizer = GPT2Tokenizer.from_pretrained('gpt2')
# 입력 문장
input_text = "I love"
# 텍스트를 토큰화
inputs = tokenizer(input_text, return_tensors="pt")
# 모델 예측 (logits 반환)
with torch.no_grad():
outputs = model(**inputs)
# logits 추출
logits = outputs.logits
# 예시: 첫 번째 단어의 logit 값을 확인
print(logits[0, -1]) # 마지막 토큰에 대한 logit 값