인공지능

인공지능을 이용한 딥러닝 욕설 필터링 모델 만들기 - 2번째 (학습 단계)

yjlee06 2023. 7. 22. 00:27
반응형

저번 포스팅에서 설치했던 라이브러리를 이용하여

모델을 강화학습을 진행하겠습니다.

 

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()

위의 과정을 모두 거치면 모델이 정상적으로

학습을 진행하게 됩니다.

 

저도 지금 학습 완료하였으나

데이터부족 또는 비대칭 문제가 발생하여

추가적으로 학습을 진행하고 있는 단계입니다.

 

이로써 욕설 필터링 모델 제작 프로젝트는 한 달 락 끝났으며

앞으로 종종 실행이나 추가적인 사항을 포스팅하며 끝마치겠습니다.

 

여러분들도 한번 자신만의 인공지능을 제작하는 것을

도전해 보고 경험을 쌓으시면서 성장하시기 바랍니다!