๋ง์ถคํ ์ํคํ ์ฒ ๋ง๋ค๊ธฐ[[create-a-custom-architecture]]
AutoClass
๋ ๋ชจ๋ธ ์ํคํ
์ฒ๋ฅผ ์๋์ผ๋ก ์ถ๋ก ํ๊ณ ๋ฏธ๋ฆฌ ํ์ต๋ configuration๊ณผ ๊ฐ์ค์น๋ฅผ ๋ค์ด๋ก๋ํฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ฒดํฌํฌ์ธํธ์ ๊ตฌ์ ๋ฐ์ง ์๋ ์ฝ๋๋ฅผ ์์ฑํ๋ ค๋ฉด AutoClass
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ํ์ง๋ง ํน์ ๋ชจ๋ธ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ณด๋ค ์ธ๋ฐํ๊ฒ ์ ์ดํ๊ณ ์ ํ๋ ์ฌ์ฉ์๋ ๋ช ๊ฐ์ง ๊ธฐ๋ณธ ํด๋์ค๋ง์ผ๋ก ์ปค์คํ
๐ค Transformers ๋ชจ๋ธ์ ์์ฑํ ์ ์์ต๋๋ค. ์ด๋ ๐ค Transformers ๋ชจ๋ธ์ ์ฐ๊ตฌ, ๊ต์ก ๋๋ ์คํํ๋ ๋ฐ ๊ด์ฌ์ด ์๋ ๋ชจ๋ ์ฌ์ฉ์์๊ฒ ํนํ ์ ์ฉํ ์ ์์ต๋๋ค. ์ด ๊ฐ์ด๋์์๋ 'AutoClass'๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์ปค์คํ
๋ชจ๋ธ์ ๋ง๋๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค:
- ๋ชจ๋ธ configuration์ ๊ฐ์ ธ์ค๊ณ ์ฌ์ฉ์ ์ง์ ํฉ๋๋ค.
- ๋ชจ๋ธ ์ํคํ ์ฒ๋ฅผ ์์ฑํฉ๋๋ค.
- ํ ์คํธ์ ์ฌ์ฉํ ๋๋ฆฌ๊ฑฐ๋ ๋น ๋ฅธ ํ ํฐํ๊ธฐ๋ฅผ ๋ง๋ญ๋๋ค.
- ๋น์ ์์ ์ ์ํ ์ด๋ฏธ์ง ํ๋ก์ธ์๋ฅผ ์์ฑํฉ๋๋ค.
- ์ค๋์ค ์์ ์ ์ํ ํน์ฑ ์ถ์ถ๊ธฐ๋ฅผ ์์ฑํฉ๋๋ค.
- ๋ฉํฐ๋ชจ๋ฌ ์์ ์ฉ ํ๋ก์ธ์๋ฅผ ์์ฑํฉ๋๋ค.
Configuration[[configuration]]
configuration์ ๋ชจ๋ธ์ ํน์ ์์ฑ์ ๋ํ๋
๋๋ค. ๊ฐ ๋ชจ๋ธ ๊ตฌ์ฑ์๋ ์๋ก ๋ค๋ฅธ ์์ฑ์ด ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋ชจ๋ NLP ๋ชจ๋ธ์๋ hidden_size
, num_attention_heads
, num_hidden_layers
๋ฐ vocab_size
์์ฑ์ด ๊ณตํต์ผ๋ก ์์ต๋๋ค. ์ด๋ฌํ ์์ฑ์ ๋ชจ๋ธ์ ๊ตฌ์ฑํ attention heads ๋๋ hidden layers์ ์๋ฅผ ์ง์ ํฉ๋๋ค.
DistilBERT ์์ฑ์ ๊ฒ์ฌํ๊ธฐ ์ํด [DistilBertConfig
]์ ์ ๊ทผํ์ฌ ์์ธํ ์ดํด๋ด
๋๋ค:
>>> from transformers import DistilBertConfig
>>> config = DistilBertConfig()
>>> print(config)
DistilBertConfig {
"activation": "gelu",
"attention_dropout": 0.1,
"dim": 768,
"dropout": 0.1,
"hidden_dim": 3072,
"initializer_range": 0.02,
"max_position_embeddings": 512,
"model_type": "distilbert",
"n_heads": 12,
"n_layers": 6,
"pad_token_id": 0,
"qa_dropout": 0.1,
"seq_classif_dropout": 0.2,
"sinusoidal_pos_embds": false,
"transformers_version": "4.16.2",
"vocab_size": 30522
}
[DistilBertConfig
]๋ ๊ธฐ๋ณธ [DistilBertModel
]์ ๋น๋ํ๋ ๋ฐ ์ฌ์ฉ๋๋ ๋ชจ๋ ๊ธฐ๋ณธ ์์ฑ์ ํ์ํฉ๋๋ค. ๋ชจ๋ ์์ฑ์ ์ปค์คํฐ๋ง์ด์ง์ด ๊ฐ๋ฅํ๋ฏ๋ก ์คํ์ ์ํ ๊ณต๊ฐ์ ๋ง๋ค ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ๊ธฐ๋ณธ ๋ชจ๋ธ์ ๋ค์๊ณผ ๊ฐ์ด ์ปค์คํฐ๋ง์ด์ฆํ ์ ์์ต๋๋ค:
activation
ํ๋ผ๋ฏธํฐ๋ก ๋ค๋ฅธ ํ์ฑํ ํจ์๋ฅผ ์ฌ์ฉํด ๋ณด์ธ์.attention_dropout
ํ๋ผ๋ฏธํฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ดํ ์ ํ๋ฅ ์ ๋ ๋์ ๋๋กญ์์ ๋น์จ์ ์ฌ์ฉํ์ธ์.
>>> my_config = DistilBertConfig(activation="relu", attention_dropout=0.4)
>>> print(my_config)
DistilBertConfig {
"activation": "relu",
"attention_dropout": 0.4,
"dim": 768,
"dropout": 0.1,
"hidden_dim": 3072,
"initializer_range": 0.02,
"max_position_embeddings": 512,
"model_type": "distilbert",
"n_heads": 12,
"n_layers": 6,
"pad_token_id": 0,
"qa_dropout": 0.1,
"seq_classif_dropout": 0.2,
"sinusoidal_pos_embds": false,
"transformers_version": "4.16.2",
"vocab_size": 30522
}
์ฌ์ ํ์ต๋ ๋ชจ๋ธ ์์ฑ์ [~PretrainedConfig.from_pretrained
] ํจ์์์ ์์ ํ ์ ์์ต๋๋ค:
>>> my_config = DistilBertConfig.from_pretrained("distilbert-base-uncased", activation="relu", attention_dropout=0.4)
๋ชจ๋ธ ๊ตฌ์ฑ์ด ๋ง์กฑ์ค๋ฌ์ฐ๋ฉด [~PretrainedConfig.save_pretrained
]๋ก ์ ์ฅํ ์ ์์ต๋๋ค. ์ค์ ํ์ผ์ ์ง์ ๋ ์์
๊ฒฝ๋ก์ JSON ํ์ผ๋ก ์ ์ฅ๋ฉ๋๋ค:
>>> my_config.save_pretrained(save_directory="./your_model_save_path")
configuration ํ์ผ์ ์ฌ์ฌ์ฉํ๋ ค๋ฉด [~PretrainedConfig.from_pretrained
]๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ ธ์ค์ธ์:
>>> my_config = DistilBertConfig.from_pretrained("./your_model_save_path/config.json")
configuration ํ์ผ์ ๋์ ๋๋ฆฌ๋ก ์ ์ฅํ๊ฑฐ๋ ์ฌ์ฉ์ ์ ์ configuration ์์ฑ๊ณผ ๊ธฐ๋ณธ configuration ์์ฑ์ ์ฐจ์ด์ ๋ง ์ ์ฅํ ์๋ ์์ต๋๋ค! ์์ธํ ๋ด์ฉ์ configuration ๋ฌธ์๋ฅผ ์ฐธ์กฐํ์ธ์.
๋ชจ๋ธ[[model]]
๋ค์ ๋จ๊ณ๋ ๋ชจ๋ธ(model)์ ๋ง๋๋ ๊ฒ์
๋๋ค. ๋์จํ๊ฒ ์ํคํ
์ฒ๋ผ๊ณ ๋ ๋ถ๋ฆฌ๋ ๋ชจ๋ธ์ ๊ฐ ๊ณ์ธต์ด ์ํํ๋ ๋์๊ณผ ๋ฐ์ํ๋ ์์
์ ์ ์ํฉ๋๋ค. configuration์ num_hidden_layers
์ ๊ฐ์ ์์ฑ์ ์ํคํ
์ฒ๋ฅผ ์ ์ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ๋ชจ๋ ๋ชจ๋ธ์ ๊ธฐ๋ณธ ํด๋์ค [PreTrainedModel
]๊ณผ ์
๋ ฅ ์๋ฒ ๋ฉ ํฌ๊ธฐ ์กฐ์ ๋ฐ ์
ํ ์ดํ
์
ํค๋ ๊ฐ์ง ์น๊ธฐ์ ๊ฐ์ ๋ช ๊ฐ์ง ์ผ๋ฐ์ ์ธ ๋ฉ์๋๋ฅผ ๊ณต์ ํฉ๋๋ค. ๋ํ ๋ชจ๋ ๋ชจ๋ธ์ torch.nn.Module
, tf.keras.Model
๋๋ flax.linen.Module
์ ์๋ธํด๋์ค์ด๊ธฐ๋ ํฉ๋๋ค. ์ฆ, ๋ชจ๋ธ์ ๊ฐ ํ๋ ์์ํฌ์ ์ฌ์ฉ๋ฒ๊ณผ ํธํ๋ฉ๋๋ค.
>>> from transformers import DistilBertModel
>>> my_config = DistilBertConfig.from_pretrained("./your_model_save_path/config.json")
>>> model = DistilBertModel(my_config)
์ด์ ์ฌ์ ํ์ต๋ ๊ฐ์ค์น ๋์ ์์์ ๊ฐ์ ๊ฐ์ง ๋ชจ๋ธ์ด ์์ฑ๋ฉ๋๋ค. ์ด ๋ชจ๋ธ์ ํ๋ จํ๊ธฐ ์ ๊น์ง๋ ์ ์ฉํ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค. ํ๋ จ์ ๋น์ฉ๊ณผ ์๊ฐ์ด ๋ง์ด ์์๋๋ ํ๋ก์ธ์ค์ ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ํ๋ จ์ ํ์ํ ๋ฆฌ์์ค์ ์ผ๋ถ๋ง ์ฌ์ฉํ๋ฉด์ ๋ ๋์ ๊ฒฐ๊ณผ๋ฅผ ๋ ๋นจ๋ฆฌ ์ป์ผ๋ ค๋ฉด ์ฌ์ ํ๋ จ๋ ๋ชจ๋ธ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
์ฌ์ ํ์ต๋ ๋ชจ๋ธ์ [~PreTrainedModel.from_pretrained
]๋ก ์์ฑํฉ๋๋ค:
>>> model = DistilBertModel.from_pretrained("distilbert-base-uncased")
๐ค Transformers์์ ์ ๊ณตํ ๋ชจ๋ธ์ ์ฌ์ ํ์ต๋ ๊ฐ์ค์น๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๊ธฐ๋ณธ ๋ชจ๋ธ configuration์ ์๋์ผ๋ก ๋ถ๋ฌ์ต๋๋ค. ๊ทธ๋ฌ๋ ์ํ๋ ๊ฒฝ์ฐ ๊ธฐ๋ณธ ๋ชจ๋ธ configuration ์์ฑ์ ์ผ๋ถ ๋๋ ์ ๋ถ๋ฅผ ์ฌ์ฉ์ ์ง์ ์ผ๋ก ๋ฐ๊ฟ ์ ์์ต๋๋ค:
>>> model = DistilBertModel.from_pretrained("distilbert-base-uncased", config=my_config)
์ฌ์ฉ์ ์ง์ configuration ์์ฑ์ ๋ชจ๋ธ์ ๋ถ๋ฌ์ต๋๋ค:
>>> from transformers import TFDistilBertModel
>>> my_config = DistilBertConfig.from_pretrained("./your_model_save_path/my_config.json")
>>> tf_model = TFDistilBertModel(my_config)
์ด์ ์ฌ์ ํ์ต๋ ๊ฐ์ค์น ๋์ ์์์ ๊ฐ์ ๊ฐ์ง ๋ชจ๋ธ์ด ์์ฑ๋ฉ๋๋ค. ์ด ๋ชจ๋ธ์ ํ๋ จํ๊ธฐ ์ ๊น์ง๋ ์ ์ฉํ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค. ํ๋ จ์ ๋น์ฉ๊ณผ ์๊ฐ์ด ๋ง์ด ์์๋๋ ํ๋ก์ธ์ค์ ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ํ๋ จ์ ํ์ํ ๋ฆฌ์์ค์ ์ผ๋ถ๋ง ์ฌ์ฉํ๋ฉด์ ๋ ๋์ ๊ฒฐ๊ณผ๋ฅผ ๋ ๋นจ๋ฆฌ ์ป์ผ๋ ค๋ฉด ์ฌ์ ํ๋ จ๋ ๋ชจ๋ธ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
์ฌ์ ํ์ต๋ ๋ชจ๋ธ์ [~TFPreTrainedModel.from_pretrained
]๋ก ์์ฑํฉ๋๋ค:
>>> tf_model = TFDistilBertModel.from_pretrained("distilbert-base-uncased")
๐ค Transformers์์ ์ ๊ณตํ ๋ชจ๋ธ์ ์ฌ์ ํ์ต๋ ๊ฐ์ค์น๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๊ธฐ๋ณธ ๋ชจ๋ธ configuration์ ์๋์ผ๋ก ๋ถ๋ฌ์ต๋๋ค. ๊ทธ๋ฌ๋ ์ํ๋ ๊ฒฝ์ฐ ๊ธฐ๋ณธ ๋ชจ๋ธ configuration ์์ฑ์ ์ผ๋ถ ๋๋ ์ ๋ถ๋ฅผ ์ฌ์ฉ์ ์ง์ ์ผ๋ก ๋ฐ๊ฟ ์ ์์ต๋๋ค:
>>> tf_model = TFDistilBertModel.from_pretrained("distilbert-base-uncased", config=my_config)
๋ชจ๋ธ ํค๋[[model-heads]]
์ด ์์ ์์ *์๋ ์ํ(hidden state)*๋ฅผ ์ถ๋ ฅํ๋ ๊ธฐ๋ณธ DistilBERT ๋ชจ๋ธ์ ๊ฐ๊ฒ ๋ฉ๋๋ค. ์๋ ์ํ๋ ์ต์ข ์ถ๋ ฅ์ ์์ฑํ๊ธฐ ์ํด ๋ชจ๋ธ ํค๋์ ์ ๋ ฅ์ผ๋ก ์ ๋ฌ๋ฉ๋๋ค. ๐ค Transformers๋ ๋ชจ๋ธ์ด ํด๋น ์์ ์ ์ง์ํ๋ ํ ๊ฐ ์์ ๋ง๋ค ๋ค๋ฅธ ๋ชจ๋ธ ํค๋๋ฅผ ์ ๊ณตํฉ๋๋ค(์ฆ, ๋ฒ์ญ๊ณผ ๊ฐ์ ์ํ์ค ๊ฐ ์์ ์๋ DistilBERT๋ฅผ ์ฌ์ฉํ ์ ์์).
์๋ฅผ ๋ค์ด, [`DistilBertForSequenceClassification`]์ ์ํ์ค ๋ถ๋ฅ ํค๋๊ฐ ์๋ ๊ธฐ๋ณธ DistilBERT ๋ชจ๋ธ์ ๋๋ค. ์ํ์ค ๋ถ๋ฅ ํค๋๋ ํ๋ง๋ ์ถ๋ ฅ ์์ ์๋ ์ ํ ๋ ์ด์ด์ ๋๋ค.>>> from transformers import DistilBertForSequenceClassification
>>> model = DistilBertForSequenceClassification.from_pretrained("distilbert-base-uncased")
๋ค๋ฅธ ๋ชจ๋ธ ํค๋๋ก ์ ํํ์ฌ ์ด ์ฒดํฌํฌ์ธํธ๋ฅผ ๋ค๋ฅธ ์์
์ ์ฝ๊ฒ ์ฌ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ง์์๋ต ์์
์ ๊ฒฝ์ฐ, [DistilBertForQuestionAnswering
] ๋ชจ๋ธ ํค๋๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ง์์๋ต ํค๋๋ ์จ๊ฒจ์ง ์ํ ์ถ๋ ฅ ์์ ์ ํ ๋ ์ด์ด๊ฐ ์๋ค๋ ์ ์ ์ ์ธํ๋ฉด ์ํ์ค ๋ถ๋ฅ ํค๋์ ์ ์ฌํฉ๋๋ค.
>>> from transformers import DistilBertForQuestionAnswering
>>> model = DistilBertForQuestionAnswering.from_pretrained("distilbert-base-uncased")
์๋ฅผ ๋ค์ด, [`TFDistilBertForSequenceClassification`]์ ์ํ์ค ๋ถ๋ฅ ํค๋๊ฐ ์๋ ๊ธฐ๋ณธ DistilBERT ๋ชจ๋ธ์
๋๋ค. ์ํ์ค ๋ถ๋ฅ ํค๋๋ ํ๋ง๋ ์ถ๋ ฅ ์์ ์๋ ์ ํ ๋ ์ด์ด์
๋๋ค.
>>> from transformers import TFDistilBertForSequenceClassification
>>> tf_model = TFDistilBertForSequenceClassification.from_pretrained("distilbert-base-uncased")
๋ค๋ฅธ ๋ชจ๋ธ ํค๋๋ก ์ ํํ์ฌ ์ด ์ฒดํฌํฌ์ธํธ๋ฅผ ๋ค๋ฅธ ์์
์ ์ฝ๊ฒ ์ฌ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ง์์๋ต ์์
์ ๊ฒฝ์ฐ, [TFDistilBertForQuestionAnswering
] ๋ชจ๋ธ ํค๋๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ง์์๋ต ํค๋๋ ์จ๊ฒจ์ง ์ํ ์ถ๋ ฅ ์์ ์ ํ ๋ ์ด์ด๊ฐ ์๋ค๋ ์ ์ ์ ์ธํ๋ฉด ์ํ์ค ๋ถ๋ฅ ํค๋์ ์ ์ฌํฉ๋๋ค.
>>> from transformers import TFDistilBertForQuestionAnswering
>>> tf_model = TFDistilBertForQuestionAnswering.from_pretrained("distilbert-base-uncased")
ํ ํฌ๋์ด์ [[tokenizer]]
ํ ์คํธ ๋ฐ์ดํฐ์ ๋ชจ๋ธ์ ์ฌ์ฉํ๊ธฐ ์ ์ ๋ง์ง๋ง์ผ๋ก ํ์ํ ๊ธฐ๋ณธ ํด๋์ค๋ ์์ ํ ์คํธ๋ฅผ ํ ์๋ก ๋ณํํ๋ ํ ํฌ๋์ด์ ์ ๋๋ค. ๐ค Transformers์ ์ฌ์ฉํ ์ ์๋ ํ ํฌ๋์ด์ ๋ ๋ ๊ฐ์ง ์ ํ์ด ์์ต๋๋ค:
- [
PreTrainedTokenizer
]: ํ์ด์ฌ์ผ๋ก ๊ตฌํ๋ ํ ํฌ๋์ด์ ์ ๋๋ค. - [
PreTrainedTokenizerFast
]: Rust ๊ธฐ๋ฐ ๐ค Tokenizer ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ๋ง๋ค์ด์ง ํ ํฌ๋์ด์ ์ ๋๋ค. ์ด ํ ํฌ๋์ด์ ๋ Rust๋ก ๊ตฌํ๋์ด ๋ฐฐ์น ํ ํฐํ์์ ํนํ ๋น ๋ฆ ๋๋ค. ๋น ๋ฅธ ํ ํฌ๋์ด์ ๋ ํ ํฐ์ ์๋ ๋จ์ด๋ ๋ฌธ์์ ๋งคํํ๋ ์คํ์ ๋งคํ๊ณผ ๊ฐ์ ์ถ๊ฐ ๋ฉ์๋๋ ์ ๊ณตํฉ๋๋ค. ๋ ํ ํฌ๋์ด์ ๋ชจ๋ ์ธ์ฝ๋ฉ ๋ฐ ๋์ฝ๋ฉ, ์ ํ ํฐ ์ถ๊ฐ, ํน์ ํ ํฐ ๊ด๋ฆฌ์ ๊ฐ์ ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ์ ์ง์ํฉ๋๋ค.
๋ชจ๋ ๋ชจ๋ธ์ด ๋น ๋ฅธ ํ ํฌ๋์ด์ ๋ฅผ ์ง์ํ๋ ๊ฒ์ ์๋๋๋ค. ์ด ํ์์ ๋ชจ๋ธ์ ๋น ๋ฅธ ํ ํฌ๋์ด์ ์ง์ ์ฌ๋ถ๋ฅผ ํ์ธํ์ธ์.
ํ ํฌ๋์ด์ ๋ฅผ ์ง์ ํ์ตํ ๊ฒฝ์ฐ, ์ดํ(vocabulary) ํ์ผ์์ ํ ํฌ๋์ด์ ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค:
>>> from transformers import DistilBertTokenizer
>>> my_tokenizer = DistilBertTokenizer(vocab_file="my_vocab_file.txt", do_lower_case=False, padding_side="left")
์ฌ์ฉ์ ์ง์ ํ ํฌ๋์ด์ ์ ์ดํ๋ ์ฌ์ ํ์ต๋ ๋ชจ๋ธ์ ํ ํฌ๋์ด์ ์์ ์์ฑ๋ ์ดํ์ ๋ค๋ฅผ ์ ์๋ค๋ ์ ์ ๊ธฐ์ตํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์ฌ์ ํ์ต๋ ๋ชจ๋ธ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ฌ์ ํ์ต๋ ๋ชจ๋ธ์ ์ดํ๋ฅผ ์ฌ์ฉํด์ผ ํ๋ฉฐ, ๊ทธ๋ ์ง ์์ผ๋ฉด ์
๋ ฅ์ด ์๋ฏธ๋ฅผ ๊ฐ์ง ๋ชปํฉ๋๋ค. [DistilBertTokenizer
] ํด๋์ค๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ ํ์ต๋ ๋ชจ๋ธ์ ์ดํ๋ก ํ ํฌ๋์ด์ ๋ฅผ ์์ฑํฉ๋๋ค:
>>> from transformers import DistilBertTokenizer
>>> slow_tokenizer = DistilBertTokenizer.from_pretrained("distilbert-base-uncased")
[DistilBertTokenizerFast
] ํด๋์ค๋ก ๋น ๋ฅธ ํ ํฌ๋์ด์ ๋ฅผ ์์ฑํฉ๋๋ค:
>>> from transformers import DistilBertTokenizerFast
>>> fast_tokenizer = DistilBertTokenizerFast.from_pretrained("distilbert-base-uncased")
[AutoTokenizer
]๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋น ๋ฅธ ํ ํฌ๋์ด์ ๋ฅผ ๊ฐ์ ธ์ค๋ ค๊ณ ํฉ๋๋ค. ์ด ๋์์ ๋นํ์ฑํํ๋ ค๋ฉด from_pretrained
์์ use_fast=False
๋ฅผ ์ค์ ํ๋ฉด ๋ฉ๋๋ค.
์ด๋ฏธ์ง ํ๋ก์ธ์[[image-processor]]
์ด๋ฏธ์ง ํ๋ก์ธ์(image processor)๋ ๋น์ ์
๋ ฅ์ ์ฒ๋ฆฌํฉ๋๋ค. ๊ธฐ๋ณธ [~image_processing_utils.ImageProcessingMixin
] ํด๋์ค์์ ์์ํฉ๋๋ค.
์ฌ์ฉํ๋ ค๋ฉด ์ฌ์ฉ ์ค์ธ ๋ชจ๋ธ๊ณผ ์ฐ๊ฒฐ๋ ์ด๋ฏธ์ง ํ๋ก์ธ์๋ฅผ ์์ฑํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ด๋ฏธ์ง ๋ถ๋ฅ์ ViT๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๊ธฐ๋ณธ [ViTImageProcessor
]๋ฅผ ์์ฑํฉ๋๋ค:
>>> from transformers import ViTImageProcessor
>>> vit_extractor = ViTImageProcessor()
>>> print(vit_extractor)
ViTImageProcessor {
"do_normalize": true,
"do_resize": true,
"feature_extractor_type": "ViTImageProcessor",
"image_mean": [
0.5,
0.5,
0.5
],
"image_std": [
0.5,
0.5,
0.5
],
"resample": 2,
"size": 224
}
์ฌ์ฉ์ ์ง์ ์ ์ํ์ง ์๋ ๊ฒฝ์ฐ from_pretrained
๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋ธ์ ๊ธฐ๋ณธ ์ด๋ฏธ์ง ํ๋ก์ธ์ ๋งค๊ฐ๋ณ์๋ฅผ ๋ถ๋ฌ์ค๋ฉด ๋ฉ๋๋ค.
์ฌ์ฉ์ ์ง์ ์ด๋ฏธ์ง ํ๋ก์ธ์๋ฅผ ์์ฑํ๋ ค๋ฉด [ViTImageProcessor
] ํ๋ผ๋ฏธํฐ๋ฅผ ์์ ํฉ๋๋ค:
>>> from transformers import ViTImageProcessor
>>> my_vit_extractor = ViTImageProcessor(resample="PIL.Image.BOX", do_normalize=False, image_mean=[0.3, 0.3, 0.3])
>>> print(my_vit_extractor)
ViTImageProcessor {
"do_normalize": false,
"do_resize": true,
"feature_extractor_type": "ViTImageProcessor",
"image_mean": [
0.3,
0.3,
0.3
],
"image_std": [
0.5,
0.5,
0.5
],
"resample": "PIL.Image.BOX",
"size": 224
}
ํน์ฑ ์ถ์ถ๊ธฐ[[feature-extractor]]
ํน์ฑ ์ถ์ถ๊ธฐ(feature extractor)๋ ์ค๋์ค ์
๋ ฅ์ ์ฒ๋ฆฌํฉ๋๋ค. ๊ธฐ๋ณธ [~feature_extraction_utils.FeatureExtractionMixin
] ํด๋์ค์์ ์์๋๋ฉฐ, ์ค๋์ค ์
๋ ฅ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด [SequenceFeatureExtractor
] ํด๋์ค์์ ์์ํ ์๋ ์์ต๋๋ค.
์ฌ์ฉํ๋ ค๋ฉด ์ฌ์ฉ ์ค์ธ ๋ชจ๋ธ๊ณผ ์ฐ๊ฒฐ๋ ํน์ฑ ์ถ์ถ๊ธฐ๋ฅผ ์์ฑํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ค๋์ค ๋ถ๋ฅ์ Wav2Vec2๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๊ธฐ๋ณธ [Wav2Vec2FeatureExtractor
]๋ฅผ ์์ฑํฉ๋๋ค:
>>> from transformers import Wav2Vec2FeatureExtractor
>>> w2v2_extractor = Wav2Vec2FeatureExtractor()
>>> print(w2v2_extractor)
Wav2Vec2FeatureExtractor {
"do_normalize": true,
"feature_extractor_type": "Wav2Vec2FeatureExtractor",
"feature_size": 1,
"padding_side": "right",
"padding_value": 0.0,
"return_attention_mask": false,
"sampling_rate": 16000
}
์ฌ์ฉ์ ์ง์ ์ด ํ์ํ์ง ์์ ๊ฒฝ์ฐ from_pretrained
๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋ธ์ ๊ธฐ๋ณธ ํน์ฑ ์ถ์ถ๊ธฐ ใ
๊ฐ๋ณ์๋ฅผ ๋ถ๋ฌ ์ค๋ฉด ๋ฉ๋๋ค.
์ฌ์ฉ์ ์ง์ ํน์ฑ ์ถ์ถ๊ธฐ๋ฅผ ๋ง๋ค๋ ค๋ฉด [Wav2Vec2FeatureExtractor
] ๋งค๊ฐ๋ณ์๋ฅผ ์์ ํฉ๋๋ค:
>>> from transformers import Wav2Vec2FeatureExtractor
>>> w2v2_extractor = Wav2Vec2FeatureExtractor(sampling_rate=8000, do_normalize=False)
>>> print(w2v2_extractor)
Wav2Vec2FeatureExtractor {
"do_normalize": false,
"feature_extractor_type": "Wav2Vec2FeatureExtractor",
"feature_size": 1,
"padding_side": "right",
"padding_value": 0.0,
"return_attention_mask": false,
"sampling_rate": 8000
}
ํ๋ก์ธ์[[processor]]
๋ฉํฐ๋ชจ๋ฌ ์์
์ ์ง์ํ๋ ๋ชจ๋ธ์ ๊ฒฝ์ฐ, ๐ค Transformers๋ ํน์ฑ ์ถ์ถ๊ธฐ ๋ฐ ํ ํฌ๋์ด์ ์ ๊ฐ์ ์ฒ๋ฆฌ ํด๋์ค๋ฅผ ๋จ์ผ ๊ฐ์ฒด๋ก ํธ๋ฆฌํ๊ฒ ๋ํํ๋ ํ๋ก์ธ์ ํด๋์ค๋ฅผ ์ ๊ณตํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์๋ ์์ฑ ์ธ์ ์์
(Automatic Speech Recognition task (ASR))์ [Wav2Vec2Processor
]๋ฅผ ์ฌ์ฉํ๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. ์๋ ์์ฑ ์ธ์ ์์
์ ์ค๋์ค๋ฅผ ํ
์คํธ๋ก ๋ณํํ๋ฏ๋ก ํน์ฑ ์ถ์ถ๊ธฐ์ ํ ํฌ๋์ด์ ๊ฐ ํ์ํฉ๋๋ค.
์ค๋์ค ์ ๋ ฅ์ ์ฒ๋ฆฌํ ํน์ฑ ์ถ์ถ๊ธฐ๋ฅผ ๋ง๋ญ๋๋ค:
>>> from transformers import Wav2Vec2FeatureExtractor
>>> feature_extractor = Wav2Vec2FeatureExtractor(padding_value=1.0, do_normalize=True)
ํ ์คํธ ์ ๋ ฅ์ ์ฒ๋ฆฌํ ํ ํฌ๋์ด์ ๋ฅผ ๋ง๋ญ๋๋ค:
>>> from transformers import Wav2Vec2CTCTokenizer
>>> tokenizer = Wav2Vec2CTCTokenizer(vocab_file="my_vocab_file.txt")
[Wav2Vec2Processor
]์์ ํน์ฑ ์ถ์ถ๊ธฐ์ ํ ํฌ๋์ด์ ๋ฅผ ๊ฒฐํฉํฉ๋๋ค:
>>> from transformers import Wav2Vec2Processor
>>> processor = Wav2Vec2Processor(feature_extractor=feature_extractor, tokenizer=tokenizer)
configuration๊ณผ ๋ชจ๋ธ์ด๋ผ๋ ๋ ๊ฐ์ง ๊ธฐ๋ณธ ํด๋์ค์ ์ถ๊ฐ ์ ์ฒ๋ฆฌ ํด๋์ค(ํ ํฌ๋์ด์ , ์ด๋ฏธ์ง ํ๋ก์ธ์, ํน์ฑ ์ถ์ถ๊ธฐ ๋๋ ํ๋ก์ธ์)๋ฅผ ์ฌ์ฉํ๋ฉด ๐ค Transformers์์ ์ง์ํ๋ ๋ชจ๋ ๋ชจ๋ธ์ ๋ง๋ค ์ ์์ต๋๋ค. ์ด๋ฌํ ๊ฐ ๊ธฐ๋ณธ ํด๋์ค๋ ๊ตฌ์ฑ์ด ๊ฐ๋ฅํ๋ฏ๋ก ์ํ๋ ํน์ ์์ฑ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ํ์ต์ ์ํด ๋ชจ๋ธ์ ์ฝ๊ฒ ์ค์ ํ๊ฑฐ๋ ๊ธฐ์กด์ ์ฌ์ ํ์ต๋ ๋ชจ๋ธ์ ์์ ํ์ฌ ๋ฏธ์ธ ์กฐ์ ํ ์ ์์ต๋๋ค.