Модуль 15. RL там, где есть цена ошибки¶
Чему вы научитесь в этом модуле
- Записывать задачу управления запасами как MDP и называть две стоимости, между которыми идёт компромисс.
- Находить оптимальный уровень запаса с помощью классической формулы newsvendor и объяснять, откуда в ней квантиль.
- Определять, когда классический метод исследования операций уже оптимален, а когда обучение окупается.
- Сравнивать обученную политику с настроенной классической базой честно и признавать случай, где база не хуже.
- Объяснять, почему в прикладном RL цена ошибки повышает планку проверки, а не понижает.
Время: около двух недель. Пререквизиты: модуль 14 и модуль 1.
Ноутбук: открыть в Colab · notebooks/15-rl-with-a-cost.ipynb
Зачем нужен этот модуль¶
Игровые среды прощают ошибку: проиграл партию — начал заново. Прикладные среды не прощают. Заказали слишком много товара — платите за хранение; слишком мало — теряете продажи и клиентов. Каждое действие имеет цену в деньгах, и это меняет дисциплину: планка проверки поднимается, а не опускается.
И именно здесь RL встречается с областью, которая решала эти задачи за полвека до него, — исследованием операций (operations research). У этой области есть готовые ответы: для управления запасами, очередей, составления расписаний. Часто эти ответы уже оптимальны, и тогда обученная политика в лучшем случае их воспроизводит, а в худшем — проигрывает. Признать это — часть той же интеллектуальной честности, которой посвящён весь курс.
Задача о запасах¶
Каждый период вы заказываете товар, не зная будущего спроса. Затем приходит спрос — случайный. Дальше возможен один из двух исходов:
Излишек. Заказали больше, чем было куплено. Остаток лежит на складе — вы платите за хранение.
Нехватка. Заказали меньше, чем потребовалось. Часть спроса осталась неудовлетворённой. Вы теряете продажу, а иногда и клиента — вы платите за дефицит.
Как правило, дефицит обходится дороже хранения: потерянный клиент стоит больше, чем лишняя коробка на полке. Задача — выбрать уровень запаса \(S\), до которого пополнять склад каждый период, таким образом, чтобы суммарная стоимость была наименьшей. Это компромисс: поднимаете \(S\) — меньше дефицита, но больше затрат на хранение; опускаете — наоборот.
Классический ответ: newsvendor¶
У этой задачи существует точное решение, и оно значительно старше любого нейросетевого метода. Оптимальный уровень запаса — это квантиль распределения спроса:
где \(F\) — функция распределения спроса. Прочитайте словами: покрывайте спрос ровно до той доли, в которой стоимость дефицита перевешивает стоимость хранения. Если дефицит втрое дороже хранения — покрывайте спрос на \(3/4\), то есть держите уровень на 75-м процентиле распределения. Никакого обучения: одна формула, при условии что распределение спроса известно.
Двигайте \(S\) и ищите минимум суммарной стоимости — это база newsvendor, найденная вручную. При стабильном спросе минимум чёткий и единственный: классике здесь обучение не требуется. Теперь нажмите «спрос: дрейфует». Спрос начинает ползти вверх со временем, и никакой фиксированный \(S\) уже не является хорошим решением: низкий уровень создаёт дефицит в конце, высокий — затраты на хранение в начале. Вот трещина, в которую входит RL.
Когда обучение окупается¶
Формула newsvendor оптимальна при одном условии: спрос стационарен и его распределение известно. Как только это условие нарушается, формула теряет оптимальность, и появляется пространство для обучения.
Нестационарность. Спрос дрейфует, подвержен сезонности, реагирует на цену. Фиксированный уровень запаса отстаёт от реальности; политика, зависящая от состояния (недавний спрос, день недели, текущая цена), — нет.
Связанные решения. Несколько складов, доставка с задержкой, скидки за объём, ограничения по бюджету. Классические формулы существуют не для всех комбинаций условий; RL способен оптимизировать все эти факторы совместно.
Неизвестное распределение. Функция \(F\) не задана, а спрос наблюдается только по факту. Обучение работает с наблюдёнными образцами, формула — нет.
Где обучение не окупается: стационарный спрос, известное распределение, одна товарная позиция. Там newsvendor уже оптимален, и обученная политика в лучшем случае к нему сходится, затратив на это тысячи прогонов вместо одной формулы.
Честное сравнение¶
Отсюда следует правило, ради которого написан весь курс, — и в прикладном RL оно действует строже, чем в игровом.
Базой для обученной политики должна быть настроенная классика, а не наивная. Сравнивать RL с политикой «всегда заказывать 10» — это самообман: побить плохую базу легко и бессмысленно. Честная база — это newsvendor с оптимальным \(S\), найденным перебором, или адаптивная base-stock стратегия, отслеживающая спрос. Это ровно та асимметрия усилий из модуля 1: свой метод настраивают неделю, а чужую базу берут из коробки без настройки.
И вывод сравнения читается по правилу перекрытия интервалов. Обученная политика показала прибыль выше — сравните межквартильные средние по многим зёрнам с бутстрэп-интервалами. Перекрываются — улучшение не продемонстрировано, как бы ни хотелось объявить победу обучения над «устаревшей» классикой.
Заявление, которое вы уже проверяли. В модуле 1 вы своими руками проверяли утверждение из decisionrl: на нестационарном спросе обученная политика даёт прибыль 274.0 против 240.7 у лучшей фиксированной base-stock стратегии. Ключевое слово — «лучшей»: база там не наивная, а найденная перебором, оптимальная в своём классе. Здесь вы понимаете, почему это является честным сравнением, а не подыгрыванием.
Практическая часть¶
Часть 1. Работа с ноутбуком¶
Откройте notebooks/15-rl-with-a-cost.ipynb. Только numpy и matplotlib, вычисления занимают секунды.
Что содержится внутри:
- Среда управления запасами как MDP: хранение, дефицит, стоимость за период. Двадцать строк кода.
- База newsvendor: перебор значений \(S\), U-образная кривая стоимости, сверка найденного минимума с формулой-квантилем.
- Нестационарный спрос: фиксированный \(S\) против адаптивного, отслеживающего недавний спрос. Разрыв выражается в деньгах.
- Простая обученная политика против настроенной базы: честное сравнение через IQM и бутстрэп из модуля 1. На стационарном спросе база не побеждается; на дрейфующем — обучение выигрывает.
Часть 2. Собственная задача с ценой ошибки¶
Возьмите задачу из своей работы, где ошибка стоит денег: запасы, расписание, мощность сервера, закупки.
- Запишите её как MDP: состояние, действие, две стоимости ошибки в обе стороны.
- Найдите классическую базу. Существует ли для неё готовая формула из исследования операций?
- Стационарна ли задача? Если да — обучение, скорее всего, лишнее, и это честный вывод.
- Если нестационарна — что должно входить в состояние, чтобы политика могла адаптироваться?
Задание¶
- Выведите формулу newsvendor из условия баланса предельных стоимостей: последняя единица запаса окупается, пока ожидаемая экономия на дефиците не сравняется с ценой хранения.
- Реализуйте среду управления запасами и постройте U-образную кривую стоимости как функцию \(S\). Совпадает ли минимум с квантилем?
- Сделайте спрос нестационарным и покажите, что лучший фиксированный \(S\) проигрывает адаптивному. Разницу выразите в деньгах.
- Сравните обученную политику с настроенной базой на стационарном и на нестационарном спросе. Два вывода в формате модуля 1.
- Постройте случай, в котором обучение проигрывает базе, и объясните, почему это правильный результат, а не провал.
Проверка усвоения¶
- Какие две стоимости уравновешивает уровень запаса?
- Откуда в формуле newsvendor берётся квантиль и почему именно \(c_{\text{деф}}/(c_{\text{деф}}+c_{\text{хран}})\)?
- При каком условии newsvendor оптимален и обучение не нужно?
- Что нарушает оптимальность классики и открывает место для RL?
- Почему сравнивать обученную политику с наивной базой — это самообман?
- Обученная политика показала прибыль выше базы на одном прогоне. Что вы проверите, прежде чем этому поверить?
- Почему цена ошибки повышает планку проверки, а не понижает?
Что дальше¶
В модуле 16 — что происходит, когда награда задана не та, которую имели в виду: reward hacking, закон Гудхарта, обучение на обратной связи от человека. Здесь награда была честной (деньги), и оптимизировать её было безопасно. Дальше награда станет приблизительной, и её оптимизация начнёт приносить не то, что хотели.
Прикладной RL не отменяет исследование операций, а конкурирует с ним. Иногда обучение выигрывает, иногда классика уже оптимальна — и признать второе так же важно, как заявить первое.
Принцип
Побить наивную базу легко и бессмысленно. Единственное сравнение, которое что-то значит, — с классикой, настроенной так же старательно, как собственная политика.