| layout | hub_detail | |
|---|---|---|
| background-class | hub-background | |
| body-class | hub | |
| title | RoBERTa | |
| summary | BERT๋ฅผ ๊ฐ๋ ฅํ๊ฒ ์ต์ ํํ๋ ์ฌ์ ํ์ต ์ ๊ทผ๋ฒ, RoBERTa | |
| category | researchers | |
| image | fairseq_logo.png | |
| author | Facebook AI (fairseq Team) | |
| tags |
|
|
| github-link | https://github.com/pytorch/fairseq/ | |
| github-id | pytorch/fairseq | |
| accelerator | cuda-optional | |
| order | 10 | |
| demo-model-link | https://huggingface.co/spaces/pytorch/RoBERTa |
Bidirectional Encoder Representations from Transformers, BERT๋ ํ ์คํธ์์ ์๋์ ์ผ๋ก ์จ๊ฒจ์ง ๋ถ๋ถ์ ์์ธกํ๋ ๋ฐ์ด๋ ์๊ธฐ์ง๋ ์ฌ์ ํ์ต(self-supervised pretraining) ๊ธฐ์ ์ ๋๋ค. ํนํ BERT๊ฐ ํ์ตํ ํํ์ ๋ค์ด์คํธ๋ฆผ ํ์คํฌ(downstream tasks)์ ์ ์ผ๋ฐํ๋๋ ๊ฒ์ผ๋ก ๋ํ๋ฌ์ผ๋ฉฐ, BERT๊ฐ ์ฒ์ ๊ณต๊ฐ๋ 2018๋ ์ ์๋ง์ ์์ฐ์ด์ฒ๋ฆฌ ๋ฒค์น๋งํฌ ๋ฐ์ดํฐ์ ์ ๋ํด ๊ฐ์ฅ ์ข์ ์ฑ๋ฅ์ ๊ธฐ๋กํ์ต๋๋ค.
RoBERTa๋ BERT์ ์ธ์ด ๋ง์คํน ์ ๋ต(language masking strategy)์ ๊ธฐ๋ฐํ์ง๋ง ๋ช ๊ฐ์ง ์ฐจ์ด์ ์ด ์กด์ฌํฉ๋๋ค. ๋ค์ ๋ฌธ์ฅ ์ฌ์ ํ์ต(next-sentence pretraining objective)์ ์ ๊ฑฐํ๊ณ ํจ์ฌ ๋ ํฐ ๋ฏธ๋ ๋ฐฐ์น์ ํ์ต ์๋๋ก ํ๋ จํ๋ ๋ฑ ์ฃผ์ ํ์ดํผํ๋ผ๋ฏธํฐ๋ฅผ ์์ ํฉ๋๋ค. ๋ํ RoBERTa๋ ๋ ์ค๋ ์๊ฐ ๋์ BERT๋ณด๋ค ํจ์ฌ ๋ง์ ๋ฐ์ดํฐ์ ๋ํด ํ์ต๋์์ต๋๋ค. ์ด๋ฅผ ํตํด RoBERTa์ ํํ์ BERT๋ณด๋ค ๋ค์ด์คํธ๋ฆผ ํ์คํฌ์ ๋ ์ ์ผ๋ฐํ๋ ์ ์์ต๋๋ค.
์ถ๊ฐ์ ์ธ Python ์์กด์ฑ์ด ํ์ํฉ๋๋ค.
pip install regex requests hydra-core omegaconfimport torch
roberta = torch.hub.load('pytorch/fairseq', 'roberta.large')
roberta.eval() # ๋๋กญ์์ ๋นํ์ฑํ (๋๋ ํ์ต ๋ชจ๋ ๋นํ์ฑํ)tokens = roberta.encode('Hello world!')
assert tokens.tolist() == [0, 31414, 232, 328, 2]
assert roberta.decode(tokens) == 'Hello world!'# ๋ง์ง๋ง ๊ณ์ธต์ ํน์ง ์ถ์ถ
last_layer_features = roberta.extract_features(tokens)
assert last_layer_features.size() == torch.Size([1, 5, 1024])
# ๋ชจ๋ ๊ณ์ธต์ ํน์ง ์ถ์ถ
all_layers = roberta.extract_features(tokens, return_all_hiddens=True)
assert len(all_layers) == 25
assert torch.all(all_layers[-1] == last_layer_features)# MNLI์ ๋ํด ๋ฏธ์ธ์กฐ์ ๋ RoBERTa ๋ค์ด๋ก๋
roberta = torch.hub.load('pytorch/fairseq', 'roberta.large.mnli')
roberta.eval() # ํ๊ฐ๋ฅผ ์ํด ๋๋กญ์์ ๋นํ์ฑํ
with torch.no_grad():
# ํ ์์ ๋ฌธ์ฅ์ ์ธ์ฝ๋ฉํ๊ณ ์์ธก
tokens = roberta.encode('Roberta is a heavily optimized version of BERT.', 'Roberta is not very optimized.')
prediction = roberta.predict('mnli', tokens).argmax().item()
assert prediction == 0 # contradiction
# ๋ค๋ฅธ ๋ฌธ์ฅ ์์ ์ธ์ฝ๋ฉํ๊ณ ์์ธก
tokens = roberta.encode('Roberta is a heavily optimized version of BERT.', 'Roberta is based on BERT.')
prediction = roberta.predict('mnli', tokens).argmax().item()
assert prediction == 2 # entailmentroberta.register_classification_head('new_task', num_classes=3)
logprobs = roberta.predict('new_task', tokens) # tensor([[-1.1050, -1.0672, -1.1245]], grad_fn=<LogSoftmaxBackward>)