과제(Task)에 상관없이 공통으로 적용됩니다.
# 설정값 선언
from ratsnlp.nlpbook.classification import ClassificationTrainArguments
# rstsnlp: 실습 진행용 오픈소스 파이썬 패키지 → 다운로트 툴킷으로 사용
# github.com/ratsgo/ratsnlp
args = ClassificationTrainArguments(
pretrained_model_name="beomi/kcbert-base"
, downstream_corpus_name="nsmc"
, downstream_corpus_root_dir="/content/Korpora"
, downstream_model_dir="/gdrive/My Drive/nlpbook/checkpoint-doccls"
, learning_rate=5e-5
, batch_size=32
,
)
# 데이터 다운로드
from Korpora import Korpora
# 코포라(Korpora): 오픈소스 파이썬 패키지. 다양한 한국어 말뭉치를 쉽게 내려받고 전처리할 수 있음
# github.com/ko-nlp/korpora
Kopora.fetch(
corpus_name=args.downstream_corpus_name
, root_dir=args.downstream_corpus_root_dir
, force_download=True
)
# kcbert-base 모델 준비
from transformers import BertConfig, BertForSequenceClassification
pretrained_model_config = BertConfig.from_pretrained(
args.pretrained_model_name # kcbert-base 모델(github.com/Beomi/KcBERT)를 준비
, num_labels=2
,
)
model = BertForSequenceClassification.from_pretrained(
args.pretrained_model_name
, config=pretrained_model_config
,
)
# kcgert-base가 로컬 저장소에 없으면 자동으로 내려받고, 있으면 캐시 디렉터리에서 읽어옴
# kcbert-base 토크나이저 준비
from transformers import BertTokenizer
tokenizer = BertTokenizer.from_pretrained(
args.pretrained_model_name
, do_lower_case=False
,
)
# 토크나이저 관련 파일이 로컬 저장소에 없으면 자동으로 내려받고, 있으면 캐시에서 읽어옴
데이터 로더(DataLoader) 준비하기
파이토치(PyTorch)에 포함되어 있음
파이토치로 딥러닝 모델을 만드려면 데이터 로더를 반드시 정의해야 함
데이터를 배치(batch) 단위로 모델에 밀어 넣어주는 역할
데이터셋(dataset): 데이터 로더의 구성 요소 가운데 하나
데이터 로더가 배치를 만들 때 인스턴스를 뽑는 방식은 파이토치 사용자가 자유롭게 정할 수 있음


배치는 그 모양이 고정적이어야 할 때가 많음 == 동일한 배치에 있는 문장들의 토큰(input_ids) 개수가 같아야 함

컬레이트(collate): 배치의 모양 등을 정비해 모델의 최종 입력으로 만들어 주는 과정
# 문서 분류 데이터 로더 선언
from ratsnlp import nlpbook
from torch.utils.data import DataLoader, RandomSampler
from ratsnlp.nlpbook.classification import NsmcCorpus, ClassificationDataset
corpus = NsmcCorpus()
train_dataset = ClassificationDataset(
args=args
. corpus=corpus
. tokenizer=tokenizer
. mode="train"
,
)
train_dataloader = DataLoader(
train_dataset
, batch_size=args.batch_size
, sampler=RandomSampler(
train_dataset
, replacement=False
)
, collate_fn=nlpbook.data_collator
, drop_last=False
, num_workers=args.cpu_workers
,
)
첵에서 다루는 자연어 처리 모델의 입력은 토큰 시퀀스로 분석된 자연어, 더 정확하게는 각 토큰이 그에 해당하는 정수(integer)로 변환된 형태
즉, 자연어 처리 모델은 계산 가능한 형태 == 숫자 입력을 받는다!
인덱싱(indexing): 각 토큰을 그에 해당하는 정수로 변환하는 과정
인덱싱은 보통 토크나이저가 토큰화와 함꼐 수행
용어 “인덱싱(indexing)”은 상황과 분야에 따라 다르게 쓰임
- 파이썬 문법에서의 인덱싱:
- 리스트나 문자열 등에서 특정 위치의 값을 추출하는 작업
- 예:
my_list[0]처럼 대괄호로 위치(인덱스)를 지정해 값을 가져오는 것- 자연어 처리(NLP) 모델에서의 인덱싱:
- 각 토큰(단어, subword 등)을 고유한 정수(ID)로 변환하는 과정
- 예:
tokenizer.encode("고양이")를 하면"고양이" → [1023]같이 숫자 인덱스로 변환됨
- 이 과정은 토큰화(tokenization) 이후, 딥러닝 모델이 텍스트가 아닌 수치 데이터를 다루기 위해 필수적으로 이뤄짐
- 정리하면:
- 같은 “인덱싱”이라는 말이더라도 상황마다 의미가 다름
- 프로그래밍 언어에서는 “데이터의 특정 위치를 참조”하는 것,
- NLP에서는 “토큰을 고유한 정수 인덱스(ID)로 변환”하는 것을 각각 지칭 → NLP 맥락에서 “인덱싱”은 주로 모델 입력 전/후 정수 인덱스로의 매핑 작업을 의미

