Модели на основе трансформаторов увеличиваются в размерах, и вместе с этим усложняется использование универсальных моделей для конкретных задач. «У нас нет рва, как и у OpenAI» — будущее за конкретными задачами Модели Transformer, используемые промышленностью, никто не будет доминировать над всеми.
В этом духе давайте пройдемся по тонкой настройке модели T5 для перевода с английского на хинглиш. Я буду упрощать процесс, сосредоточившись на настройке подготовки набора данных и обучении.
Модель
Как следует из названия, T5 или Трансформатор преобразования текста в текст основан на архитектуре преобразователя и предназначен для выполнения различных задач НЛП. T5 имеет структуру преобразования текста в текст, так что все проблемы НЛП, такие как перевод, разговор, сводка, анализ настроений и т. д., представлены как задачи преобразования текста в текст. T5 рассматривает все эти задачи как примеры преобразования одного текстового ввода в другой текстовый вывод.
Обученная на обширных наборах данных из Интернета, модель T5 была предварительно обучена комбинацией неконтролируемых и контролируемых задач, где каждая задача преобразуется в формат преобразования текста в текст. Например, для перевода: «перевести с английского на хинглиш: …», для резюмирования: «резюмировать: …. ”
Платформа преобразования текста в текст обеспечивает гибкость и делает ее идеальной для точной настройки пользовательских данных в зависимости от задачи. Нашей задачей сегодня будет перевод с английского на хинглиш.
Набор данных
Открыто доступные наборы данных Hinglish плохого качества. Я объединил несколько источников и создал единый источник данных для обучения. Он может быть найден здесь". Будьте осторожны с наборами данных, я бы порекомендовал вам прочитать несколько примеров, прежде чем использовать их.
Обучение
### MODEL ### model_name = "t5-small" config = AutoConfig.from_pretrained( model_name ) tokenizer = AutoTokenizer.from_pretrained( model_name use_fast=True, #important ) model = AutoModelForSeq2SeqLM.from_pretrained( model_name, config=config ) # transformers lib will fetch the config, # tokenizer and pre-trained model as per the model_name # tokenizer: T5TokenizerFast, fast tokenizer can be trained for old ones # model : T5ForConditionalGeneration # config : T5Config
Подробнее о моделях можно узнать — T5 / T5v1.1
Нам придется переобучить токенизатор, так как наш новый словарь будет состоять из хинглиш-слов, которых может не быть в базовом словаре. Для токенизатора давайте потренируемся, загрузив набор данных из концентратора. Для модели, чтобы продемонстрировать, как вы можете использовать свои собственные файлы, набор данных будет создан из файла.
### DATA TOKENIZER ### dataset = load_dataset('findnitai/english-to-hinglish') # data set format will be json lines, two lines below as example # {"translation" : {"en" : "Hello, what is your name?" , "hi_ng" : "Namaste aapka naam kya hai?" }} ### TOKENIZER ### master = [] for line in dataset['train']['translation']: master.append(line['en']) master.append(line['hi_ng']) def gen_training_data(): return (master[i : i+500] for i in range(0, len(master), 500) ) tokenizer_training_data = gen_training_data() tokenizer = tokenizer_base.train_new_from_iterator(tokenizer_training_data, 32128) # tokenizer.save_pretrained("en-hig-tokenizer") ### DATA TRAIN & PROCESS ### train_file = "hinglish_upload_v1.json" # same as dataset loaded for Tokenizer # train file format # {"translation" : {"en" : "Hello, what is your name?" , "hi_ng" : "Namaste aapka naam kya hai?" }} data_files = {} data_files["train"] = train_file # data_files["valid"] = validation_file raw_datasets = load_dataset( "json", data_files=data_files ) source_prefix = "Translate English to Hinglish : " source_lang = "en" target_lang = "hi_ng" max_source_length = 128 max_target_length = 128 # target and source length task dependent (translation, summary etc.) padding = "max_length" # padding to max length num_epochs = 3 def preprocess(source_data): inputs = [sample[source_lang] for sample in source_data["translation"]] targets = [sample[target_lang] for sample in source_data["translation"]] inputs = [source_prefix + inp for inp in inputs] model_inputs = tokenizer(inputs, max_length=max_source_length, padding=padding, truncation=True) # Tokenize targets with the `text_target` keyword argument labels = tokenizer(text_target=targets, max_length=max_target_length, padding=padding, truncation=True) # replace tokenizer.pad_token_id in the labels by -100 to ignore padding in the loss. labels["input_ids"] = [ [(l if l != tokenizer.pad_token_id else -100) for l in label] for label in labels["input_ids"] ] model_inputs["labels"] = labels["input_ids"] return model_inputs
Здесь исходный префикс определяет задачу в архитектуре преобразования текста в текст, используемой T5. Токены заполнения поддерживают длину последовательности, маскируют нерелевантные токены и обеспечивают согласованное выравнивание переводов.
train_dataset = raw_dataset["train"] train_dataset = train_dataset.map(preprocess, batched=True, remove_columns="translation") data_collator = default_data_collator trainer_args_in = { 'output_dir': 'my-t5-hinglish-translator', 'overwrite_output_dir' : True, 'do_train' : True, # 'do_valid' : False, 'per_device_train_batch_size' : 8, 'num_train_epochs' : num_epochs, } #all arguments can be found detailed in the TrainingArguments dataclass parser = HfArgumentParser((Seq2SeqTrainingArguments)) training_args = parser.parse_dict(trainer_args_in) trainer = Seq2SeqTrainer(model=model, args=training_args[0], train_dataset=train_dataset, tokenizer=tokenizer, data_collator=data_collator) train_result = trainer.train(resume_from_checkpoint=None) trainer.save_model()
Если вы хотите поиграть с моделью, вы можете сделать это здесь.
### INFERENCE ### model = T5ForConditionalGeneration.from_pretrained("my-t5-hinglish-translator") #path to output dir input_ids = tokenizer("translate English to Hinglish: How is the weather?", return_tensors="pt").input_ids outputs = mmodel.generate(input_ids) print("Test Output : " + tokenizer.decode(outputs[0], skip_special_tokens=True)) # Test Output : mausam kaisa hai?
Краткое содержание
Используя ресурсы Hugging Face, в том числе модель T5, вы можете создать систему перевода, которая устраняет разрыв между английским и хинглиш и другими пользовательскими переводами.
Лучшей производительности можно добиться, вкладывая время и усилия в обработку данных.
Источники:
- Изучение трансферного обучения с T5: преобразователь преобразования текста в текст [БЛОГ][БУМАГА]
- Набор данных Hinglish TOP [БУМАГА]
- HinGE: набор данных для генерации и оценки текста на хинглише со смешанным кодом
- CMU Хинглиш Дог [Хинглиш][Английский]