layout | background-class | body-class | title | summary | category | image | author | tags | github-link | github-id | featured_image_1 | featured_image_2 | accelerator | order | demo-model-link | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
hub_detail |
hub-background |
hub |
PyTorch-Transformers |
PyTorch implementations of popular NLP Transformers |
researchers |
huggingface-logo.png |
HuggingFace Team |
|
huggingface/transformers |
no-image |
no-image |
cuda-optional |
10 |
PyTorch-Transformers (์ด์ ์ pytorch-pretrained-bert
์ผ๋ก ์๋ ค์ง) ๋ ์์ฐ์ด ์ฒ๋ฆฌ(NLP)๋ฅผ ์ํ ์ต์ ์ ์ฌ์ ํ์ต๋ ๋ชจ๋ธ๋ค์ ๋ชจ์๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์
๋๋ค.
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํ์ฌ ๋ค์ ๋ชจ๋ธ๋ค์ ๋ํ ํ์ดํ ์น ๊ตฌํ๊ณผ ์ฌ์ ํ์ต๋ ๊ฐ์ค์น, ์ฌ์ฉ ์คํฌ๋ฆฝํธ, ๋ณํ ์ ํธ๋ฆฌํฐ๋ฅผ ํฌํจํ๊ณ ์์ต๋๋ค.
- BERT ๋ Google์์ ๋ฐํํ BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding ๋ ผ๋ฌธ๊ณผ ํจ๊ป ๊ณต๊ฐ๋์์ต๋๋ค. (์ ์: Jacob Devlin, Ming-Wei Chang, Kenton Lee, Kristina Toutanova)
- GPT ๋ OpenAI์์ ๋ฐํํ Improving Language Understanding by Generative Pre-Training ๋ ผ๋ฌธ๊ณผ ํจ๊ป ๊ณต๊ฐ๋์์ต๋๋ค. (์ ์: Alec Radford, Karthik Narasimhan, Tim Salimans, Ilya Sutskever)
- GPT-2 ๋ OpenAI์์ ๋ฐํํ Language Models are Unsupervised Multitask Learners ๋ ผ๋ฌธ๊ณผ ํจ๊ป ๊ณต๊ฐ๋์์ต๋๋ค. (์ ์: Alec Radford*, Jeffrey Wu*, Rewon Child, David Luan, Dario Amodei**, Ilya Sutskever**)
- Transformer-XL ๋ Google/CMU์์ ๋ฐํํ Transformer-XL: Attentive Language Models Beyond a Fixed-Length Context ๋ ผ๋ฌธ๊ณผ ํจ๊ป ๊ณต๊ฐ๋์์ต๋๋ค. (์ ์: Zihang Dai*, Zhilin Yang*, Yiming Yang, Jaime Carbonell, Quoc V. Le, Ruslan Salakhutdinov)
- XLNet ๋ Google/CMU์์ ๋ฐํํ โXLNet: Generalized Autoregressive Pretraining for Language Understanding ๋ ผ๋ฌธ๊ณผ ํจ๊ป ๊ณต๊ฐ๋์์ต๋๋ค. (์ ์: Zhilin Yang*, Zihang Dai*, Yiming Yang, Jaime Carbonell, Ruslan Salakhutdinov, Quoc V. Le)
- XLM ๋ Facebook์์ ๋ฐํํ Cross-lingual Language Model Pretraining ๋ ผ๋ฌธ๊ณผ ํจ๊ป ๊ณต๊ฐ๋์์ต๋๋ค. (์ ์: Guillaume Lample, Alexis Conneau)
- RoBERTa ๋ Facebook์์ ๋ฐํํ Robustly Optimized BERT Pretraining Approach ๋ ผ๋ฌธ๊ณผ ํจ๊ป ๊ณต๊ฐ๋์์ต๋๋ค. (์ ์: Yinhan Liu, Myle Ott, Naman Goyal, Jingfei Du, Mandar Joshi, Danqi Chen, Omer Levy, Mike Lewis, Luke Zettlemoyer, Veselin Stoyanov)
- DistilBERT ๋ HuggingFace์์ ๊ฒ์ํ Smaller, faster, cheaper, lighter: Introducing DistilBERT, a distilled version ofย BERT ๋ธ๋ก๊ทธ ํฌ์คํ ๊ณผ ํจ๊ป ๋ฐํ๋์์ต๋๋ค. (์ ์: Victor Sanh, Lysandre Debut, Thomas Wolf)
์ฌ๊ธฐ์์ ์ฌ์ฉ๋๋ ๊ตฌ์ฑ์์๋ค์ pytorch-transformers
๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์๋ AutoModel
๊ณผ AutoTokenizer
ํด๋์ค๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๊ณ ์์ต๋๋ค.
ํ์ดํ ์น ํ๋ธ์ ์๋ ๋๋ถ๋ถ์ ๋ค๋ฅธ ๋ชจ๋ธ๋ค๊ณผ ๋ค๋ฅด๊ฒ, BERT๋ ๋ณ๋์ ํ์ด์ฌ ํจํค์ง๋ค์ ์ค์นํด์ผ ํฉ๋๋ค.
pip install tqdm boto3 requests regex sentencepiece sacremoses
์ฌ์ฉ ๊ฐ๋ฅํ ๋ฉ์๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
config
: ์ง์ ํ ๋ชจ๋ธ ๋๋ ๊ฒฝ๋ก์ ํด๋นํ๋ ์ค์ ๊ฐ(configuration)์ ๋ฐํํฉ๋๋ค.tokenizer
: ์ง์ ํ ๋ชจ๋ธ ๋๋ ๊ฒฝ๋ก์ ํด๋นํ๋ ํ ํฌ๋์ด์ (tokenizer)๋ฅผ ๋ฐํํฉ๋๋ค.model
: ์ง์ ํ ๋ชจ๋ธ ๋๋ ๊ฒฝ๋ก์ ํด๋นํ๋ ๋ชจ๋ธ์ ๋ฐํํฉ๋๋ค.modelForCausalLM
: ์ง์ ํ ๋ชจ๋ธ ๋๋ ๊ฒฝ๋ก์ ํด๋นํ๋, ์ธ์ด ๋ชจ๋ธ๋ง ํค๋(language modeling head)๊ฐ ์ถ๊ฐ๋ ๋ชจ๋ธ์ ๋ฐํํฉ๋๋ค.modelForSequenceClassification
: ์ง์ ํ ๋ชจ๋ธ ๋๋ ๊ฒฝ๋ก์ ํด๋นํ๋, ์ํ์ค ๋ถ๋ฅ๊ธฐ(sequence classifier)๊ฐ ์ถ๊ฐ๋ ๋ชจ๋ธ์ ๋ฐํํฉ๋๋ค.modelForQuestionAnswering
: ์ง์ ํ ๋ชจ๋ธ ๋๋ ๊ฒฝ๋ก์ ํด๋นํ๋, ์ง์ ์๋ต ํค๋(question answering head)๊ฐ ์ถ๊ฐ๋ ๋ชจ๋ธ์ ๋ฐํํฉ๋๋ค.
์ฌ๊ธฐ์ ๋ชจ๋ ๋ฉ์๋๋ค์ ๋ค์ ์ธ์๋ฅผ ๊ณต์ ํฉ๋๋ค: pretrained_model_or_path
๋ ๋ฐํํ ์ธ์คํด์ค์ ๋ํ ์ฌ์ ํ์ต๋ ๋ชจ๋ธ ๋๋ ๊ฒฝ๋ก๋ฅผ ๋ํ๋ด๋ ๋ฌธ์์ด์
๋๋ค. ๊ฐ ๋ชจ๋ธ์ ๋ํด ์ฌ์ฉํ ์ ์๋ ๋ค์ํ ์ฒดํฌํฌ์ธํธ(checkpoint)๊ฐ ์๊ณ , ์์ธํ ๋ด์ฉ์ ์๋์์ ํ์ธํ์ค ์ ์์ต๋๋ค:
์ฌ์ฉ ๊ฐ๋ฅํ ๋ชจ๋ธ์ pytorch-transformers ๋ฌธ์์ pre-trained models ์น์ ์ ๋์ด๋์ด ์์ต๋๋ค.
๋ค์์ ๊ฐ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฉ์๋๋ค์ ์ฌ์ฉ๋ฒ์ ์์ธํ ์ค๋ช ํ๋ ๋ช ๊ฐ์ง ์์์ ๋๋ค.
ํ ํฌ๋์ด์ ๊ฐ์ฒด๋ก ๋ฌธ์์ด์ ๋ชจ๋ธ์์ ์ฌ์ฉํ ์ ์๋ ํ ํฐ์ผ๋ก ๋ณํํ ์ ์์ต๋๋ค. ๊ฐ ๋ชจ๋ธ๋ง๋ค ๊ณ ์ ํ ํ ํฌ๋์ด์ ๊ฐ ์๊ณ , ์ผ๋ถ ํ ํฐํ ๋ฉ์๋๋ ํ ํฌ๋์ด์ ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค. ์ ์ฒด ๋ฌธ์๋ ์ฌ๊ธฐ์์ ํ์ธํด๋ณด์ค ์ ์์ต๋๋ค.
import torch
tokenizer = torch.hub.load('huggingface/pytorch-transformers', 'tokenizer', 'bert-base-uncased') # S3 ๋ฐ ์บ์์์ ์ดํ(vocabulary)๋ฅผ ๋ค์ด๋ก๋ํฉ๋๋ค.
tokenizer = torch.hub.load('huggingface/pytorch-transformers', 'tokenizer', './test/bert_saved_model/') # `save_pretrained('./test/saved_model/')`๋ฅผ ํตํด ํ ํฌ๋์ด์ ๋ฅผ ์ ์ฅํ ๊ฒฝ์ฐ์ ๋ก๋ฉํ๋ ์์์
๋๋ค.
๋ชจ๋ธ ๊ฐ์ฒด๋ nn.Module
๋ฅผ ์์ํ๋ ๋ชจ๋ธ์ ์ธ์คํด์ค์
๋๋ค. ๊ฐ ๋ชจ๋ธ์ ๋ก์ปฌ ํ์ผ ํน์ ๋๋ ํฐ๋ฆฌ๋ ์ฌ์ ํ์ตํ ๋ ์ฌ์ฉ๋ ์ค์ ๊ฐ(์์ ์ค๋ช
ํ config
)์ผ๋ก๋ถํฐ ์ ์ฅ/๋ก๋ฉํ๋ ๋ฐฉ๋ฒ์ด ํจ๊ป ์ ๊ณต๋ฉ๋๋ค. ๊ฐ ๋ชจ๋ธ์ ๋ค๋ฅด๊ฒ ๋์ํ๋ฉฐ, ์ฌ๋ฌ ๋ค๋ฅธ ๋ชจ๋ธ๋ค์ ์ ์ฒด ๊ฐ์๋ ์ฌ๊ธฐ์์ ํ์ธํด๋ณด์ค ์ ์์ต๋๋ค.
import torch
model = torch.hub.load('huggingface/pytorch-transformers', 'model', 'bert-base-uncased') # S3์ ์บ์๋ก๋ถํฐ ๋ชจ๋ธ๊ณผ ์ค์ ๊ฐ์ ๋ค์ด๋ก๋ํฉ๋๋ค.
model = torch.hub.load('huggingface/pytorch-transformers', 'model', './test/bert_model/') # `save_pretrained('./test/saved_model/')`๋ฅผ ํตํด ๋ชจ๋ธ์ ์ ์ฅํ ๊ฒฝ์ฐ์ ๋ก๋ฉํ๋ ์์์
๋๋ค.
model = torch.hub.load('huggingface/pytorch-transformers', 'model', 'bert-base-uncased', output_attentions=True) # ์ค์ ๊ฐ์ ์
๋ฐ์ดํธํ์ฌ ๋ก๋ฉํฉ๋๋ค.
assert model.config.output_attentions == True
# ํ์ดํ ์น ๋ชจ๋ธ ๋์ ํ
์ํ๋ก์ฐ ์ฒดํฌํฌ์ธํธ ํ์ผ๋ก๋ถํฐ ๋ก๋ฉํฉ๋๋ค. (๋๋ฆผ)
config = AutoConfig.from_json_file('./tf_model/bert_tf_model_config.json')
model = torch.hub.load('huggingface/pytorch-transformers', 'model', './tf_model/bert_tf_checkpoint.ckpt.index', from_tf=True, config=config)
์์ ์ธ๊ธํ, ์ธ์ด ๋ชจ๋ธ๋ง ํค๋๊ฐ ์ถ๊ฐ๋ model
์ธ์คํด์ค์
๋๋ค.
import torch
model = torch.hub.load('huggingface/transformers', 'modelForCausalLM', 'gpt2') # huggingface.co์ ์บ์๋ก๋ถํฐ ๋ชจ๋ธ๊ณผ ์ค์ ๊ฐ์ ๋ค์ด๋ก๋ํฉ๋๋ค.
model = torch.hub.load('huggingface/transformers', 'modelForCausalLM', './test/saved_model/') # `save_pretrained('./test/saved_model/')`๋ฅผ ํตํด ๋ชจ๋ธ์ ์ ์ฅํ ๊ฒฝ์ฐ์ ๋ก๋ฉํ๋ ์์์
๋๋ค.
model = torch.hub.load('huggingface/transformers', 'modelForCausalLM', 'gpt2', output_attentions=True) # ์ค์ ๊ฐ์ ์
๋ฐ์ดํธํ์ฌ ๋ก๋ฉํฉ๋๋ค.
assert model.config.output_attentions == True
# ํ์ดํ ์น ๋ชจ๋ธ ๋์ ํ
์ํ๋ก์ฐ ์ฒดํฌํฌ์ธํธ ํ์ผ๋ก๋ถํฐ ๋ก๋ฉํฉ๋๋ค. (๋๋ฆผ)
config = AutoConfig.from_pretrained('./tf_model/gpt_tf_model_config.json')
model = torch.hub.load('huggingface/transformers', 'modelForCausalLM', './tf_model/gpt_tf_checkpoint.ckpt.index', from_tf=True, config=config)
์์ ์ธ๊ธํ, ์ํ์ค ๋ถ๋ฅ๊ธฐ๊ฐ ์ถ๊ฐ๋ model
์ธ์คํด์ค์
๋๋ค.
import torch
model = torch.hub.load('huggingface/pytorch-transformers', 'modelForSequenceClassification', 'bert-base-uncased') # S3์ ์บ์๋ก๋ถํฐ ๋ชจ๋ธ๊ณผ ์ค์ ๊ฐ์ ๋ค์ด๋ก๋ํฉ๋๋ค.
model = torch.hub.load('huggingface/pytorch-transformers', 'modelForSequenceClassification', './test/bert_model/') # `save_pretrained('./test/saved_model/')`๋ฅผ ํตํด ๋ชจ๋ธ์ ์ ์ฅํ ๊ฒฝ์ฐ์ ๋ก๋ฉํ๋ ์์์
๋๋ค.
model = torch.hub.load('huggingface/pytorch-transformers', 'modelForSequenceClassification', 'bert-base-uncased', output_attention=True) # ์ค์ ๊ฐ์ ์
๋ฐ์ดํธํ์ฌ ๋ก๋ฉํฉ๋๋ค.
assert model.config.output_attention == True
# ํ์ดํ ์น ๋ชจ๋ธ ๋์ ํ
์ํ๋ก์ฐ ์ฒดํฌํฌ์ธํธ ํ์ผ๋ก๋ถํฐ ๋ก๋ฉํฉ๋๋ค. (๋๋ฆผ)
config = AutoConfig.from_json_file('./tf_model/bert_tf_model_config.json')
model = torch.hub.load('huggingface/pytorch-transformers', 'modelForSequenceClassification', './tf_model/bert_tf_checkpoint.ckpt.index', from_tf=True, config=config)
์์ ์ธ๊ธํ, ์ง์ ์๋ต ํค๋๊ฐ ์ถ๊ฐ๋ model
์ธ์คํด์ค์
๋๋ค.
import torch
model = torch.hub.load('huggingface/pytorch-transformers', 'modelForQuestionAnswering', 'bert-base-uncased') # S3์ ์บ์๋ก๋ถํฐ ๋ชจ๋ธ๊ณผ ์ค์ ๊ฐ์ ๋ค์ด๋ก๋ํฉ๋๋ค.
model = torch.hub.load('huggingface/pytorch-transformers', 'modelForQuestionAnswering', './test/bert_model/') # `save_pretrained('./test/saved_model/')`๋ฅผ ํตํด ๋ชจ๋ธ์ ์ ์ฅํ ๊ฒฝ์ฐ์ ๋ก๋ฉํ๋ ์์์
๋๋ค.
model = torch.hub.load('huggingface/pytorch-transformers', 'modelForQuestionAnswering', 'bert-base-uncased', output_attention=True) # ์ค์ ๊ฐ์ ์
๋ฐ์ดํธํ์ฌ ๋ก๋ฉํฉ๋๋ค.
assert model.config.output_attention == True
# ํ์ดํ ์น ๋ชจ๋ธ ๋์ ํ
์ํ๋ก์ฐ ์ฒดํฌํฌ์ธํธ ํ์ผ๋ก๋ถํฐ ๋ก๋ฉํฉ๋๋ค. (๋๋ฆผ)
config = AutoConfig.from_json_file('./tf_model/bert_tf_model_config.json')
model = torch.hub.load('huggingface/pytorch-transformers', 'modelForQuestionAnswering', './tf_model/bert_tf_checkpoint.ckpt.index', from_tf=True, config=config)
์ค์ ๊ฐ์ ์ ํ ์ฌํญ์ ๋๋ค. ์ค์ ๊ฐ ๊ฐ์ฒด๋ ๋ชจ๋ธ์ ๊ดํ ์ ๋ณด, ์๋ฅผ ๋ค์ด ํค๋๋ ๋ ์ด์ด์ ๊ฐ์, ๋ชจ๋ธ์ด ์ดํ ์ (attentions) ๋๋ ์๋ ์ํ(hidden states)๋ฅผ ์ถ๋ ฅํด์ผ ํ๋์ง, ๋๋ ๋ชจ๋ธ์ด TorchScript์ ๋ง๊ฒ ์กฐ์ ๋์ด์ผ ํ๋์ง ์ฌ๋ถ์ ๋ํ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. ๊ฐ ๋ชจ๋ธ์ ๋ฐ๋ผ ๋ค์ํ ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ ์ฒด ๋ฌธ์๋ ์ฌ๊ธฐ์์ ํ์ธํด๋ณด์ค ์ ์์ต๋๋ค.
import torch
config = torch.hub.load('huggingface/pytorch-transformers', 'config', 'bert-base-uncased') # S3์ ์บ์๋ก๋ถํฐ ๋ชจ๋ธ๊ณผ ์ค์ ๊ฐ์ ๋ค์ด๋ก๋ํฉ๋๋ค.
config = torch.hub.load('huggingface/pytorch-transformers', 'config', './test/bert_saved_model/') # `save_pretrained('./test/saved_model/')`๋ฅผ ํตํด ๋ชจ๋ธ์ ์ ์ฅํ ๊ฒฝ์ฐ์ ๋ก๋ฉํ๋ ์์์
๋๋ค.
config = torch.hub.load('huggingface/pytorch-transformers', 'config', './test/bert_saved_model/my_configuration.json')
config = torch.hub.load('huggingface/pytorch-transformers', 'config', 'bert-base-uncased', output_attention=True, foo=False)
assert config.output_attention == True
config, unused_kwargs = torch.hub.load('huggingface/pytorch-transformers', 'config', 'bert-base-uncased', output_attention=True, foo=False, return_unused_kwargs=True)
assert config.output_attention == True
assert unused_kwargs == {'foo': False}
# ์ค์ ๊ฐ์ ์ฌ์ฉํ์ฌ ๋ชจ๋ธ์ ๋ก๋ฉํฉ๋๋ค.
config = torch.hub.load('huggingface/pytorch-transformers', 'config', 'bert-base-uncased')
config.output_attentions = True
config.output_hidden_states = True
model = torch.hub.load('huggingface/pytorch-transformers', 'model', 'bert-base-uncased', config=config)
# ๋ชจ๋ธ์ ์ด์ ์ดํ
์
๊ณผ ์๋ ์ํ๋ ์ถ๋ ฅํ๋๋ก ์ค์ ๋์์ต๋๋ค.
๋ค์์ ์ ๋ ฅ ํ ์คํธ๋ฅผ ํ ํฐํํ ํ BERT ๋ชจ๋ธ์ ์ ๋ ฅ์ผ๋ก ๋ฃ์ด์ ๊ณ์ฐ๋ ์๋ ์ํ๋ฅผ ๊ฐ์ ธ์ค๊ฑฐ๋, ์ธ์ด ๋ชจ๋ธ๋ง BERT ๋ชจ๋ธ์ ์ด์ฉํ์ฌ ๋ง์คํน๋ ํ ํฐ๋ค์ ์์ธกํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์์์ ๋๋ค.
import torch
tokenizer = torch.hub.load('huggingface/pytorch-transformers', 'tokenizer', 'bert-base-cased')
text_1 = "Who was Jim Henson ?"
text_2 = "Jim Henson was a puppeteer"
# ์ฃผ์์ ํน์ ํ ํฐ์ด ์๋ ์
๋ ฅ์ ํ ํฐํํฉ๋๋ค. (BERT์์๋ ์ฒ์๊ณผ ๋์ ๊ฐ๊ฐ [CLS]์ [SEP] ํ ํฐ์ด ์์ต๋๋ค.)
indexed_tokens = tokenizer.encode(text_1, text_2, add_special_tokens=True)
BertModel
์ ์ฌ์ฉํ์ฌ, ์
๋ ฅ ๋ฌธ์ฅ์ ๋ง์ง๋ง ๋ ์ด์ด ์๋ ์ํ์ ์ํ์ค๋ก ์ธ์ฝ๋ฉํ๊ธฐ
# ์ฒซ๋ฒ์งธ ๋ฌธ์ฅ A์ ๋๋ฒ์งธ ๋ฌธ์ฅ B์ ์ธ๋ฑ์ค๋ฅผ ์ ์ํฉ๋๋ค. (๋
ผ๋ฌธ ์ฐธ์กฐ)
segments_ids = [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1]
# ์
๋ ฅ๊ฐ์ PyTorch tensor๋ก ๋ณํํฉ๋๋ค.
segments_tensors = torch.tensor([segments_ids])
tokens_tensor = torch.tensor([indexed_tokens])
model = torch.hub.load('huggingface/pytorch-transformers', 'model', 'bert-base-cased')
with torch.no_grad():
encoded_layers, _ = model(tokens_tensor, token_type_ids=segments_tensors)
# `BertForMaskedLM`๋ฅผ ํตํด ์์ธกํ ํ ํฐ์ ๋ง์คํน(๋ง์คํฌ ํ ํฐ์ผ๋ก ๋ณํ)ํฉ๋๋ค.
masked_index = 8
indexed_tokens[masked_index] = tokenizer.mask_token_id
tokens_tensor = torch.tensor([indexed_tokens])
masked_lm_model = torch.hub.load('huggingface/pytorch-transformers', 'modelForMaskedLM', 'bert-base-cased')
with torch.no_grad():
predictions = masked_lm_model(tokens_tensor, token_type_ids=segments_tensors)
# ์์ธก๋ ํ ํฐ์ ๊ฐ์ ธ์ต๋๋ค.
predicted_index = torch.argmax(predictions[0][0], dim=1)[masked_index].item()
predicted_token = tokenizer.convert_ids_to_tokens([predicted_index])[0]
assert predicted_token == 'Jim'
question_answering_model = torch.hub.load('huggingface/pytorch-transformers', 'modelForQuestionAnswering', 'bert-large-uncased-whole-word-masking-finetuned-squad')
question_answering_tokenizer = torch.hub.load('huggingface/pytorch-transformers', 'tokenizer', 'bert-large-uncased-whole-word-masking-finetuned-squad')
# ํ์์ ๋จ๋ฝ์ด ๋จผ์ ์ฃผ์ด์ง๊ณ , ๊ทธ ๋ค์์ ์ง๋ฌธ์ด ์ฃผ์ด์ง๋ ํ์์
๋๋ค.
text_1 = "Jim Henson was a puppeteer"
text_2 = "Who was Jim Henson ?"
indexed_tokens = question_answering_tokenizer.encode(text_1, text_2, add_special_tokens=True)
segments_ids = [0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1]
segments_tensors = torch.tensor([segments_ids])
tokens_tensor = torch.tensor([indexed_tokens])
# ์์ ๋ฐ ์ข
๋ฃ ์์น์ ๋ํ ๋ก์ง(logits)์ ์์ธกํฉ๋๋ค.
with torch.no_grad():
out = question_answering_model(tokens_tensor, token_type_ids=segments_tensors)
# ๊ฐ์ฅ ๋์ ๋ก์ง์ ๊ฐ์ง ์์ธก์ ๊ฐ์ ธ์ต๋๋ค.
answer = question_answering_tokenizer.decode(indexed_tokens[torch.argmax(out.start_logits):torch.argmax(out.end_logits)+1])
assert answer == "puppeteer"
# ๋๋ ์์ ๋ฐ ์ข
๋ฃ ์์น์ ๋ํ ๊ต์ฐจ ์ํธ๋กํผ ์์ค์ ์ดํฉ์ ๊ฐ์ ธ์ต๋๋ค. (์ด ์ฝ๋๊ฐ ํ์ต ์์ ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ ๋ฏธ๋ฆฌ ๋ชจ๋ธ์ ํ์ต ๋ชจ๋๋ก ์ค์ ํด์ผ ํฉ๋๋ค.)
start_positions, end_positions = torch.tensor([12]), torch.tensor([14])
multiple_choice_loss = question_answering_model(tokens_tensor, token_type_ids=segments_tensors, start_positions=start_positions, end_positions=end_positions)
sequence_classification_model = torch.hub.load('huggingface/pytorch-transformers', 'modelForSequenceClassification', 'bert-base-cased-finetuned-mrpc')
sequence_classification_tokenizer = torch.hub.load('huggingface/pytorch-transformers', 'tokenizer', 'bert-base-cased-finetuned-mrpc')
text_1 = "Jim Henson was a puppeteer"
text_2 = "Who was Jim Henson ?"
indexed_tokens = sequence_classification_tokenizer.encode(text_1, text_2, add_special_tokens=True)
segments_ids = [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1]
segments_tensors = torch.tensor([segments_ids])
tokens_tensor = torch.tensor([indexed_tokens])
# ์ํ์ค ๋ถ๋ฅ๋ฅผ ์ํ ๋ก์ง์ ์์ธกํฉ๋๋ค.
with torch.no_grad():
seq_classif_logits = sequence_classification_model(tokens_tensor, token_type_ids=segments_tensors)
predicted_labels = torch.argmax(seq_classif_logits[0]).item()
assert predicted_labels == 0 # MRPC ๋ฐ์ดํฐ์
์์, ์ด๋ ๋ ๋ฌธ์ฅ์ด ์๋ก ๋ฐ๊พธ์ด ํํํ ์ ์๋ค๋ ๊ฒ์ ๋ปํฉ๋๋ค.
# ๋๋ ์ํ์ค ๋ถ๋ฅ์ ๋ํ ์์ค์ ๊ฐ์ ธ์ต๋๋ค. (์ด ์ฝ๋๊ฐ ํ์ต ์์ ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ ๋ฏธ๋ฆฌ ๋ชจ๋ธ์ ํ์ต ๋ชจ๋๋ก ์ค์ ํด์ผ ํฉ๋๋ค.)
labels = torch.tensor([1])
seq_classif_loss = sequence_classification_model(tokens_tensor, token_type_ids=segments_tensors, labels=labels)