Я пытаюсь создать агента RL для определения цены, уплаченной за места в авиакомпании (а не за билет). Общая установка:
Я еще не определился с общей архитектурой. Я хочу принять во внимание различную информацию о бронировании и рейсах, поэтому я знаю, что буду использовать аппроксимацию функций (скорее всего, нейронную сеть) для обобщения по пространству состояний.
Однако я не совсем понимаю, как настроить пространство для действий. Я предполагаю, что действие будет представлять собой вектор с ценой для каждого типа места. Если у меня, например, 8 разных типов сидений и 10 разных цен на каждое, это дает мне в общей сложности 10 ^ 8 различных действий, многие из которых будут очень похожи. Кроме того, каждое дополнительное действие (установление цены на один тип места) в некоторой степени зависит от других в том смысле, что цена одного типа места, вероятно, повлияет на спрос (и, следовательно, вознаграждение) на другой. Следовательно, я сомневаюсь, что проблему можно разложить на набор подзадач.
Мне интересно, проводились ли исследования по решению такой проблемы. Очевидно, что любой агент, который я создаю, нуждается в некотором способе обобщения действий до некоторой степени, поскольку сбор реальных данных о миллионах действий невозможен даже для одного состояния.
На мой взгляд, это сводится к двум вопросам:
Мне не удалось найти никакой литературы по этому поводу, особенно по второму вопросу - любая помощь будет очень признательна!
Хорошо, я не был уверен в разнице, но я проверил сайт, и он кажется более подходящим, поэтому я повторно разместил там. Спасибо за внимание.
Поправьте меня, если я ошибаюсь, но я предполагаю, что это именно то, о чем вы спрашиваете, и отвечу соответствующим образом.
Я создаю RL, и он должен быть достаточно умным, чтобы понимать, что если я куплю один авиабилет, это впоследствии повлияет на цену других авиабилетов, потому что сейчас их меньше.
Кроме того, агент RL должен понимать, что действия, очень близкие друг к другу, являются относительно похожими действиями, например, [10, 12, 20] ≈ [10, 13, 20]
1) Чтобы предоставить память вашему RL-агенту, вы можете сделать это двумя способами. Самый простой способ - передать состояния в виде вектора прошлых купленных билетов, а также текущего билета.
Пример: Допустим, мы создаем RL, чтобы запомнить как минимум 3 последние транзакции. В самом начале наш вектор состояния будет [0, 0, 3], что означает, что ранее не было покупок билетов (нулей), а в настоящее время мы покупаем билет № 3. Тогда вектор состояния следующего временного шага может быть [0, 3, 6], сообщая агенту RL, что ранее был выбран билет № 3, а теперь мы покупаем билет № 6. Нейронная сеть узнает, что вектор состояния [0, 0, 6] должен отображаться на другой результат по сравнению с [0, 3, 6], потому что в первом случае билет № 6 был первым купленным билетом, и было много поставки. Но во втором случае билет 3 уже был продан, поэтому теперь все оставшиеся билеты подорожали.
Правильный и более сложный способ - использовать рекуррентную нейронную сеть в качестве аппроксиматора функций для вашего RL-агента. Архитектура рекуррентной нейронной сети позволяет нейронной сети запоминать определенные «важные» состояния. В вашем случае важно количество билетов, купленных ранее, поэтому нейронная сеть запомнит ранее купленные билеты и соответственно рассчитает результат.
2) Любой алгоритм обучения с подкреплением аппроксимации функции автоматически обобщает наборы действий, близкие друг к другу. Единственные архитектуры RL, которые этого не делают, - это подходы на основе таблиц.
Причина в следующем:
Мы можем рассматривать эти аппроксиматоры функций просто как линию. Нейронные сети просто строят очень нелинейную непрерывную линию (нейронные сети обучаются с использованием обратного распространения и градиентного спуска, поэтому они должны быть непрерывными), а набор состояний будет отображаться в уникальный набор выходных данных. Поскольку это линия, наборы состояний, которые очень похожи, ДОЛЖНЫ отображаться на выходы, которые также очень близки. В простейшем случае представьте, что y = 2x. Если наш вход x = 1, наш y = 2. И если наш вход x равен 1,1, что очень близко к 1, наш выход y = 2,2, что очень близко к 2, потому что они находятся на непрерывной линии.
Для табличного подхода есть просто матрица. По оси Y у вас есть состояния, а по оси X - действия. В этом подходе состояния и действия дискретны. В зависимости от дискретизации разница может быть огромной, и если система плохо дискретизирована, действия, очень близкие друг к другу, МОГУТ не быть обобщены.
Надеюсь, это поможет, дайте мне знать, если что-то неясно.
Привет, Руи, спасибо за ответ. Я думаю, что вы, возможно, неправильно поняли часть вопроса. Я говорил о дополнительном сервисе, в котором вы платите за выбор места после покупки билета на рейс. Я разместил на AI stackexchange слегка обновленный вопрос, чтобы прояснить это (ai.stackexchange.com/questions/7524/…).
Что касается вашего первого пункта, у меня будет доступ к инвентарной информации, так что я думаю, что это должно позаботиться об этой стороне вещей. Ваше объяснение второго пункта очень ясное, так что спасибо. Однако я все еще немного не уверен, как это может работать на практике, когда у меня огромное пространство для действий (из-за большого количества комбинаций цен). Например, с DQN у меня нет возможности иметь 10 ^ 8 выходных узлов для каждой комбинации ценового набора. Любые идеи, которые у вас есть, были бы очень признательны - в таком случае, возможно, было бы разумнее ответить на мой повторный пост, который я дал выше.
Думаю, этот вопрос может больше подойти к ai.stackexchange.com (или, возможно, stats.stackexchange.com), а не к этому сайту. Этот сайт предназначен для вопросов, касающихся непосредственно программирования / реализации.