올해는 머신러닝이다.
바닥부터 대형 언어 모델(LM) 만들기 – 개요 및 실습 본문
원문 영상
https://www.youtube.com/watch?v=osv2csoHVAo&t=857s
아래 내용은 위 영상을 보고 정리한 내용입니다.
바닥부터 대형 언어 모델(LM) 만들기 – 개요 및 실습
최근 AI와 머신러닝 기술이 발전하면서 대형 언어 모델(LM, Large Language Model) 구축에 대한 관심이 높아지고 있습니다. 오늘은 LM을 바닥부터 만들어보는 과정을 소개해 드리겠습니다. 이 과정은 여러분이 직접 실습하며 모델 훈련과 작동 원리를 이해하는 데 도움이 될 것입니다.
LM 기술의 변화와 현재
대형 언어 모델을 직접 구축하는 기술은 이미 몇 년 전부터 대중화되기 시작했습니다. 특히 중국에서 개발된 ‘딥시(DeepSeek)’가 등장하면서 LM 시장이 급격히 변화하고 있으며, 오픈소스 LM 모델도 속속 등장하고 있습니다. 최근에는 X1 3.5 모델이 공개될 예정이라 더욱 많은 연구자와 개발자들이 LM을 직접 다뤄볼 기회가 생겼습니다.
기존의 상용 LM 모델은 OpenAI의 ChatGPT와 같은 API 기반의 유료 모델이 주를 이뤘습니다. 하지만 비용 부담 없이 LM을 활용하고 싶다면 오픈소스 모델을 선택해 직접 학습시키는 것도 좋은 대안이 될 수 있습니다.
대형 언어 모델(LM) 만드는 과정 요약
LM을 만들기 위해서는 몇 가지 주요 단계를 거쳐야 합니다.
- 사전 훈련(Pretraining): 일반적인 언어 능력을 학습하는 단계로, 문장의 흐름을 예측하도록 모델을 훈련시킵니다.
- 미세 조정(Fine-tuning): 특정한 작업(예: 질문-답변, 번역 등)을 수행하도록 모델을 추가로 학습합니다.
- 추론(Generation) 및 최적화: 훈련된 모델이 더 정확하고 빠르게 답변을 생성하도록 개선합니다.
LM을 훈련시키기 위해서는 먼저 훈련 데이터를 준비하고, 이를 모델이 이해할 수 있는 형태로 변환해야 합니다. 이후 뉴럴 네트워크를 정의하고, 학습을 진행하면서 모델의 성능을 평가합니다.
실습 – LM 구축하기
1. 훈련 데이터 준비
훈련 데이터는 LM의 성능을 결정하는 핵심 요소 중 하나입니다. 예를 들어, 영어권에서는 해리포터, 셰익스피어 작품 등을 활용할 수 있으며, 한국어 모델을 만들고 싶다면 한글 소설이나 뉴스 데이터를 활용할 수 있습니다.
데이터 전처리 과정에서는 다음과 같은 작업을 수행합니다:
- 텍스트 파일에서 불필요한 기호 및 공백 제거
- 문장을 정제하여 하나의 긴 문자열로 변환
- 모델이 이해할 수 있도록 토큰화(Tokenization)
2. 토큰화(Tokenization) 및 데이터 로더(Data Loader) 설정
텍스트 데이터를 뉴럴 네트워크에서 학습할 수 있도록 숫자로 변환하는 과정이 필요합니다. 이를 위해 ‘토크나이저(Tokenizers)’를 활용하여 단어 또는 글자를 숫자로 매핑합니다.
예제:
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("gpt2")
text = "Harry Potter was a wizard."
tokens = tokenizer.encode(text)
print(tokens)
위 코드를 실행하면 해당 문장이 숫자로 변환된 토큰 리스트를 출력하게 됩니다.
3. 데이터 로더(Data Loader) 생성
토큰화된 데이터를 모델에 입력할 수 있도록 훈련 데이터를 배치(batch) 단위로 나누어야 합니다.
from torch.utils.data import DataLoader, Dataset
class TextDataset(Dataset):
def __init__(self, text, tokenizer, block_size=128):
self.tokenizer = tokenizer
self.tokens = tokenizer.encode(text)
self.block_size = block_size
def __len__(self):
return len(self.tokens) - self.block_size
def __getitem__(self, idx):
return (
self.tokens[idx:idx + self.block_size],
self.tokens[idx + 1: idx + self.block_size + 1]
)
dataset = TextDataset(text, tokenizer)
dataloader = DataLoader(dataset, batch_size=8, shuffle=True)
4. 뉴럴 네트워크 모델 정의 및 훈련
LM의 핵심 구조인 트랜스포머(Transformer) 모델을 사용하여 훈련을 진행합니다. 이를 위해 PyTorch 또는 TensorFlow를 활용할 수 있습니다.
import torch
from torch import nn
class SimpleLM(nn.Module):
def __init__(self, vocab_size, hidden_size=256):
super(SimpleLM, self).__init__()
self.embed = nn.Embedding(vocab_size, hidden_size)
self.lstm = nn.LSTM(hidden_size, hidden_size, batch_first=True)
self.fc = nn.Linear(hidden_size, vocab_size)
def forward(self, x):
x = self.embed(x)
x, _ = self.lstm(x)
x = self.fc(x)
return x
model = SimpleLM(vocab_size=len(tokenizer))
모델을 정의한 후, GPU를 사용할 수 있는 경우 해당 장치에서 훈련을 진행하면 속도를 높일 수 있습니다.
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model.to(device)
이제 훈련을 진행할 수 있습니다.
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
criterion = nn.CrossEntropyLoss()
for epoch in range(10):
for x, y in dataloader:
x, y = x.to(device), y.to(device)
optimizer.zero_grad()
output = model(x)
loss = criterion(output.view(-1, len(tokenizer)), y.view(-1))
loss.backward()
optimizer.step()
print(f"Epoch {epoch+1}, Loss: {loss.item()}")
결과 확인 및 활용
훈련이 완료된 후, 생성된 모델을 활용하여 문장을 예측할 수 있습니다.
input_text = "Dobby is"
tokens = tokenizer.encode(input_text, return_tensors='pt').to(device)
output = model(tokens)
predicted_token = torch.argmax(output, dim=-1).item()
print("Predicted next word:", tokenizer.decode(predicted_token))
이렇게 하면 "Dobby is free"와 같은 문장을 생성할 수 있습니다.
마무리하며
이제 여러분도 직접 LM을 만들고 훈련시키는 방법을 이해하셨을 것입니다. 향후에는 더욱 큰 데이터셋을 활용하거나, 모델의 성능을 개선하는 다양한 기법을 적용해볼 수 있습니다. 앞으로도 LM과 AI 에이전트 기술은 더욱 발전할 것이므로, 지속적으로 관심을 가지시면 큰 도움이 될 것입니다!
'AI' 카테고리의 다른 글
LangChain, LangGraph, LangFlow, LangSmith 비교 분석 (0) | 2025.03.06 |
---|---|
구글의 에이전트 백서 요약 (0) | 2025.03.06 |
AI 기반 에이전트 디자인 패턴 완전 정복 (0) | 2025.03.06 |
작은 언어 모델(SLM)의 가능성과 활용(요약 정리) (0) | 2025.03.06 |
딥러닝의 혁신: Deepseek R1과 Deepseek V3 모델 완벽 분석 (0) | 2025.03.06 |