
Fine-tuning을 직접 하는 방법에 대한 Chapter입니다.
아래 그림의 8번에 해당하는 부분을 직접 구현하는 부분입니다.
6.1 Fine-tuning의 종류들
Fine-tuning의 케이스는 크게 두가지 정도 있습니다.
1. Classification
2. Instruction (주로 많이 보는 LLM들이 여기에 해당합니다.)
그 중에서 이번 챕터에서는 Classification을 하는 LLM을 학습하는 방법에 대해서 얘기를 해보려고합니다.
주로 SPAM인지 아닌지를 확인하는 LLM을 예시로 보여주려고합니다.
6.2 데이터셋 준비하기
가장 먼저 학습할 데이터를 준비해야합니다.
그러면 Classification을 위한 데이터를 준비해야하는것인데 그 예시는 책에 링크로 준비되어있습니다.
spam과 not spam(ham)을 구분하기 위한 데이터는 아래와 같이 준비되었습니다.
그래서 그 데이터를 통해서 데이터를 학습 할 수 있도록 특수한 토큰들을 넣어줘야합니다.
아래와 같이 학습을 위한 데이터 Batch는 모두 같은 길이를 가져야합니다.
그래서 Padding을 모든 문장마다 붙여줍니다.
이를 통해서 코드상에서 학습을 쉽게 할 수 있습니다.
아래는 그 예시입니다.
3개의 메세지가 있는데 모두 11개의 토큰으로 길이를 맞춰줍니다.
1. 기존 6개의 토큰 -> padding 5개 추가 -> 11개로 채움
2. 기존 5개의 토큰 -> padding 6개 추가 -> 11개로 채움
3. 기존 11개의 토큰 -> padding 추가 X -> 11개로 채움
Padding으로 추가한 토큰은 50256번인데 이것은 | end of text |를 의미하는 토큰을 추가했습니다.
6.3 Data를 업로드 하는 동작
이런식으로 Input text들의 길이를 맞춰주고 결과에 해당하는 spam/ham 결과를 0/1로 표시해서 데이터들을 만들어냅니다.
실제 학습되는 값은 아래와 같이 변환되어서 학습하는데 사용이됩니다.
이 데이터들을 이제 직접 학습하면 됩니다.
그래서 이 직후 동작은 기존에 Chapter 5까지 학습했던 Foundation 모델을 학습시키기 위해서 weight를 load 해 보려고 합니다.
6.4. Pretrained Weight를 통해서 모델을 불러오기
아래와 같이 색칠된 부분입니다.
이 부분은 그냥 학습된 weight를 불러오면 됩니다!
특별한 동작은 없습니다.
아래와 같이 코드를 통해 모델을 Load 하면 됩니다.
6.5 Classification을 위한 헤드를 추가합니다.
기존에 우리가 이전 챕터들에서 학습한 결과는 마지막 레이어에서 출력하는 벡터의 차원은 50,257개입니다.
문자를 출력하기 위한 임베딩이 50,257개 라서 이렇게 구성됐었죠.
기존에 학습한 GPT 모델의 구조가 위와 같고 최종 아웃풋은 50,257개의 차원의 출력이었죠.
근데 이 개수는 Classification을 하기 위해서 만들진 않았기때문에 이를 변경을 좀 해야합니다.
Spam/ham을 구분하기 위해서는 마지막 아웃풋은 2개만 있으면 됩니다. 50,257개까진 필요없죠.
그래서 기존에 학습한 Layer중 마지막 레이어를 Classification용으로 갈아끼워보려고합니다.
기존의 model의 형태는 아래와 같은데요.
여기서 out_head를 새로운 out_head로 갈아끼우려고합니다.
기존 : 768 차원 -> 50,257차원으로 바꿔주는 Layer
변경 : 768 차원 -> 2차원으로 바꿔주는 Layer
아래와 같은 코드로 변경할 수 있습니다.
그리고 또한 기존에 있던 여러개의 Transformer중에 마지막 레이어와 final_norm을 위한 Layer를 추가로 학습시키려고합니다.
나머지 레이어들은 기존 Chapter 5까지의 layer를 그대로 쓸겁니다.
코드상으로는 아래와 같이 해당 영역들을 Trainable하게 바꿀 수 있습니다.
왜 전체 학습 가능한 Layer중에 일부 Layer만 변경한지는 아래 메모를 확인해보시길!
메모 : 특정 몇개의 Layer만 Fine-tuning하기 vs 모든 레이어를 fine-tuning하기
항상 모든 레이어를 fine-tuning할 필요는 없습니다.
Neural network 기반의 언어 모델의 경우 가장 아래쪽(lower) layer들은 일반적으로 언어의 구조와 문법에 대한 특징을 가지고 있습니다.
그래서 우리는 Classification을 위해서는 마지막 layer들만 수정하는것이죠.
언어적 특성은 그대로 두고 특정 목적을 위한 동작들만 제어하기 위함이죠
또한, 일부 레이어만 학습하면 연산량이 줄어들어서 더 효율적이기도 합니다.
그래서 최종 아웃풋을 뽑아내는 레이어를 갈아끼우면 아래와 같이 최종 2개의 토큰만이 나오게 됩니다.
아래는 Classification을 하는 레이어 전체를 abstract한 구조입니다.
6.6 Classification loss와 정확도 계산하기
그래서 6.5까지 아래와 같이 Fine-tuning을 위한 데이터 준비, 모델을 준비 완료했습니다.
이제 학습을 해야하는데 학습을 하려면 loss/accuracy를 구할 수 있어야겠죠.
지금이 바로 그 단계입니다.
그래서 Classification을 위한 단계이니 결국은 Spam이면 Spam을 맞추도록, Spam이 아니면 Ham을 선택하도록 하는 loss 설정이 필요하겠죠.
우리는 2개중에서 하나를 선택하는 함수는 우리는 주로 Softmax 함수를 사용했습니다. (기존 50,257개중에 하나를 고를때도 똑같긴했습니다.)
그래서 그 Softmax 값에 대한 loss를 줄이고 accuracy를 올리면 되겠죠
accuracy코드와 loss 코드를 만들어서 학습을 시키면 된다는 의미입니다.
코드 자체는 어렵지 않아서 아래와 같이 캡처를 통해서 보여드리고 넘어가겠습니다.
위가 Accuracy 측정하는 함수이고
아래가 loss를 구하는 함수입니다.
6.7 Supervised data를 통해서 model을 fine-tuning하라
이제는 학습에 필요한 데이터와 loss/accuracy함수를 만들었으니 이제 학습을 하면 됩니다.
아래와 같은 flow로 학습합니다.
그래서 아래와 같이 계속 학습하면서 정확도가 올라가지 않을 때 까지 계속 학습해봅니다.
아래는 학습 코드이고
실제 학습의 결과 출력은 아래와 같습니다.
Loss는 아래와 같이 학습함에 따라서 줄어드는게 보이구요.
정확도는 올라가는게 보입니다.
이렇게 Classification을 위한 Fine-tuning이 완료되었습니다.
다음 챕터는 마지막 챕터인 Instruction을 위한 Fine-tuning입니다.
다음 글에서 마무리지어보도록 하겠습니다.
'CS 지식 > AI 관련' 카테고리의 다른 글
Build a large language model - Chapter 7. Fine-tuning for instruction (1) | 2025.06.12 |
---|---|
Transformer 바닥부터 이해하기 - 3. Transformer 최적화 및 Transformer Applications (2) | 2025.03.15 |
Transformer 바닥부터 이해하기 - 2. Transformer 구조 (1) | 2025.03.09 |
Transformer 바닥부터 이해하기 - 1. Attention 이해하기 (0) | 2025.03.08 |
Word Embedding에 관련된 질문 그리고 해답 찾기 (0) | 2025.03.05 |
개발 및 IT 관련 포스팅을 작성 하는 블로그입니다.
IT 기술 및 개인 개발에 대한 내용을 작성하는 블로그입니다. 많은 분들과 소통하며 의견을 나누고 싶습니다.