๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
AI

[PyTorch] Transformers ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ #2

by jjjaeunn 2023. 11. 1.

 

Hugging Face ๐Ÿค— ์‚ฌ์—์„œ ์ œ๊ณตํ•˜๋Š” Transformers Course๋ฅผ ํ•œ๊ตญ์–ด ๋ฒ„์ „์œผ๋กœ ํ˜ผ์ž ๊ณต๋ถ€ํ•˜๋ฉฐ ์ •๋ฆฌํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค.


  • 1์žฅ์—์„œ ์†Œ๊ฐœํ•œ pipeline() ํ•จ์ˆ˜๋ฅผ ๋Œ€์ฒดํ•˜๊ธฐ ์œ„ํ•ด, ์ง์ ‘ model๊ณผ tokenizer๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•œ๋‹ค.
  • tokenizer๋Š” ํ…์ŠคํŠธ ์ž…๋ ฅ์„ ์ˆ˜์น˜ ๋ฐ์ดํ„ฐ(numerical data)๋กœ ๋ณ€ํ™˜ํ•˜๊ณ , ์ด ์ˆ˜์น˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์‹œ ํ…์ŠคํŠธ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.
  • model์€ ์ ํ•ฉํ•œ ๋ชจ๋ธ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋ถˆ๋Ÿฌ์™€ ํ•™์Šต์„ ์ง„ํ–‰ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.
  • ํŒŒ์ดํ”„๋ผ์ธ์€ ์ „์ฒ˜๋ฆฌ, ๋ชจ๋ธ๋กœ ์ž…๋ ฅ ์ „๋‹ฌ, ํ›„์ฒ˜๋ฆฌ์˜ 3๋‹จ๊ณ„๋ฅผ ํ•œ ๋ฒˆ์— ์‹คํ–‰ํ•œ๋‹ค.

๋ชจ๋ธ / ํ† ํฌ๋‚˜์ด์ € ๋ถˆ๋Ÿฌ์˜ค๊ธฐ

  • config() ๊ธฐ๋ณธ ์„ค์ •์—์„œ ๋ชจ๋ธ์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์ง€๋งŒ, ๋ณดํ†ต ์‚ฌ์ „ ํ•™์Šต๋œ Transformer ๋ชจ๋ธ์„ ๋กœ๋“œํ•ด์˜จ๋‹ค.
  • from_pretrained() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด์„œ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
from transformers import AutoModel
import torch
  • checkpoint์— ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์€ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์ €์žฅํ•ด๋‘” ๋’ค, ํ† ํฌ๋‚˜์ด์ €์™€ ๋ชจ๋ธ์„ ํ•ด๋‹น ์•„ํ‚คํ…์ฒ˜์—์„œ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
checkpoint = "bert-base-cased"
tokenizer = AutoTokenizer.from_pretrained(checkpoint)
model = AutoModel.from_pretrained(checkpoint)

 

sequence๋ฅผ ์ธ์ฝ”๋”ฉ๋œ id๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ

sequences = ["Hello!", "Cool.", "Nice!"]
encoded_ids = []
for sequence in sequences:
    tokens = tokenizer.tokenize(sequence)
    ids = tokenizer.convert_tokens_to_ids(tokens)
    encoded_ids.append(ids)
    
inputs = torch.tensor(encoded_ids)
  • sequences์— ์ €์žฅ๋œ ๊ฐ ๋ฌธ์žฅ์„ ์ธ์ฝ”๋”ฉ ํ•ด์ค€๋‹ค.
  • ๋„์–ด์“ฐ๊ธฐ๊ฐ€ ์žˆ๋Š” ๋ฌธ์žฅ์„ ํฌํ•จํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ํŒจ๋”ฉ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ณผ์ •์ด ํ•„์š”ํ•˜๋‹ค. (์ถ”ํ›„์— ๋‚˜์˜ด)

