Написать пост

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

Аватарка пользователя Паша Темирчев

Рассказал, как из простой языковой модели сделать полезного ассистента, соблюдающего законы робототехники.

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

Большие языковые модели — настоящий прорыв в машинном обучении. Они отличаются умом и сообразительностью, не требуя при этом дорогостоящих специализированных датасетов. Однако для того, чтобы стать продуктом, а не просто забавной игрушкой, языковую модель зачастую требуется «довести до ума».

Меня зовут Павел Темирчев, я работаю в Яндексе в так называемой «группе поиска смысла», а также преподаю в Школе анализа данных. Сегодня я расскажу, как из простой языковой модели сделать полезного ассистента, соблюдающего законы робототехники.

Что вообще такое языковая модель? Это некий чёрный ящик, в который засовываешь кусок текста, а в обмен он даёт большую кучу чисел. Эти числа — вероятности того, что введённый кусок текста может быть продолжен тем или иным токеном (грубо говоря, словом). Самое большое число в куче даёт самое вероятное продолжение текста.

Звучит неплохо, но здесь возникает несколько проблем. Во-первых, языковые модели применяются в каких-то пользовательских сценариях, например, в режиме ассистента — им задают вопрос и ожидают ответ. Соответственно, если в чёрный ящик закинули текст «Как пропатчить KDE2 под FreeBSD?», в ответ не нужно высокохудожественное продолжение в духе «Геннадий всё утро терзался этой мыслью, но ближе к обеду отчаялся и ушёл двачевать капчу». Нужно что-то хотя бы похожее на инструкцию.

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

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

Как учить учёного

Чтобы стать по-настоящему полезными, языковые модели специальным образом дообучаются. На профессиональном сленге ML-щиков это называется alignment, а модель, не прошедшая алайнмент, зовётся предобученной, или pretrain-моделью. Грубо говоря, pretrain-модель — это школьник, научившийся читать, писать и считать, а alignment — это колледж, где школьнику дают уже конкретную профессию.

Каким образом можно дообучить pretrain-модель? Например, скормить ей датасет с пользовательскими вопросами и правильными ответами на них. Это называется «дообучение с учителем» (supervised fine-tuning, SFT). И в принципе это хорошая идея, и по факту все так и делают, но есть нюансы. Во-первых, такой датасет надо ещё откуда-то достать — это не корпус условно-бесплатных текстов со всея интернета Во-вторых, при небольшом объёме датасета велик риск переобучения — модель научится повторять ответы из обучающей выборки, а не генерировать собственные. Сегодня мы поговорим о том, с какой стороны лучше всего обойти эти грабли.

Что такое хорошо

Начать стоит с целеполагания. Какую модель мы считаем «хорошей»? Она не должна галлюцинировать и выдавать неверную информацию. Более того, её информация должна быть не просто верной, а релевантной для пользователя. И наконец, модель не должна выдавать какие-то опасные и незаконные вещи, вроде рецептов взрывчатых веществ. Этот список критериев называют «правилом трёх эйч»: идеальный ассистент должен быть честным (honest), безопасным (harmless) и полезным (helpful).

Как обычно, есть проблема: критерии HHH трудно до конца формализовать, а оценку по ним — автоматизировать. Поэтому для того, чтобы оценивать ответы модели, нанимаются специальные люди, которые называются асессоры. Асессоры снабжаются подробными инструкциями, как сравнивать ответы с точки зрения честности, безопасности и полезности. Дальше происходит следующее: асессору даётся пара ответов от разных моделей, он должен выбрать из них лучший по критериям HHH, и это повторяется до тех пор, пока не будет собрано достаточное количество данных. Этот процесс называется асессорской разметкой. Он позволяет делать заявления типа «Модель 1 лучше модели 2 в 60% случаев». На самом деле он позволяет намного большее, но об этом ниже.

Человеческий фактор

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

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

Есть и более очевидные вещи, такие как усталость и «замыливание взгляда». Когда асессор работает долго, он может потерять концентрацию внимания, и точность его разметки снизится. А может, он и в принципе не старался? Чтобы детектить такие вещи, используют «ханипоты» (honeypots). К некоторым вопросам пишутся эталонно правильные ответы силами доверенных экспертов. Если асессор не выбрал такой ответ как правильный — значит, качество его разметки вызывает большие сомнения. И нужно, во-первых, задуматься, доверять ли его предыдущим ответам, а во-вторых, дать ему какую-то обратную связь, чтобы он был внимательнее.