GPU(Graphic Processing Unit)
: 그래픽 연산을 빠르게 처리하는 장치
병렬 연산을 잘 해서 딥러닝 모델 학습에 널리 쓰임
cf. TPU(Tensor Processing Unit)
: 텐서 처리 장치
구글에서 발표한 데이터 분석 및 딥러닝용 하드웨어
# 문서 분류 모델 학습
from ratsnlp.nlpbook.classification import ClassificationTask
task = ClassificationTask(model, args)
trainer = nlpbook.get_trainer(args)
trainer.fit(
task
, train_dataloaders=train_dataloader
,
)
예시:
데이터aaabdaaabac
↓
BPE는 데이터에 등장한 글자(a,b,c,d)를 초기 사전으로 구성
↓
연속된 두 글자를 한 글자로 병합
ZabdZabac
↓
한 번 더 압축 가능: ab(Za도 가능하지만 둘의 빈도수가 같으므로 알파벳 순으로 앞선 ab를 먼저 병합)
ZYdZYac
↓
ZY 역시 병합 가능: 이미 병합된 문자열 역시 한 번 더 병합할 수 있음
XdXac
- BPE 수행 이전
- 원래 데이터를 표현하기 위한 사전 크기: 4개(a,b,c,d)
- 데이터 길이: 11
- BPE 수행 후
- 사전 크기: 7개(a,b,c,d,Z,Y,X)
- 데이터 길이: 5
- BPE는 사전의 크기를 지나치게 늘리지 않으면서도 데이터 길이를 효율적으로 압축할 수 있음
| 토큰 | 빈도 |
|---|---|
| hug | 10 |
| pug | 5 |
| pun | 12 |
| bun | 4 |
| hugs | 5 |
| 토큰 | 빈도 |
|---|---|
| h,u,g | 10 |
| p,u,g | 5 |
| p,u,n | 12 |
| b,u,n | 4 |
| h,u,g,s | 5 |
| 토큰 | 빈도 |
|---|---|
| h,u | 10 |
| u,g | 10 |
| p,u | 5 |
| u,g | 5 |
| p,u | 12 |
| u,n | 12 |
| b,u | 4 |
| u,n | 4 |
| h,u | 5 |
| u,g | 5 |
| g,s | 5 |
| 토큰 | 빈도 |
|---|---|
| h,u | 15 |
| u,g | 20 |
| p,u | 17 |
| u,n | 16 |
| b,u | 4 |
| g,s | 5 |
ug| 토큰 | 빈도 |
|---|---|
| h,ug | 10 |
| p,ug | 5 |
| p,u,n | 12 |
| b,u,n | 4 |
| h,ug,s | 5 |
| 토큰 | 빈도 |
|---|---|
| b,u | 4 |
| h,ug | 15 |
| p,u | 12 |
| p,ug | 5 |
| u,n | 16 |
| ug,s | 5 |
un| 토큰 | 빈도 |
|---|---|
| h,ug | 10 |
| p,ug | 5 |
| p,un | 12 |
| b,un | 4 |
| h,ug,s | 5 |
| 토큰 | 빈도 |
|---|---|
| b,un | 4 |
| h,ug | 15 |
| p,ug | 5 |
| p,un | 12 |
| ug,s | 5 |
hug사용자가 정한 크기가 될 때까지 위 과정을 계속 반복: BPE 어휘 집합은 고빈도 바이그램 쌍을 병합하는 방식으로 구축
hug)는 vocab.json 파일로 저장merge.txt 자료로 만들어 BPE 토큰화 과정에서 서브워드 병합 우선순위를 정하는 데 사용