LLM(대형 언어 모델)의 학습 및 검증을 위한 데이터 세트 준비
소개
LLM(언어 모델) 학습을 위한 데이터세트를 생성하려면 언어의 뉘앙스를 포착하는 효율성을 보장하기 위한 몇 가지 중요한 단계가 필요합니다. 다양한 텍스트 소스 선택부터 전처리, 데이터 세트 분할까지 각 단계마다 세심한 주의가 필요합니다. 또한 모델의 학습 프로세스를 최적화하려면 데이터 세트의 크기와 복잡성의 균형을 맞추는 것이 중요합니다. 잘 구조화된 데이터 세트를 선별함으로써 능숙하고 정확하게 자연어를 이해하고 생성할 수 있는 LLM 교육을 위한 강력한 기반을 마련합니다.
이 간략한 가이드는 LLM(언어 모델)을 훈련하고 검증하기 위한 분류 데이터 세트를 생성하는 과정을 안내합니다. 여기서 생성된 데이터 세트는 작지만 탐색 및 추가 개발을 위한 견고한 기반을 마련합니다.
전제 조건
- 기본 지식: LLM 개념 및 데이터 전처리 기술에 대한 지식.
- 데이터 소스: 텍스트 형식의 깨끗하고 다양하며 관련성 있는 데이터 세트에 액세스합니다.
- 툴킷: Python,
pandas
,numpy
와 같은 라이브러리,TensorFlow
또는PyTorch와 같은 프레임워크 설치 코드>.
- 저장용량: 대규모 데이터 세트를 처리하기에 충분한 컴퓨팅 리소스입니다.
LLM 미세 조정 및 교육을 위한 데이터 세트
여러 소스에서 LLM을 미세 조정하고 교육하기 위한 훌륭한 데이터 세트를 제공합니다. 그 중 몇 가지가 아래에 나열되어 있습니다:-
1.Kaggle: Kaggle은 다양한 도메인에 걸쳐 다양한 데이터 세트를 호스팅합니다. 텍스트 분류, 감정 분석 등을 포함하는 NLP 작업을 위한 데이터세트를 찾을 수 있습니다. 방문: Kaggle 데이터세트
2.Hugging Face 데이터세트: Hugging Face는 자연어 처리 작업을 위해 특별히 선별된 대규모 데이터세트를 제공합니다. 또한 모델 교육을 위해 변환기 라이브러리와 쉽게 통합할 수 있습니다. 방문: 포옹하는 얼굴 데이터세트
3.Google 데이터세트 검색: Google 데이터세트 검색은 연구자가 무료로 사용할 수 있는 온라인 데이터를 찾는 데 도움을 주기 위해 특별히 설계된 검색 엔진입니다. 여기에서 언어 모델링 작업을 위한 다양한 데이터 세트를 찾을 수 있습니다. 방문: Google 데이터세트 검색
4.UCI 머신 러닝 리포지토리: UCI 머신 러닝 리포지토리에는 NLP에만 중점을 두지는 않지만 언어 모델링 및 관련 작업에 사용할 수 있는 다양한 데이터 세트가 포함되어 있습니다. 방문: UCI 머신러닝 저장소
5.GitHub: GitHub는 NLP를 포함하여 다양한 목적의 데이터 세트가 포함된 수많은 저장소를 호스팅합니다. 특정 작업이나 모델 아키텍처와 관련된 저장소를 검색할 수 있습니다. 방문: GitHub
6.Common Crawl: Common Crawl은 웹을 크롤링하고 아카이브와 데이터 세트를 대중에게 무료로 제공하는 비영리 조직입니다. 이는 언어 모델링을 위한 텍스트 데이터를 수집하는 데 귀중한 리소스가 될 수 있습니다. 방문: 일반 크롤링
7.OpenAI 데이터세트: OpenAI는 연구 목적으로 데이터세트를 주기적으로 공개합니다. 이러한 데이터 세트에는 LLM 교육에 사용할 수 있는 대규모 텍스트 말뭉치가 포함되는 경우가 많습니다. 방문: OpenAI 데이터세트
데이터 세트를 생성하고 준비하는 코드
이 기사의 코드와 개념은 처음부터 실질적인 언어 모델을 구성하는 데 대한 포괄적인 통찰력을 제공하는 Sebastian Rashka의 훌륭한 과정에서 영감을 받았습니다.
1. 먼저 필요한 패키지 설치부터 시작하겠습니다.
import pandas as pd #for data processing, manipulation
import urllib.request #for downloading files from URLs zip file
import zipfile #to deal with zip file
import os #for dealing with the OS
from pathlib import Path #for working with file paths
2. 아래 코드 줄은 원시 데이터 세트를 가져와 추출하는 데 도움이 됩니다.
# getting the zip file from the url
url = "https://archive.ics.uci.edu/static/public/228/sms+spam+collection.zip"
data_zip_path = "sms_spam_collection.zip"
data_extracted_path = "sms_spam_collection"
data_file_path = Path(data_extracted_path) / "SMSSpamCollection.tsv"
3.다음으로 URL 열기와 로컬 파일 열기 모두에 'with' 문을 사용하겠습니다.
# Downloading the file
with urllib.request.urlopen(url) as response:
with open(data_zip_path, "wb") as out_file:
out_file.write(response.read())
Unzipping the file
with zipfile.ZipFile(data_zip_path, "r") as zip_ref:
zip_ref.extractall(data_extracted_path)
4. 아래 코드는 다운로드한 파일의 이름이 ".tsv " 파일로 올바르게 변경되었는지 확인합니다.
# Add .tsv file extension
original_file_path = Path(data_extracted_path) / "SMSSpamCollection"
os.rename(original_file_path, data_file_path)
print(f"File downloaded and saved as {data_file_path}")
이 코드를 성공적으로 실행하면 "파일이 다운로드되어 sms_spam_collection/SMSSpamCollection.tsv로 저장되었습니다"라는 메시지가 표시됩니다.
5. pandas 라이브러리를 사용하여 저장된 데이터 세트를 로드하고 데이터를 추가로 탐색합니다.
raw_text_df = pd.read_csv(data_file_path, sep="\t", header=None, names=["Label", "Text"])
raw_text_df.head()
print(raw_text_df["Label"].value_counts())
상표 햄 4825 스팸 747 이름: 개수, dtype: int64
6. 균형 잡힌 데이터세트를 생성하기 위해 팬더를 사용하여 함수를 정의해 보겠습니다. 처음에는 '스팸' 메시지 수를 계산한 다음 전체 스팸 인스턴스 수에 맞춰 동일한 수를 무작위로 샘플링합니다.
def create_balanced_dataset(df):
# Count the instances of "spam"
num_spam_inst = raw_text_df[raw_text_df["Label"] == "spam"].shape[0]
# Randomly sample "ham' instances to match the number of 'spam' instances
ham_subset_df = raw_text_df[raw_text_df["Label"] == "ham"].sample(num_spam, random_state=123)
# Combine ham "subset" with "spam"
balanced_df = pd.concat([ham_subset_df, raw_text_df[raw_text_df["Label"] == "spam"]])
return balanced_df
balanced_df = create_balanced_dataset(raw_text_df)
'스팸'과 '햄'의 개수를 확인하기 위해 value_count를 수행해 보겠습니다.
print(balanced_df["Label"].value_counts())
상표 햄 747 스팸 747 이름: 개수, dtype: int64
보시다시피 이제 데이터 프레임의 균형이 맞춰졌습니다.
#change the 'label' data to integer class
balanced_df['Label']= balanced_df['Label'].map({"ham":1, "spam":0})
7.Net에서는 데이터 세트를 무작위로 분할하여 훈련, 테스트 및 검증 기능을 수행하는 함수를 작성합니다.
def random_split(df, train_frac, valid_frac):
df = df.sample(frac = 1, random_state = 123).reset_index(drop=True)
train_end = int(len(df) * train_frac)
valid_end = train_end + int(len(df) * valid_frac)
train_df = df[:train_end]
valid_df = df[train_end:valid_end]
test_df = df[valid_end:]
return train_df,valid_df,test_df
train_df, valid_df, test_df = random_split(balanced_df, 0.7, 0.1)
다음으로 데이터세트를 로컬에 저장합니다.
train_df.to_csv("train_df.csv", index=None)
valid_df.to_csv("valid_df.csv", index=None)
test_df.to_csv("test_df.csv", index=None)
결론
LLM(대형 언어 모델)을 구축하는 것은 매우 복잡합니다. 그러나 끊임없이 진화하는 A.I. 분야와 신기술이 등장하면서 상황은 점점 덜 복잡해지고 있습니다. 강력한 알고리즘으로 기반을 마련하는 것부터 하이퍼 매개변수를 미세 조정하고 방대한 데이터 세트를 관리하는 것까지 모든 단계는 인간과 유사한 텍스트를 이해하고 생성할 수 있는 모델을 만드는 데 중요합니다.
LLM 교육의 중요한 측면 중 하나는 고품질 데이터세트를 만드는 것입니다. 여기에는 다양하고 대표적인 텍스트 말뭉치를 소싱하고 이를 전처리하여 일관성과 관련성을 보장하며, 아마도 가장 중요한 것은 균형 잡힌 데이터세트를 선별하여 편향을 방지하고 모델 성능을 향상시키는 일이 포함됩니다.
이것으로 우리는 기사의 끝 부분에 이르렀으며 구분된 파일에서 분류 데이터 세트를 생성하는 것이 얼마나 쉬운지 이해했습니다. 이 글을 토대로 좀 더 복잡한 데이터를 만들어 보시길 강력히 추천드립니다.
기사를 재미있게 읽으셨기를 바랍니다!
참고자료
- 코드 참조