Повторенье - мать ученья. Или почему DPO, а не reward+ppo.
Крч, на днях, дядя обнаружил, что запамятовал суть DPO, да и наркоз стал отпускать. Самое время пойти на архив в
папир.
Знаете, PPO в RLHF - это как подростковый секс, все о нем говорят, что завели и все круто летит, но мало кто знает и умеет.
Так вот - DPO, шкет, это твое
спасение на пути в RLHF. Оказывается от этих 4ех буков, останется ток две последние, и то
из human feedback оно превращается в preferences tuning без всякого RL.
Как это происходит?
Давай вспомним, как заводят
первый роман PPO:
1. Сначало собирают предпочтения кожаных мешков на генерациях с LLM.
2. Далее размечают попарно какие генерации лучше какие хуже для одной и той же затравки.
3. Потом учат reward модельку этому ранжированию, те проксируют предпочтения человеков, через модельку.
Для этого, важно,
юзают loss = -E{log(sigmoid[ rank(yi/x) -rank(yj/x)]))} , yi - предпочитаемая yj-му генерация для каждого промпта из x.
И вот тут - стоп. Далее не пойдем. Там будет после обучения процедура PPO, а ты еще молодой, у тебя вся жизнь впереди, не надо оно тебе
Там эта модель награды используется для получения оценок генерации, мы максимизируем мат ожидание оценок на батче и прочий нестабильный изврат.
Вот тут на сцену выйдет DPO. Челики авторы умные сели подумали, а зачем нам эти прокси модельки награды, нестабильный РРО. Когда можно сразу в этап файнтюна закинуть предпочтения как +1ый шаг и главное дифференцируемое е2е.
Следим за руками, объясняю на пальцах: вот у нас есть P(x)-вероятность следующего токена порождаемое моделью LLM при промпте Х. И мы хотим, чтобы при генерации у нас было максимальное правдопобие P(yi/x). Те мы хотим, чтобы вероятнее был токен Yi, чем Yj. Значит, мы просто хотим напрямую от модели выполнить адаптацию к нашим предпочтениям. А как это можно сделать без этих наград и тп, но с оглядкой на хинты PPO и reward?
Да просто, давайте, возьмём
loss такой, что он
будет давать предпочтение распределению вероятостей над Yi по отношению к Yj. Как это сделать? Да также как с рангами оценки в reward.
Так мы получим loss=-E log(sigmoid[P(yi/x) - P(yj/x)]), но нам чет не хватает. В процедуре РРО для RLHF еще была важная фича. Это регуляризация на reference модель, т.е. на поведение предка (LLM на предыдущем шаге обучения). И выглядело это как вот такая компонента в лоссе: lambda*KLD(P/Pref). Ну один момент, давайте тоже красиво это вставим в промежуточный лосс DPO:
Loss=-E log(sigm[Betta*log(Pi/Pi-ref)-Betta*log(Pj/Pj-ref)]), где Pi, j-ref это это вероятности токенов i,j для референсной модели при промпте X.
Всë, мы получили искомый DPO лось, с штрафом/оглядкой на поведение референс модели и даже коэфициентик переняли. Зачем нам это? Для того, чтобы наследовать поведение модели предка в некоторой доле по связности изложения, знаниям и тп. Почему для обеих компонент лосса, так это ж оценка на одной и тойже модели, значит и штраф в обоих случаях.
Конечно, это пояснение на пальцах, в статье есть целая выкладка в аппендиксе, которая доказывает, что такая функция ошибок действительно является дифференцируемой аппроксимацией над предпочтениями и вообще эквивалентна тому же что и в PPO+reward. Но это вы уже сами почитаете.