
Этот репозиторий предоставляет код для обучения японских моделей. Этот код был использован для производства японского GPT2-Medium, японского GPT2-Small и японской базы, выпущенной в модель Huggingface Model By Rinna Co., Ltd.
В настоящее время поддерживаемые модели включают: GPT-2, Роберта.
| Оглавление |
|---|
| Обновление журнала |
| Используйте советы |
| Используйте наши предварительные модели через Huggingface |
Обучить japanese-gpt2-xsmall с нуля |
Обучить japanese-roberta-base с нуля |
| Лицензия |
Пожалуйста, откройте проблему (на английском/японском языке), если вы столкнетесь с какой -либо проблемой, используя код или используете наши модели через Huggingface.
Если вы найдете эту работу полезной, пожалуйста, укажите следующую статью:
@article{rinna_pretrained2021,
title={日本語自然言語処理における事前学習モデルの公開},
author={趙 天雨 and 沢田 慶},
journal={人工知能学会研究会資料 言語・音声理解と対話処理研究会},
volume={93},
pages={169-170},
year={2021},
doi={10.11517/jsaislud.93.0_169}
}
2022/01/25 Обновленная ссылка на rinna/japanese-gpt-1b в таблице сводной модели.
2022/01/17 Обновленная информация о цитировании.
2021/11/01 Обновленные ссылки корпусов.
2021/09/13 Добавлены советы по использованию position_ids с japanese-roberta-base . Обратитесь к выпуску 3 для деталей.
2021/08/26 [Важная] Обновленная лицензия от лицензии MIT до лицензии Apache 2.0 из-за использования кода предварительной обработки Википедии от Cl-Tohoku/Bert-Japanese. Смотрите выпуск 1 для деталей.
2021/08/23 добавил японскую Википедию в Training Corpora. Опубликованный код для обучения rinna/japanese-gpt2-small , rinna/japanese-gpt2-xsmall и rinna/japanese-roberta-base .
2021/08/18 Изменено имя репо с japanese-gpt2 на japanese-pretrained-models
2021/06/15 Исправлена лучшая ошибка отслеживания PPL при использовании контрольной точки.
2021/05/04 Исправлена случайная ошибка за сеяние для обучения мульти-GPU.
2021/04/06 Опубликованный код для обучения rinna/japanese-gpt2-medium .
rinna/japanese-roberta-base Используйте [CLS] : чтобы предсказать токен в масках, обязательно добавьте токен [CLS] перед предложением для правильного кодирования модели, поскольку он используется во время обучения модели.
Используйте [MASK] после токенизации: а) непосредственно ввод [MASK] во входной строке и б) заменить токен [MASK] после того, как токенизация даст разные последовательности токенов, и, следовательно, разные результаты прогнозирования. Более уместно использовать [MASK] после токенизации (так как она согласуется с тем, как модель была предварительно установлена). Тем не менее, API вывода HuggingFice поддерживает только набор [MASK] во входной строке и создает менее надежные прогнозы.
Предоставьте position_ids как аргумент явно: когда position_ids не предоставляется для модели Roberta* , transformers HuggingFace автоматически построят ее, но начнутся с padding_idx вместо 0 (см. Проблема и функция create_position_ids_from_input_ids() в реализации HuggingFace), которые, к сожалению, не работают с rinna/japanese-roberta-base с тех пор, что не работает, с Rinna-roberta-base-base-base-base_idx, что не 0 , с Rinna/япон-и- padding_idx . Поэтому, пожалуйста, не забудьте создать position_ids самостоятельно и заставьте его начать с идентификатора позиции 0 .
| языковая модель | # Params | # слои | # emb Dim | #Epochs | Dev Ppl | время обучения* |
|---|---|---|---|---|---|---|
| Ринна/Японский-ГПТ-1B | 1.3b | двадцать четыре | 2048 | 10+ | 13.9 | N/A ** |
| Ринна/Японская-Гпт2-Мидея | 336 м | двадцать четыре | 1024 | 4 | 18 | 45 дней |
| Ринна/японская-GPT2-Small | 110 м | 12 | 768 | 3 | двадцать один | 15 дней |
| Ринна/японская-GPT2-XSMALL | 37м | 6 | 512 | 3 | 28 | 4 дня |
| Модель в масках | # Params | # слои | # emb Dim | #Epochs | Dev Ppl | время обучения* |
|---|---|---|---|---|---|---|
| Ринна/японская база | 110 м | 12 | 768 | 8 | 3.9 | 15 дней |
* Обучение проводилось на 82 ГБ машине 8X V100.
** Обучение проводилось с использованием другой кодовой базы и другой вычислительной среды.
rinna/japanese-roberta-base для прогнозирования токена маски import torch
from transformers import T5Tokenizer, RobertaForMaskedLM
# load tokenizer
tokenizer = T5Tokenizer.from_pretrained("rinna/japanese-roberta-base")
tokenizer.do_lower_case = True # due to some bug of tokenizer config loading
# load model
model = RobertaForMaskedLM.from_pretrained("rinna/japanese-roberta-base")
model = model.eval()
# original text
text = "4年に1度オリンピックは開かれる。"
# prepend [CLS]
text = "[CLS]" + text
# tokenize
tokens = tokenizer.tokenize(text)
print(tokens) # output: ['[CLS]', '▁4', '年に', '1', '度', 'オリンピック', 'は', '開かれる', '。']']
# mask a token
masked_idx = 5
tokens[masked_idx] = tokenizer.mask_token
print(tokens) # output: ['[CLS]', '▁4', '年に', '1', '度', '[MASK]', 'は', '開かれる', '。']
# convert to ids
token_ids = tokenizer.convert_tokens_to_ids(tokens)
print(token_ids) # output: [4, 1602, 44, 24, 368, 6, 11, 21583, 8]
# convert to tensor
token_tensor = torch.LongTensor([token_ids])
# provide position ids explicitly
position_ids = list(range(0, token_tensor.size(1)))
print(position_ids) # output: [0, 1, 2, 3, 4, 5, 6, 7, 8]
position_id_tensor = torch.LongTensor([position_ids])
# get the top 10 predictions of the masked token
with torch.no_grad():
outputs = model(input_ids=token_tensor, position_ids=position_id_tensor)
predictions = outputs[0][0, masked_idx].topk(10)
for i, index_t in enumerate(predictions.indices):
index = index_t.item()
token = tokenizer.convert_ids_to_tokens([index])[0]
print(i, token)
"""
0 総会
1 サミット
2 ワールドカップ
3 フェスティバル
4 大会
5 オリンピック
6 全国大会
7 党大会
8 イベント
9 世界選手権
"""
japanese-gpt2-xsmall с нуляУстановите требуемые пакеты, запустив следующую команду в каталоге Repo:
pip install -r requirements.txt
python -m unidic download
Загрузите обучение Corpus японского CC-100 и извлечь файл ja.txt .
Переместите файл ja.txt или измените src/corpus/jp_cc100/config.py чтобы соответствовать FilePath ja.txt с self.raw_data_dir в файле config.
Разделить ja.txt на более мелкие файлы, запустив:
cd src/
python -m corpus.jp_cc100.split_to_small_files
self.download_link (в файле src/corpus/jp_wiki/config.py ) со ссылкой на вашу предпочтительную версию дампа Википедии. Затем загрузите учебную корпус японскую Википедию и разделите ее, работая: python -m corpus.jp_wiki.build_pretrain_dataset
python -m corpus.jp_wiki.split_to_small_files
CUDA_VISIBLE_DEVICES=0,1,2,3 python -m task.pretrain_gpt2.train
--n_gpus 4
--save_model True
--enable_log True
--model_size xsmall
--model_config_filepath model/gpt2-ja-xsmall-config.json
--batch_size 20
--eval_batch_size 40
--n_training_steps 1600000
--n_accum_steps 3
--init_lr 0.0007
Предположим, что вы запустили учебный скрипт и сохранили свой xsmall-размерный GPT-2 для data/model/pretrain_gpt2/gpt2-ja-xsmall-xxx.checkpoint . Запустите следующую команду, чтобы использовать ее для завершения текста на одном графическом процессоре с помощью отбора проб ядра с p=0.95 и k=40 :
CUDA_VISIBLE_DEVICES=0 python -m task.pretrain_gpt2.interact
--checkpoint_path ../data/model/pretrain_gpt2/gpt2-ja-medium-xxx.checkpoint
--gen_type top
--top_p 0.95
--top_k 40
Сделайте свою учетную запись HuggingFace. Создайте модель репо. Клонировать его на местную машину.
Создать модель и файлы конфигурации с контрольной точки, запустив:
python -m task.pretrain_gpt2.checkpoint2huggingface
--checkpoint_path ../data/model/gpt2-medium-xxx.checkpoint
--save_dir {huggingface's model repo directory}
python -m task.pretrain_gpt2.check_huggingface
--model_dir {huggingface's model repo directory}
Проверьте доступные аргументы учебного сценария GPT-2 под управлением:
python -m task.pretrain_gpt2.train --help
japanese-roberta-base с нуляПредположим, что вы закончили процесс построения данных, как описано выше, запустите следующую команду для обучения японской Роберты размером с базы, например, 8 V100 графических процессоров:
CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 python -m task.pretrain_roberta.train
--n_gpus 8
--save_model True
--enable_log True
--model_size base
--model_config_filepath model/roberta-ja-base-config.json
--batch_size 32
--eval_batch_size 32
--n_training_steps 3000000
--n_accum_steps 16
--init_lr 0.0006
Лицензия Apache 2.0