ํ—ˆ๊น…ํŽ˜์ด์Šค๋Š” Tensorflow Hub์™€ ์œ ์‚ฌํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ๊ณณ์ด๋‹ค.

 

ํŠธ๋žœ์Šคํฌ๋จธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ๋‹ค์–‘ํ•œ ๋ชจ๋ธ๋“ค์ด ์กด์žฌํ•˜๋ฉฐ, ๊ฐ๊ฐ์˜ Task์— ๋งž๊ฒŒ ๋ฏธ์„ธ์กฐ์ •์„ ์ง„ํ–‰ํ•œ ๋ชจ๋ธ๋“ค ๋˜ํ•œ ๊ตฌ์ถ•๋˜์–ด์žˆ๋‹ค. ๋˜ํ•œ, ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ ๋ชจ๋ธ์— ๋งž๊ฒŒ ์ „์ฒ˜๋ฆฌํ•˜๊ธฐ ํŽธ๋ฆฌํ•˜๋„๋ก Tokenizer๋„ ์ „๋ถ€ ๊ตฌํ˜„๋˜์–ด์žˆ๋‹ค.

๊ทธ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ํ•™์Šต์„ ์œ„ํ•ด ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ์…‹๋„ ์ €์žฅ๋˜์–ด ์žˆ์–ด, ์‚ฌ์šฉ์ž๋Š” ๊ทธ์ € ๊ฐ€์ ธ์˜จ ๋’ค ์‚ฌ์šฉํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค.

 

์ฆ‰, ํ—ˆ๊น…ํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ธฐ์กด ํ•™์Šต ์Šคํฌ๋ฆฝํŠธ์—์„œ ๋ฐ˜๋ณต๋˜๋Š” ๋ชจ๋“  ๋ถ€๋ถ„์„ ์ผ์ผ์ด ๋”ฐ๋กœ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์•„๋„ ํŽธ๋ฆฌํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ฐ์ดํ„ฐ ๊ตฌ์ถ•๋ถ€ํ„ฐ ์ „์ฒ˜๋ฆฌ, ๋ชจ๋ธ ํ•™์Šต ๋ฐ ๊ฒฐ๊ณผ ๋„์ถœ๊นŒ์ง€ ๋งค์šฐ ํŽธ๋ฆฌํ•˜๊ณ  ํšจ์œจ์ ์œผ๋กœ ์ฝ”๋”ฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.

Hugging Face ํ™ˆํŽ˜์ด์ง€

 

ํ—ˆ๊น…ํŽ˜์ด์Šค๋Š” ๋‹ค์–‘ํ•œ ํŠธ๋žœ์Šคํฌ๋จธ ๋ชจ๋ธ๊ณผ ํ•™์Šต ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ชจ๋“ˆ๋กœ, pytorch์™€ tensorflow๋กœ ๊ฐ๊ฐ ๊ตฌํ˜„๋˜์–ด ์žˆ๋‹ค. ๋จผ์ € ํ•„์š”ํ•œ ๋ชจ๋ธ์„ ์ž์‹ ์˜ ์ž‘์—…์— ๋งž๊ฒŒ ๊ฐ€์ ธ์˜ค๋ฉด ๋œ๋‹ค. 

Models

๊ฐ„๋‹จํ•˜๊ฒŒ Fill-Mask๋ฅผ ์œ„ํ•ด BERT ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด "bert-base-uncased" ์ฒ˜๋Ÿผ ๊ฒ€์ƒ‰์„ ํ•˜์—ฌ ๋“ค์–ด๊ฐ€์„œ ์ •๋ณด๋ฅผ ํ™•์ธํ•˜๋ฉด ๋œ๋‹ค. 

BERT Model

์ด ๋ชจ๋ธ์„ ๋งค์šฐ ๊ฐ„๋‹จํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

#BERT ๋ชจ๋ธ๊ณผ ์ด๋ฅผ ์œ„ํ•œ BERT ๋ชจ๋ธ์— ๋งž๋Š” Tokenizer์„ ๊ฐ€์ ธ์˜จ๋‹ค.
from transformers import BertTokenizer, BertModel

