딥 러닝을 이용한 자연어 처리: KoBERT를 이용한 KorNLI 풀어보기 (다중 클래스 분류)

작성자: [조광형]

작성일: [날짜]

1. 서론

자연어 처리는 인간 언어를 컴퓨터가 이해하고 처리하는 기술로, 기계 번역, 감정 분석, 질문 응답 시스템 등 다양한 분야에 활용되고 있습니다. 특히 최근에는 딥 러닝 기술의 발전으로 인해 자연어 처리 분야에서도 많은 혁신이 일어나고 있습니다. 이 글에서는 KoBERT 모델을 이용하여 KorNLI 데이터셋을 활용한 다중 클래스 분류 문제를 깊이 있게 탐구하고자 합니다.

2. 자연어 처리와 딥 러닝

자연어 처리를 위해 딥 러닝 기술이 사용되는 이유는 다음과 같습니다. 첫째, 딥 러닝 모델은 대량의 데이터를 기반으로 학습할 수 있어, 언어의 복잡한 패턴을 학습하는 데 적합합니다. 둘째, 신경망 아키텍처는 다양한 데이터(텍스트, 이미지 등)를 통합하여 처리할 수 있는 능력이 있습니다. 마지막으로, 최근에는 Transformer 기반의 모델들이 자연어 처리 분야에서 매우 높은 성능을 보이고 있습니다.

3. KoBERT 소개

KoBERT는 한국어에 특화된 BERT(Bidirectional Encoder Representations from Transformers) 모델로, 한국어 데이터셋을 이용하여 사전 학습된 모델입니다. 이 모델은 한국어 자연어 처리 작업에서 높은 성능을 발휘하며, 다양한 하위 작업(감정 분석, 개체명 인식 등)에 쉽게 적용할 수 있습니다. KoBERT의 주요 특징은 다음과 같습니다:

  • 양방향 Transformer 구조를 기반으로 하여 문맥을 효과적으로 이해
  • 한국어 특성에 최적화된 토크나이저 사용
  • 다양한 자연어 처리 태스크에 대한 뛰어난 전이 학습 성능

4. KorNLI 데이터셋

KorNLI(Korean Natural Language Inference)는 한국어 자연어 추론(NLI) 데이터셋으로, 문장 쌍에 대한 관계를 다중 클래스(Entailment, Neutral, Contradiction)로 분류하는 태스크를 수행합니다. 이 데이터셋은 자연어 처리 모델의 추론 능력을 평가하는 데 적합합니다. KorNLI 데이터셋의 특징은 다음과 같습니다:

  • 총 50,000개의 문장 쌍으로 구성
  • 다양한 주제를 포함하고 있어 일반적인 자연어 추론 문제를 다양하게 다룸
  • 라벨은 Entailment, Neutral, Contradiction으로 구성

5. KoBERT를 활용한 KorNLI 모델 구축

5.1. 라이브러리 설치

모델을 구축하기 위해 필요한 라이브러리를 설치하겠습니다. 주로 PyTorch와 Hugging Face의 Transformers 라이브러리를 사용합니다.

!pip install torch torchvision transformers

5.2. 데이터 전처리

KorNLI 데이터셋을 로드하고, 적절한 형식으로 전처리하는 과정입니다. 문장 쌍을 입력으로 사용하고, 해당 레이블을 출력으로 할당해야 합니다.


import pandas as pd

# 데이터셋 로드
data = pd.read_csv('kornli_dataset.csv')

# 데이터 확인
print(data.head())
            

5.3. KoBERT 모델 정의

KoBERT 모델을 불러오고, 분류 작업을 위한 레이어를 추가합니다. 아래는 기본적인 모델 정의 코드입니다.


from transformers import BertTokenizer, BertForSequenceClassification

# 토크나이저와 모델 초기화
tokenizer = BertTokenizer.from_pretrained('monologg/kobert')
model = BertForSequenceClassification.from_pretrained('monologg/kobert', num_labels=3)
            

5.4. 모델 학습

모델 학습을 위해 PyTorch의 DataLoader를 사용하여 배치 단위로 데이터를 로드합니다. 이후 epochs 만큼 모델을 학습합니다.


from torch.utils.data import DataLoader, Dataset

class KorNliDataset(Dataset):
    def __init__(self, texts, labels, tokenizer, max_len):
        self.labels = labels
        self.texts = texts
        self.tokenizer = tokenizer
        self.max_len = max_len

    def __len__(self):
        return len(self.texts)

    def __getitem__(self, idx):
        text = self.texts[idx]
        label = self.labels[idx]

        encoding = self.tokenizer.encode_plus(
            text,
            add_special_tokens=True,
            max_length=self.max_len,
            return_token_type_ids=False,
            padding='max_length',
            return_attention_mask=True,
            return_tensors='pt',
            truncation=True
        )

        return {
            'input_ids': encoding['input_ids'].flatten(),
            'attention_mask': encoding['attention_mask'].flatten(),
            'labels': torch.tensor(label, dtype=torch.long)
        }

# DataLoader 정의
dataset = KorNliDataset(data['text'].values, data['label'].values, tokenizer, max_len=128)
dataloader = DataLoader(dataset, batch_size=16, shuffle=True)

# 옵티마이저 정의
optimizer = torch.optim.AdamW(model.parameters(), lr=2e-5)

# 모델 학습
model.train()
for epoch in range(epochs):
    for batch in dataloader:
        optimizer.zero_grad()
        outputs = model(
            input_ids=batch['input_ids'],
            attention_mask=batch['attention_mask'],
            labels=batch['labels']
        )
        loss = outputs.loss
        loss.backward()
        optimizer.step()
            

5.5. 모델 평가

학습된 모델의 성능을 평가하기 위해 검증 데이터를 사용합니다. accuracy와 같은 성능 지표를 사용할 수 있습니다.


model.eval()
predictions = []
true_labels = []

with torch.no_grad():
    for batch in validation_dataloader:
        outputs = model(
            input_ids=batch['input_ids'],
            attention_mask=batch['attention_mask']
        )

        preds = torch.argmax(outputs.logits, dim=1)
        predictions.extend(preds.numpy())
        true_labels.extend(batch['labels'].numpy())

# 정확도 계산
from sklearn.metrics import accuracy_score
accuracy = accuracy_score(true_labels, predictions)
print(f'Accuracy: {accuracy}')
            

6. 결론

KoBERT를 활용하여 KorNLI 데이터셋을 이용한 다중 클래스 분류 문제를 해결함으로써, 한국어 자연어 처리의 발전 가능성과 딥 러닝 기술의 효용성을 살펴보았습니다. 앞으로도 딥 러닝 기반 자연어 처리 기술의 발전은 더욱 가속화될 것이며, 다양한 분야에서의 응용이 기대됩니다.

참고 문헌

  • Devlin, J., Chang, M. W., Lee, K., & Toutanova, K. (2019). BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding.
  • Monologg, K. (2020). KoBERT: Korean BERT Model.
  • KorNLI Dataset. [Link to dataset]