허깅페이스 트렌스포머 활용강좌, 앙상블 트레이닝에 사용할 사전학습 BERT 불러오기

오늘은 딥러닝 모델 중에서 가장 많이 사용되는 BERT(Bidirectional Encoder Representations from Transformers) 모델을 활용하여 앙상블 트레이닝에 적용하는 방법을 배워보겠습니다. 이 과정에서는 허깅페이스(Hugging Face)의 Transformers 라이브러리를 사용하여 사전학습된 BERT 모델을 로드하고, 이를 기반으로 앙상블 모델을 구축하는 방법을 설명할 것입니다.

어떻게 BERT가 작동하는가?

BERT 모델은 문맥을 이해하기 위해 양방향으로 전이 학습을 수행하는 모델입니다. 즉, 입력 문장의 왼편과 오른편의 단어들이 문맥을 어떻게 형성하는지를 동시에 고려합니다. 이를 통해 단어의 의미를 더욱 깊이 있는 방식으로 이해할 수 있습니다. BERT는 unsupervised 방식으로 대량의 텍스트 데이터에서 사전학습을 진행한 후, 다양한 다운스트림 태스크에 적합하게 fine-tuning 할 수 있습니다.

허깅페이스 라이브러리 설치

허깅페이스 Transformers 라이브러리는 BERT와 같은 다양한 사전학습 모델을 쉽게 사용할 수 있도록 해줍니다. 라이브러리를 설치하기 위해서는 아래의 명령어를 실행하여 설치할 수 있습니다:

pip install transformers torch

사전학습된 BERT 모델 불러오기

이제 Hugging Face Transformers 라이브러리를 사용하여 사전학습된 BERT 모델을 불러오겠습니다. 아래의 코드는 BERT 모델과 토크나이저를 불러오는 간단한 코드입니다.


from transformers import BertTokenizer, BertModel

# BERT 토크나이저와 모델 불러오기
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertModel.from_pretrained('bert-base-uncased')

# 테스트 문장
text = "Hello, how are you?"
inputs = tokenizer(text, return_tensors='pt')

# BERT 모델에 입력하여 출력 받기
outputs = model(**inputs)
print(outputs)
    

코드 설명

  • from transformers import BertTokenizer, BertModel: 허깅페이스의 트랜스포머에서 BERT 토크나이저와 모델을 가져옵니다.
  • tokenizer = BertTokenizer.from_pretrained('bert-base-uncased'): 사전학습된 BERT 토크나이저를 불러옵니다.
  • model = BertModel.from_pretrained('bert-base-uncased'): 사전학습된 BERT 모델을 불러옵니다.
  • inputs = tokenizer(text, return_tensors='pt'): 입력 문장을 토큰화하고 PyTorch 텐서로 변환합니다.
  • outputs = model(**inputs): 모델에 입력하여 출력을 받습니다.

앙상블 트레이닝 개요

앙상블 학습은 여러 모델의 예측 결과를 조합하여 최종 예측 성능을 향상시키는 방법입니다. 다양한 학습 모델의 장점을 합쳐서 보다 신뢰할 수 있는 예측 결과를 얻을 수 있습니다. 일반적으로 앙상블 학습에는 여러가지 기법이 있을 수 있으며, Bagging과 Boosting 방식이 널리 사용됩니다.

BERT로 앙상블 모델 구성하기

이제 BERT 모델을 사용하여 앙상블 모델을 구성하는 방법을 살펴보겠습니다. 여러 개의 BERT 모델을 학습시키고, 그 예측 값을 합쳐서 최종 예측을 도출해 보겠습니다.

모델 개요

우리는 다음과 같은 구조로 앙상블 모델을 구성할 것입니다:

  • 여러 개의 BERT 모델을 생성하여 훈련
  • 각 모델의 예측 값을 수집
  • 예측 값을 결합하여 최종 예측 생성

데이터셋 준비

우리는 간단한 텍스트 분류 문제를 사용할 것입니다. 예를 들어, 이메일 스팸 필터링 등의 문제를 가정할 수 있습니다. 먼저, 아래와 같이 편리한 데이터셋을 준비합니다.


import pandas as pd

# 예시 데이터셋 생성
data = {'text': ["Free money now", "Hello friend, how are you?", "Limited time offer", "Nice to see you"],
        'label': [1, 0, 1, 0]}  # 1: 스팸, 0: 일반 메일
df = pd.DataFrame(data)
    

모델 학습 및 앙상블 수행

이제 각각의 BERT 모델을 학습시키도록 하겠습니다. 학습된 모델은 앙상블을 위해 저장됩니다.


from sklearn.model_selection import train_test_split
import torch

# 데이터 분할
train_texts, test_texts, train_labels, test_labels = train_test_split(df['text'], df['label'], test_size=0.2, random_state=42)

# BERT 모델을 위한 데이터 준비
train_encodings = tokenizer(list(train_texts), truncation=True, padding=True, return_tensors='pt')
test_encodings = tokenizer(list(test_texts), truncation=True, padding=True, return_tensors='pt')

class BERTClassifier(torch.nn.Module):
    def __init__(self):
        super(BERTClassifier, self).__init__()
        self.bert = BertModel.from_pretrained('bert-base-uncased')
        self.classifier = torch.nn.Linear(self.bert.config.hidden_size, 2)  # 2 클래스 (스팸, 비스팸)

    def forward(self, input_ids, attention_mask):
        output = self.bert(input_ids, attention_mask=attention_mask)[1]
        return self.classifier(output)

# 모델 및 옵티마이저 선언
model1 = BERTClassifier()
model2 = BERTClassifier()  # 두 번째 모델 예시
optimizer = torch.optim.Adam(model1.parameters(), lr=5e-5)

# 간단한 학습 루프
model1.train()
for epoch in range(3):  # 3번 에폭
    optimizer.zero_grad()
    outputs = model1(input_ids=train_encodings['input_ids'], attention_mask=train_encodings['attention_mask'])
    loss = torch.nn.CrossEntropyLoss()(outputs, torch.tensor(train_labels.values))
    loss.backward()
    optimizer.step()
    print(f'Epoch {epoch + 1}, Loss: {loss.item()}')
    # 동일한 방식으로 model2도 학습

# 모델 저장
torch.save(model1.state_dict(), 'bert_model1.pth')
torch.save(model2.state_dict(), 'bert_model2.pth')
    

예측 수행 및 앙상블 결과

모델 학습이 완료되면, 각 모델의 예측 결과를 결합하여 최종 예측 값도 생성할 수 있습니다.


# 예측 함수 정의
def predict(model, encodings):
    model.eval()
    with torch.no_grad():
        outputs = model(input_ids=encodings['input_ids'], attention_mask=encodings['attention_mask'])
    return torch.argmax(outputs, dim=1)

# 모델 로드
model1.load_state_dict(torch.load('bert_model1.pth'))
model2.load_state_dict(torch.load('bert_model2.pth'))

# 개별 모델 예측
preds_model1 = predict(model1, test_encodings)
preds_model2 = predict(model2, test_encodings)

# 앙상블 예측
final_preds = (preds_model1 + preds_model2) / 2
final_preds = (final_preds > 0.5).int()  # 0.5를 임계값으로 사용하여 이진 예측
print(f'최종 예측: {final_preds}')
    

결론

오늘은 허깅페이스 트렌스포머 라이브러리를 사용하여 사전학습된 BERT 모델을 불러오고, 이를 기반으로 간단한 앙상블 트레이닝 방법을 살펴보았습니다. BERT는 복잡한 자연어 처리 태스크에서 훌륭한 성능을 보이며, 앙상블 기법을 사용할 경우 더욱 향상된 성능을 기대할 수 있습니다. 앞으로 다양한 태스크에서도 이러한 기법을 적용하여 더 나은 결과를 만들어 보시기 바랍니다.