#ํ† ํฌ๋‚˜์ด์ €๋Š” ๋ฏธ๋ฆฌ ํ•™์Šต๋œ 'bert-base-uncased'์—์„œ ๊ฐ€์ ธ์˜จ๋‹ค.
#BertTokenizer๋Œ€์‹  AutoTokenizer์„ ์‚ฌ์šฉํ•ด๋„ ๋œ๋‹ค.
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')

# ๋ชจ๋ธ์€ ์‚ฌ์ „ ํ•™์Šต๋œ "bert-base-uncased"์„ ๊ฐ€์ ธ์™€์„œ ์‚ฌ์šฉํ•œ๋‹ค.
# ์ด๋˜ํ•œ AutoModel์„ importํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
model = BertModel.from_pretrained("bert-base-uncased")

#๋ฐ์ดํ„ฐ๋ฅผ ์ž…๋ ฅํ•œ๋’ค
text = "Replace me by any text you'd like."

#ํ† ํฌ๋‚˜์ด์ €๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ๋ธ์— ๋„ฃ์„ ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ค์–ด์ค€๋‹ค. 
#'pt'๋Š” pytorch, 'tf'๋Š” tensorflow๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
encoded_input = tokenizer(text, return_tensors='pt')

#๋งˆ์ง€๋ง‰์œผ๋กœ ๋ชจ๋ธ์— ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์œผ๋ฉด ๋๋‚œ๋‹ค.
output = model(**encoded_input)

๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

from datasets import load_dataset

# ํ—ˆ๊น…ํŽ˜์ด์Šค์—์„œ SNLI ๋ฐ์ดํ„ฐ์…‹ ๊ฐ€์ ธ์˜ค๊ธฐ
raw_datasets = load_dataset("snli")

๊ฐ„๋‹จํ•˜๊ฒŒ ๊ฐ€์ ธ์™€์„œ ์‚ฌ์šฉ๋งŒ ํ•œ๋‹ค๋ฉด ์œ„์™€ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ฐ€๋Šฅํ•˜๋‹ค.


ํ—ˆ๊น…ํŽ˜์ด์Šค์—์„œ ํŠธ๋žœ์Šคํฌ๋จธ ๋ชจ๋ธ์„ ๊ฐ€์ ธ์™€์„œ ์ž์‹ ์˜ ์ž‘์—…์— ๋งž๊ฒŒ ๋ฏธ์„ธ์กฐ์ • ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

์˜ˆ์‹œ๋กœ Text Classification ํ•˜๋Š” ๋ชจ๋ธ์ด๋‹ค.

#ํ•™์Šต์— ์‚ฌ์šฉํ•  ์˜ตํ‹ฐ๋งˆ์ด์ €๋ฅผ ์„ค์ •
from transformers import AdamW

optimizer = AdamW(model.parameters(), lr=2e-5)

#๋ฐ์ดํ„ฐ์…‹์„ ์ „์ฒ˜๋ฆฌ ์™„๋ฃŒํ–ˆ๋‹ค๋Š” ๊ฐ€์ •ํ•˜์—, ํ•™์Šต์„ ์œ„ํ•œ ๊ธฐํƒ€ ์„ค์ •์„ ์ง„ํ–‰ํ•œ๋‹ค.
num_epochs = 5
num_training_steps = num_epochs * len(train_dataloader)
lr_scheduler = get_scheduler(
    "linear",
    optimizer=optimizer,
    num_warmup_steps=0,
    num_training_steps=num_training_steps,
)

#๊ฐ€์ ธ์˜จ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•™์Šต์„ ์ง„ํ–‰ํ•œ๋‹ค.
for batch in train_dataloader:
    model.train()
    optimizer.zero_grad()
    batch = {k: v.to(device) for k, v in batch.items()}

    outputs = model(**batch)
    loss = outputs.loss
    loss.backward()
    optimizer.step()
    lr_scheduler.step()

