I about me

Ch2. 텍스트 분류 본문

AI/NLP

Ch2. 텍스트 분류

ssungni 2024. 9. 9. 11:02

 

텍스트 분류

  • 고객 피드백을 여러 카테고리로 분류
  • 언어에 따라 고객 지원 요청 티켓을 전달 언어에 따라 그 요청을 적절한 담당자나 팀에 할당하는 과정 또는 시스템 기능
  • 이메일의 스팸 필터가 받음 메일함에서 정크 메일을 걸러냄
  • 텍스트의 감성분석 ex) 테슬라의 트위터 포스트 분석
  • 이 장에서는 BERT에 비견하는 DistilBERT를 사용함
    • DistilBERT는 BERT보다 파라미터를 줄였음에도, 성능이 꿀리지 않아 실제로 BERT를 실생활에서 이용할 때, 속도와 메모리 때문에 DistilBERT이 사용됨

1. 데이터셋 불러오기

  • load_dataset() 함수로 emotion 데이터셋을 로드함
from datasets import load_dataset
emotions = load_dataset('emotion')

2. Tokenizer를 활용하여 문자로 분리하기

 

 

  • 부분 단어 토큰화 기법을 활용하여 Tokenization
    • 트랜스포머는 사전 훈련된 모델에 연관된 토크나이저를 빠르게 로드하는 AutoTokenizer class를 제공함.
    • from_pretrained() method를 허브 모델 ID나 로컬 파일 경로와 함께 호출하면 됨.
from transformers import AutoTokenizer

model_ckpt = "distilbert-base-uncased"
tokenizer = AutoTokenizer.from_pretrained(model_ckpt)
  • tokenize 한 줄로 인코딩된 트윗을 input_ids로 반환하고, attention_mask 배열 리스트로 반환
    • 배치마다 입력 시퀀스는 배치에서 가장 긴 시퀀스 길이에 맞춰 패딩
    • 어텐션 마스크는 모델이 입력 텐서에서 패딩 영역을 무시하는데 사용

def tokenize(batch):
    return tokenizer(batch["text"], padding=True, truncation=True)
    
emotions_encoded = emotions.map(tokenize, batched=True, batch_size=None)
  • 전체 emotions 데이터셋을 적용하기 위해 map()함수를 사용
    • map(): 모든 샘플에 개별적으로 적용한다는 뜻
    • batched=True : 트윗을 배치로 인코딩
    • batch_size=None : 전체 데이터셋이 하나의 배치로 적용
emotions_encoded = emotions.map(tokenize, batched=True, batch_size=None)

3-1. 트랜스포머를 특성 추출기로 사용하기

사전 학습된 트랜스포머 모델의 내부 표현(특징)을 고정된 상태로 사용하고,

이 표현을 기반으로 새로운 작업에 필요한 모델을 훈련하는 방법

 

자세한 코드 설명은 https://regal-forgery-1e2.notion.site/Ch2-548cef7cb1e74f21bb30372b3e6007c8?pvs=4

 

 

결과적으로 anger와 fear는 sadness와 가장 많이 혼동됨.

또 love와 surprise는 joy로 많이 오인함

 

분류 성능을 높이기 위해 미세튜닝하는 방법을 살펴보겠음

 

3-2. 트랜스포머를 미세 튜닝하여 사용하기

사전 학습된 트랜스포머 모델을 새로운 작업에 맞게 재학습하는 방법

이때 모델의 모든 파라미터가 조정됨

 

자세한 코드 설명은 https://regal-forgery-1e2.notion.site/Ch2-548cef7cb1e74f21bb30372b3e6007c8?pvs=4

 

주 대각선 외에 는 거의 0에 가까워 매우 이상적인 것을 알 수 있음

 

 

'AI > NLP' 카테고리의 다른 글

Ch1. 트랜스포머 소개  (1) 2024.08.26