참고 자료

허깅페이스 트렌스포머 활용강좌, 소스 언어 M2M100 토크나이징

딥러닝의 발전과 함께 자연어 처리(NLP)는 큰 변화를 겪었습니다. 특히, 허깅페이스(Hugging Face)의 트랜스포머(transformers) 라이브러리는 NLP 작업을 위한 강력한 도구로 자리 잡았습니다. 이 강좌에서는 M2M100 모델을 활용한 다국어 번역 및 토크나이징 과정을 소개합니다.

M2M100 모델 개요

M2M100(Multilingual To Multilingual Translation) 모델은 100개 이상의 언어 간의 직접 번역을 지원하는 다국어 모델입니다. 기존의 번역 모델은 소스 언어에서 중간 언어(예: 영어)로 번역한 후 대상 언어로 변환하는 간접 번역 방식을 사용했습니다. M2M100은 이러한 한계를 극복하기 위해 다국어 간 변환을 가능하게 하여 다양한 언어 쌍 간의 번역 효율성을 크게 향상시킵니다.

토크나이징이란?

토크나이징(tokenization)은 입력된 텍스트를 더 작은 단위인 토큰(token)으로 나누는 과정입니다. 리스트 형식으로 변환한 후, 각각의 토큰에 대해 고유한 인덱스를 부여하게 됩니다. 토크나이징은 NLP에서는 필수적인 과정으로, 텍스트 데이터를 모델에 입력하기 전에 필요합니다.

환경 설정

강좌를 진행하기 전에 필요한 라이브러리를 설치해야 합니다. 특히 transformerstorch를 설치할 것입니다. 아래의 명령어로 설치할 수 있습니다:

        pip install transformers torch
    

토크나이저 불러오기

M2M100 모델에 대한 토크나이저를 불러오기 위해 transformers 라이브러리에서 제공하는 M2M100Tokenizer 클래스를 사용할 것입니다.

        
import torch
from transformers import M2M100Tokenizer

# M2M100 모델의 토크나이저 불러오기
tokenizer = M2M100Tokenizer.from_pretrained("facebook/m2m100_418M")
        
    

토크나이징 과정

이제 우리는 텍스트를 토크나이징할 준비가 되었습니다. 아래는 ‘안녕하세요, 여러분!’이라는 문장을 토크나이징하는 예시입니다.

        
# 입력 텍스트
text = "안녕하세요, 여러분!"

# 텍스트를 토크나이징
encoded_input = tokenizer(text, return_tensors="pt")

# 토큰과 인덱스 출력
print("토크나이즈된 토큰:", tokenizer.convert_ids_to_tokens(encoded_input['input_ids'][0]))
print("토큰 인덱스:", encoded_input['input_ids'])
        
    

토크나이징 결과

위 코드 실행 후 출력되는 결과는 입력된 텍스트가 어떻게 토크나이징되고 인덱스가 매겨졌는지 보여줍니다. convert_ids_to_tokens 메서드를 통해 토큰의 실제 값을 확인할 수 있습니다.

다국어 번역

토크나이징된 데이터를 사용하여 다국어 번역을 수행할 수 있습니다. M2M100 모델을 활용하여 한국어를 영어로 번역하는 예시를 보여드리겠습니다.

        
from transformers import M2M100ForConditionalGeneration

# M2M100 모델 불러오기
model = M2M100ForConditionalGeneration.from_pretrained("facebook/m2m100_418M")

# 한국어 텍스트
text = "안녕하세요, 여러분!"
encoded_input = tokenizer(text, return_tensors="pt")

# 번역
translated_tokens = model.generate(**encoded_input, forced_bos_token_id=tokenizer.get_lang_id("en"))

# 번역 결과
translated_text = tokenizer.batch_decode(translated_tokens, skip_special_tokens=True)
print("번역 결과:", translated_text[0])
        
    

