[๐ค ๊ฐ์ข 2.6] 2์ฅ์์ ๋ฐฐ์ด ๊ฒ ์ด์ ๋ฆฌ
์ง๋ ๋ช ์น์ ์์ ์ฐ๋ฆฌ๋ ๋๋ถ๋ถ์ ์์ ์ ์ง์ ์ธ๋ถ์ ์ผ๋ก ์ํํ๊ธฐ ์ํด ์ต์ ์ ๋คํ์ต๋๋ค. ์ฐ๋ฆฌ๋ ํ ํฌ๋์ด์ ์ ์๋ ๋ฐฉ์๊ณผ ํ ํฐํ(tokenization), ์ ๋ ฅ ์๋ณ์(input IDs)๋ก์ ๋ณํ, ํจ๋ฉ(padding), ์ ๋จ(truncation) ๋ฐ ์ดํ ์ ๋ง์คํฌ(attention mask) ๋ฑ์ ์ดํด๋ณด์์ต๋๋ค.
๊ทธ๋ฌ๋ ์น์ 2์์ ๋ณด์๋ฏ์ด ๐คTransformers API๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ๊ธฐ์์ ์์ธํ ๋ค๋ฃฐ ์์ ์ธ ๊ณ ์์ค ํจ์๋ค(high-level functions)๋ก ์ด ๋ชจ๋ ๊ฒ์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ๋ฌธ์ฅ์ ๋ํด์ ์ง์ ํ ํฌ๋์ด์ ๋ฅผ ํธ์ถํ๋ฉด ๋ชจ๋ธ์ ์ ๋ฌ๋ ์ค๋น๊ฐ ๋ ์ต์ข ์ ๋ ฅ ํํ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค:
from transformers import AutoTokenizer
checkpoint = "distilbert-base-uncased-finetuned-sst-2-english"
tokenizer = AutoTokenizer.from_pretrained(checkpoint)
sequence = "I've been waiting for a HuggingFace course my whole life."
model_inputs = tokenizer(sequence)
์ฌ๊ธฐ์์ model_inputs
๋ณ์๋ ๋ชจ๋ธ์ด ์ ๋๋ก ๋์ํ๋๋ฐ ํ์ํ ๋ชจ๋ ์ ๋ณด๋ค์ ํฌํจํ๊ณ ์์ต๋๋ค. DistilBERT์ ๊ฒฝ์ฐ, model_inputs
์๋ ์
๋ ฅ ์๋ณ์(input IDs)์ ์ดํ
์
๋ง์คํฌ(attention mask)๊ฐ ํฌํจ๋ฉ๋๋ค. ๋ชจ๋ธ์ ๋ฐ๋ผ์ tokenizer
๊ฐ์ฒด๋ ๋ชจ๋ธ์ ํ์ํ ์
๋ ฅ ์ ๋ณด๋ค์ ์์์ ์ ๊ณตํด ์ค๋๋ค.
์๋์ ๋ช ๊ฐ์ง ์์์ ๋ณผ ์ ์๋ฏ์ด tokenizer
๋ฉ์๋๋ ๋งค์ฐ ๊ฐ๋ ฅํฉ๋๋ค. ์ฐ์ ๋จ์ผ ์ํ์ค๋ฅผ ํ ํฐํํ ์ ์์ต๋๋ค:
sequence = "I've been waiting for a HuggingFace course my whole life."
model_inputs = tokenizer(sequence)
๋ํ ๋ณ๊ฒฝ ์ฌํญ ์์ด ํ ๋ฒ์ ์ฌ๋ฌ ์ํ์ค๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค:
sequences = ["I've been waiting for a HuggingFace course my whole life.", "So have I!"]
model_inputs = tokenizer(sequences)
๊ทธ๋ฆฌ๊ณ ๋ค์ํ ๋ชจ๋์ ๋ฐ๋ผ ํจ๋ฉ(padding) ์ฒ๋ฆฌ๋ฅผ ํ ์ ์์ต๋๋ค:
# ํด๋น ์ํ์ค๋ฅผ ๋ฆฌ์คํธ ๋ด์ ์ต๋ ์ํ์ค ๊ธธ์ด๊น์ง ํจ๋ฉ(padding) ํฉ๋๋ค.
model_inputs = tokenizer(sequences, padding="longest")
# ์ํ์ค๋ฅผ ๋ชจ๋ธ ์ต๋ ๊ธธ์ด(model max length)๊น์ง ํจ๋ฉ(padding) ํฉ๋๋ค.
# (512 for BERT or DistilBERT)
model_inputs = tokenizer(sequences, padding="max_length")
# ์ง์ ๋ ์ต๋ ๊ธธ์ด๊น์ง ์ํ์ค๋ฅผ ํจ๋ฉ(padding) ํฉ๋๋ค.
model_inputs = tokenizer(sequences, padding="max_length", max_length=8)
์ํ์ค๋ฅผ ์๋ฅผ ์๋ ์์ต๋๋ค:
sequences = ["I've been waiting for a HuggingFace course my whole life.", "So have I!"]
# ๋ชจ๋ธ ์ต๋ ๊ธธ์ด(model max length)๋ณด๋ค ๊ธด ์ํ์ค๋ฅผ ์๋ฆ
๋๋ค.
# (512 for BERT or DistilBERT)
model_inputs = tokenizer(sequences, truncation=True)
# ์ง์ ๋ ์ต๋ ๊ธธ์ด๋ณด๋ค ๊ธด ์ํ์ค๋ฅผ ์๋ฆ
๋๋ค.
model_inputs = tokenizer(sequences, max_length=8, truncation=True)
ํน์ ํ ํฐ๋ค (Special tokens)
ํ ํฌ๋์ด์ ๊ฐ ๋ฐํํ ์ ๋ ฅ ์๋ณ์(input IDs)๋ฅผ ์ดํด๋ณด๋ฉด ์ด์ ๊ณผ ์ฝ๊ฐ ๋ค๋ฅด๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค:
sequence = "I've been waiting for a HuggingFace course my whole life."
model_inputs = tokenizer(sequence)
print(model_inputs["input_ids"])
tokens = tokenizer.tokenize(sequence)
ids = tokenizer.convert_tokens_to_ids(tokens)
print(ids)
[101, 1045, 1005, 2310, 2042, 3403, 2005, 1037, 17662, 12172, 2607, 2026, 2878, 2166, 1012, 102]
[1045, 1005, 2310, 2042, 3403, 2005, 1037, 17662, 12172, 2607, 2026, 2878, 2166, 1012]
์๋ก์ด ํ ํฐ ์๋ณ์๊ฐ ์ฒ์๊ณผ ๋ง์ง๋ง์ ํ๋์ฉ ์ถ๊ฐ๋์์ต๋๋ค. ์์ ๋ ๊ฐ์ง ์๋ณ์ ์ํ์ค๋ฅผ ๋์ฝ๋ฉ(decoding)ํ์ฌ ์ด๊ฒ์ด ๋ฌด์์ ๋ํ๋ด๋ ๊ฒ์ธ์ง ์์๋ณด๊ฒ ์ต๋๋ค:
print(tokenizer.decode(model_inputs["input_ids"]))
print(tokenizer.decode(ids))
[CLS] i've been waiting for a huggingface course my whole life. [SEP]
i've been waiting for a huggingface course my whole life.
ํ ํฌ๋์ด์ ๋ ์์ ๋ถ๋ถ์ ํน์ ๋จ์ด [CLS]๋ฅผ ์ถ๊ฐํ๊ณ ๋์ ํน์ ๋จ์ด [SEP]๋ฅผ ์ถ๊ฐํ์ต๋๋ค. ์ด๋ ๋ชจ๋ธ์ด ํด๋น ํน์ ํ ํฐ๋ค๋ก ์ฌ์ ํ์ต(pre-training)๋์๊ธฐ ๋๋ฌธ์ ์ถ๋ก ์ ๋ํด ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ์ป์ผ๋ ค๋ฉด ์ด๋ฅผ ์ถ๊ฐํด์ผ ํฉ๋๋ค. ์ผ๋ถ ๋ชจ๋ธ์ ์ด๋ค ํน์ ํ ํฐ๋ค์ด๋ ๋ค๋ฅธ ํน๋ณํ ๋จ์ด๋ค์ ์ถ๊ฐํ์ง ์๋ ๊ฒฝ์ฐ๋ ์์ต๋๋ค. ๋ ์ด๋ค ๋ชจ๋ธ์ ์์ ๋ถ๋ถ์๋ง ์ด๋ฌํ ํน์ ๋จ์ด๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ํน์ ๋ ๋ถ๋ถ์๋ง ์ถ๊ฐํ ์๋ ์์ต๋๋ค. ์ด์จ๋ ํ ํฌ๋์ด์ ๋ ์ ๋ ฅ์ด ์์๋๋ ํ ํฐ๋ค์ ์ด๋ฏธ ์๊ณ ์์ผ๋ฉฐ ์ด๋ฅผ ์ฒ๋ฆฌํ ๊ฒ์ ๋๋ค.
๋ง๋ฌด๋ฆฌ: ํ ํฌ๋์ด์ ์์ ๋ชจ๋ธ๋ก...
์ด์ ํ ํฌ๋์ด์ ๊ฐ์ฒด๊ฐ ํ ์คํธ๋ฅผ ์ฒ๋ฆฌํ ๋ ์คํ๋๋ ๋ชจ๋ ๊ฐ๋ณ ๋จ๊ณ๋ค์ ์ดํด๋ณด์์ผ๋ฏ๋ก, ์ฃผ์ API๋ก ๋ค์ค ์ํ์ค(ํจ๋ฉ, padding!), ๋งค์ฐ ๊ธด ์ํ์ค(์ ๋จ, truncation!), ์ฌ๋ฌ ์ ํ์ ํ ์๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ ๋ฑ์ ๋ง์ง๋ง์ผ๋ก ํ ๋ฒ ๋ณด๊ฒ ์ต๋๋ค.
import torch
from transformers import AutoTokenizer, AutoModelForSequenceClassification
checkpoint = "distilbert-base-uncased-finetuned-sst-2-english"
tokenizer = AutoTokenizer.from_pretrained(checkpoint)
model = AutoModelForSequenceClassification.from_pretrained(checkpoint)
sequences = ["I've been waiting for a HuggingFace course my whole life.", "So have I!"]
tokens = tokenizer(sequences, padding=True, truncation=True, return_tensors="pt")
output = model(**tokens)
print(output)
SequenceClassifierOutput(loss=None, logits=tensor([[-1.5607, 1.6123],
[-3.6183, 3.9137]], grad_fn=<AddmmBackward0>), hidden_states=None, attentions=None)
Author And Source
์ด ๋ฌธ์ ์ ๊ดํ์ฌ([๐ค ๊ฐ์ข 2.6] 2์ฅ์์ ๋ฐฐ์ด ๊ฒ ์ด์ ๋ฆฌ), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค https://velog.io/@spasis/๊ฐ์ข-2.5-2์ฅ์์-๋ฐฐ์ด-๊ฒ-์ด์ ๋ฆฌ์ ์ ๊ท์: ์์์ ์ ๋ณด๊ฐ ์์์ URL์ ํฌํจ๋์ด ์์ผ๋ฉฐ ์ ์๊ถ์ ์์์ ์์ ์ ๋๋ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ ์ธ ๋ฐ๊ฒฌ์ ์ ๋ (Collection and Share based on the CC Protocol.)
์ข์ ์นํ์ด์ง ์ฆ๊ฒจ์ฐพ๊ธฐ
๊ฐ๋ฐ์ ์ฐ์ ์ฌ์ดํธ ์์ง
๊ฐ๋ฐ์๊ฐ ์์์ผ ํ ํ์ ์ฌ์ดํธ 100์ ์ถ์ฒ ์ฐ๋ฆฌ๋ ๋น์ ์ ์ํด 100๊ฐ์ ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ํ์ต ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค