Как нейросети обучаются в контексте

Стандартный алгоритм работы с языковыми моделями такой: сначала обучаем на очень большом наборе текстов, а потом адаптируем под новые задачи, используя небольшие наборы примеров. Эти небольшие наборы примеров работают действительно хорошо, но почему это так, мы ещё не обсуждали. Предлагаю исправить сие досадное недоразумение и совместно прочитать статью «Why Can GPT Learn In-Context? Language Models Implicitly Perform Gradient Descent as Meta-Optimizers» («Почему GPT может обучаться в контексте? Языковые модели скрыто используют градиентный спуск, выступая в качестве мета-оптимизаторов»).

Я буду всё объяснять максимально понятно и подробно, но вот несколько материалов, которые вам могут быть полезны для более полного погружения:

· Моя большая и подробная лекция по основам ИИ (на youtube, на дзене);

· Короткое видео про градиентный спуск – важнейший алгоритм для обучения ИИ (youtube, дзен).

На самом деле, мы толком не знаем до конца, как происходит это обучение на небольшом наборе примеров (оно также называется «обучение в контексте», я этот термин тоже буду использовать). Я нашла несколько работ с разными вариантами объяснения, и сегодня представлю вам только одну из них – просто учтите, что это не истина в последней инстанции.

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

О чём речь

Для экспериментов авторы взяли модель GPT и задачу классификации: на вход даётся текст, и модель должна отнести его к одной из заранее подготовленных категорий.

Обучение в контексте предполагает, что мы сначала даём модели несколько примеров уже классифицированных текстов. Рассмотрим, например, классификацию отзывов на яблоки в супермаркете (все примеры мной выдуманы, все совпадения случайны). То, что мы передаём модели, могло бы выглядеть как-то так:

Отзыв: «Отличные яблоки, сочные, мне понравились!» Категория: «Положительный» Отзыв: «Покупала неделю назад, яблоки норм». Категория: «Нейтральный» Отзыв: «Продавать пожухлые, мятые яблоки по такой цене – это грабёж средь бела дня!» Категория: «Негативный». Определи категорию следующего отзыва: «Сочные яблоки, добавляли в салат и так ели, возьму ещё».

Если бы речь шла об обычном обучении на большом массиве данных, мы бы взяли очень много таких примеров (допустим, несколько тысяч), для которых уже были бы проставлены категории, и разделили их на две группы: для обучения и для тестирования. Группу для обучения передали бы как есть, с категориями, а для тестирования – без категорий. Затем сравнили бы ответы модели с правильными, посчитали, сколько раз она ошиблась и вернули бы это значение ошибки, чтобы модель скорректировала свои предсказания. Мы бы проделали эту операцию несколько раз, и модель каждый раз справлялась бы лучше.

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

Внимание – это фишка именно трансформеров, которая обеспечивает их эффективность. Авторы рассматривают внимание как линейную функцию со следующими параметрами:

· Данные о предыдущих ошибках;

· Предыдущие входные данные;

· Текущие входные данные.

Линейная функция – это функция вида k*x + b, где x – это наши входные данные, а k и b – коэффициенты.

В обычном обучении с большим массивом данных каждый предыдущий вход x’ умножается на ошибку, которую модель сделала, создавая для него ответ. Полученные результаты собираются в одну большую матрицу ∆W. Воспринимайте её как «матрицу недавнего прошлого опыта»: вот мы получили x’, что-то ответили и должны были так-то скорректировать этот ответ.

Затем мы берём новый x и умножаем на матрицу недавнего опыта, чтобы прошлые ошибки были учтены – но этого пока недостаточно.

Воспользуемся тем, что модель была предобучена – то есть, до обучения на классификацию её обучали в целом работать с текстом на Очень Большом массиве данных – и добавим к матрице полученного опыта весь опыт предыдущего обучения W0.

Получается (W0 + ∆W)*x. Коэффициент b здесь равен нулю, это нормально. Коэффициент k на месте и состоит из опыта.

Скажем, вы научились водить машину и имеете некоторый опыт вождения. Вы знаете, как тронуться с места, переключать скорости, когда куда поворачивать и всё такое: это ваша матрица W0. Вы берёте машину в аренду, и вам нужно к ней немного адаптироваться: найти, где у неё нужные кнопки и рычаги, понять, как быстро она разгоняется – это ∆W. И то, и другое важно.

Так, с этим разобрались. При обучении в контексте весь жизненный опыт W0 у нас есть, потому что модель заранее предобучали. Роль недавнего опыта ∆W играют примеры, которые мы только что сообщили. Одна загвоздка только: нам же ошибка нужна, а её в примерах нет.

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

Возвращаясь к аналогии с вождением: во время обучения у вас был инструктор, который говорил «поворачивай руль раньше» или «плавнее отпускай сцепление» – и вы корректировали свои действия. Когда вы сели за руль незнакомой машины, никто вас не поправляет, но вы знаете, как машина должна себя вести, если вы стартанули слишком резко или недокрутили руль. Вы наблюдаете поведение новой машины и думаете: «Ага, она быстро реагирует, нужно аккуратнее выжимать педаль газа,» – это как раз ваши псевдоошибки.

Заключение

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

Они работали только с классификацией и со сравнительно небольшими моделями в силу технических ограничений, так что их выводы ещё предстоит протестировать и проверить другим исследователям.

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

Если вам такое нравится, заходите ко мне в телеграм, я там пишу про разные статьи и немного про собственные исследования и ещё совсем чуть-чуть про разные собственные мысли.

Начать дискуссию