번역 결과 해석

위 코드를 통해 한국어 문장이 영어로 잘 번역됐는지 확인할 수 있습니다. generate 메서드는 입력된 토큰 데이터를 기반으로 번역된 결과를 생성합니다.

결론

이번 강좌에서는 허깅페이스의 M2M100 모델을 활용하여 다국어 토크나이징 및 번역 과정에 대해 살펴보았습니다. 자연어 처리 분야의 발전은 앞으로도 계속될 것이며, 이러한 도구를 활용하여 보다 다양한 언어 간의 소통이 가능해질 것입니다. 앞으로도 NLP와 딥러닝에 대한 많은 관심과 연구가 지속되기를 바랍니다.

참고 자료

허깅페이스 트렌스포머 활용강좌, 샘플 이미지 데이터세트

최근 인공지능 및 딥러닝 분야에서 자연어 처리(NLP)와 컴퓨터 비전(CV) 분야 모두에서 허깅페이스(Hugging Face) 라이브러리가 널리 사용되고 있습니다. 이 글에서는 허깅페이스 트랜스포머 라이브러리를 활용하여 이미지 데이터셋을 어떻게 처리하고 모델을 학습할 수 있는지에 대해 설명하고, 예제 코드를 통해 구체적으로 알아보겠습니다.

1. 허깅페이스와 트랜스포머란?

허깅페이스는 자연어 처리와 관련된 다양한 미리 훈련된 모델을 제공하는 라이브러리로, BERT, GPT-2, T5와 같은 모델을 손쉽게 사용할 수 있습니다. 하지만 최근에는 이미지 처리 모델인 비전 트랜스포머(ViT), CLIP 등이 추가되어 컴퓨터 비전 작업에서도 강력한 성능을 발휘하고 있습니다.

2. 필요한 패키지 및 환경 설정

허깅페이스의 트랜스포머 라이브러리를 사용하기 위해서는 먼저 필요한 패키지를 설치해야 합니다. 아래의 코드로 간단히 설치할 수 있습니다.

pip install transformers torchvision torch

3. 샘플 이미지 데이터셋

이번 강좌에서는 CIFAR-10 데이터셋을 샘플 데이터로 사용합니다. CIFAR-10은 10개의 클래스(비행기, 자동차, 새, 고양이, 사슴, 개, 펭귄, 기차, 곰, 자동차)로 구성된 6만 개의 32×32 색상 이미지를 포함하고 있습니다. 이 데이터셋은 이미지 분류 문제에 매우 적합합니다.

3.1 데이터셋 불러오기

파이썬의 torchvision 라이브러리를 활용하여 CIFAR-10 데이터셋을 불러오고, 학습과 검증 세트로 나누어 보겠습니다.

import torchvision
import torchvision.transforms as transforms

# 데이터 변환 설정
transform = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)),
])

# 학습 및 검증 데이터셋 불러오기
trainset = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=4, shuffle=True, num_workers=2)

testset = torchvision.datasets.CIFAR10(root='./data', train=False, download=True, transform=transform)
testloader = torch.utils.data.DataLoader(testset, batch_size=4, shuffle=False, num_workers=2)

3.2 데이터 전처리

불러온 데이터셋은 이미지 데이터를 텐서 형태로 변환하고 정규화 과정을 거쳐야 합니다. 위의 코드에서는 ToTensor() 메서드를 사용하여 이미지를 텐서로 변환하고, Normalize() 메서드를 사용하여 평균과 표준편차를 기반으로 정규화를 수행했습니다.

4. 비전 트랜스포머(ViT) 모델 구축

이제 ViT 모델을 구축하여 CIFAR-10 데이터셋에 대한 이미지를 분류하는 작업을 진행하겠습니다. 모델 정의는 허깅페이스의 transformers 라이브러리를 통해 간단하게 구현할 수 있습니다.