output / postprocessing

  • ํ˜„์žฌ ๋ชจ๋ธ์„ ๊ฑฐ์นœ output์€ ํˆฌํ”Œ ํ˜•ํƒœ๋กœ, last_hidden_state, grad_fn ๋“ฑ์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค. ์ด ์ค‘  softmax๋ฅผ ์ด์šฉํ•ด last_hidden_state ๊ฐ’์„ ์ •๊ทœํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

  • ์ฐธ๊ณ ๋กœ last hidden state๋Š” BERT ๋ชจ๋ธ์˜ ๋งˆ์ง€๋ง‰ ๋ ˆ์ด์–ด์—์„œ์˜ ์€๋‹‰ ์ƒํƒœ๋กœ, ์ตœ์ข… ๊ฒฐ๊ณผ๋ฌผ์— ํ•ด๋‹นํ•œ๋‹ค.

๋‹ค์ค‘ ์‹œํ€€์Šค ์ฒ˜๋ฆฌํ•˜๊ธฐ

  • ๋ชจ๋ธ์€ ์ž…๋ ฅ์˜ ๋ฐฐ์น˜ ํ˜•ํƒœ๋ฅผ ์š”๊ตฌํ•˜๊ณ , ๋‹จ์ผํ•œ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ž…๋ ฅ์œผ๋กœ ๋„ฃ์„ ์‹œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

  • ๋”ฐ๋ผ์„œ input์€ ๋ฌด์กฐ๊ฑด ๋ฐฐ์น˜ ํ˜•ํƒœ(๋‹ค์ค‘ ๋ฆฌ์ŠคํŠธ)๋กœ ์ „๋‹ฌํ•ด์•ผ ํ•œ๋‹ค. 
  • ์•„๋ž˜์ฒ˜๋Ÿผ ๋ฆฌ์ŠคํŠธ๋กœ ํ•œ ๋ฒˆ ๋” ๊ฐ์‹ธ์ฃผ๋ฉด, ์ฐจ์›์ด ์ฆ๊ฐ€ํ•˜๋ฉด์„œ ๋ชจ๋ธ์„ ๊ฑฐ์น  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.
input_ids = torch.tensor([ids])

padding ์ถ”๊ฐ€ํ•˜๊ธฐ

  • tensor๋Š” ๋ฐ˜๋“œ์‹œ ์ง์‚ฌ๊ฐํ˜• ๋ชจ์–‘์ด์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  input sequence๋Š” ํฌ๊ธฐ๊ฐ€ ๋™์ผํ•ด์•ผ ํ•œ๋‹ค.
  • ๋ฌธ์žฅ์˜ ๊ธธ์ด๋“ค์€ ์ „๋ถ€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— max_length๋ฅผ ์ •ํ•œ ๋’ค, ๋ชจ๋‘ ๋™์ผํ•œ ์‚ฌ์ด์ฆˆ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋„๋ก padding์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ์‹์„ ์ฑ„ํƒํ•œ๋‹ค.
  • ์ด ๋•Œ padding ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๊ณ ๋ คํ•˜์ง€ ์•Š๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด attention mask๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

attention mask ์‚ฌ์šฉํ•˜๊ธฐ

batch_ids = [
    [200, 200, 200],
    [200, 200, tokenizer.pad_token_id],
]

attention_mask = [
    [1, 1, 1],
    [1, 1, 0],
]

outputs = model(torch.tensor(batch_ids), attention_mask=torch.tensor(attention_mask))
print(outputs.logits)
  • ์œ„์ฒ˜๋Ÿผ padding ์ฒ˜๋ฆฌํ•œ ID์—๋Š” attention mask๋ฅผ 0์œผ๋กœ ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค.

ํŠน์ˆ˜ ํ† ํฐ๋“ค

  • ํ† ํฌ๋‚˜์ด์ €๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฐ’์„ ๋ฐ”๋กœ ๋””์ฝ”๋”ฉํ•œ ๊ฒฝ์šฐ, CLS/SEP ๊ณผ ๊ฐ™์€ ํŠน์ˆ˜ ํ† ํฐ๋“ค์ด ์ถ”๊ฐ€๋œ๋‹ค.
  • tokenize ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์–ป์€ token๋“ค์„ id๋กœ ๋ณ€ํ™˜ํ•œ ํ›„ ๋””์ฝ”๋”ฉํ•˜๋ฉด ํŠน์ˆ˜ ํ† ํฐ์ด ์—†์ด ์ผ๋ฐ˜ ๋ฌธ์žฅ์œผ๋กœ ๋””์ฝ”๋”ฉ๋œ๋‹ค.