RECGym は推薦設定での強化学習シミュレーション環境です. このシミュレータは OpenAI Gym および Gymnasium のインターフェイスに従っています.RECGymは,UserModel
(user_preference_dynamics
やreward_function
を実装) といった内部モジュールをカスタマイズできるように設計されています.
RECGymは scope-rl リポジトリの下で公開されており,オフライン強化学習の実装を試す環境として容易に使えます.
推薦システムにおける累積報酬を最大化の問題を(部分観測)マルコフ決定過程((PO)MDP)として定式化します.
状態
:- ユーザーの持つ特徴ベクトルで,エージェントが提示する行動に応じて時間と共に変化する.
- 真の状態が観測できない場合,エージェントは状態の代わりにノイズがのった観測を用いる.
行動
: どのアイテムをユーザに提示するかを表す.報酬
: ユーザーの興味の大きさを表す.0/1の二値または連続量.
RECGymでは,推薦環境の標準的な環境を提供しています.
"RECEnv-v0"
: 標準的な推薦環境.
RECGym は以下の環境で構成されています.
- RECEnv: 大枠となる環境.カスタマイズ可能な環境設定を引数に持つ.
RECGymは以下のモジュールについて設定可能です.
- UserModel: 推薦システムのユーザーモデルを定義するクラス.
上記のモジュールは abstract class に従ってカスタマイズすることができます.
BasicGymは,Pythonのpip
を使用して scope-rl の一部としてインストールすることができます.
pip install scope-rl
また,コードからインストールすることもできます.
git clone https://github.com/hakuhodo-technologies/scope-rl
cd scope-rl
python setup.py install
標準環境とカスタマイズされた環境の使用例を提供します. なお,オンライン/オフライン強化学習およびオフ方策評価の実装例は,SCOPE-RLのREADMEで紹介されています.
標準的なRECEnvは,OpenAI Gym や Gymnasiumのインターフェースに従い gym.make()
から利用可能です.
# recgymとgymをインポートする
import recgym
import gym
# (1) 標準的な環境
env = gym.make('RECEnv-v0')
基本的なインタラクションは,以下の4行のコードのみで実行できます.
obs, info = env.reset()
while not done:
action = agent.act(obs)
obs, reward, done, truncated, info = env.step(action)
ランダム方策で行うインタラクションを可視化してみましょう.
# 他のライブラリからインポートする
from scope_rl.policy import OnlineHead
from d3rlpy.algos import DiscreteRandomPolicy
# ランダムエージェントを定義する
agent = OnlineHead(
DiscreteRandomPolicy(),
name="random",
)
agent.build_with_env(env)
# (2) 基本的なインタラクション
obs, info = env.reset()
done = False
# ログ
reward_list = []
while not done:
action = agent.sample_action_online(obs)
obs, reward, done, truncated, info = env.step(action)
# ログ
reward_list.append(reward)
# 結果を可視化する
fig = plt.figure()
ax1 = fig.add_subplot(111)
ax1.plot(reward_list[:-1], label='reward', color='tab:orange')
ax1.set_xlabel('timestep')
ax1.set_ylabel('reward')
ax1.legend(loc='upper left')
plt.show()
一エピソードにおける報酬の変遷
今回の例では SCOPE-RL と d3rlpy を利用していますが,BasicGymはOpenAI Gym と Gymnasiumのインターフェースに対応している他のライブラリとも互換性があります.
次に,環境のカスタマイズの方法を説明します.
環境設定のリスト: (クリックして展開)
step_per_episode
: 一つのエピソードでの意思決定の数n_items
: 推薦システムでのアイテムの数n_users
: 推薦システムでのユーザーの数item_feature_dim
: アイテム特徴量の次元user_feature_dim
: ユーザー特徴量の次元item_feature_vector
: それぞれのアイテムの特徴量(ベクトル)user_feature_vector
: それぞれのユーザーの特徴量(ベクトル)reward_type
: 報酬のタイプreward_std
: 報酬のノイズの大きさ (reward_typeが"continuous"の場合のみ)obs_std
: 状態観測のノイズの大きさStateTransitionFunction
: 状態遷移関数UserModel
: ユーザーモデル (ユーザーの嗜好の推移と報酬関数を定義)random_state
: ランダムシード
from recgym import RECEnv
env = RECEnv(
step_per_episode=10,
n_items=100,
n_users=100,
item_feature_dim=5,
user_feature_dim=5,
reward_type="continuous", # "binary"
reward_std=0.3,
obs_std=0.3,
random_state=12345,
)
また,以下のように独自の UserModel
を定義・使用できます.
# reccgymモジュールをインポートする
from recgym import BaseUserModel
from recgym.types import Action
# その他必要なものをインポートする
from dataclasses import dataclass
from typing import Optional
import numpy as np
@dataclass
class CustomizedUserModel(BaseUserModel):
user_feature_dim: int
item_feature_dim: int
reward_type: str = "continuous" # "binary"
reward_std: float = 0.0
random_state: Optional[int] = None
def __post_init__(self):
self.random_ = check_random_state(self.random_state)
self.coef = self.random_.normal(size=(self.user_feature_dim, self.item_feature_dim))
def user_preference_dynamics(
self,
state: np.ndarray,
action: Action,
item_feature_vector: np.ndarray,
alpha: float = 1.0,
) -> np.ndarray:
coefficient = state.T @ self.coef @ item_feature_vector[action]
state = state + alpha * coefficient * item_feature_vector[action]
state = state / np.linalg.norm(state, ord=2)
return state
def reward_function(
self,
state: np.ndarray,
action: Action,
item_feature_vector: np.ndarray,
) -> float:
logit = state.T @ self.coef @ item_feature_vector[action]
reward = (
logit if self.reward_type == "continuous" else sigmoid(logit)
)
if self.reward_type == "discrete":
reward = self.random_.binominal(1, p=reward)
return reward
より多くの例は quickstart_ja/rec/rec_synthetic_customize_env_ja.ipynbを参照してください.
環境の統計量の可視化は,quickstart_ja/rec/rec_synthetic_data_collection_ja.ipynbで確認できます.
ソフトウェアを使用する場合は,以下の論文の引用をお願いします.
Haruka Kiyohara, Ren Kishimoto, Kosuke Kawakami, Ken Kobayashi, Kazuhide Nakata, Yuta Saito.
SCOPE-RL: A Python Library for Offline Reinforcement Learning and Off-Policy Evaluation
Bibtex:
@article{kiyohara2023scope,
author = {Kiyohara, Haruka and Kishimoto, Ren and Kawakami, Kosuke and Kobayashi, Ken and Nataka, Kazuhide and Saito, Yuta},
title = {SCOPE-RL: A Python Library for Offline Reinforcement Learning and Off-Policy Evaluation},
journal={arXiv preprint arXiv:2311.18206},
year = {2023},
}
SCOPE-RLへの貢献も歓迎しています! プロジェクトへの貢献方法については, CONTRIBUTING.mdを参照してください.
このプロジェクトはApache 2.0ライセンスのもとでライセンスされています - 詳細についてはLICENSEファイルをご覧ください.
- 清原 明加 (Haruka Kiyohara) (コーネル大学,Main Contributor)
- 岸本 廉 (Ren Kishimoto) (東京工業大学)
- 川上 孝介 (Kosuke Kawakami) (博報堂テクノロジーズ)
- 小林 健 (Ken Kobayashi) (東京工業大学)
- 中田 和秀 (Kazuhide Nakata) (東京工業大学)
- 齋藤 優太 (Yuta Saito) (コーネル大学)
論文やソフトウェアに関する質問がある場合は,[email protected]までお気軽にお問い合わせください.
論文 (クリックして展開)
-
Greg Brockman, Vicki Cheung, Ludwig Pettersson, Jonas Schneider, John Schulman, Jie Tang, and Wojciech Zaremba. OpenAI Gym. arXiv preprint arXiv:1606.01540, 2016.
-
Takuma Seno and Michita Imai. d3rlpy: An Offline Deep Reinforcement Library, arXiv preprint arXiv:2111.03788, 2021.
-
Sarah Dean and Jamie Morgenstern. Preference Dynamics Under Personalized Recommendations. In Proceedings of the 23rd ACM Conference on Economics and Computation, 4503-9150, 2022.