from transformers import ViTForImageClassification, ViTFeatureExtractor

# ViT 모델과 feature extractor 초기화
feature_extractor = ViTFeatureExtractor.from_pretrained('google/vit-base-patch16-224')
model = ViTForImageClassification.from_pretrained('google/vit-base-patch16-224', num_labels=10)

위 코드는 비전 트랜스포머 모델을 초기화하는 과정으로, `num_labels` 매개변수는 클래스 수를 설정하는 데 사용됩니다. 여기서는 10개의 클래스를 가지고 있으므로 해당 값으로 설정하였습니다.

5. 모델 학습

모델을 학습하기 위해서는 손실 함수 및 최적화 알고리즘을 정의해야 합니다. 여기서는 CrossEntropyLoss 손실 함수를 사용하고, Adam 옵티마이저를 사용할 것입니다.

import torch.optim as optim

# 손실 함수 및 최적화 알고리즘 정의
criterion = torch.nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)

# 모델을 학습할 장치 설정
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model.to(device)

# 모델 학습
for epoch in range(10):  # 10 에폭 동안 학습
    running_loss = 0.0
    for i, data in enumerate(trainloader, 0):
        inputs, labels = data
        inputs, labels = inputs.to(device), labels.to(device)

        # 기울기 초기화
        optimizer.zero_grad()

        # 순 forward + 역전파 + 최적화
        outputs = model(inputs).logits
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()

        running_loss += loss.item()
        if i % 2000 == 1999:  # 매 2000 미니배치마다 출력
            print(f"[{epoch + 1}, {i + 1}] loss: {running_loss / 2000:.3f}")
            running_loss = 0.0

위 코드는 에폭 수와 미니배치에 따라 모델을 학습하는 과정입니다. 각 배치에 대한 손실을 계산하고, 역전파를 통해 가중치를 업데이트하는 방식으로 진행합니다.

6. 모델 평가

학습이 완료된 모델을 평가하기 위해 테스트 데이터셋을 사용하겠습니다. 모델의 정확도를 평가하는 방법은 다음과 같습니다.

correct = 0
total = 0

with torch.no_grad():
    for data in testloader:
        images, labels = data
        images, labels = images.to(device), labels.to(device)
        outputs = model(images).logits
        _, predicted = torch.max(outputs.data, 1)
        total += labels.size(0)
        correct += (predicted == labels).sum().item()

print(f'Accuracy of the network on the 10000 test images: {100 * correct / total:.2f}%')

위 코드는 테스트 데이터셋에서 모델의 정확도를 계산하는 과정입니다. 각 이미지에 대해 예측값과 실제 라벨을 비교하여 정확도를 산출합니다.

7. 결론

이번 글에서는 허깅페이스의 트랜스포머 라이브러리를 활용하여 CIFAR-10 데이터를 처리하고, 비전 트랜스포머 모델을 구축하여 이미지를 분류하는 방법을 알아보았습니다. 허깅페이스의 라이브러리를 사용하면 복잡한 모델을 손쉽게 구축하고, 다양한 데이터셋을 활용하여 성능을 최적화할 수 있습니다. 앞으로 더 다양한 모델과 데이터셋을 활용한 딥러닝 적용 사례를 계속 탐구해보시길 바랍니다.

문의 및 추가 정보가 필요하신 경우 댓글로 남겨주시면 감사하겠습니다.

허깅페이스 트렌스포머 활용강좌, 사전학습 모델 불러오기

1. 소개

딥러닝의 발전은 자연어 처리(NLP) 분야에서 특히 눈부신 성과를 이룩해왔습니다. 이러한 발전의 중심에는
사전학습 모델이 있습니다. 허깅페이스(Hugging Face)는 이러한 사전학습 모델을 보다 쉽게 사용할 수 있도록
해주는 강력한 라이브러리인 Transformers를 제공합니다. 본 강좌에서는 허깅페이스의
Transformers 라이브러리를 사용하여 사전학습 모델을 불러오는 방법에 대해 자세히 알아보겠습니다.

