




→ 인코더로부터 정보를 전달받아 디코더가 출력 결과를 만들어내는 구조: 디코더는 시작 심볼 <sos>를 입력으로 받아 종료 심볼 <eos>가 나올 때까지 연산을 진행
기존의 seq2seq 모델 → 인코더-디코더 구조로 구성
인코더: 입력 시퀀스를 하나의 벡터 표현으로 압축 / 디코더: 벡터 표현을 통해서 출력 시퀀스를 생성
단점 → 인코더가 입력 시퀀스를 하나의 벡터로 압축하는 과정에서 입력 시퀀스의 정보가 일부 손실된다
이를 보정하기 위해 어텐션을 사용 → 그런데 어텐션을 RNN의 보정을 위한 용도로서 사용하는 것이 아니라 어텐션만으로 인코더와 디코더를 만들어보면 어떨까요? == "Transformar 모델"
※주의: 용어 헷갈리지 말기※ hugging face의 transformers 라이브러리와 Transformer 모델은 서로 다름
dropnadata[data["document"].str.strip() != '']checkpoint = "monologg/kobert")데이터 콜레이터(Data Collator)는 모델에 데이터를 배치(batch) 형태로 전달하기 전에 여러 샘플을 묶어서 전처리(결합, 패딩 등)를 자동으로 해주는 함수 또는 객체입니다.
핵심 역할
- 여러 개의 샘플을 하나의 배치로 묶음
예를 들어, 길이가 서로 다른 텍스트 시퀀스들이 있을 때 하나의 배치로 만들기 위해 패딩 등을 적용합니다.- 패딩 자동 처리
NLP에서는 시퀀스 길이가 다르기 때문에 모델에 입력하기 전에 가장 긴 시퀀스에 맞춰 나머지 데이터를pad값으로 채워줍니다.- 특정 입력 포맷(예: 딕셔너리 형태)로 가공
각 샘플에 포함된 토큰, 마스크, 레이블 등 다양한 정보를 올바른 방식으로 배치 단위로 묶어줍니다.- 추가적인 샘플링, 마스킹, 텍스트 변형 등 커스텀 전처리 지원
Masked Language Modeling(MLM)처럼 일부 토큰을 마스킹해야 할 때도 데이터 콜레이터에서 처리할 수 있습니다.실제 예시
DataLoader에서 보통
collate_fn이라는 인자로 사용됩니다.from torch.utils.data import DataLoader dataloader = DataLoader(dataset, batch_size=32, collate_fn=custom_data_collator)
- Transformers 라이브러리에서는
DataCollatorWithPadding,DataCollatorForSeq2Seq등 다양한 데이터 콜레이터 클래스를 제공합니다.- 직접 작성하는 경우도 많고, 기본 collator를 그대로 쓰기도 합니다.
요약
데이터 콜레이터는 배치 구성 전 데이터를 "자동으로 같은 길이와 같은 포맷"으로 묶어주는 역할을 합니다.
이를 통해 서로 다른 길이의 데이터를 자연스럽게 배치화해서, 모델이 쉽게 학습·추론할 수 있도록 만들어줍니다.
DataCollator를 사용하여 배치 내에서 동적 패딩을 할 계획이라면, 토크나이저 호출 시에 tokenize_function에 padding 옵션을 넣지 않아도 됩니다.
이유는 DataCollatorWithPadding이 배치별로 가장 긴 길이에 맞춰 동적으로 패딩을 처리해 주기 때문입니다. 만약 토큰화 단계에서 고정 길이 패딩(max_length로)까지 했다가 DataCollator에서도 패딩을 하게 되면 중복 작업이 되고 효율이 떨어질 수 있습니다.
즉, 추천하는 워크플로우는:
- 토크나이즈 시:
truncation=True,max_length=512만 지정하고,padding은 지정하지 않음 (기본값 False).- DataCollatorWithPadding 사용 시:
배치 사이즈마다 가장 긴 시퀀스 길이에 맞춰 자동 패딩 처리.- 예시:
def tokenize_function(batch): texts = [text.strip() for text in batch["item"]] enc = tokenizer(texts, truncation=True, max_length=512) # padding 옵션 없음 enc["labels"] = [float(label) for label in batch["label"]] return enc from transformers import DataCollatorWithPadding data_collator = DataCollatorWithPadding(tokenizer=tokenizer)이렇게 하면, 데이터로더에
data_collator를 넣을 때마다 적절한 패딩이 동적으로 적용되어 효율적인 배치 구성이 가능합니다.
요약:
토크나이저에 padding 주지 않아도 됨
(DataCollatorWithPadding이 배치별 패딩을 담당함)
→ 이 방법이 Hugging Face Transformer 기반 학습 파이프라인에서 일반적으로 권장되는 방식입니다.
AutoTokenizer를 쓰면 됨KoBERT와 동일하게 허깅페이스 AutoTokenizer, AutoModelForSequenceClassification 사용
# 사용할 모델
checkpoint = "monologg/koelectra-small-v2-discriminator"
# 라이브러리 불러오기: KoELECTRA 모델을 위한 토큰화 작업
from transformers import AutoTokenizer
# 1. KoELECTRA 모델의 토큰화 도구 불러오기 (모델 체크포인트 기반 토크나이저 불러오기)
tokenizer = AutoTokenizer.from_pretrained(checkpoint)
# 1-a. 토큰화 함수 생성: 파라미터는 BERT와 동일하게 설정
# 함수는 데이터셋에 한 줄씩 적용하기 위해 만들었음
def tokenizer_function (example):
return tokenizer(
example["document"] # 데이터셋
, max_length = 128 # 문장의 최대 길이 지정
, padding = "max_length" # 최대 길이보다 짧을 경우 → 0으로 패딩
, truncation = True # 최대 길이보다 길 경우 → 잘라주세요
)
# 1-b. 토큰화 수행 (토크나이저 적용)
train_dataset = train_dataset.map( # map이 인덱싱(한 줄씩 가져옴) 후 토큰화
tokenizer_function
, batched=True
)
val_dataset = val_dataset.map(tokenizer_function, batched=True)
map 함수 활용)from transformers import AutoModelForSequenceClassification
# 2. 모델 불러오기
model = AutoModelForSequenceClassification.from_pretrained(checkpoint, num_labels=2)
AutoModelForSequenceClassification.from_pretrained() 함수로 분류 모델 불러오기num_labels=2)하여 분류 작업에 맞춤padding="max_length"로 줬다면 DataCollatorWithPadding 의미가 없음padding=True로 준 후 collator 사용하기padding=True로 주면 DataCollatorWithPadding에서 각 배치(list)를 모델이 바로 입력(input)할 수 있는 텐서 형태의 딕셔너리로 바꿈: 가장 긴 문장에 맞춰 padding# 3~5
# 콜레이터, 파라미터, 학습 도구 불러오기
from transformers import DataCollatorWithPadding
from transformers import TrainingArguments
from transformers import Trainer
# 콜레이터
data_collator = DataCollatorWithPadding(tokenizer=tokenizer)
# 학습 파라미터 설정: BERT와 동일하게 사용
training_args = TrainingArguments(
output_dir='./results/koelectra_naver' # ★★★★경로변경 필수★★★★
, learning_rate=2e-5
, weight_decay=0.01
, per_device_train_batch_size=16
, per_device_eval_batch_size=16
, num_train_epochs=1
, eval_strategy="epoch"
, save_strategy="epoch"
, load_best_model_at_end=True
)
# 모델 학습 객체 생성
trainer = Trainer(
model=model # 모델
, args=training_args
, train_dataset=train_dataset
, eval_dataset=val_dataset
, data_collator=data_collator
, # tokenizer는 이미 해서 collater에 묶었기 때문에 생략
)
# 모델 학습
trainer.train()

