Как можно устранить проблему, когда ИИ постоянно повторяет одни и те же фразы?

Я доработал модель (distilgpt2) и натренировал её на 220+ эпохах (100000 шагов), ожидая отличных результатов. Однако, в выводе модели наблюдается повторение фраз. <br/> Вот как происходит запуск модели: <br/> <pre><code>def generate(msg):
    question = "Question: "+msg
    inputs = tokenizer(question, return_tensors="pt").to("cuda:0")
    attention_mask = inputs["attention_mask"]
    outputs = model.generate(
        inputs["input_ids"],
        attention_mask=attention_mask,
        max_length=256,
        num_return_sequences=1,
        do_sample=True,  # Enable sampling for varied output
        top_k=50,        # Limit to top 50 probable tokens
        top_p=0.95,      # Use nucleus sampling
        pad_token_id=tokenizer.eos_token_id  # Explicitly set padding token
    )

    # Decode and print the raw output for debugging
    raw_output = tokenizer.decode(outputs[0], skip_special_tokens=True)
    ##decoded_output = bytes(raw_output, "latin-1'").decode("unicode_escape")
    #print("Raw output:", repr(raw_output))   # Show exact string with quotes
    #print("Visible output:", raw_output)     # Show what’s printed
    return decode_escapes(raw_output.replace(question, "").split('Answer: ')[-1])</code></pre> <br/> <br/> Например, при запросе: <br/> <pre><code>напиши код на C++, выводящий на экран надпись "тест"</code></pre> <br/> Ответ выглядит так: <br/> <pre><code>Вот код на C++, выводящий на экран "тест":
```#include &lt;iostream&gt;
int main() {
   std::cout &lt;&lt; "тест":
```#include &lt;iostream&gt;
int main() {
     std::cout &lt;&lt; "тест":
```#include &lt;iostream&gt;
    экран    return 0;
}```</code></pre> <br/> <br/> Также вот фрагмент из датасета (в котором использовались случайные символы и множество подобных примеров):
  • 14 марта 2025 г. 19:44
Ответы на вопрос 2
Проблема повторения фраз в выводе модели может быть вызвана несколькими факторами, включая настройки генерации текста, архитектуру модели и качество тренировочных данных. Вот несколько вещей, которые вы можете попробовать, чтобы снизить повторения и улучшить разнообразие выводимого текста:

1. **Настройки генерации**:
   - **Увеличение температуры**: Попробуйте увеличить параметр `temperature` в функции `model.generate`. Температура контролирует случайность выбора токенов. Чем выше значение, тем более разнообразные, но потенциально менее логичные ответы.
   - **Использование `repetition_penalty`**: Добавьте параметр `repetition_penalty` в методы генерации. Этот параметр штрафует повторяющиеся токены, тем самым уменьшая вероятность их повторения. Пример: `repetition_penalty=1.2`.
   - **Изменение `num_return_sequences`**: Увеличьте количество возвращаемых последовательностей и выберите наиболее подходящую из них, что может также помочь избежать повторений.

2. **Качество тренировочных данных**:
   - Попробуйте очистить и разнообразить ваш датасет. Избегайте включения избыточного количества однотипных примеров, так как это может привести к избыточному запоминанию модели.
   - Убедитесь, что ваш набор данных содержит разнообразные форматы вопросов и ответов. Чем разнообразнее данные, тем лучше модель сможет обобщать.

3. **Обработка вывода**:
   - Вы можете добавить дополнительную обработку вывода после генерации текста, чтобы удалить или заменить дублирующиеся фрагменты.
   - Способы могут включать в себя простую проверку на дубли или более сложные механизмы, такие как сохранение предыдущих выводов и анализ совпадений.

4. **Тонкая настройка модели**:
   - Рассмотрите возможность дообучения модели с фокусом на данные, которые меньше склонны к повторениям, или на примеры, которые содержат более разнообразные языковые конструкции.

5. **Тестирование различных параметров**:
   - Экспериментируйте с параметрами `top_k` и `top_p`. Возможно, потребуется изменить их значения для достижения лучших результатов.
   - Выполните несколько циклов тестирования с различными параметрами, чтобы выявить, какие настройки работают лучше всего для вашего конкретного случая.

Вот пример обновленного кода с учетом предложенных улучшений:

```python
def generate(msg):
    question = "Question: " + msg
    inputs = tokenizer(question, return_tensors="pt").to("cuda:0")
    attention_mask = inputs["attention_mask"]
    outputs = model.generate(
        inputs["input_ids"],
        attention_mask=attention_mask,
        max_length=256,
        num_return_sequences=5,  # Возврат пяти последовательностей
        do_sample=True,
        top_k=50,
        top_p=0.95,
        temperature=1.2,  # Увеличение температуры
        repetition_penalty=1.2,  # Штраф за повторения
        pad_token_id=tokenizer.eos_token_id
    )
    
    results = []
    for i in range(5):  # Проход по всем сгенерированным значениям
        raw_output = tokenizer.decode(outputs[i], skip_special_tokens=True)
        results.append(decode_escapes(raw_output.replace(question, "").split('Answer: ')[-1]))

    # Возвращаем первый (лучший) результат
    return sorted(results, key=lambda x: len(set(x.split())), reverse=True)[0]  # Возврат наиболее разнообразного
```

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

Заменил distilgpt2 на t5-small, там параметров меньше и кириллица есть.
Минусы - пытаюсь пофиксить замену спец символов на
Похожие вопросы