지정해 준 최대 길이 (max_length)에 도달하기 전이라도 모델은 스스로 문장이 끝났다고 판단하면 생성 조기 종료를 결정한다.
기본적으로 "다음에 올 가장 확률이 높은 토큰"을 단어장에서 하나씩 뽑아내는 방식으로 문장을 생성한다.(Auto-regressive 방식)
모델(Transformer 등)이 문맥을 다 읽고 나면, 마지막 레이어에서 문장의 의미를 담은 고차원 벡터 (Hidden state 벡터)가 출력된다. 이 벡터를 가지고 단어장을 만들게 된다.
(이 단어장에는 일반적인 단어뿐만 아니라 문장의 끝을 의미하는 특수 토큰인 [EOS] (, <|endoftext|> 등등..)가 포함되어 있다.)
이 벡터들을 Linear Layer(선형 레이어)에 통과시키면 각 단어가 다음에 올만한 자격이 얼마나 되는지 나타내는 "가점"이 나온다. (Logits)
Logits 상태로는 확률을 쓸 수 없기 때문에 모든 점수를 0과 1사이의 확률값으로 변환하고 총합이 1이 되도록 소프트맥스 함수를 적용한다.
연산을 거치면 단어장 내의 모든 토큰에 확률이 부여된다. 문장이 마무리될 시점이 되면 모델 내부의 Attention 메커니즘이 연산을 통해 [EOS] 토큰의 가점을 가장 높게 주므로 다음과 같은 활률 분포가 만들어진다.
[사과]: 0.01%
[먹었다]: 0.05%
[EOS] (종료 토큰): 89.4%
[그리고]: 1.2%
이제 이 확률 분포를 바탕으로 토큰을 실제로 선택한다. 설정된 디코딩 방식에 따라 결정된다.
EOS 토큰 예측 외에도 실제 서빙 환경이나 파인 튜닝(Inference)단계에서 생성을 멈추게 하는 여러 장치들이 있다.
예시:
Chatbot을 만들 때 stop sequence를 \nUser:(줄바꿈 후 유저 입력 표시)로 설정해 두면, 모델이 AI 답변을 마치고 유저의 차례를 흉내 내어 글을 쓰기 직전에 딱 멈춘다.
RAG 환경이나 Few-shot 러닝에서 템플릿이 깨지거나 모델이 혼자서 북 치고 장구 치며 1인 2역 하는 것을 막을 때 필수적으로 사용된다.
Repetition Penalty: 이미 생성한 토큰이 또 나오면 확률을 깎아버려 다른 단어(또는 EOS)를 고르게 유도한다.
No Repeat N-Gram Size: 3글자 또는 4글자 이상의 동일한 어구가 반복되면 강제로 확률을 0으로 만들어 생성을 우회시키고 종료를 돕는다.