torch.save(model,model_save_path)

์ด์™€ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ํ•™์Šต์„ ์ง„ํ–‰ํ•˜๋Š”๋ฐ,

ํ•™์Šต์œจ์„ ์ž‘๊ฒŒ ์„ค์ •ํ•˜์—ฌ ์ž์‹ ์˜ ๋ฐ์ดํ„ฐ์…‹์œผ๋กœ ๋ฏธ์„ธ ์กฐ์ • ์‹œํ‚ค๋ฉด ๋œ๋‹ค.

์ค‘๊ฐ„์— ํ•™์Šต๋˜๋Š” ๊ณผ์ •์„ ํ™•์ธํ•˜๊ณ  ์‹ถ์œผ๋ฉด, ์•„๋ž˜์™€ ๊ฐ™์ด ์„ค์ •ํ•˜์—ฌ ์„ฑ๋Šฅ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

# ์—ํฌํฌ๊ฐ€ ํ•˜๋‚˜ ์ง„ํ–‰๋˜์—ˆ์„ ๋•Œ ๋งˆ๋‹ค ๋Œ์•„๊ฐ€๋„๋ก ์„ค์ •ํ•˜๋ฉด ๋œ๋‹ค.
model.eval()
test_loss = 0
correct = 0
with torch.no_grad():
    for batch in eval_dataloader:
        batch = {k: v.to(device) for k, v in batch.items()}
        outputs = model(**batch)
        logits = outputs.logits
        predict = torch.argmax(logits, dim=-1)
        metric.add_batch(predictions=predict, references=batch["labels"])
print(metric.compute())

ํ˜น์—ฌ๋‚˜ ๋‹ค๋ฅธ Task์˜ ์ž‘์—…์„ ์œ„ํ•ด ๋งŒ๋“ค์–ด๋†“์€ ๋ชจ๋ธ์„ ์ž์‹ ์˜ Task์— ๋งž๊ฒŒ ๋ชจ๋ธ์˜ ์•„์›ƒํ’‹์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

#๋ชจ๋ธ์ •์˜ํ•˜๊ณ  ๋ชจ๋ธ์— ๋ฐฐ์น˜ ์ „๋‹ฌ
from transformers import AutoModelForSequenceClassification
from transformers import AutoConfig

# model์„ ์ˆ˜์ •ํ•  ๊ฑฐ๋ผ๊ณ  ์„ค์ •
config_model = AutoConfig.from_pretrained(model_name)

# ๋ชจ๋ธ์˜ ๋งˆ์ง€๋ง‰ ๋ถ€๋ถ„์— Classification์„ ์œ„ํ•ด 3๊ฐœ์˜ ์•„์›ƒํ’‹์œผ๋กœ ์„ค์ •ํ•จ
config_model.num_labels = 3

# ์ˆ˜์ •ํ•œ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•  ๊ฑฐ๋ผ๊ณ  ์„ค์ •
model =AutoModelForSequenceClassification.from_config(config_model)

 ํ˜„์žฌ๊นŒ์ง€๋Š” Classification์„ ์œ„ํ•œ ์˜ˆ์‹œ์ด๋ฉฐ, ํšŒ๊ท€๋‚˜ ๋‹ค๋ฅธ Task์˜ ์ž‘์—…์€ ํ—ˆ๊น…ํŽ˜์ด์Šค ํ™ˆํŽ˜์ด์ง€์— ์ž์„ธํžˆ ์„ค๋ช…๋˜์–ด์žˆ๋‹ค.

 

https://huggingface.co/

 

๋งค์šฐ ํŽธํ•˜๊ณ  ์“ฐ๊ธฐ ์‰ฝ๋‹ค. ์ž์—ฐ์–ด ์ฒ˜๋ฆฌ ๊ณต๋ถ€ํ•˜๋ฉด์„œ ์œ ์šฉํ•˜๊ฒŒ ์ž˜ ์“ฐ๊ณ  ์žˆ๋‹ค.

728x90
๋ฐ˜์‘ํ˜•
Liky