본문 바로가기
NLP

[NLP] Transformer의 함수 model.generate() 파라미터

by 단깅수 2024. 11. 25.
728x90

저번 포스팅에서는 LLM의 Prompt Engineering에 대해서 알아보았습니다.

 

[NLP] LLM Prompt Engineering

오랜만에 돌아왔습니다. 컨퍼런스하랴, 인턴생활하랴, 공모전하랴, 일본어 공부하랴 너무 현생이 바빠서 한 달 동안 블로그를 쓰지 못하였네요. 그래서 오랜만에 돌아왔으니 재미난 이야기를

dangingsu.tistory.com

 

이번 포스팅에서는 말씀드린대로 Output Parameter, 즉 generate 함수 파라미터에 대해서 알아보도록 하겠습니다.


1. Decoding Strategy

일단 파라미터를 알아보기 전에 generate 함수가 어떤 원리로 단어 혹은 문장을 생성하는지에 대해 알아보겠습니다.

1) Greedy Search

 첫 번째로 Greedy Search 입니다. Greedy Search란, 해당 타임 스텝에서 가장 높은 확률을 가지는 토큰을 그 다음 토큰으로 선택하는 전략인데요. 그때그때마다 최적의 단어를 찾고 출력하기 때문에 상당히 직관적이며 짧은 텍스트를 생성할 때 좋은 전략입니다.

 

 하지만 위 예시에서도 알 수 있듯이 실제 최적의 경로와는 다르게 최적 경로를 설정하는 경우도 발생하고, 어느 순간부터 같은 단어를 생성하는 문제가 발생할 수 있습니다. 동어 반복 문제는 이 Greedy Search와 아래에서 얘기할 Beam Search 알고리즘에서 특히 자주 발생한다고 합니다.

 

2) Beam Search

 두 번째는 Beam Search 입니다. Beam Search도 위에서 설명한 Greedy Search와 동일하게 해당 타임 스텝에서 가장 높은 확률을 가지는 토큰을 선택하는 전략인데, Greedy Search와 다른 점은 num_beams 개의 시퀀스를 유지한다는 점입니다. 쉽게 말해서 Greedy Search는 num_beams가 1인 셈이죠. 그래서 Beam Search는 언제나 Greedy Search보다 더 높은 확률의 시퀀스를 찾게 됩니다.

 

 하지만 최적의 num_beams를 찾기가 어려우며 이로 인해 최적의 Output을 생성하는 방법론이라고 볼 수는 없습니다.

 

3) Top-k Sampling

 세 번째는 Top-k Sampling 입니다. 해당 타입 스텝에서 등장가능한 단어들 중 가장 확률이 높은 K개의 다음 단어들을 필터링하고 확률 질량함수로 해당 K개의 단어들을 재분배하는 전략입니다.

 

 예를 들어, 위 그림은 K = 6으로 설정한 샘플링입니다. 각 타임 스텝에서 등장 가능한 6개의 단어들을 뽑고 그 안에서 고르는 거죠. 하지만 이렇게 되면 첫 번째 타임 스텝에서 나름 등장해도 이상하지 않은 people, house 등의 단어들은 제외되고, 두 번째 타임 스텝에서 뽑으면 어색해지는 down, a 등의 토큰이 샘플링에 포함되게 됩니다.

 

4) Top-p Sampling

 네 번째는 Top-p Sampling 입니다. 앞에서 등장했던 샘플링 기법이나 Search 기법들을 보완하는 기법인데요. 등장가능한 K개의 토큰을 샘플링하기보다, 누적확률이 P에 달하는 최소한의 단어 집합에서 샘플링한다는 전략입니다. 그래서 기존에 K개로 샘플링했던 전략보다 확실히 더 그럴싸한 문장을 만들 수 있겠죠.


2. Generate 함수 파라미터

 이제 본격적으로 Transformers의 generate() 함수에 쓰이는 파라미터들이 어떤 역할을 하는지 알아보겠습니다.

