Spaces:
Paused
A newer version of the Gradio SDK is available:
5.23.3
๋ค๊ตญ์ด ๋ชจ๋ธ ์ถ๋ก ํ๊ธฐ[[multilingual-models-for-inference]]
[[open-in-colab]]
๐ค Transformers์๋ ์ฌ๋ฌ ์ข ๋ฅ์ ๋ค๊ตญ์ด(multilingual) ๋ชจ๋ธ์ด ์์ผ๋ฉฐ, ๋จ์ผ ์ธ์ด(monolingual) ๋ชจ๋ธ๊ณผ ์ถ๋ก ์ ์ฌ์ฉ๋ฒ์ด ๋ค๋ฆ ๋๋ค. ๊ทธ๋ ๋ค๊ณ ํด์ ๋ชจ๋ ๋ค๊ตญ์ด ๋ชจ๋ธ์ ์ฌ์ฉ๋ฒ์ด ๋ค๋ฅธ ๊ฒ์ ์๋๋๋ค.
bert-base-multilingual-uncased์ ๊ฐ์ ๋ช๋ช ๋ชจ๋ธ์ ๋จ์ผ ์ธ์ด ๋ชจ๋ธ์ฒ๋ผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ฒ ๊ฐ์ด๋์์ ๋ค๊ตญ์ด ๋ชจ๋ธ์ ์ถ๋ก ์ ์ฌ์ฉ ๋ฐฉ๋ฒ์ ์์๋ณผ ๊ฒ์ ๋๋ค.
XLM[[xlm]]
XLM์๋ 10๊ฐ์ง ์ฒดํฌํฌ์ธํธ(checkpoint)๊ฐ ์๋๋ฐ, ์ด ์ค ํ๋๋ง ๋จ์ผ ์ธ์ด์ ๋๋ค. ๋๋จธ์ง ์ฒดํฌํฌ์ธํธ 9๊ฐ๋ ์ธ์ด ์๋ฒ ๋ฉ์ ์ฌ์ฉํ๋ ์ฒดํฌํฌ์ธํธ์ ๊ทธ๋ ์ง ์์ ์ฒดํฌํฌ์ธํธ์ ๋ ๊ฐ์ง ๋ฒ์ฃผ๋ก ๋๋ ์ ์์ต๋๋ค.
์ธ์ด ์๋ฒ ๋ฉ์ ์ฌ์ฉํ๋ XLM[[xlm-with-language-embeddings]]
๋ค์ XLM ๋ชจ๋ธ์ ์ถ๋ก ์์ ์ธ์ด ์๋ฒ ๋ฉ์ ์ฌ์ฉํฉ๋๋ค:
xlm-mlm-ende-1024
(๋ง์คํน๋ ์ธ์ด ๋ชจ๋ธ๋ง, ์์ด-๋ ์ผ์ด)xlm-mlm-enfr-1024
(๋ง์คํน๋ ์ธ์ด ๋ชจ๋ธ๋ง, ์์ด-ํ๋์ค์ด)xlm-mlm-enro-1024
(๋ง์คํน๋ ์ธ์ด ๋ชจ๋ธ๋ง, ์์ด-๋ฃจ๋ง๋์์ด)xlm-mlm-xnli15-1024
(๋ง์คํน๋ ์ธ์ด ๋ชจ๋ธ๋ง, XNLI ๋ฐ์ดํฐ ์ธํธ์์ ์ ๊ณตํ๋ 15๊ฐ ๊ตญ์ด)xlm-mlm-tlm-xnli15-1024
(๋ง์คํน๋ ์ธ์ด ๋ชจ๋ธ๋ง + ๋ฒ์ญ, XNLI ๋ฐ์ดํฐ ์ธํธ์์ ์ ๊ณตํ๋ 15๊ฐ ๊ตญ์ด)xlm-clm-enfr-1024
(Causal language modeling, ์์ด-ํ๋์ค์ด)xlm-clm-ende-1024
(Causal language modeling, ์์ด-๋ ์ผ์ด)
์ธ์ด ์๋ฒ ๋ฉ์ ๋ชจ๋ธ์ ์ ๋ฌ๋ input_ids
์ ๋์ผํ shape์ ํ
์๋ก ํํ๋ฉ๋๋ค.
์ด๋ฌํ ํ
์์ ๊ฐ์ ์ฌ์ฉ๋ ์ธ์ด์ ๋ฐ๋ผ ๋ค๋ฅด๋ฉฐ ํ ํฌ๋์ด์ ์ lang2id
๋ฐ id2lang
์์ฑ์ ์ํด ์๋ณ๋ฉ๋๋ค.
๋ค์ ์์ ์์๋ xlm-clm-enfr-1024
์ฒดํฌํฌ์ธํธ(์ฝ์ ์ธ์ด ๋ชจ๋ธ๋ง(causal language modeling), ์์ด-ํ๋์ค์ด)๋ฅผ ๊ฐ์ ธ์ต๋๋ค:
>>> import torch
>>> from transformers import XLMTokenizer, XLMWithLMHeadModel
>>> tokenizer = XLMTokenizer.from_pretrained("xlm-clm-enfr-1024")
>>> model = XLMWithLMHeadModel.from_pretrained("xlm-clm-enfr-1024")
ํ ํฌ๋์ด์ ์ lang2id
์์ฑ์ ๋ชจ๋ธ์ ์ธ์ด์ ํด๋น ID๋ฅผ ํ์ํฉ๋๋ค:
>>> print(tokenizer.lang2id)
{'en': 0, 'fr': 1}
๋ค์์ผ๋ก, ์์ ์ ๋ ฅ์ ๋ง๋ญ๋๋ค:
>>> input_ids = torch.tensor([tokenizer.encode("Wikipedia was used to")]) # ๋ฐฐ์น ํฌ๊ธฐ๋ 1์
๋๋ค
์ธ์ด ID๋ฅผ "en"
์ผ๋ก ์ค์ ํด ์ธ์ด ์๋ฒ ๋ฉ์ ์ ์ํฉ๋๋ค.
์ธ์ด ์๋ฒ ๋ฉ์ ์์ด์ ์ธ์ด ID์ธ 0
์ผ๋ก ์ฑ์์ง ํ
์์
๋๋ค.
์ด ํ
์๋ input_ids
์ ๊ฐ์ ํฌ๊ธฐ์ฌ์ผ ํฉ๋๋ค.
>>> language_id = tokenizer.lang2id["en"] # 0
>>> langs = torch.tensor([language_id] * input_ids.shape[1]) # torch.tensor([0, 0, 0, ..., 0])
>>> # (batch_size, sequence_length) shape์ ํ
์๊ฐ ๋๋๋ก ๋ง๋ญ๋๋ค.
>>> langs = langs.view(1, -1) # ์ด์ [1, sequence_length] shape์ด ๋์์ต๋๋ค(๋ฐฐ์น ํฌ๊ธฐ๋ 1์
๋๋ค)
์ด์ input_ids
์ ์ธ์ด ์๋ฒ ๋ฉ์ ๋ชจ๋ธ๋ก ์ ๋ฌํฉ๋๋ค:
>>> outputs = model(input_ids, langs=langs)
run_generation.py ์คํฌ๋ฆฝํธ๋ก xlm-clm
์ฒดํฌํฌ์ธํธ๋ฅผ ์ฌ์ฉํด ํ
์คํธ์ ์ธ์ด ์๋ฒ ๋ฉ์ ์์ฑํ ์ ์์ต๋๋ค.
์ธ์ด ์๋ฒ ๋ฉ์ ์ฌ์ฉํ์ง ์๋ XLM[[xlm-without-language-embeddings]]
๋ค์ XLM ๋ชจ๋ธ์ ์ถ๋ก ์์ ์ธ์ด ์๋ฒ ๋ฉ์ด ํ์ํ์ง ์์ต๋๋ค:
xlm-mlm-17-1280
(๋ง์คํน๋ ์ธ์ด ๋ชจ๋ธ๋ง, 17๊ฐ ๊ตญ์ด)xlm-mlm-100-1280
(๋ง์คํน๋ ์ธ์ด ๋ชจ๋ธ๋ง, 100๊ฐ ๊ตญ์ด)
์ด์ ์ XLM ์ฒดํฌํฌ์ธํธ์ ๋ฌ๋ฆฌ ์ด ๋ชจ๋ธ์ ์ผ๋ฐ ๋ฌธ์ฅ ํํ์ ์ฌ์ฉ๋ฉ๋๋ค.
BERT[[bert]]
๋ค์ BERT ๋ชจ๋ธ์ ๋ค๊ตญ์ด ํ์คํฌ์ ์ฌ์ฉํ ์ ์์ต๋๋ค:
bert-base-multilingual-uncased
(๋ง์คํน๋ ์ธ์ด ๋ชจ๋ธ๋ง + ๋ค์ ๋ฌธ์ฅ ์์ธก, 102๊ฐ ๊ตญ์ด)bert-base-multilingual-cased
(๋ง์คํน๋ ์ธ์ด ๋ชจ๋ธ๋ง + ๋ค์ ๋ฌธ์ฅ ์์ธก, 104๊ฐ ๊ตญ์ด)
์ด๋ฌํ ๋ชจ๋ธ์ ์ถ๋ก ์์ ์ธ์ด ์๋ฒ ๋ฉ์ด ํ์ํ์ง ์์ต๋๋ค. ๋ฌธ๋งฅ์์ ์ธ์ด๋ฅผ ์๋ณํ๊ณ , ์๋ณ๋ ์ธ์ด๋ก ์ถ๋ก ํฉ๋๋ค.
XLM-RoBERTa[[xlmroberta]]
๋ค์ XLM-RoBERTa ๋ํ ๋ค๊ตญ์ด ๋ค๊ตญ์ด ํ์คํฌ์ ์ฌ์ฉํ ์ ์์ต๋๋ค:
xlm-roberta-base
(๋ง์คํน๋ ์ธ์ด ๋ชจ๋ธ๋ง, 100๊ฐ ๊ตญ์ด)xlm-roberta-large
(๋ง์คํน๋ ์ธ์ด ๋ชจ๋ธ๋ง, 100๊ฐ ๊ตญ์ด)
XLM-RoBERTa๋ 100๊ฐ ๊ตญ์ด์ ๋ํด ์๋ก ์์ฑ๋๊ณ ์ ์ ๋ 2.5TB ๊ท๋ชจ์ CommonCrawl ๋ฐ์ดํฐ๋ก ํ์ต๋์์ต๋๋ค. ์ด์ ์ ๊ณต๊ฐ๋ mBERT๋ XLM๊ณผ ๊ฐ์ ๋ค๊ตญ์ด ๋ชจ๋ธ์ ๋นํด ๋ถ๋ฅ, ์ํ์ค ๋ผ๋ฒจ๋ง, ์ง์ ์๋ต๊ณผ ๊ฐ์ ๋ค์ด์คํธ๋ฆผ(downstream) ์์ ์์ ์ด์ ์ด ์์ต๋๋ค.
M2M100[[m2m100]]
๋ค์ M2M100 ๋ชจ๋ธ ๋ํ ๋ค๊ตญ์ด ๋ค๊ตญ์ด ํ์คํฌ์ ์ฌ์ฉํ ์ ์์ต๋๋ค:
facebook/m2m100_418M
(๋ฒ์ญ)facebook/m2m100_1.2B
(๋ฒ์ญ)
์ด ์์ ์์๋ facebook/m2m100_418M
์ฒดํฌํฌ์ธํธ๋ฅผ ๊ฐ์ ธ์์ ์ค๊ตญ์ด๋ฅผ ์์ด๋ก ๋ฒ์ญํฉ๋๋ค.
ํ ํฌ๋์ด์ ์์ ๋ฒ์ญ ๋์ ์ธ์ด(source language)๋ฅผ ์ค์ ํ ์ ์์ต๋๋ค:
>>> from transformers import M2M100ForConditionalGeneration, M2M100Tokenizer
>>> en_text = "Do not meddle in the affairs of wizards, for they are subtle and quick to anger."
>>> chinese_text = "ไธ่ฆๆๆๅทซๅธซ็ไบๅ, ๅ ็บไปๅๆฏๅพฎๅฆ็, ๅพๅฟซๅฐฑๆ็ผๆ."
>>> tokenizer = M2M100Tokenizer.from_pretrained("facebook/m2m100_418M", src_lang="zh")
>>> model = M2M100ForConditionalGeneration.from_pretrained("facebook/m2m100_418M")
๋ฌธ์ฅ์ ํ ํฐํํฉ๋๋ค:
>>> encoded_zh = tokenizer(chinese_text, return_tensors="pt")
M2M100์ ๋ฒ์ญ์ ์งํํ๊ธฐ ์ํด ์ฒซ ๋ฒ์งธ๋ก ์์ฑ๋๋ ํ ํฐ์ ๋ฒ์ญํ ์ธ์ด(target language) ID๋ก ๊ฐ์ ์ง์ ํฉ๋๋ค.
์์ด๋ก ๋ฒ์ญํ๊ธฐ ์ํด generate
๋ฉ์๋์์ forced_bos_token_id
๋ฅผ en
์ผ๋ก ์ค์ ํฉ๋๋ค:
>>> generated_tokens = model.generate(**encoded_zh, forced_bos_token_id=tokenizer.get_lang_id("en"))
>>> tokenizer.batch_decode(generated_tokens, skip_special_tokens=True)
'Do not interfere with the matters of the witches, because they are delicate and will soon be angry.'
MBart[[mbart]]
๋ค์ MBart ๋ชจ๋ธ ๋ํ ๋ค๊ตญ์ด ํ์คํฌ์ ์ฌ์ฉํ ์ ์์ต๋๋ค:
facebook/mbart-large-50-one-to-many-mmt
(์ผ๋๋ค ๋ค๊ตญ์ด ๋ฒ์ญ, 50๊ฐ ๊ตญ์ด)facebook/mbart-large-50-many-to-many-mmt
(๋ค๋๋ค ๋ค๊ตญ์ด ๋ฒ์ญ, 50๊ฐ ๊ตญ์ด)facebook/mbart-large-50-many-to-one-mmt
(๋ค๋์ผ ๋ค๊ตญ์ด ๋ฒ์ญ, 50๊ฐ ๊ตญ์ด)facebook/mbart-large-50
(๋ค๊ตญ์ด ๋ฒ์ญ, 50๊ฐ ๊ตญ์ด)facebook/mbart-large-cc25
์ด ์์ ์์๋ ํ๋๋์ด๋ฅผ ์์ด๋ก ๋ฒ์ญํ๊ธฐ ์ํด facebook/mbart-large-50-many-to-many-mmt
์ฒดํฌํฌ์ธํธ๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
ํ ํฌ๋์ด์ ์์ ๋ฒ์ญ ๋์ ์ธ์ด(source language)๋ฅผ ์ค์ ํ ์ ์์ต๋๋ค:
>>> from transformers import AutoTokenizer, AutoModelForSeq2SeqLM
>>> en_text = "Do not meddle in the affairs of wizards, for they are subtle and quick to anger."
>>> fi_text = "รlรค sekaannu velhojen asioihin, sillรค ne ovat hienovaraisia ja nopeasti vihaisia."
>>> tokenizer = AutoTokenizer.from_pretrained("facebook/mbart-large-50-many-to-many-mmt", src_lang="fi_FI")
>>> model = AutoModelForSeq2SeqLM.from_pretrained("facebook/mbart-large-50-many-to-many-mmt")
๋ฌธ์ฅ์ ํ ํฐํํฉ๋๋ค:
>>> encoded_en = tokenizer(en_text, return_tensors="pt")
MBart๋ ๋ฒ์ญ์ ์งํํ๊ธฐ ์ํด ์ฒซ ๋ฒ์งธ๋ก ์์ฑ๋๋ ํ ํฐ์ ๋ฒ์ญํ ์ธ์ด(target language) ID๋ก ๊ฐ์ ์ง์ ํฉ๋๋ค.
์์ด๋ก ๋ฒ์ญํ๊ธฐ ์ํด generate
๋ฉ์๋์์ forced_bos_token_id
๋ฅผ en
์ผ๋ก ์ค์ ํฉ๋๋ค:
>>> generated_tokens = model.generate(**encoded_en, forced_bos_token_id=tokenizer.lang_code_to_id("en_XX"))
>>> tokenizer.batch_decode(generated_tokens, skip_special_tokens=True)
"Don't interfere with the wizard's affairs, because they are subtle, will soon get angry."
facebook/mbart-large-50-many-to-one-mmt
์ฒดํฌํฌ์ธํธ๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค๋ฉด, ์ฒซ ๋ฒ์งธ๋ก ์์ฑ๋๋ ํ ํฐ์ ๋ฒ์ญํ ์ธ์ด(target language) ID๋ก ๊ฐ์ ์ง์ ํ ํ์๋ ์์ต๋๋ค.