2. 허깅페이스 Transformers 라이브러리란?

허깅페이스 Transformers 라이브러리는 다양한 자연어 처리(NLP) 모델을 제공하는 라이브러리로,
BERT, GPT, RoBERTa, T5
여러 모델을 포함하고 있습니다. 이 라이브러리를 통해 개발자는 손쉽게 사전학습된 언어 모델을 로드하고
이를 기반으로 다양한 NLP 작업을 수행할 수 있습니다.

3. 환경 설정

시작하기 전에 필요한 라이브러리를 설치해야 합니다. 아래의 명령어를 통해 기본적인 라이브러리를
설치할 수 있습니다.

pip install transformers torch

여기서, transformers는 허깅페이스 라이브러리이며, torch
PyTorch 프레임워크입니다. PyTorch 대신 TensorFlow를 사용하고 싶다면 TensorFlow를 설치하면 됩니다.

4. 사전학습 모델 불러오기

이제 사전학습된 모델을 불러와 보겠습니다. 예를 들어, BERT 모델을 이용하여
텍스트의 의미를 이해할 수 있습니다. 아래는 Python 코드를 통해 BERT 모델을 불러오는 방법입니다.

from transformers import BertTokenizer, BertModel

# BERT 모델의 토크나이저와 모델을 불러오기
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertModel.from_pretrained('bert-base-uncased')

# 예제 문장
sentence = "Hugging Face is creating a tool that democratizes AI."

# 문장을 토큰화하여 입력 벡터로 변환
inputs = tokenizer(sentence, return_tensors='pt')
outputs = model(**inputs)

# 출력 결과 확인
print(outputs)

위 코드에서 BertTokenizer 클래스는 입력된 문장을 BERT 모델이 이해할 수 있는
형태로 변환합니다. BertModel 클래스는 실제 모델을 불러오고, 변환된
입력을 모델에 통과시켜 출력을 생성합니다.

5. 출력 결과 분석

위의 코드에서 출력되는 outputs 변수는 두 가지 주요 정보를 포함하고 있습니다:

  • last_hidden_state: 마지막 은닉 상태(hidden state)로, 각 토큰의 벡터 표현을 보여줍니다.
  • pooler_output: 입력 시퀀스의 전체를 요약한 벡터로, 주로 분류 작업에 사용됩니다.

각 토큰의 벡터 표현은 자연어 처리를 위한 매우 유용한 정보입니다. 각 토큰에 대해 출력된
은닉 상태는 아래와 같이 접근할 수 있습니다.

# 마지막 은닉 상태 접근
hidden_states = outputs.last_hidden_state
print(hidden_states.shape)  # (배치 크기, 시퀀스 길이, 숨겨진 차원)

6. 다양한 사전학습 모델 사용하기

허깅페이스는 BERT 외에도 여러 다른 모델을 지원합니다. 사용자가 다양한 작업에 적합한
모델을 선택할 수 있도록 여러 모델을 제공합니다. GPT-2, RoBERTa,
T5 등 각 모델의 사용법은 대동소이합니다. 예를 들어, GPT-2 모델을
사용하고자 할 경우, 아래와 같은 방법으로 불러올 수 있습니다.

from transformers import GPT2Tokenizer, GPT2Model

# GPT-2 모델의 토크나이저와 모델을 불러오기
tokenizer = GPT2Tokenizer.from_pretrained('gpt2')
model = GPT2Model.from_pretrained('gpt2')

# 예제 문장
sentence = "Hugging Face has become a leader in NLP."

# 문장을 토큰화하여 입력 벡터로 변환
inputs = tokenizer(sentence, return_tensors='pt')
outputs = model(**inputs)

print(outputs)

7. 직접 모델 학습하기

