A A
[NLP] ์ฒ˜์Œ ๋งŒ๋‚˜๋Š” ์ž์—ฐ์–ด ์ฒ˜๋ฆฌ & Transfer Learning

๋”ฅ๋Ÿฌ๋‹ ๊ธฐ๋ฐ˜ ์ž์—ฐ์–ด ์ฒ˜๋ฆฌ ๋ชจ๋ธ

๐Ÿ’ก ๋ชจ๋ธ(Model): ์ž…๋ ฅ์„ ๋ฐ›์•„ ์–ด๋–ค ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ํ•จ์ˆ˜, ์ž์—ฐ์–ด์ฒ˜๋ฆฌ์—์„œ์˜ input์€ ์ž์—ฐ์–ด

๐Ÿ’ก ๋ชจ๋ธ์˜ ์ถœ๋ ฅ์€ ํ™•๋ฅ ์ด๋ผ๋Š” ์ ์— ์ฃผ๋ชฉ์„ ํ•ด์•ผํ•œ๋‹ค.
  • ์ž์—ฐ์–ด์ฒ˜๋ฆฌ ๋ชจ๋ธ์˜ ์ถœ๋ ฅ๋„ ํ™•๋ฅ  → ๊ทธ๋Ÿฌ๋‚˜, ๋ชจ๋ธ์˜ ์ถœ๋ ฅ ํ˜•ํƒœ๋Š” ํ™•๋ฅ , ์‚ฌ๋žŒ์ด ์›ํ•˜๋Š”๊ฑด ์ž์—ฐ์–ด ํ˜•ํƒœ.
    • ๊ทธ๋Ÿฌ๋ฉด ์ถœ๋ ฅ๋œ ํ™•๋ฅ ์„ ํ›„์ฒ˜๋ฆฌ ํ•ด์„œ ์ž์—ฐ์–ด ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜์„ ํ•ด์•ผํ•œ๋‹ค.

  • ๋”ฅ๋Ÿฌ๋‹ ๋ชจ๋ธ์—์„œ๋Š” ๋ฐ์ดํ„ฐ์— ‘๊ฐ์„ฑ’ ์ด๋ผ๋Š” ๋ ˆ์ด๋ธ”์„ ๋‹ฌ์•„ ๋†“์€ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์–ด์•ผ ํ•œ๋‹ค. → ์ด๊ฑธ ํ•™์Šต ๋ฐ์ดํ„ฐ ๋ผ๊ณ  ํ•œ๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  ๋ชจ๋ธ์ด ๋ฐ์ดํ„ฐ์˜ ํŒจํ„ด์„ ์Šค์Šค๋กœ ์ตํžˆ๊ฒŒ ํ•˜๋Š” ๊ณผ์ • → ํ•™์Šต(train)


Transfer Learning

๐Ÿ’ก ํŠธ๋žœ์Šคํผ ๋Ÿฌ๋‹: ํŠน์ • Task๋ฅผ ํ•™์Šตํ•œ ๋ชจ๋ธ์„ ๋‹ค๋ฅธ ํ…Œ์Šคํฌ ์ˆ˜ํ–‰์— ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋ฒ•์„ ๊ฐ€๋ฆฌํ‚ด

  • ํŠธ๋žœ์Šคํผ ์ ์šฉ์‹œ ๊ธฐ์กด๋ณด๋‹ค ๋ชจ๋ธ์˜ ํ•™์Šต ์†๋„ ๋นจ๋ฆฌ์ง, ์ƒˆ๋กœ์šด ํƒœ์Šคํฌ๋ฅผ ๋” ์ž˜ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Œ
    • ํƒœ์Šคํฌ1: ์—…์ŠคํŠธ๋ฆผ(pre-train)
    • ํƒœ์Šคํฌ2: ๋‹ค์šด์ŠคํŠธ๋ฆผ

์—…์ŠคํŠธ๋ฆผ ํƒœ์Šคํฌ

  • ๋‹ค์Œ๋‹จ์–ด ๋งžํžˆ๊ธฐ. ์ด๊ฑธ ์ˆ˜ํ–‰ํ•œ ๋ชจ๋ธ์„ ์–ธ์–ด๋ชจ๋ธ(Language Model)

  • ๋นˆ์นธ์ฑ„์šฐ๊ธฐ: Bert ๊ณ„์—ด ๋ชจ๋ธ์ด ์ด ํƒœ์Šคํฌ๋กœ Pre-Train ์ˆ˜ํ–‰ → ๋นˆ์นธ์ฑ„์šฐ๊ธฐ๋กœ ์—…์ŠคํŠธ๋ฆผ ํ…Œ์ŠคํŠธ ์ˆ˜ํ–‰๋ชจ๋ธ(Masked ์–ธ์–ด ๋ชจ๋ธ)

๐Ÿ’ก ์ด๋ ‡๊ฒŒ ์‚ฌ๋žŒ์ด ์ผ์ผ์ด ์ •๋‹ต(Label)์„ ๋งŒ๋“  ๋ฐ์ดํ„ฐ๋กœ ๋ชจ๋ธ์„ ํ•™์Šตํ•˜๋Š” ๋ฐฉ์‹ → ์ง€๋„ ํ•™์Šต ๋ฐฉ์‹ (Supervised Learning)

๋‹ค์šด์ŠคํŠธ๋ฆผ ํƒœ์Šคํฌ - ์ž์—ฐ์–ด ์ฒ˜๋ฆฌ์˜ ๊ตฌ์ฒด์ ์ธ ๊ณผ์ œ๋ฌผ

๐Ÿ’ก Main Task → ๋ถ„๋ฅ˜: Classification
  1. ๋ฌธ์„œ ๋ถ„๋ฅ˜: ์ž์—ฐ์–ด๋ฅผ ์ž…๋ ฅ๋ฐ›์•„ ํ•ด๋‹น input์ด ๊ธ,๋ถ€์ •, ์ค‘๋ฆฝ์ธ์ง€ ๊ทธ ํ™•๋ฅ ๊ฐ’ ๋ฐ˜ํ™˜
  2. ์ž์—ฐ์–ด ์ถ”๋ก : ๋ฌธ์žฅ 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,
)