layout | background-class | body-class | title | summary | category | image | author | tags | github-link | github-id | accelerator | order | demo-model-link | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
hub_detail |
hub-background |
hub |
RoBERTa |
BERT๋ฅผ ๊ฐ๋ ฅํ๊ฒ ์ต์ ํํ๋ ์ฌ์ ํ์ต ์ ๊ทผ๋ฒ, RoBERTa |
researchers |
fairseq_logo.png |
Facebook AI (fairseq Team) |
|
pytorch/fairseq |
cuda-optional |
10 |
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 omegaconf
import 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 # entailment
roberta.register_classification_head('new_task', num_classes=3)
logprobs = roberta.predict('new_task', tokens) # tensor([[-1.1050, -1.0672, -1.1245]], grad_fn=<LogSoftmaxBackward>)