train() 함수 호출로 학습 진행 및 결과 확인wandb 설정(API key 입력) 및 학습 과정 모니터링핵심 개념:
한국어 감성 분석 절차: 데이터 전처리부터 학습까지 with KoBERT, KoELECTRA
핵심 단어:
KoBERT, KoELECTRA, tokenizer, DataCollator, Trainer
- Point
- 네이버 영화 리뷰 데이터 전처리, 형태소 분석 후 피클 파일로 저장 → 효율적 학습 가능
- KoELECTRA에서 사용한 걸 보세요
- 허깅페이스 transformers 라이브러리로 모델 불러와 토크나이저, 데이터 콜레이터, 트레이너 구성 및 학습하기
- KoBERT, KoELECTRA: 학습 과정은 유사하게 진행됨 → 저장 경로만 잘 바꿔주면 된다
- ELECTRA 모델은 BERT 모델 대비 성능 향상
- 학습 데이터 양과 성능 관계
- 데이터가 적으면 epochs를 많이 돌려도 의미가 적음
- 데이터 양을 늘리는 것이 성능 향상에 중요
pipeline 사용from transformers import pipeline
my_model = pipeline(
task="text-classification" # 분류 작업: pretrained 모델의 Task를 따라감
, model="./results/koelectra_naver/checkpoint-1000/" # 저장한 모델의 checkpoint까지 들어가기
, tokenizer=tokenizer
)
# 예측할 텍스트
text = "이 영화 정말 재미있어요!"
# 예측 수행
result = my_model(text)
# 결과 출력: result → [{'label': 'LABEL_1', 'score': 0.8494069576263428}]
print(f'예측 레이블: {result[0]["label"].split("_")[1]}')
print(f'예측 정확도: {round(result[0]["score"], 4)}')
예측 레이블: 1
예측 정확도: 0.8635
text2 = ["스토리도 별로고 재미도 없고", "그냥 그래요"]
# 예측 수행
result2 = my_model(text2)
# 결과 출력
# result2 → [{'label': 'LABEL_0', 'score': 0.8137917518615723}, {'label': 'LABEL_0', 'score': 0.7861501574516296}]
print("첫 번째 문장")
print(f'예측 레이블: {result2[0]["label"].split("_")[1]}')
print(f'예측 정확도: {round(result2[0]["score"], 4)}')
print("\n두 번째 문장")
print(f'예측 레이블: {result2[1]["label"].split("_")[1]}')
print(f'예측 정확도: {round(result2[1]["score"], 4)}')
첫 번째 문장
예측 레이블: 0
예측 정확도: 0.8138
두 번째 문장
예측 레이블: 0
예측 정확도: 0.7862
from transformers import BertTokenizer
checkpoint_kobert = "monologg/kobert"
tokenizer_kobert_ver1 = BertTokenizer.from_pretrained(checkpoint_kobert)
my_model_kobert_ver1 = pipeline(
task="text-classification" # 분류 작업: pretrained 모델의 Task를 따라감
, model="./results/kobert_naver/checkpoint-1000/" # 저장한 모델의 checkpoint까지 들어가기
, tokenizer=tokenizer_kobert_ver1
)
# 예측 수행
result_kobert_ver1 = my_model_kobert_ver1(text)
print(f'예측 레이블: {result_kobert[0]["label"].split("_")[1]}')
print(f'예측 정확도: {round(result_kobert[0]["score"], 4)}')
# 예측 수행
result2_kobert_ver1 = my_model_kobert_ver1(text2)
# 결과 출력
print("첫 번째 문장")
print(f'예측 레이블: {result2_kobert_ver1[0]["label"].split("_")[1]}')
print(f'예측 정확도: {round(result2_kobert_ver1[0]["score"], 4)}')
print("\n두 번째 문장")
print(f'예측 레이블: {result2_kobert_ver1[1]["label"].split("_")[1]}')
print(f'예측 정확도: {round(result2_kobert_ver1[1]["score"], 4)}')
Device set to use cuda:0
예측 레이블: 1
예측 정확도: 0.8152
첫 번째 문장
예측 레이블: 1
예측 정확도: 0.5657
두 번째 문장
예측 레이블: 1
예측 정확도: 0.5787
# KoBERT vs. KoELECTRA
txt_ls = ["몇 번이고 다시 보고 싶은 감동적인 이야기 다들 빨리 보러 가세요", "감독의 의도를 모르겠다 원작을 전혀 살리지 못했다"]
korbert_out_ver1 = my_model_kobert_ver1(txt_ls) # BertTokenizer
korbert_out = my_model_kobert(txt_ls) # AutoTokenizer → KoBertTokenizer
koelectra_out = my_model_koelectra(txt_ls)
print("KoBERT_ver1")
print("첫 번째 문장")
print(f'예측 레이블: {korbert_out_ver1[0]["label"].split("_")[1]}')
print(f'예측 정확도: {round(korbert_out_ver1[0]["score"], 4)}')
print("\n두 번째 문장")
print(f'예측 레이블: {korbert_out_ver1[1]["label"].split("_")[1]}')
print(f'예측 정확도: {round(korbert_out_ver1[1]["score"], 4)}')
print()
print("KoBERT_ver2")
print("첫 번째 문장")
print(f'예측 레이블: {korbert_out[0]["label"].split("_")[1]}')
print(f'예측 정확도: {round(korbert_out[0]["score"], 4)}')
print("\n두 번째 문장")
print(f'예측 레이블: {korbert_out[1]["label"].split("_")[1]}')
print(f'예측 정확도: {round(korbert_out[1]["score"], 4)}')
print()
print("KoELECTRA")
print("첫 번째 문장")
print(f'예측 레이블: {koelectra_out[0]["label"].split("_")[1]}')
print(f'예측 정확도: {round(koelectra_out[0]["score"], 4)}')
print("\n두 번째 문장")
print(f'예측 레이블: {koelectra_out[1]["label"].split("_")[1]}')
print(f'예측 정확도: {round(koelectra_out[1]["score"], 4)}')
KoBERT_ver1
첫 번째 문장
예측 레이블: 1
예측 정확도: 0.7144
두 번째 문장
예측 레이블: 1
예측 정확도: 0.57
KoBERT_ver2
첫 번째 문장
예측 레이블: 1
예측 정확도: 0.8112
두 번째 문장
예측 레이블: 0
예측 정확도: 0.7096
KoELECTRA
첫 번째 문장
예측 레이블: 1
예측 정확도: 0.8216
두 번째 문장
예측 레이블: 0
예측 정확도: 0.7992
핵심 개념:
트랜스포머 기반 모델 학습 시 패딩, 콜레이터, 트레이너 구성과 로컬 저장 모델 활용법
핵심 단어:
패딩, 콜레이터, 트레이너, 로스, 파이프라인
- Point:
- 패딩값과 콜레이터 설정을 통한 AutoPadding
- 학습 결과로 나온 loss 값 모델별 비교
- KoELECTRA가 KoBERT보다 성능이 향상됨
- 로컬에 저장된 모델 파이프라인으로 불러오는 법
- 예측 결과 출력 후처리
| 이름 | 의미 | 실제 역할 | 토큰 예시 |
|---|---|---|---|
| BOS | Beginning Of Sentence | 문장의 시작을 알림 | <s> |
| EOS | End Of Sentence | 문장의 끝을 알림 | </s> |
# tranformers: HuggingFace에서 만든 '라이브러리 이름' (Transformer 모델과 관계 없음)
from transformers import AutoTokenizer
# 저장된 파일 불러오기
import pickle
with open("./data/bert_train_data_ratings.pkl", "rb") as f:
train_data = pickle.load(f)
# 앞 1만 개, 뒤 1만 개 추려서 사용
train_data2 = pd.concat([train_data[:10000], train_data[-10000:]], ignore_index=True)
from sklearn.model_selection import train_test_split
from datasets import Dataset # HuggingFace 전용 데이터셋 포맷 변경
# 훈련용:검증용 = 8:2
train_df, val_df = train_test_split(train_data2, test_size=0.2, random_state=1)
# 문제와 정답으로 분리
# Dataset 클래스는 외부 라이브러리인 Pandas 형태를 받지 않음(받아들이지 못함) → 파이썬 리스트로 변환
train_texts = train_df["document"].astype(str).tolist() # pandas.Series → python.list
train_labels = train_df["label"].tolist()
val_texts = val_df["document"].astype(str).tolist()
val_labels = val_df["label"].tolist()
# Hugging Face Dataset으로 변환!
train_dataset = Dataset.from_dict({"document": train_texts, "label": train_labels})
val_dataset = Dataset.from_dict({"document": val_texts, "label": val_labels})
# KoBART 모델 토큰화 도구 불러오기
checkpoint_kobart = "gogamza/kobart-base-v2"
tokenizer_kobart = AutoTokenizer.from_pretrained(checkpoint_kobart)
# 토큰화 함수 전에 "시작 토큰, 끝 토큰" 정의
bos_token = tokenizer_kobart.bos_token or "<s>"
eos_token = tokenizer_kobart.eos_token or "</s>"
# tokenizer.eos_token이 있다면 그 값을 사용하고 없다면 </s> 값을 사용하라는 뜻
# 토큰화 함수 생성
def tokenizer_kobart_function(example):
# 비어있거나 공백뿐인 문장을 [NO TEXT]로 대체: 새로운 데이터 예측 시 들어온 데이터가 비어있을 경우를 대비
cleaned_docs = [] # 시작 토큰과 끝 토큰이 포함된 깨끗한 문장 데이터를 저장하는 리스트
for doc in example["document"]:
if not doc or doc.strip() == "":
doc="[NO TEXT]"
else:
doc=doc.strip()
# 수동으로 시작 토큰, 끝 토큰을 문장에 추가
cleaned_docs.append(f"{bos_token} {doc} {eos_token}") # 반복문을 사용해 원본 데이터에서 문장만 추출해 cleaned_docs에 넣음
# bos_token, eos_token: AutoTokenizer가 로드한 사전 학습 모델에 정의되어 있는 특수 토큰
tokenized = tokenizer_kobart(
cleaned_docs
, padding=True
, truncation=True
, max_length=128
, add_special_tokens=False # 자동으로 시작 코튼(<s>)과 끝 코튼(</s>)을 추가하지 않도록 하기 위해: 우리가 직접 추가했기 때문
, return_tensors="pt" # PyTorch 텐서로 반환
)
# label 추가해주기!
tokenized["label"] = example["label"]
return tokenized
Q. 비어있거나 공백뿐인 문장은 train 데이터 전처리 과정에서 진행했는데 왜 또?
A. 예측 시 들어온 데이터가 비어있을 경우를 대비한 것
add_special_tokens=False)[No Text]로 대체하여 데이터의 일관성을 유지add_special_tokens=False)# 토큰화 수행
train_dataset = train_dataset.map(tokenizer_kobart_function, batched=True)
val_dataset = val_dataset.map(tokenizer_kobart_function, batched=True)
from transformers import AutoModelForSequenceClassification
model_kobart = AutoModelForSequenceClassification.from_pretrained(checkpoint, num_labels = 2)
from transformers import TrainingArguments, Trainer
from transformers import DataCollatorWithPadding
# 토큰화 결과에 패딩 수행
data_collator_kobart = DataCollatorWithPadding(tokenizer=tokenizer_kobart)
# 파라미터
training_args_kobart = TrainingArguments(
output_dir='./results/kobart_naver'
, learning_rate=2e-5 # 학습률
, weight_decay=0.01 # 학습률 감쇄: 과적합 방지를 위한 weight → 점수가 잘 안 나올 경우 해당 파라미터 없애도 됨
, per_device_train_batch_size=16 # 훈련/검증 데이터 배치 사이즈
, per_device_eval_batch_size=16
, num_train_epochs=1 # 학습 반복 수
, eval_strategy="epoch" # 검증/저장 시기,주기
, save_strategy="epoch" # 매 에폭(epoch)마다 모델을 저장
, load_best_model_at_end=True # 베스트 모델 저장 여부
)
# 모델 학습 객체 생성
trainer_kobart = Trainer(
model=model_kobart # 모델
, args=training_args_kobart
, train_dataset=train_dataset
, eval_dataset=val_dataset
, data_collator=data_collator_kobart
, # tokenizer는 이미 해서 collater에 묶었기 때문에 생략
)
trainer_kobart.train()

