Spaces:
Paused
Paused
<!--Copyright 2022 The HuggingFace Team. All rights reserved. | |
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with | |
the License. You may obtain a copy of the License at | |
http://www.apache.org/licenses/LICENSE-2.0 | |
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on | |
an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the | |
specific language governing permissions and limitations under the License. | |
โ ๏ธ Note that this file is in Markdown but contain specific syntax for our doc-builder (similar to MDX) that may not be | |
rendered properly in your Markdown viewer. | |
--> | |
# ๋ค๊ตญ์ด ๋ชจ๋ธ ์ถ๋ก ํ๊ธฐ[[multilingual-models-for-inference]] | |
[[open-in-colab]] | |
๐ค Transformers์๋ ์ฌ๋ฌ ์ข ๋ฅ์ ๋ค๊ตญ์ด(multilingual) ๋ชจ๋ธ์ด ์์ผ๋ฉฐ, ๋จ์ผ ์ธ์ด(monolingual) ๋ชจ๋ธ๊ณผ ์ถ๋ก ์ ์ฌ์ฉ๋ฒ์ด ๋ค๋ฆ ๋๋ค. | |
๊ทธ๋ ๋ค๊ณ ํด์ *๋ชจ๋ * ๋ค๊ตญ์ด ๋ชจ๋ธ์ ์ฌ์ฉ๋ฒ์ด ๋ค๋ฅธ ๊ฒ์ ์๋๋๋ค. | |
[bert-base-multilingual-uncased](https://huggingface.co/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), ์์ด-ํ๋์ค์ด)๋ฅผ ๊ฐ์ ธ์ต๋๋ค: | |
```py | |
>>> 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๋ฅผ ํ์ํฉ๋๋ค: | |
```py | |
>>> print(tokenizer.lang2id) | |
{'en': 0, 'fr': 1} | |
``` | |
๋ค์์ผ๋ก, ์์ ์ ๋ ฅ์ ๋ง๋ญ๋๋ค: | |
```py | |
>>> input_ids = torch.tensor([tokenizer.encode("Wikipedia was used to")]) # ๋ฐฐ์น ํฌ๊ธฐ๋ 1์ ๋๋ค | |
``` | |
์ธ์ด ID๋ฅผ `"en"`์ผ๋ก ์ค์ ํด ์ธ์ด ์๋ฒ ๋ฉ์ ์ ์ํฉ๋๋ค. | |
์ธ์ด ์๋ฒ ๋ฉ์ ์์ด์ ์ธ์ด ID์ธ `0`์ผ๋ก ์ฑ์์ง ํ ์์ ๋๋ค. | |
์ด ํ ์๋ `input_ids`์ ๊ฐ์ ํฌ๊ธฐ์ฌ์ผ ํฉ๋๋ค. | |
```py | |
>>> 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`์ ์ธ์ด ์๋ฒ ๋ฉ์ ๋ชจ๋ธ๋ก ์ ๋ฌํฉ๋๋ค: | |
```py | |
>>> outputs = model(input_ids, langs=langs) | |
``` | |
[run_generation.py](https://github.com/huggingface/transformers/tree/main/examples/pytorch/text-generation/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)๋ฅผ ์ค์ ํ ์ ์์ต๋๋ค: | |
```py | |
>>> 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") | |
``` | |
๋ฌธ์ฅ์ ํ ํฐํํฉ๋๋ค: | |
```py | |
>>> encoded_zh = tokenizer(chinese_text, return_tensors="pt") | |
``` | |
M2M100์ ๋ฒ์ญ์ ์งํํ๊ธฐ ์ํด ์ฒซ ๋ฒ์งธ๋ก ์์ฑ๋๋ ํ ํฐ์ ๋ฒ์ญํ ์ธ์ด(target language) ID๋ก ๊ฐ์ ์ง์ ํฉ๋๋ค. | |
์์ด๋ก ๋ฒ์ญํ๊ธฐ ์ํด `generate` ๋ฉ์๋์์ `forced_bos_token_id`๋ฅผ `en`์ผ๋ก ์ค์ ํฉ๋๋ค: | |
```py | |
>>> 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)๋ฅผ ์ค์ ํ ์ ์์ต๋๋ค: | |
```py | |
>>> 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") | |
``` | |
๋ฌธ์ฅ์ ํ ํฐํํฉ๋๋ค: | |
```py | |
>>> encoded_en = tokenizer(en_text, return_tensors="pt") | |
``` | |
MBart๋ ๋ฒ์ญ์ ์งํํ๊ธฐ ์ํด ์ฒซ ๋ฒ์งธ๋ก ์์ฑ๋๋ ํ ํฐ์ ๋ฒ์ญํ ์ธ์ด(target language) ID๋ก ๊ฐ์ ์ง์ ํฉ๋๋ค. | |
์์ด๋ก ๋ฒ์ญํ๊ธฐ ์ํด `generate` ๋ฉ์๋์์ `forced_bos_token_id`๋ฅผ `en`์ผ๋ก ์ค์ ํฉ๋๋ค: | |
```py | |
>>> 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๋ก ๊ฐ์ ์ง์ ํ ํ์๋ ์์ต๋๋ค. | |