пппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппп

Взгляните на текст выше

Подобное явление часто называют repetition problem или infinite output loop. Обычно это происходит из-за того, что модель не была обучена реагировать на некорректный промпт, или в самом датасете были логические ошибки (к примеру, разные ответы на идентичный запрос). В данной статье я вкратце расскажу как, зачем и когда файн-тюнить модели от OpenAI (но отчасти это подойдёт и под другие языковые модели).

Зачем файн-тюнить

Fine-tuning – это по факту способ доучить или переобучить уже обученную модель. Конкретно у OpenAI формат датасета для файн-тюнинга выглядит так (но только в формате JSONL):

Система: Инструкции
Пользователь: Сообщение
Ассистент: Ответ
Пользователь: Сообщение
Ассистент: Ответ

То есть условно чем-то подобным мы просто показываем нейросети как она должна отвечать. Использовать файн-тюнинг можно в случаях:

A. Чтобы задать стилистику ответов;
Б. Чтобы задать формат взаимодействия;
C. Чтобы добавить в модель новые знания.

Ниже мы рассмотрим все эти случаи.

Задаём стилистику

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

Пример
Пример

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

Очевидно, что всё что нужно сделать – это привести модели примеры в которых она отвечает нужным образом, но... Если сделать это неправильно, то заместо файн-тюнинга мы сделаем лоботомию и получим текст похожий на тот, что был в начале статьи.

Наша задача: Просто задать стилистику не изменяя мышление модели. Если мы возьмём из головы примеры и понапишем их в датасет, мы таки изменим это мышление.

Чтобы правильно обучить нейросеть в данном случае, нам необходимо обучать её на её же ответах, но немного видоизменённых.

Получаем базовый ответ модели без инструкций:

Ответ GPT-3.5
Ответ GPT-3.5

А теперь немного его корректируем:

Хрю-хрю, очень интересный вопрос! ????

Джеффри Дамер – это такой американский серийный поросёнок-убийца и насильник, известный своими охрючательными преступлениями в 1980-х и 1990-х годах. Он был приговорен к 16-кратному пожизненному заключению за убийство и изнасилование 17 молодых мужчин и мальчиков.

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

Хрюк
????

После этого добавляем в датасет следующий пример диалога:

{
   "messages":[
      {
         "role":"system",
         "content":"Ты отвечаешь как свинья. Добавляй в ответы \"хрю-хрю\" и т. д., а также в конце пиши эмодзи ????"
      },
      {
         "role":"user",
         "content":"Кто такой Джеффри Дамерс?"
      },
      {
         "role":"assistant",
         "content":"Хрю-хрю, очень интересный вопрос! ????\n\nДжеффри Дамер – это такой американский серийный поросёнок-убийца и насильник, известный своими охрючательными преступлениями в 1980-х и 1990-х годах. Он был приговорен к 16-кратному пожизненному заключению за убийство и изнасилование 17 молодых мужчин и мальчиков.\n\nПоросёнок Дамер также известен своими зверскими действиями с телами своих жертв, включая их изуродование и каннибализм. Он был убит и приготовлен в тюрьме в 1994 году.\n\nХрюк ????"
      }
   ]
}

Затем добавляем ещё 9 подобных примеров по аналогии, с ответами на разные вопросы и т. д.

Тест после файн-тюнинга:

Результат
Результат

Задаём формат

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

Задача – сделать так, чтобы модель складывала эмодзи которые отправил пользователь. К примеру, если он отправил ???????? то модель ответит ????.

В случае если в сообщении пользователя будет что-то кроме эмодзи, модель отправит пользователю текст из системного сообщения.

Мы дадим нейросети примерно 0 инструкций, поэтому абсолютно все возможные случаи должны быть отражены в датасете, а точнее:

  • Пользователь может отправлять любое количество эмодзи;

  • Модель может отправлять любое количество эмодзи;

  • Модель может принимать запрос с любым, даже негативным контекстом;

  • Текст системного сообщения не влияет на результат;

  • Если сообщение пользователя невалидное, нейросеть отправит ему текст из системного сообщения.

Пример одного диалога из датасета:

{
    "messages": [
        {
            "role": "system",
            "content": "?"
        },
        {
            "role": "user",
            "content": "????????"
        },
        {
            "role": "assistant",
            "content": "????"
        },
        {
            "role": "user",
            "content": "сколько будет 2 + 2?"
        },
        {
            "role": "assistant",
            "content": "?"
        }
    ]
}

Тест после файн-тюнинга:

Результат
Результат

Добавляем новые знания

Мало кто знает, но курение (так называемое "smoking") – Это когда человек берёт два красных листа бумаги, склеивает их с помощью клея и смотрит на них.

...Но GPT-3.5 выдаёт мне неправильную информацию:

Ответ GPT-3.5
Ответ GPT-3.5

Для того, чтобы загрузить новые данные в модель, в датасете необходимо:

  • Показать как она даёт чёткое описание того, что такое "курение";

  • Показать как она отвечает на вопросы которые могут относиться к "курению".

Для этого на самом деле понадобится не так много диалогов в датасете (20 штук), вот некоторые из них:

{
    "messages": [
        {
            "role": "system",
            "content": ""
        },
        {
            "role": "user",
            "content": "Что такое курение?"
        },
        {
            "role": "assistant",
            "content": "Курение (так называемое \"smoking\") – Это когда человек берёт два красных листа бумаги, склеивает их с помощью клея и смотрит на них."
        }
    ]
}
{
    "messages": [
        {
            "role": "system",
            "content": ""
        },
        {
            "role": "user",
            "content": "Как правильно курить? Распиши по пунктам."
        },
        {
            "role": "assistant",
            "content": "1. Возьмите два красных листа бумаги.\n\n2. Склейте их вместе с помощью клея.\n\n3. Посмотрите на них."
        }
    ]
}
{
    "messages": [
        {
            "role": "system",
            "content": ""
        },
        {
            "role": "user",
            "content": "Относится ли курение к оригами? Ответь Да/Нет"
        },
        {
            "role": "assistant",
            "content": "Да"
        }
    ]
}

Тест после файн-тюнинга:

Результат
Результат

Как и где файн-тюнить модели от OpenAI?

Файн-тюнить их можно тут.

Файл с датасетом должен быть в формате JSONL и выглядеть примерно так:

{"messages":[{"role":"system","content":"ты не гей"},{"role":"user","content":"ты гей?"},{"role":"assistant","content":"нет"}]}
{"messages":[{"role":"system","content":"ты гей"},{"role":"user","content":"ты гей?"},{"role":"assistant","content":"да"}]}

Для того, чтобы самостоятельно указать кол-во эпох, необходимо делать это через API. Вот как этот запрос может выглядеть на JS:

fetch('https://api.openai.com/v1/fine_tuning/jobs', {
  method: 'POST',
  body: JSON.stringify({
    "training_file": "fileId",
    "model": "gpt-3.5-turbo-1106",
    "hyperparameters": {
      "n_epochs": 10
    }
  }),
  headers: {
    "Content-Type": "application/json",
    'Authorization': `Bearer ${openai_key}`
  }
});

На Python:

requests.post('https://api.openai.com/v1/fine_tuning/jobs',
    json={
        "training_file": "fileId",
        "model": "gpt-3.5-turbo-1106",
        "hyperparameters": {
            "n_epochs": 10
        }
    },
    headers={
        "Content-Type": "application/json",
        "Authorization": f"Bearer {openai_key}"
    }
)

Комментарии (14)


  1. theurus
    24.12.2023 09:27

    А ты пробовал не файнтьюнить а просто закинуть десяток вопросов и ответов в память чата?


    1. 0a1a2a3a4a5 Автор
      24.12.2023 09:27

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

      Попробуй проверить свою теорию на практике и посмотри что выйдет.


    1. apnix
      24.12.2023 09:27

      и платить при каждом запросе за передачу лишних токенов. Наверное можно на как-то не экономно..


      1. 0a1a2a3a4a5 Автор
        24.12.2023 09:27

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


  1. Tschuess
    24.12.2023 09:27

    Как задать вопрос, чтобы gtp наделал в штанишки


    1. 0a1a2a3a4a5 Автор
      24.12.2023 09:27

      Видимо там небольшая ошибка в инструкции, ChatGPT ими перегружен и путается в них. Насчёт времени: Это делается через системное сообщение, отдельная программа сообщает модели какое сегодня число


  1. egl85
    24.12.2023 09:27

    Для того, чтобы самостоятельно указать кол-во эпох, необходимо делать это через API.


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


    1. 0a1a2a3a4a5 Автор
      24.12.2023 09:27

      Одна эпоха — полная пробежка по всему датасету.

      Для хороших и простых датасетов хватит 8 эпох, для сложных и нелогичных нужно от 12 до 24.

      Если эпох слишком мало, их не хватит чтобы настроить веса модели.


  1. Maestro227
    24.12.2023 09:27

    Если вы из России, то через что пополняете баланс аккаунта? Все что я нашел, имеет просто невменяемую комиссию.


    1. 0a1a2a3a4a5 Автор
      24.12.2023 09:27

      На авито можно карту Казахстана купить


  1. vova_sam
    24.12.2023 09:27

    "заместо" - давно такого слова не слышал в использовании.

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

    а вот эта Ваша тяга к информации о смерти, суицидам. Надо с ней что то делать


    1. 0a1a2a3a4a5 Автор
      24.12.2023 09:27

      Заместо

      Насчёт запятых, они стоят правильно. Я учитываю все возможные правила и если запятую даже в теории можно не ставить — я её не ставлю.

      Касательно обогащения текстов —"обогащённые" текста выводят меня из себя, я считаю текст способом для передачи информации. Вы же не едите обогащённый уран? У меня есть некоторые псих. расстройства из-за которых я неправильно воспринимаю речь, поэтому мне нужен стандарт написания статей.

      Про информации о смерти и о суицидах — я просто считаю это смешным. У меня нет суицидальных мыслей.


      1. vova_sam
        24.12.2023 09:27

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

        Оба эти явления я бы не назвал "смешными". Но Ваше право воспринимать все по своему.
        Удачи Вам!

        А по теме интересно узнать, как обучающие данные обрабатываются: что там "под капотом" у модели


        1. 0a1a2a3a4a5 Автор
          24.12.2023 09:27

          У OpenAI модели не опенсорсные, не известно. Известно только то, что GPT-4 "переписывает" датасет перед запуском алгоритма для подбора весов, а что именно это за алгоритм они не говорят, поскольку они разработали свою альтернативу для backpropagation