А ещё иногда случается странное, но человек не виноват. Например, по результатам асессорской разметки может получиться, что модель 1 лучше модели 2, модель 2 лучше модели 3, но модель 3 лучше модели 1! Возникает искушение отправить такие результаты в мусорку, однако проблема не в них, а в парадоксе Кондорсе. В общем случае выбор не обладает свойством транзитивности, поэтому если хочешь сравнить две конкретные модели, нужно сравнивать их напрямую, а не через «посредников».

Вкалывают роботы

Асессорская разметка — это долго и дорого. Человекам нужно платить деньги, и на обработку каждой пары вопросов у них уходят не микро- и не милли-, а просто секунды. Однако без человеческой экспертизы оценить ответ по критериям HHH нельзя. Что же делать? Нужно позаимствовать у человека экспертизу.

Имея результаты асессорской разметки, можно использовать их как датасет и обучить на них ещё одну модель, которая называется «модель награды» и будет оценивать результаты работы исходной языковой модели. Этот процесс называется дистилляцией.

Модель награды похожа по архитектуре на обычную языковую модель. Ей скармливают текст ответа, но вместо большой кучи чисел (вероятностей следующих токенов) она выдаёт одно — условную «крутость» ответа. Её обучают на данных асессорской разметки, пока её представления о крутости не приблизятся к представлениям асессоров. Но как формализовать разницу между представлениями? На помощь приходит теория вероятностей.

Распределение вероятностей — это в каком-то смысле картина мира. Любые представления о мире можно описать в терминах вероятностей. Вы знаете, что динозавры вымерли, а мужчин примерно столько же, сколько женщин — поэтому если вы встретите кого-то на улице, с вероятностью 50% это мужчина, 50% женщина и 0% — динозавр.

Как создателей ML-ассистента нас интересует вероятность, с которой ответ A лучше ответа B. Данные асессорской разметки содержат такие вероятности: если в паре ответ А отмечен правильным, а ответ B нет — значит, ответ A лучше ответа B с вероятностью 100%.

Для модели награды мы тоже можем вывести такие вероятности. Обычно это делается с помощью модели Брэдли-Терри. Берём крутость ответа A, вычитаем из неё крутость ответа В. Правда, вероятность — это число от 0 до 1, а крутость может варьироваться в более широком диапазоне. Поэтому мы к нашей разности применяем сигмоиду — функцию, которая любое число «загоняет» в диапазон от нуля до единицы, сохраняя монотонность. Результат и будет вероятностью с точки зрения модели награды.

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

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

Помощник учителя

У полученной в результате дистилляции модели награды есть множество применений. Очевидно, её можно использовать просто как замену живым асессорам, но это неинтересный случай. Благодаря тому, что она отрабатывает намного быстрее «живой» асессорской разметки, её можно использовать и во многих других сценариях.

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

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

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

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

LLM — друг человека

Как мы уже выяснили, модель награды может ассистировать в дообучении с учителем. Но можно сделать ещё интереснее и организовать для SFT-модели «вторую вышку». А именно — использовать обучение с подкреплением.

Обучение с подкреплением — это когда мы знаем, чего хотим, но не можем (или не хотим) объяснить, как это делается. Допустим, вы дрессируете собаку. Вы говорите: «Сидеть». Собака не понимает, что вы говорите, но она совершает какое-то действие из своих собачьих соображений. Может быть, лает, может быть, бегает, или — совершенно случайно — садится. Ваша задача как дрессировщика — в случае, если собака села, поощрить её вкусняшкой. Таким образом постепенно у неё сформируется ассоциативная связь между словом «сидеть» и действием, которое от неё ожидается.

Если более формально, обучение с подкреплением — это про взаимодействие модели со средой. Модель «наблюдает» среду, т.е. получает в качестве входных данных какое-то состояние. Модель совершает «действие», то есть возвращает какие-то данные в ответ. После этого модель получает «награду» — числовую оценку того, насколько успешным было её действие. Потом модель опять наблюдает среду (состояние которой, вообще говоря, после предыдущего действия могло измениться), и так далее, и так далее. Собака смотрит на хозяина, собака совершает действие, собака получает или не получает вкусняшку, goto 1.

