저번 포스팅에서는 LLM의 Prompt Engineering에 대해서 알아보았습니다.
이번 포스팅에서는 말씀드린대로 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' 카테고리의 다른 글
[NLP] LLM에서 할루시네이션이 발생하는 이유 (10) | 2024.11.26 |
---|---|
[NLP] LLM Prompt Engineering (4) | 2024.11.19 |
[NLP] Korean LLM Leaderboard (3) | 2024.10.16 |
[NLP] Survey of Chatbot, Persona (7) | 2024.09.04 |
[NLP] NLP Task Review, 감정분석 (0) | 2024.07.11 |
[NLP] Similarity, 문서 유사도 측정 (0) | 2024.07.06 |
[NLP] Text Data Preprocessing (0) | 2024.07.02 |
[NLP] 정규 표현식, Regular Expression (0) | 2024.07.01 |