저번 포스팅에서 설치했던 라이브러리를 이용하여
모델을 강화학습을 진행하겠습니다.
1. 사전에 필요한 모듈 및 토큰나이저를 불러옵니다.
from sklearn.metrics import accuracy_score, recall_score, precision_score, f1_score
from transformers import EarlyStoppingCallback, BertForSequenceClassification
import numpy as np
from kobert_tokenizer import KoBERTTokenizer
from datasets import Dataset
from transformers import TrainingArguments, Trainer
tokenizer = KoBERTTokenizer.from_pretrained('skt/kobert-base-v1', sp_model_kwargs={'nbest_size': -1, 'alpha': 0.6, 'enable_sampling': True})
model = BertForSequenceClassification.from_pretrained('skt/kobert-base-v1')
accuracy_score, recall_score, precision_score, f1_score
인공지능 성능 평가 지표 함수
EarlyStoppingCallback
학습이 최적화되었을 때 자동으로 종료하는 함수
BertForSequenceClassification
Bert 문장 분류 모델 다운로드 및 불러오는 함수
KoBERTTokenizer
KoBERT 토큰나이저 호출 함수
Dataset
데이터셋 로드 및 다운로드해주는 함수
TrainingArguments
학습시킬때의 하이퍼파라미터 및 Callback 함수를 지정할수있는 함수
Trainer
모델을 학습해주는 함수
*주의*
대표적으로 토큰나이저를 사용하는 방식은
tokenizer(sentence, padding="max_length", truncation=True, max_length= maxLength )
로 사용하지만 자신만의 tokenizer를 적용하고싶을때에는
별도의 tokenizer를 사용한 후
tokenizer.encode(sentence, padding="max_length", truncation=True, max_length= maxLength)
로 사용하셔야 합니다.
vocab에 저장되어 있는 단어와 숫자의 쌍이 다르다면 모델 학습에 악영향을 끼칩니다.
2. 데이터셋 로드 및 dataset 형식으로
def tokenize_function(raw):
contents = {
"text": [],
"input_ids": [],
"labels": []
}
for i in range(raw['labels'].__len__()):
contents["text"].append(str(raw["text"][i]))
contents["input_ids"].append(tokenizer.encode(str(raw["text"][i]), padding="max_length", truncation=True, max_length=500))
contents["labels"].append(raw["labels"][i])
train_dataset = Dataset.from_json('dataset2/trainDataset/train_dataset.json')
eval_dataset = Dataset.from_json('dataset2/testDataset/test_dataset.json')
train_tokenized_datasets = train_dataset.map(tokenize_function, batched=True)
eval_tokenized_datasets = eval_dataset.map(tokenize_function, batched=True)
train_dataset = train_tokenized_datasets.shuffle(seed=42)
eval_dataset = eval_tokenized_datasets.shuffle(seed=42)
Dataset.from_json
json 파일을 캐싱 및 로드합니다.
dataset.map(tokenize_function, batched=True)
기존 데이터셋의 문장을 숫자로 변환시킵니다.
tokenized_datasets.shuffle(seed=42)
데이터셋을 섞어줍니다.
3. 모델 학습하기
training_args = TrainingArguments(
load_best_model_at_end=True, #최적화되었을때 학습종료
output_dir="dataset/result", #저장 위치
evaluation_strategy="steps", # 평가 기준
save_strategy='steps', # 저장 기준
logging_strategy='epoch', #로그 기준
logging_steps=100, #step로그의 주기
auto_find_batch_size=True,#최적의 batch size 적용
push_to_hub=False, #허브에 공유 금지
metric_for_best_model='f1', #최적화의 기준을 정하는 점수를 f1으로 정함
eval_steps=50,#평가 step정하기
)
trainer = Trainer(
model=model,
args=training_args,
train_dataset=train_dataset,
eval_dataset=eval_dataset,
compute_metrics=compute_metrics,
callbacks = [EarlyStoppingCallback(early_stopping_patience=3)]
)
trainer.train()
위의 과정을 모두 거치면 모델이 정상적으로
학습을 진행하게 됩니다.
저도 지금 학습 완료하였으나
데이터부족 또는 비대칭 문제가 발생하여
추가적으로 학습을 진행하고 있는 단계입니다.
이로써 욕설 필터링 모델 제작 프로젝트는 한 달 락 끝났으며
앞으로 종종 실행이나 추가적인 사항을 포스팅하며 끝마치겠습니다.
여러분들도 한번 자신만의 인공지능을 제작하는 것을
도전해 보고 경험을 쌓으시면서 성장하시기 바랍니다!
'인공지능' 카테고리의 다른 글
데이터 전처리 과정 <2> | 반복 문자 정규화 (0) | 2025.03.01 |
---|---|
데이터 전처리 과정 <1> | 정규화 방식을 구상할 때 고려해야 할 점 (0) | 2025.02.24 |
인공지능을 이용한 딥러닝 욕설 필터링 모델 만들기 - 1번째 (전처리 단계) (0) | 2023.07.20 |
한국어 비속어 데이터셋 모음 + (비속어 정규식) (0) | 2023.07.20 |
강력한 음성변조 모델 RVC ai 사용하기 (환경설정 및 실행) (0) | 2023.07.09 |