## 모델을 사용해 텍스트 생성
outputs = model.generate(
    inputs["input_ids"],
    max_length = 1000,          ## 최대 출력 텍스트 길이
    min_length = 10,            ## 최소 출력 텍스트 길이
    max_new_tokens = 1000,      ## 최대 출력 토큰 개수
    min_new_tokens = 20,        ## 최소 출력 토큰 개수
    do_sample = True,           ## 샘플링 or 선택
    num_beams = 7,              ## Beam Search 사이즈
    top_k = 40,                 ## 누적확률 top k개 토큰 선택
    top_p = 0.8,                ## 누적확률 0.8 이상 토큰 선택
    temperature = 0.7,          ## 누적확률분포 조정
    early_stopping = True,      ## 최소 num_beams 문장 완료되면 조기종료
    no_repeat_ngram_size = 3,   ## n-gram 단위로 반복 제어
    repetition_penalty = 1.2,   ## 같은 토큰 출력 제어
    length_penalty = 1.2,       ## 누적확률이 작아지는 문제 해소
    num_beam_groups = 5,        ## num_beams 그룹의 다양성 제어
    num_return_sequences = 1,   ## 최종 문장 출력 개수
    pad_token_id = tokenizer.eos_token_id,
)
  • max_length
    • 출력 문장의 최대 텍스트 길이 조정
    • 평균적으로 100 ~ 512 로 설정 (요약 Task는 짧게 설정, 스토리 생성은 길게 설정)
  • min_length
    • 출력 문장의 최소 텍스트 길이 조정
    • 평균적으로 10 ~ 50 으로 설정 (출력이 너무 짧지 않도록 제어)
  • max_new_tokens
    • 새로 생성되는 토큰의 최대 개수
    • 평균적으로 50 ~ 300 으로 설정 (요약 Task는 짧게 설정, 스토리 생성은 길게 설정)
  • min_new_tokens
    • 새로 생성되는 토큰의 최소 개수
    • 평균적으로 10 ~ 30 으로 설정 (너무 짧은 반응 방지)
  • do_sample ( True / False )
    • True : 랜덤하게 샘플링 (Top-k Sampling, Top-p Sampling)
    • False : 높은 확률의 토큰을 선택 (Greedy Search, Beam Search)
  • num_beams
    • Beam Search에서 확률이 높은 K개의 토큰을 선택하는데, 이 때의 K값을 의미함
    • 보통 5 ~ 10으로 설정
    • 높은 num_beams는 정확도를 높이지만 생성 속도를 느리게 만듦 (정확도-속도 트레이드오프)
  • top_k
    • 누적확률분포 기준 상위 k개의 토큰 중에서 샘플링
    • 평균적으로 40 ~ 100으로 설정
    • 낮게 설정할수록 생성 텍스트의 품질이 높아질 가능성이 있지만 다양성이 낮아짐
  • top_p
    • 누적확률분포 기준 확률이 P 이상인 토큰 중에서 샘플링
    • 평균적으로 0.8 ~ 0.95 로 설정 (일반적으로 0.9가 많이 사용됨)
    • 낮게 설정할수록 생성 텍스트의 품질이 높아질 가능성이 있지만 다양성이 낮아짐
  • temperature
    • 누적확률분포의 스케일링 조정 (높게 설정하면 높은 확률은 더 높게, 낮은 확률은 더 낮게 됨)
    • 평균적으로 0.7 ~ 1.0 으로 설정
    • 낮게 설정할수록 안정적인 답변을 제공하고 높게 설정할수록 자유로운 답변을 제공함
  • early_stopping
    • 최소 num_beams 수만큼 생성되면 조기종료
    • Task에 따라 True / False (요약은 주로 False)
  • no_repeat_ngram_size
    • 같은 n-gram 동어 반복 방지
    • 평균적으로 2 ~ 3으로 설정
  • repetition_penalty
    • 같은 토큰이 반복될 확률을 제어
    • 평균적으로 1.1 ~ 1.3으로 설정 (작업에 따라 다르게 조정)
  • length_penalty
    • 짧은 문장 생성할 때 패널티를 주어 출력 길이를 제어
    • 평균적으로 1.0 ~ 2.0으로 설정 (요약은 낮게, 스토리 생성은 높게 설정)
  • num_beam_groups
    • 다양성 제어를 위해 beam을 그룹화하는데 이 때 beam의 group 수
    • 평균적으로 1 ~ 5로 설정 (다양성이 중요할수록 높게 설정)
  • num_return_sequences
    • 최종적으로 몇 개의 문장을 생성할지 설정
    • 평균적으로 1 ~ 5로 설정 (보통 1로 설정)

 

이번 포스팅은 여기서 마치려고 합니다. LLM으로 문장을 생성할 때도 이렇게나 많은 파라미터들이 있다니, 조사하면 조사할수록 Inference할 때 하나씩 조정해보면서 노가다로 답변 평가할 생각을 하니 참 기분이 좋네요 ^^. 이런 걸 보면 LLM은 확률에 의해서 문장을 생성한다는 걸 확실하게 알 수 있겠죠. 만약 본인이 하는 말이 말이 되는 말인지 LLM이 아는 날이 오면 신기할 것 같네요.

 

 

[NLP] Survey of Chatbot, Persona

1. Personality, Persona, Profile LLM(Large Language Model)와 같은 챗봇 유형의 모델들을 Conversational Agent라고 편하게 CA라고 부르기도 합니다. 그런데 이러한 CA가 답변을 생성하는데 있어 Personality가 중요한

dangingsu.tistory.com

 

728x90
반응형