[NLP] LLM logit

gunny·2025년 2월 10일
0

NLP

목록 보기
3/3

ORPO을 공부하면서 logit 조절이 나오는데,
이러한 logit을 제대로 파악하지 못하고 있는 것 같아
logit에 대해서 좀 더 정리를 해본다.

Logit

  • LLM에서 logit 은 모델이 각 단어(token)에 대해 예측한 확률을 계산하기 전의 출력값(로짓값)을 의미한다.
  • 로짓(logit)은 신경망 마지막 출력층(보통 소프트맥스 이전)의 값 이다.
  • 즉, LLM이 어떤 단어를 다음에 예측할 때, 각 후보별로 로짓 점수(logit score)를 계산하고, 이를 소프트맥스(softmax) 함수를 적용해 확률 분포로 변환한다.

Logit의 특징

  • 로짓 값 자체는 확률이 아니라, 비교를 위한 점수 역할
  • 값이 클수록 해당 단어가 선택될 가능성이 높음
  • 로짓 값을 소프트맥스 함수에 넣으면 확률 (0~1 사이의 값)으로 변환되는데, 예 [logit1, logit2, logit3]= [2.1, -0.5, 0.3] 이라면 소프트맥스 적용 시 [0.7, 0,1, 0.2] 처럼 확률값이 됨
  • 온도(Temperature) 조절 기능이 있어서, Temperature 값을 조절하면 로짓 값이 변형되어 모델의 생성 스타일이 달라진다. 낮은 Temperature는 높은 logit 값에 더 집중해서 더 확신있는 답변, 높은 Temperature를 사용시 다양한 단어를 더 고려해서 창의적인 답변을 한다.

예를 들어 GPT가 "I love" 다음에 올 단어를 예측한다고 가정하면
가능한 후보들의 logit 값은 "you" 2.3, "this" 1.1, "it" 0.2 라면 소프트맥스를 적용했을 때 "you"의 확률이 가장 높아져 "I love you"가 생성될 가능성이 크다는 것이다.

Logit 점수

  • 로짓 점수는 언어 모델 내부의 마지막 레이어에서 계산됨
  • "다음에 올 단어가 무엇인지"를 예측하는 과정에서 로짓 점수 생성

언어 모델은 크게 3단계를 거쳐 로짓 생성
step 1. 입력 문장을 토큰화(tokenization)
step 2. 토큰을 임베딩(embedding) 벡터로 변환
step 3. 트랜스포머(Transformer) 블록을 통과한 후, 마지막에 로짓 점수 출력

logit 값의 계산 예시

  • LLM은 입력된 문장을 바탕으로 신경망을 거쳐 각 단어(token)에 대한 logit 값(로짓 점수)동적 으로 생성함
  • 위의 예시 처럼 "I love" 라는 입력이 들어오면 모델 내부에서 다음과 같은 과정을 거친다.

step 1. 입력 문장을 토큰화

I, love

step 2. 토큰을 임베딩(embedding) 벡터로 변환

  • 각각의 단어(token)을 벡터(숫자들의 집합)으로 변환

"I" [0.2, 0.5, -0.1, ... ]
"love" [0.7, -0.3, 0.9, ...]

step 3. 트랜스포머 신경망 통과

  • 임베딩된 벡터들이 트랜스포머(transformer) 블록을 거치면서 문맥을 반영한 새로운 벡터로 변환됨
  • 트랜스포머의 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 값이 나온 후, 소프트맥스(softmax)를 적용하면 확률 분포가 만들어짐
  • logit 값이 높은 단어일수록 확률이 높아지고, 낮은 단어는 확률이 낮아짐

즉, 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 값
profile
꿈꾸는 것도 개발처럼 깊게

0개의 댓글

관련 채용 정보