Чтобы это не стало порочным кругом, нужно добавить самое главное — обучение. На каждой итерации процесса у собаки формируются нейронные связи, у ML-модели — пересчитываются весовые коэффициенты. И та, и другая стремится максимизировать свою награду. И если мы всё сделали правильно, в итоге получается очень толстый пёс, идеально выполняющий команду «сидеть».

Назло термодинамике

Существует несколько методов обучения с подкреплением для языковых моделей. Самый простой из них — это кросс-энтропийный метод. Это вообще достаточно общий метод оптимизации, применимый не только к машинному обучению. Суть его такова: допустим, есть какая-то функция, и мы хотим найти, в какой точке она достигает наибольшего значения. Пусть у нас есть некий чёрный ящик, генерирующий случайные точки. Накидаем N точек, затем выберем k из них, в которых значение функции самое большое. А затем так покрутим ручки на чёрном ящике, чтобы он генерировал точки, похожие на k наилучших, а не на все N. Повторим эту последовательность действий много раз — и чёрный ящик научится генерировать точки в районе максимума функции.

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

Но какое отношение все эти точки и функции имеют к языковым моделям? Очень простое. На каждом шаге обучения модели задаётся вопрос, и она генерирует на него N ответов. Эти ответы ранжируются с помощью модели награды и выбирается k лучших. Затем параметры языковой модели меняются так, чтобы эти k лучших стали наиболее вероятными, с помощью минимизации кросс-энтропии.

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

Исследовательский инстинкт

У метода обучения с подкреплением есть проблема — он любит находить локальные оптимумы и вырождаться. Объясню опять на собаках. Допустим, после команды «апорт» ваш пёс стал вилять хвостом и забавно скосил глаза. Не совсем то, чего вы хотели, но всё равно заслуживает награды, потому что мило. Вы даёте псу половину вкусняшки. Через несколько повторений пёс решает, что именно это и значит “апорт”. Если бы он продолжал в ответ на команду делать разные случайные вещи, он скоро обнаружил бы способ получить вкусняшку целиком. Но пёс уже попал в ловушку локального оптимума, ему суждено остаться недокормленным, а вам — неудовлетворёнными.

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

Шашечки или ехать

Существует так называемый закон Гудхарта. У него много формулировок, но мне больше всего нравится современно-корпоративная:«Дай людям KPI, и они найдут способ вместо работы производить KPI». В случае ML это означает — если использовать какую-то метрику для обучения, то она перестаёт иметь смысл как метрика, и для контроля качества нужно использовать что-то другое.

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

Но дело не только в модели награды. Существует более общая проблема под названием «доменный сдвиг». Суть её в том, что при обучении модель адаптируется к особенностям обучающей выборки, включая, возможно, какие-то статистические аномалии, уникальные именно для неё. Если данные в дикой природе такими особенностями не обладают, модель может работать на них хуже. Возвращаясь к собакам: если пёс привык к голосу тренера, он может отказаться воспринимать команду хозяина. Не из строптивости, просто из-за непонимания, что команда другим голосом — та же самая команда.

Как бороться с доменным сдвигом в случае дообучения с подкреплением? Один из методов — не давать дообученной модели уходить слишком далеко от исходной. А именно — считать расстояние Кульбака—Лейблера между новым распределением вероятностей и исходным, и с каким-то коэффициентом вычитать его из функции награды.

Другой метод — не давать адаптироваться к одной конкретной модели награды. Можно постоянно дообучать модель награды на новых данных асессорской разметки (правда, для этого нужны новые данные асессорской разметки). Или можно обучить сразу целое семейство моделей награды (например, с разными гиперпараметрами), и если ассистент будет получать сильно различные оценки у разных моделей семейства — это будет сигнализировать о доменном сдвиге.

Вместо заключения

Разумеется, в одну короткую статью всё интересное не уместить. О машинном обучении можно говорить бесконечно, и именно это я и стараюсь делать.

Статья написана по мотивам моей лекции на интенсиве GPT Week от ШАД. Записи интенсива можно посмотреть здесь.

Моя специальность — обучение с подкреплением. Если хотите копнуть глубже в эту область, то есть отдельный курс по RL, который я преподаю. Его материалы лежат в свободном доступе на гитхабе.

Следите за новыми постами
Следите за новыми постами по любимым темам
367 открытий1К показов