핵심 개념:
Seq2Seq 모델에서 시작 토큰과 끝 토큰은 학습 안정성과 데이터 구분을 위해 필수적으로 명확히 정의해야 함
핵심 단어:
시작 토큰, 끝 토튼, 태그, 데이터 전처리, 토크나이저, 레이블, 모델 로딩
- Point:
- 시작 토큰과 끝 토큰의 정의
- 수동으로 토큰 추가하는 법
- HTML 태그 구조를 통한 시작 토큰, 끝 토큰 이해
- 데이터 내 텍스트 구분 방식
- 토큰화 함수 정의 과정에서 빈 문장 처리 및 클린 데이터셋 생성하는 법
# 모델 불러오기
model_kobart = AutoModelForSequenceClassification.from_pretrained("./results/kobart_naver/checkpoint-1000/")
# 입력 문장: bos, eos 토큰이 붙어야 한다
text = "<s> 이 영화 정말 재미있어요! </s>"
# 토크나이저 설정: 텍스트 토크나이징(배치 형태 유지)
input_kobart = tokenizer_kobart(
text
, padding=True
, truncation=True
, max_length=128
, add_special_tokens=False
, return_tensors="pt" # return tensors를 pytorch 형태로 변환
)
# BERT 계열 모델: token_type_ids → 자동으로 입력에 들어가게 설정되어 있음
# BART 계열 모델: token_type_ids 사용 안 함 → 제거 과정을 거쳐줘야 함
if "token_type_ids" in input_kobart:
del input_kobart["token_type_ids"]
import torch
import torch.nn.functional as F
# 모델 예측
with torch.no_grad():
pred = model_kobart(**input_kobart) # 입력 딕셔너리를 풀어서 함수 인자로 넘기기
# 실제값과 예측값의 차이를 구하기
probs = F.softmax(pred.logits, dim=-1) # gogamza 님의 모델이 다중분류로 설정되어 있어서 (실제로는 이진분류지만) 소프트맥스 써야 함
# 결과 확인: 확률의 최댓값을 추출
pred_label = torch.argmax(probs, dim=-1).item()
# 정확도
confidence = probs[0, pred_label].item()
print(f"예측 결과: {pred_label}")
print(f"정확도: {confidence:.4f}")
예측 결과: 1
정확도: 0.9856
if "token_type_ids" in input_kobart:
del input_kobart["token_type_ids"]
argmax()를 사용해 최대 확률을 가진 클래스 선택input_ids, attention_mask가 기본 입력이며, decoder_input_ids 등은 자동으로 내부에서 처리합니다.input_ids 없이 모델 호출하면 ValueError가 발생합니다.이전까지는 사전 학습된 모델을 활용하는 정도 수준이었지만
앞으로는 직접 데이터로 학습하는 파인 튜닝 실습을 진행할 예정
from datasets import load_dataset
# 연합뉴스 데이터셋 불러오기
klue_train = load_dataset("klue", "ynat", split="train")
klue_eval = load_dataset("klue", "ynat", split="validation")
klue_train[0]
{'guid': 'ynat-v1_train_00000',
'title': '유튜브 내달 2일까지 크리에이터 지원 공간 운영',
'label': 3,
'url': 'https://news.naver.com/main/read.nhn?mode=LS2D&mid=shm&sid1=105&sid2=227&oid=001&aid=0008508947',
'date': '2016.06.30. 오전 10:36'}
# 실습에 사용하지 않는 불필요한 컬럼 제거
klue_train = klue_train.remove_columns(["guid", "url", "date"])
klue_eval = klue_eval.remove_columns(["guid", "url", "date"])
# 카테고리 내용 확인
klue_train.features["label"]
ClassLabel(names=['IT과학', '경제', '사회', '생활문화', '세계', '스포츠', '정치'])
✅ 카테고리 (label)
| 숫자 라벨 | 문자형 라벨 |
|---|---|
| 0 | IT과학 |
| 1 | 경제 |
| 2 | 사회 |
| 3 | 생활문화 |
| 4 | 세계 |
| 5 | 스포츠 |
| 6 | 정치 |
klue_label = klue_train.features["label"]
# 숫자로 된 label 값을 해당 문자열로 변환하여 새로운 컬럼 label_str 저장
def make_str_label(data):
data["label_str"] = klue_label.int2str(data["label"])
return data
klue_train = klue_train.map(make_str_label, batched=True, batch_size=1000)
klue_eval = klue_eval.map(make_str_label, batched=True, batch_size=1000)
klue_train[0]
{'title': '유튜브 내달 2일까지 크리에이터 지원 공간 운영', 'label': 3, 'label_str': '생활문화'}
# 학습용/검증용/평가용 데이터셋 분할
# 학습용에서 10000개 → test 용으로 사용하자!
train_dataset = klue_train.train_test_split(test_size=10000, shuffle=True, seed=4)["train"]
# klue_train, klue_test = klue_train.train_test_split(test_size=10000, shuffle=True, seed=42).values()
split_eval = klue_eval.train_test_split(test_size=1000, shuffle=True, seed=4)
split_eval
DatasetDict({
train: Dataset({
features: ['title', 'label', 'label_str'],
num_rows: 8107
})
test: Dataset({
features: ['title', 'label', 'label_str'],
num_rows: 1000
})
})
valid_dataset = split_eval["train"]
test_dataset = split_eval["test"]
핵심 개념:
파인튜닝은 사전 학습된 언어 모델을 특정 도메인과 작업에 맞게 추가 학습하는 과정
핵심 단어:
파인튜닝, 트랜스포머 모델, 뉴스 카테고리 분류, 허깅페이스
- Point:
- 앞으로 진행될 자연어 처리 실습 with 트랜스포머 모델
- 뉴스 카테고리 분류를 위한 데이터셋 준비 및 데이터 전처리
- 허깅페이스 라이브러리를 이용한 파인튜닝 실습