Почему мои модели выдают тексты на хинди и других языках, хотя я не использовал эти языки для их обучения?

Вопрос или проблема

В настоящее время я использую следующий llm, как упоминалось выше. Я использую unsloth для более быстрой обработки. Параметры, с которыми я загрузил модель, приведены ниже:

model, tokenizer = FastLanguageModel.from_pretrained(
    model_name="unsloth/Meta-Llama-3.1-8B-Instruct-bnb-4bit",
    max_seq_length=2048,
    dtype=None, # None для автодетекции
    load_in_4bit=True, # уменьшает использование памяти
    attn_implementation="flash_attention_2",
    token="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"
)
import torch
model = FastLanguageModel.get_peft_model(
    model,
    r = 64,
    target_modules = ["q_proj", "k_proj", "v_proj", "o_proj",
                      "gate_proj", "up_proj", "down_proj",],
    lora_alpha = 128,
    lora_dropout = 0.2,
    bias = "none",
    use_gradient_checkpointing = "unsloth",
    random_state = 4,
    use_rslora = False,
    loftq_config = None,
)

Запрос, который я использовал для тренировки:

prompt = """
### Задача перевода:
Вы профессиональный переводчик, которому поручено перевести следующее предложение с английского на {language_name}. Убедитесь, что вы сохраняете семантическое сходство, улавливаете эмоциональные нюансы и отражаете тонкости, такие как отношения между персонажами, подразумеваемые значения и культурный контекст. Обратите особое внимание на тон и намерение за фразами и адаптируйте их соответственно для целевого языка.

### Оригинальное предложение:
{sentence}

### Примеры нюансированных переводов:
- Английский: "Hello!! Chris. How are you?" Спросила Джейн.
- Нюансированный перевод: "Bonjour!! Oncle Chris. Comment ça va?" Спросила Джейн.
  *Примечание: В этом переводе близость и семейные отношения подчеркиваются изменением "Hello" на "Bonjour, Oncle", отражая возможную близость или уважение в культурном контексте.

- Английский: "For shame! For shame! cried the lady's maid."
- Нюансированный перевод: "Quelle honte! Quelle honte! continua la femme de chambre, oui, elle est semblable à un chat enragé."
  *Примечание: Здесь переводчик добавил "oui, elle est semblable à un chat enragé", оскорбление, которого не было в оригинале, чтобы усилить эмоциональный тон и адаптировать фразу к культурному контексту.

### Ваш перевод:
{translation}
"""

EOS_TOKEN = tokenizer.eos_token if tokenizer.eos_token else ""

def formatting_prompts(examples):
    languages = examples["language_name"]
    sentences = examples["aligned_src"]
    translations = examples["aligned_tgt"]

    texts = []
    for language, sentence, translation in zip(languages, sentences, translations):
        text = prompt.format(language_name=language, sentence=sentence, translation=translation) + EOS_TOKEN
        texts.append(text)

    return {"text": texts}

# Примените новую функцию форматирования к наборам данных
train_dataset = train_dataset.map(formatting_prompts, batched=True)
val_dataset = val_dataset.map(formatting_prompts, batched=True)
test_dataset = test_dataset.map(formatting_prompts, batched=True)

Что я делаю с помощью этого, так это перевод историй. У меня есть набор данных выровненных предложений, созданный с помощью инструмента bertalign, который содержит около 60000 наблюдений. Выравнивания предложений между английским, испанским, французским и португальским. Я разделил данные на обучение и тестирование в соотношении 0,1, а валидационные данные содержат около 6000 наблюдений, выделенных из обучающих данных. Параметры, которые я установил, следующие:

trainer = SFTTrainer(
    model=model,
    tokenizer=tokenizer,
    train_dataset=train_dataset,
    eval_dataset=val_dataset,
    dataset_text_field="text",
    max_seq_length=384,
    dataset_num_proc=2,
    packing=False,
    args=TrainingArguments(
        output_dir=checkpoint_dir,  # Используйте директорию контрольной точки для всех выходных данных
        per_device_train_batch_size=batch_size,
        per_device_eval_batch_size=eval_batch_size,
        gradient_accumulation_steps=4,
        warmup_steps=243,
        num_train_epochs=18,
        learning_rate=2e-4,
        fp16=not is_bfloat16_supported(),
        bf16=is_bfloat16_supported(),
        logging_steps=20,
        eval_strategy="steps",
        eval_steps=60,
        save_strategy="steps",
        save_steps=60,  # Убедитесь, что это соответствует eval_steps, если вы используете стратегию на основе шагов
        save_total_limit=5,
        load_best_model_at_end=True,
        metric_for_best_model="eval_loss",
        greater_is_better=False,
        optim="adamw_hf",
        weight_decay=0.01,
        lr_scheduler_type="linear",
        report_to="wandb",
        seed=4131,
        resume_from_checkpoint=checkpoint_dir   # Возобновление только в том случае, если существуют файлы контрольной точки
    ),
    callbacks=[
        EarlyStoppingCallback(early_stopping_patience=5)
    ],
)

Результаты обучения вышеуказанной модели следующие:
потеря при обучении и потеря на валидации

Я сделал несколько предсказаний на тестовом наборе и обнаружил, что результаты действительно хорошие с одной стороны. Но иногда модель дает мне мусорный вывод, как на этом изображении:Предсказания. Как вы можете увидеть, в выводах есть текст из запросов, и она дала мне вывод на хинди, даже если я не обучал её на этом конкретном языке. Есть идеи, почему это происходит? Это связано с рангом и значениями альфа, которые я значительно увеличил в конфигурации peft? Буду признателен за любые идеи.

Ответ или решение

Причины появления текстов на хинди и других языках в выводах модели

Ваша ситуация, когда модель дает результаты на хинди и других языках, несмотря на отсутствие тренировочных данных на этих языках, имеет несколько возможных объяснений. Рассмотрим их более подробно.

1. Архитектура модели и предобучение

Большинство современных языковых моделей, таких как Meta-Llama, основаны на трансформерах и предобучены на огромных корпусах текстов, которые включают множество языков. Даже если вы не предоставили данных на хинди при обучении, модель может иметь предобученные знания о других языках из-за их присутствия в данных, на которых она изначально обучалась. Это может объяснить, почему модель иногда генерирует текст на хинди.

2. Контекст и семантическое восприятие

Ваши модели обладают способностью к контекстуальному пониманию. Если в задании упоминается, например, культурный контекст, связанный с Индией или хинди-говорящими регионами, модель может попытаться адаптировать выводы, чтобы соответствовать этому контексту. Это может проявляться в том, что она включает текст на хинди, полагая, что это будет более уместно или эмоционально насыщенно для данной ситуации.

3. Форматирование входных данных

Форматирование, которое вы используете для подготовки данных для обучения, может влиять на выводы модели. Если модель сталкивается с фразами или именами, которые могут быть интерпретированы как относящиеся к хинди или другим языкам, она может интерпретировать это как сигнал генерировать текст на этих языках. Ваша структура шаблона может быть частью проблемы, если она не полностью ясна для модели.

4. Параметры и настройки модели

Параметры, такие как r (rank) и alpha в вашей PEFT конфигурации, могут также влиять на способность модели обобщать и извлекать информацию. Если их значения слишком высоки, это может привести к неоптимальному поведению модели, что может вызывать появление странных и неуместных выходов, включая текст на других языках.

5. Проблемы с генерацией текста

Не исключено, что нежелательный вывод является результатом генеративных особенностей модели. Разные языковые модели имеют свои нюансы в генерации текста, и иногда они могут "выходить за рамки" запрашиваемых языков. Это может быть связано с недостаточной стабильностью модели при работе с несколькими языками, особенно в ситуациях, когда предложенный контекст позволяет несколько интерпретаций.

Рекомендации по улучшению результата

  1. Проверка предобученной модели: Ознакомьтесь с данными, на которых была предобучена модель. Если хинди присутствует в pretrained dataset, это объясняет отличия в выводах.

  2. Улучшение набора данных: Можно попробовать дообучить модель, используя фильтрованный набор данных, который будет исключать нежелательные языки.

  3. Корректировка параметров: Подумайте о снижении значений параметров r и alpha, чтобы модель не теряла фокус при генерации текста.

  4. Проверка шаблонов: Возможно, стоит улучшить وضи南ть структуры шаблона, чтобы избежать неоднозначности и ненадлежащего генеративного поведения.

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...