๋ฐ์ํ
๋ฅ๋ฌ๋ ๊ธฐ๋ฐ ์์ฐ์ด ์ฒ๋ฆฌ ๋ชจ๋ธ
๐ก ๋ชจ๋ธ(Model): ์ ๋ ฅ์ ๋ฐ์ ์ด๋ค ์ฒ๋ฆฌ๋ฅผ ์ํํ๋ ํจ์, ์์ฐ์ด์ฒ๋ฆฌ์์์ input์ ์์ฐ์ด
๐ก ๋ชจ๋ธ์ ์ถ๋ ฅ์ ํ๋ฅ ์ด๋ผ๋ ์ ์ ์ฃผ๋ชฉ์ ํด์ผํ๋ค.
- ์์ฐ์ด์ฒ๋ฆฌ ๋ชจ๋ธ์ ์ถ๋ ฅ๋ ํ๋ฅ → ๊ทธ๋ฌ๋, ๋ชจ๋ธ์ ์ถ๋ ฅ ํํ๋ ํ๋ฅ , ์ฌ๋์ด ์ํ๋๊ฑด ์์ฐ์ด ํํ.
- ๊ทธ๋ฌ๋ฉด ์ถ๋ ฅ๋ ํ๋ฅ ์ ํ์ฒ๋ฆฌ ํด์ ์์ฐ์ด ํํ๋ก ๋ณํ์ ํด์ผํ๋ค.
- ๋ฅ๋ฌ๋ ๋ชจ๋ธ์์๋ ๋ฐ์ดํฐ์ ‘๊ฐ์ฑ’ ์ด๋ผ๋ ๋ ์ด๋ธ์ ๋ฌ์ ๋์ ๋ฐ์ดํฐ๊ฐ ์์ด์ผ ํ๋ค. → ์ด๊ฑธ ํ์ต ๋ฐ์ดํฐ ๋ผ๊ณ ํ๋ค.
- ๊ทธ๋ฆฌ๊ณ ๋ชจ๋ธ์ด ๋ฐ์ดํฐ์ ํจํด์ ์ค์ค๋ก ์ตํ๊ฒ ํ๋ ๊ณผ์ → ํ์ต(train)
Transfer Learning
๐ก ํธ๋์คํผ ๋ฌ๋: ํน์ Task๋ฅผ ํ์ตํ ๋ชจ๋ธ์ ๋ค๋ฅธ ํ ์คํฌ ์ํ์ ์ฌ์ฌ์ฉํ๋ ๊ธฐ๋ฒ์ ๊ฐ๋ฆฌํด
- ํธ๋์คํผ ์ ์ฉ์ ๊ธฐ์กด๋ณด๋ค ๋ชจ๋ธ์ ํ์ต ์๋ ๋นจ๋ฆฌ์ง, ์๋ก์ด ํ์คํฌ๋ฅผ ๋ ์ ์ํํ๋ ๊ฒฝํฅ์ด ์์
- ํ์คํฌ1: ์ ์คํธ๋ฆผ(pre-train)
- ํ์คํฌ2: ๋ค์ด์คํธ๋ฆผ
์ ์คํธ๋ฆผ ํ์คํฌ
- ๋ค์๋จ์ด ๋งํ๊ธฐ. ์ด๊ฑธ ์ํํ ๋ชจ๋ธ์ ์ธ์ด๋ชจ๋ธ(Language Model)
- ๋น์นธ์ฑ์ฐ๊ธฐ: Bert ๊ณ์ด ๋ชจ๋ธ์ด ์ด ํ์คํฌ๋ก Pre-Train ์ํ → ๋น์นธ์ฑ์ฐ๊ธฐ๋ก ์ ์คํธ๋ฆผ ํ ์คํธ ์ํ๋ชจ๋ธ(Masked ์ธ์ด ๋ชจ๋ธ)
๐ก ์ด๋ ๊ฒ ์ฌ๋์ด ์ผ์ผ์ด ์ ๋ต(Label)์ ๋ง๋ ๋ฐ์ดํฐ๋ก ๋ชจ๋ธ์ ํ์ตํ๋ ๋ฐฉ์ → ์ง๋ ํ์ต ๋ฐฉ์ (Supervised Learning)
๋ค์ด์คํธ๋ฆผ ํ์คํฌ - ์์ฐ์ด ์ฒ๋ฆฌ์ ๊ตฌ์ฒด์ ์ธ ๊ณผ์ ๋ฌผ
๐ก Main Task → ๋ถ๋ฅ: Classification
- ๋ฌธ์ ๋ถ๋ฅ: ์์ฐ์ด๋ฅผ ์ ๋ ฅ๋ฐ์ ํด๋น input์ด ๊ธ,๋ถ์ , ์ค๋ฆฝ์ธ์ง ๊ทธ ํ๋ฅ ๊ฐ ๋ฐํ
- ์์ฐ์ด ์ถ๋ก : ๋ฌธ์ฅ 2๊ฐ๋ฅผ ์ ๋ ฅ๋ฐ์ ๋ ๋ฌธ์ฅ ์ฌ์ด ๊ด๊ณ๊ฐ ์ฐธ, ๊ฑฐ์ง, ์ค๋ฆฝ์ธ์ง ํ๋ฅ ๊ฐ ๋ฐํ
3. ๊ฐ์ฒด๋ช ์ธ์: ์์ฐ์ด๋ฅผ ์ ๋ ฅ๋ฐ์ ๋จ์ด๋ณ๋ก ์ด๋ค ๊ฐ์ฒด ๋ฒ์ฃผ์ ์ํ๋์ง ํ๋ฅ ๊ฐ ๋ฐํ
4. ์ง์์๋ต: ์์ฐ์ด(์ง๋ฌธ+์ง๋ฌธ)์ ์ ๋ ฅ๋ฐ์ ๊ฐ ๋จ์ด๊ฐ ์ ๋ต์ ์์์ผ ํ๋ฅ ๊ฐ๊ณผ ๋์ผ ํ๋ฅ ๊ฐ ๋ฐํ
5. ๋ฌธ์ฅ์์ฑ: ์์ฐ์ด๋ฅผ ์ ๋ ฅ๋ฐ์ ์ดํ ์ ์ฒด์ ๋ํ ํ๋ฅ ๊ฐ ๋ฐํ
ํ์ต ํ์ดํ๋ผ์ธ ์๊ฐ
1. ์ค์ ๊ฐ ์ ์ธ
- ๋ชจ๋ธ์ ๋ง๋ค๋ ค๋ฉด → ์ค์ ๊ฐ์ ์ ํด์ผ ํ๋ค. ์ด๋ค ํ๋ฆฌํธ๋ ์ธ ๋ชจ๋ธ์ ์ฌ์ฉํ ์ง, ํ์ต์ ์ฌ์ฉํ ๋ฐ์ดํฐ๋ ๋ฌด์์ธ์ง, ํ์ต ๊ฒฐ๊ณผ๋ ์ด๋์ ์ ์ฅํ ์ง ๋ฑ…
- ์ด ์ค์ ๊ฐ๋ค์ ๋ณธ๊ฒฉ์ ์ธ ํ์ต์ ์์ ๋ฏธ๋ฆฌ ์ ์ธํด๋๋ค
- ํ์ดํผํ๋ผ๋ฏธํฐ(hyperparameter) ์ญ์ ๋ฏธ๋ฆฌ ์ ํด๋ฌ์ผ ํ๋ ์ค์ํ ์ ๋ณด
๐ก ํ์ดํผํ๋ผ๋ฏธํฐ๋ ๋ชจ๋ธ ๊ตฌ์กฐ์ ํ์ต ๋ฑ์ ์ง์ ๊ด๊ณ๋ ์ค์ ๊ฐ์ ๊ฐ๋ฆฌํต๋๋ค.→ ๋ฌ๋ ๋ ์ดํธ(learning rate), ๋ฐฐ์น ํฌ๊ธฐ(batch size) ๋ฑ์ด ์์ต๋๋ค.
- ์ค์น ํด์ผํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
!pip install ratsnlp
!pip install nlpbook
from ratsnlp.nlpbook.classification import ClassificationTrainArguments
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-cls",
learning_rate=5e-5,
batch_size=32,
)
2. ๋ฐ์ดํฐ ๋ค์ด๋ก๋
- downstream_corpus_name(nsmc)์ ํด๋นํ๋ ๋ง๋ญ์น๋ฅผ ์ฝ๋ฉ ํ๊ฒฝ ๋ก์ปฌ์ downstream_corpus_root_dir(/content/Korpora) ์๋์ ์ ์ฅ
from Korpora import Korpora
Korpora.fetch(
corpus_name=args.downstream_corpus_name,
root_dir=args.downstream_corpus_root_dir,
force_download=True,
)
3. KCBert-Base ๋ชจ๋ธ ์ค๋น
- ๋๊ท๋ชจ ๋ง๋ญ์น๋ฅผ ํ์ฉํ ํ๋ฆฌํธ๋ ์ธ์๋ ๋ง์ ๋ฆฌ์์ค๊ฐ ํ์
- BERT, GPT ๊ฐ์ ํธ๋์คํฌ๋จธ(Transformer) ๊ณ์ด ๋ชจ๋ธ→ ์ด ํจํค์ง๋ฅผ ์ฐ๋ฉด ๋จ ๋ช ์ค๋ง์ผ๋ก ๋ชจ๋ธ์ ์ฌ์ฉ๊ฐ๋ฅ
from transformers import BertConfig, BertForSequenceClassification
pretrained_model_config = BertConfig.from_pretrained(
args.pretrained_model_name,
num_labels=2,
)
model = BertForSequenceClassification.from_pretrained(
args.pretrained_model_name,
config=pretrained_model_config,
)
4. Tokenizer ์ค๋น
- ์์ฐ์ด ์ฒ๋ฆฌ ๋ชจ๋ธ์ ์ ๋ ฅ์ ๋๊ฐ ํ ํฐ(token) → ๋ฌธ์ฅ(sentence)๋ณด๋ค ์์ ๋จ์
- ํ ๋ฌธ์ฅ์ ์ฌ๋ฌ ๊ฐ์ ํ ํฐ์ผ๋ก ๊ตฌ์ฑ
- ํ ํฐ ๋ถ๋ฆฌ ๊ธฐ์ค์ ๊ทธ๋๊ทธ๋ ๋ค๋ฅผ ์ ์๋ค. ๋ฌธ์ฅ์ ๋์ด์ฐ๊ธฐ๋ง์ผ๋ก ๋๋ ์๋ ์๊ณ , ์๋ฏธ์ ์ต์ ๋จ์์ธ ํํ์(morpheme) ๋จ์๋ก ๋ถ๋ฆฌํ ์๋ ์๋ค.
๐ก ๋ฌธ์ฅ์ ํ ํฐ ์ํ์ค(token sequence)๋ก ๋ถ์ํ๋ ๊ณผ์ ์ ํ ํฐํ(tokenization), ํ ํฐํ๋ฅผ ์ํํ๋ ํ๋ก๊ทธ๋จ์ ํ ํฌ๋์ด์ (tokenizer)
from transformers import BertTokenizer
tokenizer = BertTokenizer.from_pretrained(
args.pretrained_model_name,
do_lower_case=False,
)
5. DataLoader ์ค๋น
- ํ์ดํ ์น(PyTorch)๋ ๋ฅ๋ฌ๋ ๋ชจ๋ธ ํ์ต์ ์ง์ํ๋ ํ์ด์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ → ๋ฐ์ดํฐ ๋ก๋(DataLoader)๋ผ๋ ๊ฒ ํฌํจ๋์ด ์์
๐ก ํ์ดํ ์น๋ก ๋ฅ๋ฌ๋ ๋ชจ๋ธ์ ๋ง๋ค๊ณ ์ ํ๋ค๋ฉด ์ด ๋ฐ์ดํฐ ๋ก๋๋ฅผ ๋ฐ๋์ ์ ์ํด์ผ ํฉ๋๋ค.
- ๋ฐ์ดํฐ๋ก๋๋ ํ์ต ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐฐ์น(batch) ๋จ์๋ก ๋ชจ๋ธ์ ๋ฐ์ด ๋ฃ์ด์ฃผ๋ ์ญํ . ์ ์ฒด ๋ฐ์ดํฐ ๊ฐ์ด๋ฐ ์ผ๋ถ ์ธ์คํด์ค๋ฅผ ๋ฝ์(sample) ๋ฐฐ์น๋ฅผ ๊ตฌ์ฑ. ๋ฐ์ดํฐ์ (dataset)์ ๋ฐ์ดํฐ ๋ก๋์ ๊ตฌ์ฑ ์์ ๊ฐ์ด๋ฐ ํ๋. ๋ฐ์ดํฐ์ ์ ์ฌ๋ฌ ์ธ์คํด์ค(๋ฌธ์+๋ ์ด๋ธ)๋ฅผ ๋ณด์ ํ๊ณ ์๋ค.
- ๋ฐ์ดํฐ ๋ก๋๊ฐ ๋ฐฐ์น๋ฅผ ๋ง๋ค ๋ ์ธ์คํด์ค๋ฅผ ๋ฝ๋ ๋ฐฉ์์ ํ์ดํ ์น ์ฌ์ฉ์๊ฐ ์์ ๋กญ๊ฒ ์ ํ ์ ์์.
- ๋ฐฐ์น๋ ๊ทธ ๋ชจ์์ด ๊ณ ์ ์ ์ด์ผ ํ ๋๊ฐ ๋ง์ต๋๋ค. ๋ค์ ๋งํด ๋์ผํ ๋ฐฐ์น์ ์๋ ๋ฌธ์ฅ๋ค์ ํ ํฐ(input_ids) ๊ฐ์๊ฐ ๊ฐ์์ผ ํ๋ค.
- ์ด๊ฐ์ด ๋ฐฐ์น์ ๋ชจ์ ๋ฑ์ ์ ๋นํด ๋ชจ๋ธ์ ์ต์ข ์ ๋ ฅ์ผ๋ก ๋ง๋ค์ด์ฃผ๋ ๊ณผ์ ์ ์ปฌ๋ ์ดํธ(collate)๋ผ๊ณ ํจ
- ์ปฌ๋ ์ดํธ ๊ณผ์ ์๋ ํ์ด์ฌ ๋ฆฌ์คํธ(list)์์ ํ์ดํ ์น ํ ์(tensor)๋ก์ ๋ณํ ๋ฑ ์๋ฃํ ๋ณํ๋ ํฌํจ. ์ปฌ๋ ์ดํธ ์ํ ๋ฐฉ์ ์ญ์ ํ์ดํ ์น ์ฌ์ฉ์๊ฐ ์์ ๋กญ๊ฒ ๊ตฌ์ฑํ ์ ์๋ค.
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,
)
6. Task ์ ์
- PyTorch Lightning Model ์ฌ์ฉ
- PyTorch Lightning: ๋ฅ๋ฌ๋ ๋ชจ๋ธ์ ํ์ตํ ๋ ๋ฐ๋ณต์ ์ธ ๋ด์ฉ์ ๋์ ์ํํด์ค ์ฌ์ฉ์๊ฐ ๋ชจ๋ธ ๊ตฌ์ถ์๋ง ์ ๊ฒฝ์ธ ์ ์๋๋ก ๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- ์ต์ ํ(optimization)๋ ํน์ ์กฐ๊ฑด์์ ์ด๋ค ๊ฐ์ด ์ต๋๋ ์ต์๊ฐ ๋๋๋ก ํ๋ ๊ณผ์ ์ ๊ฐ๋ฆฌํด.
- ์ด๋ฅผ ์ํด ์ตํฐ๋ง์ด์ (optimizer), ๋ฌ๋ ๋ ์ดํธ ์ค์ผ์ค๋ฌ(learning rate scheduler) ๋ฑ์ ์ ์ํด ๋ก๋๋ค.
- ๋ชจ๋ธ ํ์ต์ ๋ฐฐ์น ๋จ์๋ก ์ด๋ค์ง๋๋ค. ๋ฐฐ์น๋ฅผ ๋ชจ๋ธ์ ์ ๋ ฅํ ๋ค ๋ชจ๋ธ ์ถ๋ ฅ์ ์ ๋ต๊ณผ ๋น๊ตํด ์ฐจ์ด๋ฅผ ๊ณ์ฐํฉ๋๋ค. ์ดํ ๊ทธ ์ฐจ์ด๋ฅผ ์ต์ํํ๋ ๋ฐฉํฅ์ผ๋ก ๋ชจ๋ธ์ ์ ๋ฐ์ดํธ ํ๋ค.
- ์ด๋ฌํ ์ผ๋ จ์ ๊ณผ์ ์ ์คํ (step)์ด๋ผ๊ณ ํ๋ค.
7. ๋ชจ๋ธ ํ์ตํ๊ธฐ
- ํธ๋ ์ด๋(Trainer)๋ ํ์ดํ ์น ๋ผ์ดํธ๋์์ ์ ๊ณตํ๋ ๊ฐ์ฒด๋ก ์ค์ ํ์ต์ ์ํ
from ratsnlp.nlpbook.classification import ClassificationTask
task = ClassificationTask(model, args)
trainer = nlpbook.get_trainer(args)
trainer.fit(
task,
train_dataloader=train_dataloader,
)
๋ฐ์ํ
'๐ NLP (์์ฐ์ด์ฒ๋ฆฌ) > ๐ Natural Language Processing' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[NLP] Seq2Seq, Encoder & Decoder (0) | 2024.01.19 |
---|---|
[NLP] Pre-Trained Language Model - ๋ฏธ๋ฆฌ ํ์ต๋ ์ธ์ด๋ชจ๋ธ (0) | 2024.01.18 |
[NLP} Tokenization - ํ ํฐํํ๊ธฐ (0) | 2024.01.18 |
[NLP] Building a vocabulary set - ์ดํ ์งํฉ ๊ตฌ์ถํ๊ธฐ (0) | 2024.01.18 |
[NLP] Tokenization - ํ ํฐํ๋? (0) | 2024.01.16 |