[๐ค ๊ฐ์ข 2.5] ๋ค์ค ์ํ์ค ์ฒ๋ฆฌ
์ด์ ์น์ ์์ ์ฐ๋ฆฌ๋ ๊ฐ์ฅ ๊ฐ๋จํ ํ์ฉ ์ฌ๋ก๋ฅผ ์ดํด๋ณด์์ต๋๋ค. ์ฆ, ๊ธธ์ด๊ฐ ์งง์ ๋จ์ผ ์ํ์ค์ ๋ํ ์ถ๋ก ์ ์ํํ๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ๋ช ๊ฐ์ง ์๋ฌธ์ ์ด ๋ฒ์จ ๋จธ๋ฆฌ์์ ๋จ์ต๋๋ค:
-
๋ค์ค ์ํ์ค(multiple sequences)๋ฅผ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ ๊น?
-
๊ฐ๊ฐ์ด ๊ธธ์ด๊ฐ ๋ค๋ฅธ ์ฌ๋ฌ ๊ฐ์ ์ํ์ค๋ฅผ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ ๊น?
-
๋ชจ๋ธ์ด ์ ๋์ํ ์ ์๊ฒ ํ๊ธฐ ์ํด์ ์ดํ์ง(vocabulary)์ ์ธ๋ฑ์ค๋ค๋ง ์ ๋ ฅํ๋ฉด ๋ ๊น?
-
๊ธธ์ด๊ฐ ์์ฒญ๋๊ฒ ๊ธด ์ํ์ค์ ๋ํด์๋ ์ ์ฒ๋ฆฌํ ์ ์์๊น?
์ ์ง๋ฌธ๋ค์ด ์ด๋ค ๋ฌธ์ ๋ฅผ ์ผ์ผํค๊ณ ์ด๋ฅผ ๐คTransformers API๋ฅผ ์ฌ์ฉํ์ฌ ํด๊ฒฐํ ์ ์๋์ง ์์๋ด ์๋ค.
๋ชจ๋ธ(model)์ ์ ๋ ฅ์ ๋ฐฐ์น(batch) ํํ๋ฅผ ์๊ตฌํ๋ค.
์ด์ ์น์ ์์ ์ํ์ค๊ฐ ์ซ์ ๋ฆฌ์คํธ๋ก ๋ณํ๋๋ ๋ฐฉ๋ฒ์ ๋ณด์์ต๋๋ค. ์ด ์ซ์ ๋ฆฌ์คํธ๋ฅผ ํ ์(tensor)๋ก ๋ณํํ๊ณ ๋ชจ๋ธ์ ์ ๋ ฅํด ๋ณด๊ฒ ์ต๋๋ค:
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)
sequence = "I've been waiting for a HuggingFace course my whole life."
tokens = tokenizer.tokenize(sequence)
ids = tokenizer.convert_tokens_to_ids(tokens)
input_ids = torch.tensor(ids)
# This line will fail
model(input_ids)
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
/tmp/ipykernel_9651/1126667217.py in <module>
12 input_ids = torch.tensor(ids)
13 # This line will fail
---> 14 model(input_ids)
~/anaconda3/lib/python3.8/site-packages/torch/nn/modules/module.py in _call_impl(self, *input, **kwargs)
1100 if not (self._backward_hooks or self._forward_hooks or self._forward_pre_hooks or _global_backward_hooks
1101 or _global_forward_hooks or _global_forward_pre_hooks):
-> 1102 return forward_call(*input, **kwargs)
1103 # Do not call functions when jit is used
1104 full_backward_hooks, non_full_backward_hooks = [], []
~/anaconda3/lib/python3.8/site-packages/transformers/models/distilbert/modeling_distilbert.py in forward(self, input_ids, attention_mask, head_mask, inputs_embeds, labels, output_attentions, output_hidden_states, return_dict)
727 return_dict = return_dict if return_dict is not None else self.config.use_return_dict
728
--> 729 distilbert_output = self.distilbert(
730 input_ids=input_ids,
731 attention_mask=attention_mask,
~/anaconda3/lib/python3.8/site-packages/torch/nn/modules/module.py in _call_impl(self, *input, **kwargs)
1100 if not (self._backward_hooks or self._forward_hooks or self._forward_pre_hooks or _global_backward_hooks
1101 or _global_forward_hooks or _global_forward_pre_hooks):
-> 1102 return forward_call(*input, **kwargs)
1103 # Do not call functions when jit is used
1104 full_backward_hooks, non_full_backward_hooks = [], []
~/anaconda3/lib/python3.8/site-packages/transformers/models/distilbert/modeling_distilbert.py in forward(self, input_ids, attention_mask, head_mask, inputs_embeds, output_attentions, output_hidden_states, return_dict)
548
549 if inputs_embeds is None:
--> 550 inputs_embeds = self.embeddings(input_ids) # (bs, seq_length, dim)
551 return self.transformer(
552 x=inputs_embeds,
~/anaconda3/lib/python3.8/site-packages/torch/nn/modules/module.py in _call_impl(self, *input, **kwargs)
1100 if not (self._backward_hooks or self._forward_hooks or self._forward_pre_hooks or _global_backward_hooks
1101 or _global_forward_hooks or _global_forward_pre_hooks):
-> 1102 return forward_call(*input, **kwargs)
1103 # Do not call functions when jit is used
1104 full_backward_hooks, non_full_backward_hooks = [], []
~/anaconda3/lib/python3.8/site-packages/transformers/models/distilbert/modeling_distilbert.py in forward(self, input_ids)
117 embeddings)
118 """
--> 119 seq_length = input_ids.size(1)
120
121 # Setting the position-ids to the registered buffer in constructor, it helps
IndexError: Dimension out of range (expected to be in range of [-1, 0], but got 1)
์ด๋ฐ! ๋ญ๊ฐ ๋ฌธ์ ์ผ๊น์? ์ ์ฝ๋์์ ์ฐ๋ฆฌ๋ ์น์ 2์์์ ํ์ดํ๋ผ์ธ ๋จ๊ณ๋ฅผ ๊ทธ๋๋ก ๋ฐ๋์ต๋๋ค.
์ ๋ฌธ์ ๋ ์ฐ๋ฆฌ๊ฐ ๋ชจ๋ธ์ ํ๋์ ๋จ์ผ ์ํ์ค๋ฅผ ์ ๋ ฅํด์ ๋ฐ์ํ๋ ๋ฌธ์ ์ ๋๋ค. ๐คTransformers ๋ชจ๋ธ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ค์ค ๋ฌธ์ฅ(์ํ์ค)์ ํ๋ฒ์ ์ ๋ ฅํ๊ธฐ๋ฅผ ๊ธฐ๋ํ๋ค๋ ๊ฒ์ ๋๋ค. ์ฌ๊ธฐ์์ ์ฐ๋ฆฌ๋ ์ํ์ค์ ํ ํฌ๋์ด์ ๋ฅผ ์ ์ฉํ ๋ ์ค์ ๋ด๋ถ์ ์ผ๋ก ์ํํ๋ ๋ชจ๋ ์์ ์ ์๋ํ์ต๋๋ค. ํ์ง๋ง ์๋ ์ฝ๋๋ฅผ ์์ธํ ๋ณด๋ฉด ์ ๋ ฅ ์๋ณ์(input IDs) ๋ฆฌ์คํธ๋ฅผ ํ ์๋ก ๋ณํํ๋ ๋์์ ์ฐจ์(dimension) ํ๋๊ฐ ๊ทธ ์์ ์ถ๊ฐ๋๋ ๊ฒ์ ์ ์ ์์ต๋๋ค:
tokenized_inputs = tokenizer(sequence, return_tensors="pt")
print(tokenized_inputs["input_ids"])
tensor([[ 101, 1045, 1005, 2310, 2042, 3403, 2005, 1037, 17662, 12172,
2607, 2026, 2878, 2166, 1012, 102]])
์ค๋ฅ๊ฐ ๋ฐ์ํ ์ฝ๋์์ input_ids
์ ์๋ก์ด ์ฐจ์์ ํ๋ ์ถ๊ฐํด ๋ณด๊ฒ ์ต๋๋ค:
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)
sequence = "I've been waiting for a HuggingFace course my whole life."
tokens = tokenizer.tokenize(sequence)
ids = tokenizer.convert_tokens_to_ids(tokens)
input_ids = torch.tensor([ids])
print("Input IDs:", input_ids)
output = model(input_ids)
print("Logits:", output.logits)
Input IDs: tensor([[ 1045, 1005, 2310, 2042, 3403, 2005, 1037, 17662, 12172, 2607,
2026, 2878, 2166, 1012]])
Logits: tensor([[-2.7276, 2.8789]], grad_fn=<AddmmBackward0>)
์ ์ฝ๋์์๋ ์ ๋ ฅ ์๋ณ์(input IDs)์ ๊ทธ ๊ฒฐ๊ณผ ๋ก์ง(logit) ๊ฐ์ ์ถ๋ ฅํ๊ณ ์์ต๋๋ค.
Batching ์ด๋ ๋ชจ๋ธ์ ํตํด ํ๋ฒ์ ์ฌ๋ฌ ๋ฌธ์ฅ์ ์ ๋ ฅํ๋ ๋์์ ๋๋ค. ๋ฌธ์ฅ์ด ํ๋๋ง ์๋ ๊ฒฝ์ฐ ์๋์ ๊ฐ์ด ๋จ์ผ ์ํ์ค๋ก ๋ฐฐ์น(batch) ๋ฅผ ๋น๋ํ ์ ์์ต๋๋ค.
batch_ids = [ids, ids]
์ด๊ฒ์ ๋์ผํ ๋ ์ํ์ค๋ก ๊ตฌ์ฑ๋ ๋ฐฐ์น(batch) ์ ๋๋ค!
๋ฐฐ์น(batch) ์ฒ๋ฆฌ๋ฅผ ํตํด์ ๋ชจ๋ธ์ด ์ฌ๋ฌ ๋ฌธ์ฅ์ ๋์์ ์ ๋ ฅ๋ฐ์ ์ ์๋๋ก ํ ์ ์์ต๋๋ค. ๋ค์ค ์ํ์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋จ์ผ ์ํ์ค๋ก ๋ฐฐ์น(batch)๋ฅผ ๊ตฌ์ฑํ๋ ๊ฒ๋งํผ ๊ฐ๋จํฉ๋๋ค. ํ์ง๋ง ๋ ๋ฒ์งธ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๋ ๊ฐ(๋๋ ๊ทธ ์ด์) ๋ฌธ์ฅ์ ํจ๊ป ๋ฐฐ์น(batch) ์ฒ๋ฆฌํ๋ ค๊ณ ํ ๋ ๊ฐ ๋ฌธ์ฅ์ ๊ธธ์ด๊ฐ ๋ค๋ฅผ ์ ์์ต๋๋ค. ์ด์ ์ ํ ์(tensor)๋ฅผ ์ฌ์ฉํด ๋ณธ ์ ์ด ์๋ค๋ฉด ํญ์ ๊ทธ ํํ๊ฐ ์ง์ฌ๊ฐํ ๋ชจ์์ด์ด์ผ ํ๋ค๋ ๊ฒ์ ์๊ณ ์์ ๊ฒ์ ๋๋ค. ๋ฐ๋ผ์ ์ด๋ด ๊ฒฝ์ฐ์๋ ์ ๋ ฅ ์๋ณ์(input IDs) ๋ฆฌ์คํธ๋ฅผ ํ ์๋ก ์ง์ ๋ณํํ ์ ์์ต๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ผ๋ฐ์ ์ผ๋ก ์ ๋ ฅ์ ์ฑ์๋๋ค(padding).
์ ๋ ฅ์ ํจ๋ฉ(padding)ํ๊ธฐ
๋ค์ ๋ฆฌ์คํธ์ ๋ฆฌ์คํธ(ํน์ ์ด์ค ๋ฆฌ์คํธ)๋ ํ ์๋ก ๋ณํํ ์ ์์ต๋๋ค.
batched_ids = [
[200, 200, 200],
[200, 200],
]
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ํจ๋ฉ(padding) ์ ์ฌ์ฉํ์ฌ ํ
์๋ฅผ ์ง์ฌ๊ฐํ ๋ชจ์์ผ๋ก ๋ง๋ญ๋๋ค. ํจ๋ฉ(padding)์ ๊ธธ์ด๊ฐ ๋ ์งง์ ๋ฌธ์ฅ์ ํจ๋ฉ ํ ํฐ(padding token) ์ด๋ผ๋ ํน์ ๋จ์ด๋ฅผ ์ถ๊ฐํ์ฌ ๋ชจ๋ ๋ฌธ์ฅ์ด ๋์ผํ ๊ธธ์ด๋ฅผ ๊ฐ๋๋ก ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, 10๊ฐ์ ๋จ์ด๋ก ๊ตฌ์ฑ๋ 10๊ฐ์ ๋ฌธ์ฅ๊ณผ 20๊ฐ์ ๋จ์ด๊ฐ ์๋ 1๊ฐ์ ๋ฌธ์ฅ์ด ์๋ ๊ฒฝ์ฐ, ํจ๋ฉ(padding)์ ์ฌ์ฉํ๋ฉด ๋ชจ๋ ๋ฌธ์ฅ์ 20๊ฐ์ ๋จ์ด๊ฐ ํฌํจ๋ฉ๋๋ค. ์์ batched_ids
๋ฅผ ํจ๋ฉ(padding) ์ฒ๋ฆฌํ๋ฉด ๊ฒฐ๊ณผ ํ
์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
padding_id = 100
batched_ids = [
[200, 200, 200],
[200, 200, padding_id],
]
ํจ๋ฉ ํ ํฐ(padding token)์ ์๋ณ์(ID)๋ tokenizer.pad_token_id
์ ์ง์ ๋์ด ์์ต๋๋ค. ์ด๋ฅผ ํ์ฉํ์ฌ ๋ ๊ฐ์ ์ํ์ค๋ฅผ ํ๋ฒ์ ๊ฐ๋ณ์ ์ผ๋ก ๋ ํ๋ฒ์ ๋ฐฐ์น(batch) ํํ๋ก ๋ชจ๋ธ์ ์
๋ ฅํด ๋ณด๊ฒ ์ต๋๋ค:
model = AutoModelForSequenceClassification.from_pretrained(checkpoint)
sequence1_ids = [[200, 200, 200]]
sequence2_ids = [[200, 200]]
batched_ids = [
[200, 200, 200],
[200, 200, tokenizer.pad_token_id],
]
print(model(torch.tensor(sequence1_ids)).logits)
print(model(torch.tensor(sequence2_ids)).logits)
print(model(torch.tensor(batched_ids)).logits)
tensor([[ 1.5694, -1.3895]], grad_fn=<AddmmBackward0>)
tensor([[ 0.5803, -0.4125]], grad_fn=<AddmmBackward0>)
tensor([[ 1.5694, -1.3895],
[ 1.3374, -1.2163]], grad_fn=<AddmmBackward0>)
๋ฐฐ์น ์ฒ๋ฆฌ๋ ์์ธก ๊ฒฐ๊ณผ์ ๋ก์ง(logits)์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๋ ๋ฒ์งธ ํ์ ๋ ๋ฒ์งธ ๋ฌธ์ฅ์ ๋ก์ง(logits)๊ณผ ๊ฐ์์ผ ํ์ง๋ง ์์ ํ ๋ค๋ฅธ ๊ฐ์ ๊ฐ์ต๋๋ค!
์ด๋ ํธ๋์คํฌ๋จธ(Transformer) ๋ชจ๋ธ์ ํต์ฌ์ ์ธ ํน์ง์ด ๊ฐ ํ ํฐ์ ์ปจํ ์คํธํ(contextualize) ํ๋ ์ดํ ์ ๋ ์ด์ด(attention layers)๋ฅผ ๊ฐ์ง๊ณ ์๋ค๋ ์ฌ์ค์ด๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ดํ ์ ๋ ์ด์ด(attention layers)๋ ์ํ์ค์ ๋ชจ๋ ํ ํฐ์ ์ฃผ์ ์ง์ค(paying attention)์ ํ๊ธฐ ๋๋ฌธ์ ํจ๋ฉ ํ ํฐ๋ ์ญ์ ๊ณ ๋ คํฉ๋๋ค. ๋ชจ๋ธ์ ๊ธธ์ด๊ฐ ๋ค๋ฅธ ๊ฐ๋ณ ๋ฌธ์ฅ๋ค์ ์ ๋ ฅํ ๋๋ ๋์ผํ ๋ฌธ์ฅ์ผ๋ก ๊ตฌ์ฑ๋ ํจ๋ฉ์ด ์ ์ฉ๋ ๋ฐฐ์น(batch)๋ฅผ ์ ๋ ฅํ ๋ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ์ป๊ธฐ ์ํด์๋ ํด๋น ์ดํ ์ ๋ ์ด์ด(attention layers)๊ฐ ํจ๋ฉ ํ ํฐ์ ๋ฌด์ํ๋๋ก ์ง์ํด์ผ ํฉ๋๋ค. ์ด๋ ์ดํ ์ ๋ง์คํฌ(attention mask)๋ฅผ ์ฌ์ฉํ์ฌ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
์ดํ ์ ๋ง์คํฌ (attention masks)
์ดํ ์ ๋ง์คํฌ(attention mask)๋ 0๊ณผ 1๋ก ์ฑ์์ง ์ ๋ ฅ ์๋ณ์(input IDs) ํ ์(tensor)์ ํํ๊ฐ ์ ํํ๊ฒ ๋์ผํ ํ ์(tensor)์ ๋๋ค. 1์ ํด๋น ํ ํฐ์ ์ฃผ์๋ฅผ ๊ธฐ์ธ์ฌ์ผ ํจ์ ๋ํ๋ด๊ณ 0์ ํด๋น ํ ํฐ์ ๋ฌด์ํด์ผ ํจ์ ๋ํ๋ ๋๋ค. ์ฆ, ๋ชจ๋ธ์ ์ดํ ์ ๋ ์ด์ด(attention layers)์์ ๋ฌด์ํด์ผ ํฉ๋๋ค.
์ดํ ์ ๋ง์คํฌ(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)
tensor([[ 1.5694, -1.3895],
[ 0.5803, -0.4125]], grad_fn=<AddmmBackward0>)
์ด์ ๋ฐฐ์น(batch)์ ๋ ๋ฒ์งธ ๋ฌธ์ฅ์ ๋ํด ๋์ผํ ๋ก์ง(logits) ๊ฐ์ ์ป์ ์ ์์ต๋๋ค.
๋ ๋ฒ์งธ ์ํ์ค์ ๋ง์ง๋ง ๊ฐ์ด ํจ๋ฉ ์๋ณ์(padding ID)์ด๊ณ ์ด์ ํด๋นํ๋ ์ดํ ์ ๋ง์คํฌ(attention mask)์ ๊ฐ์ด 0์ธ ์ ์ ์ฃผ์ํ์ธ์.
๊ธธ์ด๊ฐ ๋ ๊ธด ์ํ์ค๋ค
ํธ๋์คํฌ๋จธ(Transformer) ๋ชจ๋ธ์ ์ฌ์ฉํ ๋, ๋ชจ๋ธ์ ์ ๋ ฅํ ์ ์๋ ์ํ์ค์ ๊ธธ์ด์ ์ ํ์ด ์์ต๋๋ค. ๋๋ถ๋ถ์ ๋ชจ๋ธ์ ์ต๋ 512๊ฐ ๋๋ 1024๊ฐ์ ํ ํฐ ์ํ์ค๋ฅผ ์ฒ๋ฆฌํ๋ฉฐ, ๊ทธ๋ณด๋ค ๋ ๊ธด ์ํ์ค๋ฅผ ์ฒ๋ฆฌํ๋ผ๋ ์์ฒญ์ ๋ฐ์ผ๋ฉด ์ค๋ฅ๋ฅผ ๋ฐ์์ํต๋๋ค. ์ด ๋ฌธ์ ์ ๋ํ ๋ ๊ฐ์ง ์๋ฃจ์ ์ด ์์ต๋๋ค.
-
๊ธธ์ด๊ฐ ๋ ๊ธด ์ํ์ค๋ฅผ ์ง์ํ๋ ๋ชจ๋ธ์ ์ฌ์ฉํ์ญ์์ค.
-
์ํ์ค๋ฅผ ์ ๋จํฉ๋๋ค(truncation).
๋ชจ๋ธ ๋ณ๋ก ์ง์๋๋ ์ํ์ค ๊ธธ์ด๊ฐ ๋ค๋ฅด๋ฉฐ ์ผ๋ถ ๋ชจ๋ธ์ ๋งค์ฐ ๊ธด ์ํ์ค ์ฒ๋ฆฌ์ ํนํ๋์ด ์์ต๋๋ค. Longformer๊ฐ ํ๋์ ์์ด๊ณ ๋ค๋ฅธ ํ๋๋ LED์ ๋๋ค. ๋งค์ฐ ๊ธด ์ํ์ค๋ฅผ ํ์๋ก ํ๋ ํ์คํฌ๋ฅผ ์ํํ๋ ๊ฒฝ์ฐ ํด๋น ๋ชจ๋ธ์ ์ดํด๋ณด๋ ๊ฒ์ด ์ข์ต๋๋ค.
๊ทธ๋ ์ง ์์ผ๋ฉด, max_sequence_length
๋งค๊ฐ๋ณ์๋ฅผ ์ง์ ํ์ฌ ์ํ์ค๋ฅผ ์ ๋จํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
max_sequence_length = 512
sequence = sequence[:max_sequence_length]
Author And Source
์ด ๋ฌธ์ ์ ๊ดํ์ฌ([๐ค ๊ฐ์ข 2.5] ๋ค์ค ์ํ์ค ์ฒ๋ฆฌ), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค https://velog.io/@spasis/๊ฐ์ข-2.5-๋ค์ค-์ํ์ค-์ฒ๋ฆฌ์ ์ ๊ท์: ์์์ ์ ๋ณด๊ฐ ์์์ URL์ ํฌํจ๋์ด ์์ผ๋ฉฐ ์ ์๊ถ์ ์์์ ์์ ์ ๋๋ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ ์ธ ๋ฐ๊ฒฌ์ ์ ๋ (Collection and Share based on the CC Protocol.)
์ข์ ์นํ์ด์ง ์ฆ๊ฒจ์ฐพ๊ธฐ
๊ฐ๋ฐ์ ์ฐ์ ์ฌ์ดํธ ์์ง
๊ฐ๋ฐ์๊ฐ ์์์ผ ํ ํ์ ์ฌ์ดํธ 100์ ์ถ์ฒ ์ฐ๋ฆฌ๋ ๋น์ ์ ์ํด 100๊ฐ์ ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ํ์ต ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค