주요 내용: LM이 생성한 텍스트의 품질 평가 방법을 알아보고, LM을 사전 훈련하는 방법을 준비합니다. 사전 훈련(Pre-training)은 기본적인 언어 이해를 위한 첫 단계 훈련을 의미하며, 이후 미세 튜닝을 통해 구체적인 목적에 활용됩니다.
텍스트 생성 과정 복습: 이전에 구현한 GPT 모델을 사용하며, 입력 텍스트를 토크나이저를 사용해 토큰 ID로 변환합니다. 이 토큰 ID를 GPT 모델에 전달하면, 모델은 각 토큰마다 어휘 사전 크기(예: 5257개)만큼의 벡터(로짓)를 출력합니다. 이 로짓 중 가장 큰 값을 가진 토큰 ID를 선택하고, 다시 텍스트로 변환하여 다음 토큰을 생성합니다.
텍스트 품질 평가 (손실 계산): 모델이 생성한 텍스트의 품질은 크로스 엔트로피 손실(Cross-Entropy Loss)을 사용하여 평가됩니다. 이는 다중 분류 모델의 손실 계산 방식과 동일합니다.
모델 출력 로짓을 소프트맥스 함수를 사용해 확률로 변환합니다.
타깃 토큰에 해당되는 예측 확률을 추출합니다.
이 확률에 로그를 씌우고, 각 토큰별 손실을 평균합니다.
최종적으로 음의 평균 로그 확률을 계산하여 손실을 최소화하는 방향으로 훈련합니다.
훈련 데이터 준비
모델이 훈련 데이터에만 너무 잘 맞는 과대적합(Overfitting)을 방지하기 위해 훈련 세트와 별도의 검증 세트를 준비합니다.
훈련은 두 세트의 손실 점수 차이가 크게 벌어지지 않을 때까지만 진행하는 것이 좋습니다.
데이터는 토크나이저를 거쳐 토큰 ID로 변환되고, 문맥 길이(시퀀스 길이, 예: 6개 또는 256개)만큼 잘라서 샘플을 만듭니다. GPT 모델의 기본 문맥 크기는 1024이지만, 컴퓨팅 자원 절약을 위해 256 등으로 줄여서 예제를 구성할 수 있습니다.
LLM 훈련하기
주요 내용: 모델 훈련 함수를 만들고 텍스트 데이터를 사용해 실제로 모델을 사전 훈련하는 방법을 알아봅니다.
파이토치 훈련 루프 (PyTorch Training Loop): 파이토치에서 모델 훈련은 개발자가 명시적으로 구현해야 하는 것이 특징입니다.
에포크 반복: 훈련 데이터를 모두 사용하는 단위인 에포크를 여러 번 반복합니다.
배치 순회: 각 에포크 내에서 데이터 로더를 통해 배치 데이터를 꺼내와 순회합니다.
그레디언트 초기화: 이전 라운드에서 계산된 그레디언트를 초기화합니다.
정방향 계산 및 손실 계산: 현재 배치 데이터를 사용하여 모델의 정방향 계산(Forward Pass)을 수행하고 손실을 계산합니다.
역전파 및 그레디언트 계산: 손실을 역전파(Backpropagation)하여 그레디언트를 계산합니다.
가중치 업데이트: 옵티마이저를 사용하여 모델의 가중치(Weight)를 업데이트합니다.
성능 확인: 훈련 중 과대적합 여부를 확인하기 위해 훈련 세트와 검증 세트의 손실을 출력합니다.
샘플 텍스트 생성: 한 에포크가 끝날 때마다 샘플 텍스트를 생성하여 모델 개선 정도를 시각적으로 확인합니다.
무작위성을 제어하기 위한 디코딩 전략
주요 내용: 단순히 가장 확률이 높은 토큰을 선택하는 그리디 디코딩 방식 대신, 더 그럴듯하고 자연스러운 텍스트를 생성하기 위해 확률적 요소를 가미하는 디코딩 전략을 알아봅니다.
온도 스케일링 (Temperature Scaling)
온도 파라미터를 사용하여 모델 출력 로짓의 확률 분포를 조절하는 기법입니다. 이 개념은 열역학의 엔트로피에서 유래했습니다.
원리: 모델이 출력한 로짓을 온도 값으로 나눈 후 소프트맥스 함수를 통과시켜 확률 분포를 조정합니다.
온도가 높을수록: 엔트로피가 증가하여 **다양성(무작위성)**이 높아지고 확률값이 고르게 분포됩니다. 이는 더 창의적인 선택을 유도하지만, 너무 높으면 말이 안 되는 텍스트가 생성될 수 있습니다.
온도가 낮을수록: 확률이 가장 큰 토큰에 집중되어 결정론적인 결과가 만들어집니다.
탑케이 샘플링 (Top-K Sampling)
모델이 출력한 로짓 중 확률이 가장 높은 최상위 K개의 토큰만 후보로 선택합니다.
선택되지 않은 나머지 토큰의 로짓은 음의 무한대 값으로 마스킹하여 Softmax 통과 시 확률이 0이 되게 합니다.
남은 K개의 후보 중에서 확률에 기반하여 무작위로 하나를 선택합니다.
이 방식은 이상한 토큰이 생성되는 것을 방지하면서 적절한 다양성을 유지할 수 있습니다.
참고: 탑피 샘플링이나 빔 서치와 같은 다른 디코딩 전략도 있습니다.
가중치 저장/로드 및 사전 훈련된 가중치 로드
해당 절에서는 훈련된 모델의 가중치를 저장하고 로드하는 방법 및 OpenAI의 사전 훈련된 GPT-2 모델의 가중치를 로드하는 방법을 다룹니다.
사전 훈련된 가중치를 로드하는 과정은 클래스에 맞춰 수동으로 가중치를 로드해야 하기 때문에 번거로울 수 있으나, 이는 구현의 원리를 배우려는 목적 때문입니다.
실제 미세 튜닝 작업 시에는 트랜스포머스 라이브러리나 케라스 NLP와 같은 고수준 라이브러리를 사용하여 모델 클래스 정의와 가중치 로드를 한 번에 간단하게 처리하는 것이 일반적입니다
댓글 영역