사전학습된 모델을 가져오는 것뿐만 아니라, 사용자는 자신의 데이터셋에 맞춰 모델을 미세 조정할
수도 있습니다. 이 과정은 아래의 단계를 통해 진행됩니다:

  1. 데이터 준비 및 전처리
  2. 사전학습된 모델 불러오기
  3. 학습을 위한 손실 함수 및 옵티마이저 설정
  4. 모델 학습

7.1 데이터 준비 및 전처리

데이터는 CSV 파일 등의 형식으로 준비할 수 있으며, 이를 불러와 전처리하는 일련의 과정이 필요합니다.

import pandas as pd

# 데이터셋 불러오기
data = pd.read_csv('data.csv')
print(data.head())  # 데이터셋의 첫 5행 확인

7.2 사전학습된 모델 불러오기

위에서 설명한 방식으로 모델을 불러오면 됩니다.

7.3 손실 함수 및 옵티마이저 설정

모델 학습을 위해서는 손실 함수와 옵티마이저를 설정해야 합니다. 예를 들면,
AdamW 옵티마이저와 CrossEntropyLoss 손실 함수를 사용할 수 있습니다.

from transformers import AdamW

optimizer = AdamW(model.parameters(), lr=5e-5)  # 학습률 설정
loss_fn = torch.nn.CrossEntropyLoss()

7.4 모델 학습

전처리된 데이터와 설정된 손실 함수 및 옵티마이저를 이용하여 모델을 학습시킬 수 있습니다.
일반적으로 에폭을 설정하고 이를 반복하여 모델을 최적화합니다.

for epoch in range(num_epochs):
    model.train()
    outputs = model(**inputs)  # 모델의 출력
    loss = loss_fn(outputs, labels)  # 손실 계산
    loss.backward()  # 역전파
    optimizer.step()  # 가중치 업데이트
    optimizer.zero_grad()  # 기울기 초기화

8. 결론

본 강좌를 통해 허깅페이스의 Transformers 라이브러리를 활용하여 사전학습 모델을 불러오고,
또 이를 기반으로 다양한 작업을 수행할 수 있는 방법에 대해 알아보았습니다. 이 라이브러리는
자연어 처리 분야에서 강력한 도구가 되며, 특히 일정한 데이터셋과 평소의 손쉬운 API를 통해
모델을 활용할 수 있도록 돕습니다. 이제 여러분은 허깅페이스의 트렌스포머를 통해
자신의 프로젝트에 활용할 수 있는 능력을 갖추었습니다.

이 글은 허깅페이스 트렌스포머를 이용한 딥러닝 강좌의 일부입니다. 더 많은 강좌를 원하시면
관련 자료를 두고 학습하시기 바랍니다.

허깅페이스 트렌스포머 활용강좌, 분류 정확도

딥러닝과 자연어 처리(NLP)의 발전은 오늘날의 기술 혁신을 이끄는 중요한 요소 중 하나입니다. 여러 라이브러리와 프레임워크가 존재하지만, 허깅페이스(Hugging Face)트랜스포머(transformers) 라이브러리는 특히 직관적이고 사용하기 쉽게 설계되어 있습니다. 본 글에서는 허깅페이스의 트랜스포머를 활용하여 문서 분류(Classification) 모델을 구축하고, 모델 성능을 평가하는 방법에 대해 다룰 것입니다.

1. 허깅페이스 트랜스포머란?

허깅페이스 트랜스포머 라이브러리는 다양한 모델 아키텍처를 지원하며, Pre-trained 모델을 쉽게 사용할 수 있도록 해줍니다. 트랜스포머는 자연어 처리에 혁신을 일으킨 모델로, Attention Mechanism을 기반으로 하고 있습니다. 이 모델들은 대규모 데이터셋으로 사전 학습되어, 특정 작업에 대해 미세 조정(Fine-tuning)하여 사용할 수 있습니다.

2. 필요한 라이브러리 설치하기

