Модели на основе трансформаторов увеличиваются в размерах, и вместе с этим усложняется использование универсальных моделей для конкретных задач. «У нас нет рва, как и у 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, вы можете создать систему перевода, которая устраняет разрыв между английским и хинглиш и другими пользовательскими переводами.

Лучшей производительности можно добиться, вкладывая время и усилия в обработку данных.

Источники:

  1. Изучение трансферного обучения с T5: преобразователь преобразования текста в текст [БЛОГ][БУМАГА]
  2. Набор данных Hinglish TOP [БУМАГА]
  3. HinGE: набор данных для генерации и оценки текста на хинглише со смешанным кодом
  4. CMU Хинглиш Дог [Хинглиш][Английский]