허깅페이스 트랜스포머를 사용하기 위해 필요한 라이브러리를 설치하겠습니다. 주로 사용할 라이브러리는 transformers, torch, datasets입니다. 다음의 명령어를 사용하여 설치하세요:

!pip install transformers torch datasets

3. 데이터셋 준비하기

문서 분류를 위해 사용할 데이터셋을 준비합니다. 여기서는 AG News 데이터셋을 사용할 것입니다. AG News는 뉴스 기사 분류를 위한 데이터셋으로, 4개의 클래스를 갖고 있습니다:

  • World
  • Sports
  • Business
  • Science/Technology

다음의 코드를 실행하면 데이터셋을 다운로드받고, 학습 및 테스트 데이터로 나눕니다.

from datasets import load_dataset

dataset = load_dataset("ag_news")

4. 데이터 전처리

데이터를 불러온 후에는 텍스트와 레이블을 분리하고, 필요한 전처리를 진행해야 합니다. 다음 코드는 샘플 데이터와 라벨을 확인하는 과정을 보여줍니다.

train_texts = dataset['train']['text']
train_labels = dataset['train']['label']

test_texts = dataset['test']['text']
test_labels = dataset['test']['label']

print("샘플 뉴스 기사:", train_texts[0])
print("라벨:", train_labels[0])

5. 모델 및 토크나이저 준비하기

이제 transformers 라이브러리를 통해 사전 학습된 모델과 토크나이저를 불러옵니다. 여기서는 BertForSequenceClassification 모델을 사용할 것입니다.

from transformers import BertTokenizer, BertForSequenceClassification

model_name = "bert-base-uncased"
tokenizer = BertTokenizer.from_pretrained(model_name)
model = BertForSequenceClassification.from_pretrained(model_name, num_labels=4)

6. 데이터 토큰화

문서 분류를 위해 각 텍스트를 BERT 모델에 맞게 토큰화합니다. 다음 코드에서는 Padding을 추가해 배치 처리에 용이하도록 만듭니다.

def tokenize_function(examples):
    return tokenizer(examples["text"], padding="max_length", truncation=True)

tokenized_datasets = dataset.map(tokenize_function, batched=True)

7. 모델 학습하기

모델을 학습하기 위해 Trainer 클래스를 사용합니다. Trainer는 학습 및 평가를 자동으로 처리해 줍니다. 다음 코드는 설정 및 학습을 위한 준비 과정을 포함합니다.

from transformers import Trainer, TrainingArguments

training_args = TrainingArguments(
    output_dir="./results",
    evaluation_strategy="epoch",
    learning_rate=2e-5,
    per_device_train_batch_size=16,
    per_device_eval_batch_size=16,
    num_train_epochs=3,
    weight_decay=0.01,
)

trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=tokenized_datasets['train'],
    eval_dataset=tokenized_datasets['test']
)

trainer.train()

8. 모델 평가하기

모델 학습이 완료되면, 평가 함수를 통해 성능을 측정할 수 있습니다. metrics 라이브러리를 활용하여 정확도를 계산해보겠습니다.

import numpy as np
from sklearn.metrics import accuracy_score

predictions, label_ids, _ = trainer.predict(tokenized_datasets['test'])
preds = np.argmax(predictions, axis=1)

accuracy = accuracy_score(label_ids, preds)
print("분류 정확도:", accuracy)

9. 결론

허깅페이스 트랜스포머를 사용하여 데이터셋을 불러오고, 사전 학습된 모델을 활용하여 텍스트 분류를 수행하는 방법을 알아보았습니다. 이 과정을 통해 자연어 처리 작업에서 트랜스포머 모델의 유용성을 알 수 있었습니다. 추가적으로 Hyperparameter 튜닝이나 다양한 모델을 시도해보면 성능을 더욱 향상시킬 수 있습니다.

10. 참고 자료

더 많은 정보와 예제를 원하는 독자를 위해 다음의 자료를 추천합니다: