Last active
July 4, 2025 03:25
-
-
Save kn1kn1/cfbc71eedb1ba16a92a9eab88379b9f3 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| { | |
| "cells": [ | |
| { | |
| "cell_type": "markdown", | |
| "metadata": { | |
| "id": "view-in-github", | |
| "colab_type": "text" | |
| }, | |
| "source": [ | |
| "<a href=\"https://colab.research.google.com/gist/kn1kn1/cfbc71eedb1ba16a92a9eab88379b9f3/basic_synthetic_continuous_basic_ja.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": { | |
| "id": "Rkn_2ZmhPLvJ" | |
| }, | |
| "source": [ | |
| "# Quickstart: オフライン強化学習とオフ方策評価 (連続行動空間)\n", | |
| "\n", | |
| "このノートブックでは,簡単な人工データセット上でのオフ方策学習(OPE)とオフライン強化学習(Offline RL)の実行例を紹介します.\n", | |
| "\n", | |
| "特に、以下の5つの順番で解説していきます:\n", | |
| "\n", | |
| "0. (シミュレーション環境の設定とオンライン強化学習)\n", | |
| "1. 人工データの生成\n", | |
| "2. オフライン強化学習\n", | |
| "3. オフ方策評価とオフライン強化学習手法の評価\n", | |
| "4. オフ方策評価手法の評価\n", | |
| "\n", | |
| "このライブラリは,オンラインとオフラインの方策学習およびモデルベースのオフ方策評価の一部で [d3rlpy](https://github.com/takuseno/d3rlpy)のアルゴリズムを利用しています.\n", | |
| "また、実装のワークフローは[Open Bandit Pipeline](https://github.com/st-tech/zr-obp)を参考にしています." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "!pip install numpy==1.26.4" | |
| ], | |
| "metadata": { | |
| "id": "5vI3yK45PNrV" | |
| }, | |
| "execution_count": null, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "!pip install scope-rl==0.2.1" | |
| ], | |
| "metadata": { | |
| "id": "FoMPmR3PPQsP" | |
| }, | |
| "execution_count": null, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": { | |
| "id": "CBY7cMq_PLvM" | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "# SCOPE-RL モジュールのインポート\n", | |
| "import scope_rl\n", | |
| "from basicgym import BasicEnv\n", | |
| "from scope_rl.dataset import SyntheticDataset\n", | |
| "from scope_rl.policy import OnlineHead, TruncatedGaussianHead\n", | |
| "from scope_rl.ope.online import (\n", | |
| " calc_on_policy_policy_value,\n", | |
| " visualize_on_policy_policy_value,\n", | |
| ")\n", | |
| "\n", | |
| "# d3rlpy アルゴリズムのインポート\n", | |
| "from d3rlpy.algos import DiscreteRandomPolicyConfig\n", | |
| "from d3rlpy.algos import RandomPolicyConfig as ContinuousRandomPolicyConfig\n", | |
| "from d3rlpy.preprocessing import MinMaxObservationScaler, MinMaxActionScaler\n", | |
| "\n", | |
| "# その他のライブラリのインポート\n", | |
| "import gym\n", | |
| "import torch" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": { | |
| "id": "RiAUjzXNPLvN" | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "import pickle\n", | |
| "from glob import glob\n", | |
| "from tqdm import tqdm\n", | |
| "\n", | |
| "import numpy as np\n", | |
| "import pandas as pd\n", | |
| "\n", | |
| "import matplotlib.pyplot as plt\n", | |
| "import seaborn as sns\n", | |
| "\n", | |
| "%matplotlib inline" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": { | |
| "id": "PA9APYr7PLvO", | |
| "outputId": "57cceb2e-91a0-46f1-a7da-4a0f6c5c36af" | |
| }, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "0.1.2\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "# バージョン\n", | |
| "print(scope_rl.__version__)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": { | |
| "id": "fGyLXwjXPLvO" | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "# random stateの設定\n", | |
| "random_state = 12345" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": { | |
| "id": "03tvlTYiPLvP" | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "device = \"cuda:0\" if torch.cuda.is_available() else \"cpu\"" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": { | |
| "id": "_WgP0YRMPLvP" | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "# logディレクトリ\n", | |
| "from pathlib import Path\n", | |
| "Path(\"logs/\").mkdir(exist_ok=True)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": { | |
| "id": "3M1g11HOPLvP" | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "# warnings\n", | |
| "import warnings\n", | |
| "warnings.simplefilter('ignore')" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": { | |
| "id": "1Ku02_W0PLvQ" | |
| }, | |
| "source": [ | |
| "\n", | |
| "## 0. (シミュレーション環境の設定とオンライン強化学習)\n", | |
| "まず初めに,今回用いる簡単な環境設定について紹介します.\n", | |
| "\n", | |
| "#### 強化学習での環境のセットアップ\n", | |
| "今回は簡単なシミュレーション環境上で,方策の獲得する累積報酬を最大化する問題を考えます.\n", | |
| "\n", | |
| "この強化学習の問題を(部分観測)マルコフ決定過程((PO)MDP)として定式化します.\n", | |
| "- `状態`: 状態観測(POMDPの場合は観測ノイズが発生).\n", | |
| "- `行動`: 強化学習エージェント (方策) により選択された行動.\n", | |
| "- `報酬`: 状態と行動に応じて観測される報酬.\n", | |
| "\n", | |
| "より詳細に環境の引数を確認したい場合は,次のノートブックを参照してください.[examples/quickstart_ja/basic/basic_synthetic_customize_env_ja.ipynb](https://github.com/hakuhodo-technologies/scope-rl/blob/main/examples/quickstart_ja/basic/basic_synthetic_customize_env_ja.ipynb)\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": { | |
| "id": "N7B7uH6pPLvQ" | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "# 環境のセットアップ\n", | |
| "env = BasicEnv(random_state=random_state)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": { | |
| "id": "R3-7NqhdPLvQ" | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "# ランダムに行動を選択するエージェントを定義\n", | |
| "agent = OnlineHead(\n", | |
| " ContinuousRandomPolicyConfig().create(device=device),\n", | |
| " name=\"random\",\n", | |
| ")\n", | |
| "agent.build_with_env(env)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": { | |
| "id": "8tjnY9UsPLvR" | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "# 環境とエージェントの相互作用\n", | |
| "# 6行で強化学習の相互作用を記述できる\n", | |
| "for episode in range(10):\n", | |
| " obs, info = env.reset()\n", | |
| " done = False\n", | |
| "\n", | |
| " while not done:\n", | |
| " action = agent.predict_online(obs)\n", | |
| " obs, reward, done, truncated, info = env.step(action)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": { | |
| "id": "e7atAJYpPLvR", | |
| "outputId": "af1a2f55-f213-4e20-b2ba-a20c07f967e4" | |
| }, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "[-0.37164978 -0.49943402 0.36963097 -0.28399277 -0.62862005]\n", | |
| "(5,)\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "# 状態\n", | |
| "print(obs)\n", | |
| "print(obs.shape)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": { | |
| "id": "5USFoow3PLvR", | |
| "outputId": "cda276f6-c96d-464a-e683-f5ea54c2d3d3" | |
| }, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkIAAAGwCAYAAABFFQqPAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAABdK0lEQVR4nO3deXjU1dn/8fckZGPJBmQlEPZ9DRoCIigoqKVaaV2KC0jVKiiK9hG62dafYlv3pVKpiK1S9HF7FBWlrBWCQNjXAMoWCBECSUgg28zvj5NJiBAIycx8Z/m8rmuuOZnMck8gyZ1z7nMfm8PhcCAiIiISgIKsDkBERETEKkqEREREJGApERIREZGApURIREREApYSIREREQlYSoREREQkYCkREhERkYDVxOoAvJ3dbufQoUO0aNECm81mdTgiIiJSDw6Hg6KiIpKSkggKqnveR4nQBRw6dIiUlBSrwxAREZEGOHDgAG3atKnz80qELqBFixaA+UJGRkZaHI2IiIjUR2FhISkpKdW/x+uiROgCnMthkZGRSoRERER8zIXKWlQsLSIiIgFLiZCIiIgELCVCIiIiErBUI+QilZWVlJeXWx1GwAkJCSE4ONjqMERExEcpEWokh8NBbm4uJ06csDqUgBUdHU1CQoL6PImIyEVTItRIziQoLi6Opk2b6pexBzkcDkpKSsjLywMgMTHR4ohERMTXKBFqhMrKyuokqGXLllaHE5AiIiIAyMvLIy4uTstkIiJyUVQs3QjOmqCmTZtaHElgc379VaMlIiIXS4mQC2g5zFr6+ouISEMpERIREZGApURIREREApYSIfF6S5cuxWazqUWBiIi4nBIhERERb1VZAZXaCOJOPpcIvfrqq6SmphIeHk56ejqrV68+7/1PnDjBpEmTSExMJCwsjC5duvD55597KFrfUVZWZnUIXhGDiIjXqCiFvw2C14aYsbiFTyVC7777LlOnTuXxxx9n3bp19O3bl1GjRlU31PuhsrIyrrrqKvbu3cv777/Pzp07mTVrFsnJye4J0OGAsmJrLg7HRYU6fPhwJk+ezEMPPUSrVq0YNWoUW7Zs4ZprrqF58+bEx8dz++23c/ToUQDmz59PdHQ0lZWVAGzYsAGbzca0adOqn/MXv/gFt912GwDHjh3j1ltvJTk5maZNm9K7d2/+/e9/XzAGgM8//5wuXboQERHBFVdcwd69exv6LyIi4rt2fQXHdsHRnbD9U6uj8Vs+1VDxueee4+6772bChAkAzJw5k88++4zZs2fX+oXsNHv2bPLz81m5ciUhISEApKamui/A8hJ4Ksl9z38+vz4Eoc0u6iFvvfUW9913HytWrODEiRNceeWV/OIXv+D555/n1KlTPPbYY9x0000sXryYoUOHUlRUxPr16xk4cCDLli2jVatWLF26tPr5li1bxmOPPQbA6dOnSUtL47HHHiMyMpLPPvuM22+/nY4dO3LppZeeMwaAAwcOcOONNzJp0iTuuece1q5dyyOPPNL4r4+IiK/Z/L8146w50PunloXiz3xmRqisrIysrCxGjhxZfVtQUBAjR44kMzPznI/55JNPyMjIYNKkScTHx9OrVy+eeuqp6lmNcyktLaWwsLDWxV917tyZv/zlL3Tt2pWFCxfSv39/nnrqKbp160b//v2ZPXs2S5YsITs7m6ioKPr161ed+CxdupSHH36Y9evXc/LkSXJycti9ezfDhg0DIDk5mUcffZR+/frRoUMHHnjgAUaPHs17771XZwxdu3bltddeo2PHjjz77LN07dqVcePGMX78eA9/ZURELHa6EHYuqPl473/h6C7r4vFjPjMjdPToUSorK4mPj691e3x8PDt27DjnY7799lsWL17MuHHj+Pzzz9m9ezf3338/5eXlPP744+d8zIwZM/jjH//YsCBDmpqZGSuEXHx367S0tOrxxo0bWbJkCc2bNz/rfnv27KFLly4MGzaMpUuX8sgjj/Df//6XGTNm8N577/H111+Tn59PUlISnTt3BszxI0899RTvvfceOTk5lJWVUVpaelYX7jNjANi+fTvp6em1bsvIyLjo9yYi4tN2zIfKUmjVBWI7QPYCMys06kmrI/M7PpMINYTdbicuLo7XX3+d4OBg0tLSyMnJ4a9//WudidD06dOZOnVq9ceFhYWkpKTU7wVttotenrJSs2Y1sZ48eZIxY8bw5z//+az7OQ8zHT58OLNnz2bjxo2EhITQrVs3hg8fztKlSzl+/Hj1bBDAX//6V1588UVeeOEFevfuTbNmzXjooYfOKog+MwYREaniXBbr/TNI6GMSoQ1z4crfQUi4tbH5GZ9JhFq1akVwcDBHjhypdfuRI0dISEg452MSExMJCQmpdRBn9+7dyc3NpaysjNDQ0LMe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5nj99detDsnlvvzySwfg2Llzp9WhuFxhYaFjypQpjrZt2zrCw8MdHTp0cPzmN79xlJaWejwWm8NhQRtHERERES+gGiEREREJWEqEREREJGApERIREZGApURIREREApYSIREREQlYSoREREQkYCkREhERkYClREhEREQClhIhEfFaS5cuxWazceLECatDERE/pURIRLzG8OHDeeihh6o/Hjx4MIcPHyYqKsqymJSMifg3/zrFTUT8SmhoKAkJCVaHISJ+TDNCIuIVxo8fz7Jly3jxxRex2WzYbDbmzJlTazZmzpw5REdHM3/+fLp27UrTpk356U9/SklJCW+99RapqanExMTw4IMPUllZWf3cpaWlPProoyQnJ9OsWTPS09NZunRp9ef37dvHmDFjiImJoVmzZvTs2ZPPP/+cvXv3csUVVwAQExODzWZj/PjxgDkZfMaMGbRv356IiAj69u3L+++/X/2czpmkzz77jD59+hAeHs6gQYPYsmWL27+WIlJ/mhESEa/w4osvkp2dTa9evfjTn/4EwNatW8+6X0lJCS+99BLz5s2jqKiIG2+8kZ/85CdER0fz+eef8+233zJ27FiGDBnCzTffDMDkyZPZtm0b8+bNIykpiY8++ojRo0ezefNmOnfuzKRJkygrK2P58uU0a9aMbdu20bx5c1JSUvjggw8YO3YsO3fuJDIykoiICABmzJjB22+/zcyZM+ncuTPLly/ntttuo3Xr1gwbNqw63l/96le8+OKLJCQk8Otf/5oxY8aQnZ1NSEiIB76qInJBHj/vXkSkDsOGDXNMmTKl+uMlS5Y4AMfx48cdDofD8eabbzoAx+7du6vvc++99zqaNm3qKCoqqr5t1KhRjnvvvdfhcDgc+/btcwQHBztycnJqvdaIESMc06dPdzgcDkfv3r0df/jDH84Z0w9jcDgcjtOnTzuaNm3qWLlyZa37Tpw40XHrrbfWety8efOqP3/s2DFHRESE4913363nV0RE3E0zQiLiU5o2bUrHjh2rP46Pjyc1NZXmzZvXui0vLw+AzZs3U1lZSZcuXWo9T2lpKS1btgTgwQcf5L777uOrr75i5MiRjB07lj59+tQZw+7duykpKeGqq66qdXtZWRn9+/evdVtGRkb1ODY2lq5du7J9+/aLfNci4i5KhETEp/xwSclms53zNrvdDsDJkycJDg4mKyuL4ODgWvdzJk+/+MUvGDVqFJ999hlfffUVM2bM4Nlnn+WBBx44ZwwnT54E4LPPPiM5ObnW58LCwhr+5kTE45QIiYjXCA0NrVXk7Ar9+/ensrKSvLw8hg4dWuf9UlJS+OUvf8kvf/lLpk+fzqxZs3jggQcIDQ0FqBVXjx49CAsLY//+/bXqgc5l1apVtG3bFoDjx4+TnZ1N9+7dXfDORMQVlAiJiNdITU3lm2++Ye/evTRv3rx6VqcxunTpwrhx47jjjjt49tln6d+/P99//z2LFi2iT58+XHfddTz00ENcc801dOnShePHj7NkyZLqZKVdu3bYbDbmz5/PtddeS0REBC1atODRRx/l4Ycfxm63c9lll1FQUMCKFSuIjIzkzjvvrH79P/3pT7Rs2ZL4+Hh+85vf0KpVK2644YZGvy8RcQ1tnxcRr/Hoo48SHBxMjx49aN26Nfv373fJ87755pvccccdPPLII3Tt2pUbbriBNWvWVM/UVFZWMmnSJLp3787o0aPp0qULf/vb3wBITk7mj3/8I9OmTSM+Pp7JkycD8MQTT/C73/2OGTNmVD/us88+o3379rVe++mnn2bKlCmkpaWRm5vLp59+Wj3LJCLWszkcDofVQYiI+JulS5dyxRVXcPz4caKjo60OR0TqoBkhERERCVhKhERERCRgaWlMREREApZmhERERCRgKRESERGRgKVESERERAKWEiEREREJWEqEREREJGApERIREZGApURIREREApYSIREREQlY/x9aLxx7QLUNxgAAAABJRU5ErkJggg==", | |
| "text/plain": [ | |
| "<Figure size 640x480 with 1 Axes>" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| } | |
| ], | |
| "source": [ | |
| "# ランダムエージェントの報酬の推移を可視化\n", | |
| "obs, info = env.reset()\n", | |
| "done = False\n", | |
| "reward_list = []\n", | |
| "\n", | |
| "while not done:\n", | |
| " action = agent.sample_action_online(obs)\n", | |
| " obs, reward, done, truncated, info = env.step(action)\n", | |
| " reward_list.append(reward)\n", | |
| "\n", | |
| "# プロット\n", | |
| "fig = plt.figure()\n", | |
| "ax1 = fig.add_subplot(111)\n", | |
| "ax1.plot(reward_list[:-1], label='reward', color='tab:orange')\n", | |
| "ax1.set_xlabel('timestep')\n", | |
| "ax1.set_ylabel('reward')\n", | |
| "ax1.legend(loc='upper left')\n", | |
| "plt.show()" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": { | |
| "id": "ctNCWd2aPLvR" | |
| }, | |
| "source": [ | |
| "#### オンライン強化学習と方策の比較\n", | |
| "まずは方策価値のオンラインでの推定に基づき,オンライン強化学習で学習した方策とランダム方策を比較します." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": { | |
| "id": "x1InWkecPLvR", | |
| "outputId": "ed70b570-6e96-4e70-98c2-166962bf8750" | |
| }, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "Box(-1.0, 1.0, (3,), float64)\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "# SCOPE-RLで実装されている連続行動空間に対する標準的な環境\n", | |
| "env = gym.make(\"BasicEnv-continuous-v0\")\n", | |
| "print(env.action_space)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": { | |
| "id": "2pC95N_XPLvS" | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "from d3rlpy.algos import SACConfig\n", | |
| "from d3rlpy.models.encoders import VectorEncoderFactory\n", | |
| "from d3rlpy.models.q_functions import MeanQFunctionFactory\n", | |
| "from d3rlpy.dataset import create_fifo_replay_buffer\n", | |
| "\n", | |
| "# モデル\n", | |
| "sac = SACConfig(\n", | |
| " actor_encoder_factory=VectorEncoderFactory(hidden_units=[30, 30]),\n", | |
| " critic_encoder_factory=VectorEncoderFactory(hidden_units=[30, 30]),\n", | |
| " q_func_factory=MeanQFunctionFactory(),\n", | |
| " action_scaler=MinMaxActionScaler(\n", | |
| " minimum=env.action_space.low,\n", | |
| " maximum=env.action_space.high,\n", | |
| " ),\n", | |
| ").create(device=device)\n", | |
| "\n", | |
| "# 再生バッファの設定\n", | |
| "buffer = create_fifo_replay_buffer(\n", | |
| " limit=10000,\n", | |
| " env=env,\n", | |
| ")" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": { | |
| "id": "Rzn8TYwUPLvS" | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "# 学習の開始\n", | |
| "# 事前学習したモデルを利用する場合はスキップ\n", | |
| "sac.fit_online(\n", | |
| " env,\n", | |
| " buffer,\n", | |
| " eval_env=env,\n", | |
| " n_steps=100000,\n", | |
| " n_steps_per_epoch=1000,\n", | |
| " update_start_step=1000,\n", | |
| ")" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": { | |
| "id": "2vR9qQggPLvS" | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "# モデルの保存\n", | |
| "sac.save_model(\"d3rlpy_logs/sac.pt\")" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": { | |
| "id": "4x7OSi4APLvS" | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "# モデルのリロード\n", | |
| "sac.build_with_env(env)\n", | |
| "sac.load_model(\"d3rlpy_logs/sac.pt\")" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": { | |
| "id": "syKSgeDYPLvS", | |
| "outputId": "adfe405a-152d-4420-8822-d86ba298c0b2" | |
| }, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "Text(0, 0.5, 'episode reward')" | |
| ] | |
| }, | |
| "execution_count": 17, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| }, | |
| { | |
| "data": { | |
| "image/png": "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DQ0Nbq/Zvn27uOKKK0RiYqLQ6/UiOztbXHXVVWLVqlVtvp7i4mJx/fXXi6SkJKHT6cSwYcPctqO3t6W7uLhYPPXUU2LKlCmiR48eQqPRiPj4eHHuueeKlStXKtc999xzAkCra1y2bJkAIL744gvltvr6evHss8+KcePGiaioKKHT6US/fv3En/70J3HkyJE210fkD5IQ3VjZR0SntaqqKsTHx+Pxxx/nqH0i8jnW1BBRl2hoaHC5TZ6OPHXq1O5dDBGdFlhTQ0Rd4sMPP8SyZctw0UUXISoqCr/++ivef/99XHDBBW7PKyIi6iwGNUTUJYYPHw6NRoN//vOfMBgMSvHw448/7u+lEVGICpqampycHLfzJ+644w68/PLLflgRERERBZKgydRs3rzZaVLonj17cP755+PKK6/046qIiIgoUARNpqalu+++G1999RUOHz7cqQPuiIiIKDQETabGUVNTE1asWIGFCxe2GtAYjUYYjUble/lU48TERAZCREREQUIIgZqaGqSnp7scDOsoKIOazz//HFVVVZg3b16r1y1evNjtmHUiIiIKPvn5+cjIyPB4f1BuP02fPh06na7VseSAa6amuroaWVlZyM/PR0xMTFcvk4iIiHzAYDAgMzMTVVVViI2N9Xhd0GVqTpw4gR9//BGffvppm9fq9Xro9XqX22NiYhjUEBERBZm2SkeCbqLw0qVLkZKSgosvvtjfSyEiIqIAElRBjcViwdKlSzF37lxoNEGXZCIiIqIuFFRBzY8//oi8vDzccMMN/l4KERERBZigSndccMEFCMK6ZiIiIuoGQZWpISIiIvKEQQ0RERGFBAY1REREFBIY1BAREVFIYFBDREREIYFBDREREYUEBjVEREQUEhjUEBERUUhgUENEREReq2lshtkSWANxg2qiMBEREfnfD/uKcfuKrYjQqTG+VyIm9UnExD6JGJAaDZWq9ZO0uxKDGiIiImq3/Ip6LPxoB0wWAUOjCT/uL8aP+4sBAPERWjw1azimD0nzy9oY1BAREVG7GE1mzH9vG2oaTRidFYeHLhmMjbkVWH+0HJuPV6CyvhnpseF+Wx+DGiIiImqXxd8cwK6CasRFaPHva0cjPS4co7LicduUPmg2W7CroAqD02P8tj4GNURERNSmb3YXYtlvxwEAz181EulxzhkZrVqFMdkJfliZHbufiIiI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pqaKOXPmiD179oj3339fhIeHi9dee61bX6+/PfHEEyIxMVF89dVXIjc3V3z88cciKipKvPDCC8o1fL875ptvvhEPPPCA+PTTTwUA8dlnnznd313v67p164RarRb//Oc/xb59+8SDDz4otFqt2L17t1evh0GNF8aPHy/mz5+vfG82m0V6erpYvHixH1cVXEpKSgQAsWbNGiGEEFVVVUKr1YqPP/5YuWb//v0CgFi/fr0Qwvo/nUqlEkVFRco1r7zyioiJiRFGo1EIIcSf//xnMWTIEKfnuvrqq8X06dO7+iUFnJqaGtGvXz/xww8/iClTpihBDd9r3/nLX/4izjzzTI/3WywWkZaWJp555hnltqqqKqHX68X7778vhBBi3759AoDYvHmzcs23334rJEkSJ0+eFEII8Z///EfEx8cr77383AMGDPD1SwpoF198sbjhhhucbrviiivEnDlzhBB8v32lZVDTne/rVVddJS6++GKn9UyYMEHceuutXr0Gbj+1U1NTE7Zu3Ypp06Ypt6lUKkybNg3r16/348qCS3V1NQAgISEBALB161Y0Nzc7va8DBw5EVlaW8r6uX78ew4YNQ2pqqnLN9OnTYTAYsHfvXuUax8eQrzkd/2zmz5+Piy++2OX94HvtO//73/8wduxYXHnllUhJScGoUaPwxhtvKPfn5uaiqKjI6X2KjY3FhAkTnN7ruLg4jB07Vrlm2rRpUKlU2Lhxo3LN2WefDZ1Op1wzffp0HDx4EJWVlV39MgPGpEmTsGrVKhw6dAgAsHPnTvz666+YMWMGAL7fXaU731df/bvCoKadysrKYDabnf6xB4DU1FQUFRX5aVXBxWKx4O6778bkyZMxdOhQAEBRURF0Oh3i4uKcrnV8X4uKity+7/J9rV1jMBjQ0NDQFS8nIH3wwQfYtm0bFi9e7HIf32vfOXbsGF555RX069cP33//PW6//XbceeedePvttwHY36vW/r0oKipCSkqK0/0ajQYJCQle/XmcDv7617/immuuwcCBA6HVajFq1CjcfffdmDNnDgC+312lO99XT9d4+76fVqd0k3/Nnz8fe/bswa+//urvpYSk/Px83HXXXfjhhx8QFhbm7+WENIvFgrFjx+LJJ58EAIwaNQp79uzBq6++irlz5/p5daHno48+wrvvvov33nsPQ4YMwY4dO3D33XcjPT2d7zc5YaamnZKSkqBWq106RYqLi5GWluanVQWPBQsW4KuvvsLq1auRkZGh3J6WloampiZUVVU5Xe/4vqalpbl93+X7WrsmJiYG4eHhvn45AWnr1q0oKSnB6NGjodFooNFosGbNGrz44ovQaDRITU3le+0jPXr0wODBg51uGzRoEPLy8gDY36vW/r1IS0tDSUmJ0/0mkwkVFRVe/XmcDu6//34lWzNs2DBcd911uOeee5SMJN/vrtGd76una7x93xnUtJNOp8OYMWOwatUq5TaLxYJVq1Zh4sSJflxZYBNCYMGCBfjss8/w008/oVevXk73jxkzBlqt1ul9PXjwIPLy8pT3deLEidi9e7fT/zg//PADYmJilA+WiRMnOj2GfM3p9Gdz3nnnYffu3dixY4fyNXbsWMyZM0f5b77XvjF58mSX0QSHDh1CdnY2AKBXr15IS0tzep8MBgM2btzo9F5XVVVh69atyjU//fQTLBYLJkyYoFyzdu1aNDc3K9f88MMPGDBgAOLj47vs9QWa+vp6qFTOH1dqtRoWiwUA3++u0p3vq8/+XfGqrPg098EHHwi9Xi+WLVsm9u3bJ2655RYRFxfn1ClCzm6//XYRGxsrfv75Z1FYWKh81dfXK9fcdtttIisrS/z0009iy5YtYuLEiWLixInK/XKb8QUXXCB27NghvvvuO5GcnOy2zfj+++8X+/fvFy+//PJp12bsjmP3kxB8r31l06ZNQqPRiCeeeEIcPnxYvPvuuyIiIkKsWLFCueapp54ScXFx4osvvhC7du0Sl19+udtW2FGjRomNGzeKX3/9VfTr18+pFbaqqkqkpqaK6667TuzZs0d88MEHIiIiIqRbjN2ZO3eu6Nmzp9LS/emnn4qkpCTx5z//WbmG73fH1NTUiO3bt4vt27cLAOJf//qX2L59uzhx4oQQovve13Xr1gmNRiOeffZZsX//fvHwww+zpbs7vPTSSyIrK0vodDoxfvx4sWHDBn8vKaABcPu1dOlS5ZqGhgZxxx13iPj4eBERESFmzpwpCgsLnR7n+PHjYsaMGSI8PFwkJSWJe++9VzQ3Nztds3r1ajFy5Eih0+lE7969nZ7jdNUyqOF77TtffvmlGDp0qNDr9WLgwIHi9ddfd7rfYrGIhx56SKSmpgq9Xi/OO+88cfDgQadrysvLxezZs0VUVJSIiYkR119/vaipqXG6ZufOneLMM88Uer1e9OzZUzz11FNd/toCjcFgEHfddZfIysoSYWFhonfv3uKBBx5wahHm+90xq1evdvtv9Ny5c4UQ3fu+fvTRR6J///5Cp9OJIUOGiK+//trr1yMJ4TCSkYiIiChIsaaGiIiIQgKDGiIiIgoJDGqIiIgoJDCoISIiopDAoIaIiIhCAoMaIiIiCgkMaoiIiCgkMKghooC3bNkyl9PFfS0nJwdLlizp0ucgoq7FoIaIAt7VV1+NQ4cO+XsZRBTgNP5eABFRW8LDw0+bE8CJqOOYqSGiLmexWLB48WL06tUL4eHhGDFiBFauXAkA+PnnnyFJEr7++msMHz4cYWFhOOOMM7Bnzx7l51tuP+3cuRPnnHMOoqOjERMTgzFjxmDLli3K/Z988gmGDBkCvV6PnJwcPPfcc07rKSkpwaWXXorw8HD06tUL7777rsuaq6qqcNNNNyE5ORkxMTE499xzsXPnTh+/M0TkS8zUEFGXW7x4MVasWIFXX30V/fr1w9q1a/GHP/wBycnJyjX3338/XnjhBaSlpeFvf/sbLr30Uhw6dAhardbl8ebMmYNRo0bhlVdegVqtxo4dO5Trtm7diquuugqPPPIIrr76avz222+44447kJiYiHnz5gEA5s2bh1OnTmH16tXQarW48847UVJS4vQcV155JcLDw/Htt98iNjYWr732Gs477zwcOnQICQkJXfdmEVHHeX0EJhGRFxobG0VERIT47bffnG6/8cYbxezZs5VTgj/44APlvvLychEeHi4+/PBDIYQQS5cuFbGxscr90dHRYtmyZW6f79prrxXnn3++023333+/GDx4sBBCiIMHDwoAYtOmTcr9+/fvFwDE888/L4QQ4pdffhExMTGisbHR6XH69OkjXnvtNe/eACLqNszUEFGXOnLkCOrr63H++ec73d7U1IRRo0Yp30+cOFH574SEBAwYMAD79+93+5gLFy7ETTfdhOXLl2PatGm48sor0adPHwDA/v37cfnllztdP3nyZCxZsgRmsxn79++HRqPBmDFjlPsHDhzosr1VW1uLxMREp8dpaGjA0aNHvXsDiKjbMKghoi5VW1sLAPj666/Rs2dPp/v0en2HgoRHHnkE1157Lb7++mt8++23ePjhh/HBBx9g5syZPltzjx498PPPP7vc19Wt5UTUcQxqiKhLDR48GHq9Hnl5eZgyZYrL/XJQs2HDBmRlZQEAKisrcejQIQwaNMjj4/bv3x/9+/fHPffcg9mzZ2Pp0qWYOXMmBg0ahHXr1jldu27dOvTv3x9qtRoDBw6EyWTC1q1bMW7cOADAwYMHUVVVpVw/evRoFBUVQaPRICcnp5PvABF1FwY1RNSloqOjcd999+Gee+6BxWLBmWeeierqaqxbtw4xMTHIzs4GAPzjH/9AYmIiUlNT8cADDyApKQm/+93vXB6voaEB999/P37/+9+jV69eKCgowObNmzFr1iwAwL333otx48bhsccew9VXX43169fj3//+N/7zn/8AAAYMGIALL7wQt956K1555RVoNBrcfffdTi3j06ZNw8SJE/G73/0O//znP9G/f3+cOnUKX3/9NWbOnImxY8d2/RtHRN7zd1EPEYU+i8UilixZIgYMGCC0Wq1ITk4W06dPF2vWrFEKhb/88ksxZMgQodPpxPjx48XOnTuVn3csFDYajeKaa64RmZmZQqfTifT0dLFgwQLR0NCgXL9y5UoxePBgodVqRVZWlnjmmWec1lNYWCguvvhiodfrRVZWlnjnnXdEdna2UigshBAGg0H86U9/Eunp6UKr1YrMzEwxZ84ckZeX16XvFRF1nCSEEP4OrIjo9PXzzz/jnHPOQWVlJetViKhTOHyPiIiIQgKDGiIiIgoJ3H4iIiKikMBMDREREYUEBjVEREQUEhjUEBERUUhgUENEREQhgUENERERhQQGNURERBQSGNQQERFRSGBQQ0RERCGBQQ0RERGFhP8HiQYGg74Ccr8AAAAASUVORK5CYII=", | |
| "text/plain": [ | |
| "<Figure size 640x480 with 1 Axes>" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| } | |
| ], | |
| "source": [ | |
| "# モデルの学習曲線\n", | |
| "log_path = sorted(glob(\"d3rlpy_logs/SAC_online_*/evaluation.csv\"))[-1]\n", | |
| "df = pd.read_csv(\n", | |
| " log_path,\n", | |
| " usecols=[1,2],\n", | |
| " names=[\"train_episode\", \"episodic_rewards\"]\n", | |
| ")\n", | |
| "plt.plot(df[\"train_episode\"], df[\"episodic_rewards\"])\n", | |
| "plt.title(\"Learning curve of SAC\")\n", | |
| "plt.xlabel(\"episode\")\n", | |
| "plt.ylabel(\"episode reward\")" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": { | |
| "id": "cRC3_WlAPLvS" | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "random = ContinuousRandomPolicyConfig().create(device=device)\n", | |
| "random.build_with_env(env)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": { | |
| "colab": { | |
| "referenced_widgets": [ | |
| "b380f9e17ff042e0af27ac842430000e", | |
| "9e88116c8ce942a988c8dd206e72ccf9" | |
| ] | |
| }, | |
| "id": "DYXBIVkPPLvS", | |
| "outputId": "ca85f4b5-52bc-4f46-d1dc-2145340c074f" | |
| }, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "application/vnd.jupyter.widget-view+json": { | |
| "model_id": "b380f9e17ff042e0af27ac842430000e", | |
| "version_major": 2, | |
| "version_minor": 0 | |
| }, | |
| "text/plain": [ | |
| "[calculate on-policy policy value]: 0%| | 0/100 [00:00<?, ?it/s]" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| }, | |
| { | |
| "data": { | |
| "application/vnd.jupyter.widget-view+json": { | |
| "model_id": "9e88116c8ce942a988c8dd206e72ccf9", | |
| "version_major": 2, | |
| "version_minor": 0 | |
| }, | |
| "text/plain": [ | |
| "[calculate on-policy policy value]: 0%| | 0/100 [00:00<?, ?it/s]" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| }, | |
| { | |
| "data": { | |
| "image/png": "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", | |
| "text/plain": [ | |
| "<Figure size 400x400 with 1 Axes>" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| } | |
| ], | |
| "source": [ | |
| "# オンラインでの性能比較\n", | |
| "visualize_on_policy_policy_value(\n", | |
| " env=env,\n", | |
| " policies=[sac, random],\n", | |
| " policy_names=[\"sac\", \"random\"],\n", | |
| " n_trajectories=100,\n", | |
| " random_state=random_state,\n", | |
| ")" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": { | |
| "colab": { | |
| "referenced_widgets": [ | |
| "2206752b1e194a04ab609bd3dda78f50", | |
| "f8fc4a2b5a5740ba8a72e4a7b44234a6" | |
| ] | |
| }, | |
| "id": "izvOXfu4PLvS", | |
| "outputId": "baf15c84-e914-4617-8e5b-08e2281f10a6" | |
| }, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "application/vnd.jupyter.widget-view+json": { | |
| "model_id": "2206752b1e194a04ab609bd3dda78f50", | |
| "version_major": 2, | |
| "version_minor": 0 | |
| }, | |
| "text/plain": [ | |
| "[calculate on-policy policy value]: 0%| | 0/100 [00:00<?, ?it/s]" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| }, | |
| { | |
| "data": { | |
| "application/vnd.jupyter.widget-view+json": { | |
| "model_id": "f8fc4a2b5a5740ba8a72e4a7b44234a6", | |
| "version_major": 2, | |
| "version_minor": 0 | |
| }, | |
| "text/plain": [ | |
| "[calculate on-policy policy value]: 0%| | 0/100 [00:00<?, ?it/s]" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| }, | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "improvement: 6.220823797617203\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "# sac方策のオンライン評価による方策価値\n", | |
| "# ランダム方策より大幅に改善\n", | |
| "sac_performance = calc_on_policy_policy_value(env, sac, n_trajectories=100, random_state=random_state)\n", | |
| "random_performance = calc_on_policy_policy_value(env, random, n_trajectories=100, random_state=random_state)\n", | |
| "print(\"improvement:\", sac_performance - random_performance)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": { | |
| "id": "yIFMKrK3PLvS" | |
| }, | |
| "source": [ | |
| "`scope_rl.ope.online`では,以下の関数を用いて方策の性能をオンラインで評価できます.\n", | |
| "\n", | |
| "(統計量)\n", | |
| "\n", | |
| "* `calc_on_policy_policy_value`\n", | |
| "* `calc_on_policy_policy_value_interval`\n", | |
| "* `calc_on_policy_variance`\n", | |
| "* `calc_on_policy_conditional_value_at_risk`\n", | |
| "* `calc_on_policy_policy_interquartile_range`\n", | |
| "* `calc_on_policy_cumulative_distribution_function`\n", | |
| "\n", | |
| "(可視化)\n", | |
| "* `visualize_on_policy_policy_value`\n", | |
| "* `visualize_on_policy_policy_value_with_variance`\n", | |
| "* `visualize_on_policy_cumulative_distribution_function`\n", | |
| "* `visualize_on_policy_conditional_value_at_risk`\n", | |
| "* `visualize_on_policy_interquartile_range`" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": { | |
| "id": "q_LnVAUwPLvS" | |
| }, | |
| "source": [ | |
| "## 1. 人工データの生成\n", | |
| "前章ではシミュレーション環境をオンライン環境とみなし,どのようにどのようにオンライン強化学習やオンラインでの性能評価を行うか確認しました.今回のようにシミュレーション環境上では簡単にエージェントを学習することができますが,実環境でオンラインのデータ収集や逐次的意思決定を行うことにはリスクを伴います.そこでオフライン強化学習ではデータ収集方策$\\pi_0$から集められた以下のオフラインのログデータのみを利用することで,新たな方策を学習することを考えます.\n", | |
| "\n", | |
| "$$\\mathcal{D}_0 := \\{ \\{ s_t, a_t, s_{t+1}, r_t \\}_{t=1}^T \\}_{i=1}^n \\sim \\prod_{i=1}^n d_{s_0}(s_0) \\prod_{t=1}^T \\pi_0(a_t | s_t) p(s_{t+1} | s_t, a_t) p(r_t | s_t, a_t),$$\n", | |
| "\n", | |
| "ここで $s_t \\in \\mathcal{S}$ は時刻$t$で観測された状態,$a_t$ はデータ収集方策 $\\pi_0$によって選択された行動,$r_t$は状態と行動に応じて観測された報酬を表します.\n", | |
| "\n", | |
| "SCOPE-RLでは人工データを簡単に生成するデータセットモジュールクラスとして `SyntheticDataset`を実装しており,`SyntheticDataset` は以下の引数を持っています:\n", | |
| "- `env`: 強化学習の(シミュレーション)環境.\n", | |
| "- `max_episode_steps`: 一つのエピソードにおける連続意思決定の数(上限)." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": { | |
| "id": "cm2ZbWPXPLvS" | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "behavior_policy = TruncatedGaussianHead(\n", | |
| " sac,\n", | |
| " minimum=env.action_space.low,\n", | |
| " maximum=env.action_space.high,\n", | |
| " sigma=np.array([0.5]),\n", | |
| " name=\"sac_sigma_0.5\",\n", | |
| " random_state=random_state,\n", | |
| ")" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": { | |
| "id": "k6Dss8ikPLvT" | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "# データセットクラスの初期化\n", | |
| "dataset = SyntheticDataset(\n", | |
| " env=env,\n", | |
| " max_episode_steps=env.step_per_episode,\n", | |
| ")" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": { | |
| "id": "icfNsRjePLvT" | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "# ログデータがある存在する場合はスキップ\n", | |
| "# データ収集方策によってログデータを集める\n", | |
| "train_logged_dataset = dataset.obtain_episodes(\n", | |
| " behavior_policies=behavior_policy,\n", | |
| " n_trajectories=10000,\n", | |
| " obtain_info=False,\n", | |
| " random_state=random_state,\n", | |
| ")\n", | |
| "test_logged_dataset = dataset.obtain_episodes(\n", | |
| " behavior_policies=behavior_policy,\n", | |
| " n_trajectories=10000,\n", | |
| " obtain_info=False,\n", | |
| " random_state=random_state + 1,\n", | |
| ")" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": { | |
| "id": "DQ-IinwCPLvT", | |
| "outputId": "e0996c6a-190e-4837-a549-3efacc3fea59" | |
| }, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "{'size': 100000,\n", | |
| " 'n_trajectories': 10000,\n", | |
| " 'step_per_trajectory': 10,\n", | |
| " 'action_type': 'continuous',\n", | |
| " 'n_actions': None,\n", | |
| " 'action_dim': 3,\n", | |
| " 'action_meaning': None,\n", | |
| " 'action_keys': None,\n", | |
| " 'state_dim': 5,\n", | |
| " 'state_keys': None,\n", | |
| " 'state': array([[ 0.46692103, -0.60091272, 0.12748286, 0.10612129, 0.62719618],\n", | |
| " [ 0.10666174, -0.43413801, 0.69911049, -0.49153976, 0.26416026],\n", | |
| " [-0.09165767, 0.53838334, 0.57967616, 0.25195753, 0.54975922],\n", | |
| " ...,\n", | |
| " [-0.58171771, 0.6782399 , 0.07907731, 0.44068758, 0.03371026],\n", | |
| " [-0.03506825, -0.34642982, 0.70207422, -0.36781008, 0.50056381],\n", | |
| " [ 0.09089026, 0.70256162, 0.47892005, 0.20888019, 0.47450056]]),\n", | |
| " 'action': array([[ 0.63094648, -0.93446503, 0.56403605],\n", | |
| " [ 0.48463834, 0.22951301, -0.71212477],\n", | |
| " [ 0.90848962, -0.58848582, -0.62280191],\n", | |
| " ...,\n", | |
| " [ 0.633153 , -0.9542258 , -0.43497972],\n", | |
| " [ 0.42549025, 0.32503334, -0.6607296 ],\n", | |
| " [ 0.80997434, -0.30832653, -0.29731225]]),\n", | |
| " 'reward': array([0.51629582, 0.27206326, 0.4348537 , ..., 0.21085268, 0.30432125,\n", | |
| " 0.44587291]),\n", | |
| " 'done': array([0., 0., 0., ..., 0., 0., 1.]),\n", | |
| " 'terminal': array([0., 0., 0., ..., 0., 0., 1.]),\n", | |
| " 'info': {},\n", | |
| " 'pscore': array([[0.94034815, 0.94034815, 0.94034815],\n", | |
| " [0.89860991, 0.89860991, 0.89860991],\n", | |
| " [1.15576638, 1.15576638, 1.15576638],\n", | |
| " ...,\n", | |
| " [0.90518726, 0.90518726, 0.90518726],\n", | |
| " [0.69265362, 0.69265362, 0.69265362],\n", | |
| " [1.02172236, 1.02172236, 1.02172236]]),\n", | |
| " 'behavior_policy': 'sac_sigma_0.5',\n", | |
| " 'dataset_id': 0}" | |
| ] | |
| }, | |
| "execution_count": 24, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "train_logged_dataset" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": { | |
| "id": "xvnfg1pNPLvT" | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "with open(\"logs/train_dataset_continuous_sac.pkl\", \"wb\") as f:\n", | |
| " pickle.dump(train_logged_dataset, f)\n", | |
| "with open(\"logs/test_dataset_continuous_sac.pkl\", \"wb\") as f:\n", | |
| " pickle.dump(test_logged_dataset, f)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": { | |
| "id": "UZNITAetPLvT" | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "with open(\"logs/train_dataset_continuous_sac.pkl\", \"rb\") as f:\n", | |
| " train_logged_dataset = pickle.load(f)\n", | |
| "with open(\"logs/test_dataset_continuous_sac.pkl\", \"rb\") as f:\n", | |
| " test_logged_dataset = pickle.load(f)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": { | |
| "colab": { | |
| "referenced_widgets": [ | |
| "42f9c085cbec44518c3c3d5808db24e2", | |
| "c4c19c7a6f444638b2d5a9fc90ab7da3", | |
| "4011ac24ea444bbdb2a46e7a288fa9af" | |
| ] | |
| }, | |
| "id": "HvggqcuAPLvT", | |
| "outputId": "8f3b0775-be29-4478-cd32-f658645eaea1" | |
| }, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "application/vnd.jupyter.widget-view+json": { | |
| "model_id": "42f9c085cbec44518c3c3d5808db24e2", | |
| "version_major": 2, | |
| "version_minor": 0 | |
| }, | |
| "text/plain": [ | |
| "[calculate on-policy policy value]: 0%| | 0/100 [00:00<?, ?it/s]" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| }, | |
| { | |
| "data": { | |
| "application/vnd.jupyter.widget-view+json": { | |
| "model_id": "c4c19c7a6f444638b2d5a9fc90ab7da3", | |
| "version_major": 2, | |
| "version_minor": 0 | |
| }, | |
| "text/plain": [ | |
| "[calculate on-policy policy value]: 0%| | 0/100 [00:00<?, ?it/s]" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| }, | |
| { | |
| "data": { | |
| "application/vnd.jupyter.widget-view+json": { | |
| "model_id": "4011ac24ea444bbdb2a46e7a288fa9af", | |
| "version_major": 2, | |
| "version_minor": 0 | |
| }, | |
| "text/plain": [ | |
| "[calculate on-policy policy value]: 0%| | 0/100 [00:00<?, ?it/s]" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| }, | |
| { | |
| "data": { | |
| "image/png": "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", | |
| "text/plain": [ | |
| "<Figure size 600x400 with 1 Axes>" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| } | |
| ], | |
| "source": [ | |
| "# オンラインでの方策性能の比較\n", | |
| "visualize_on_policy_policy_value(\n", | |
| " env=env,\n", | |
| " policies=[sac, behavior_policy, random],\n", | |
| " policy_names=[\"sac\", \"sac (sigma=0.5)\", \"random\"],\n", | |
| " n_trajectories=100,\n", | |
| " random_state=random_state,\n", | |
| ")" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": { | |
| "id": "UFA2O2suPLvT" | |
| }, | |
| "source": [ | |
| "より詳細にデータ収集と可視化について知りたい場合は,[examples/quickstart_ja/basic/basic_synthetic_data_collection_ja.ipynb](https://github.com/hakuhodo-technologies/scope-rl/blob/main/examples/quickstart_ja/basic/basic_synthetic_data_collection_ja.ipynb)を参照してください." | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": { | |
| "id": "mchWPyzEPLvT" | |
| }, | |
| "source": [ | |
| "## 2. オフライン強化学習\n", | |
| "この章では実環境と相互作用せずに,ログデータのみから新しい方策を学習する方法を紹介します.\n", | |
| "オフライン強化学習のアルゴリズムは [d3rlpy](https://github.com/takuseno/d3rlpy)に実装されているものを利用します." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": { | |
| "id": "8FJNgAzgPLvT" | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "# d3rlpyのモジュールのインポート\n", | |
| "from d3rlpy.dataset import MDPDataset\n", | |
| "from d3rlpy.algos import CQLConfig" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": { | |
| "id": "5lx-4g4kPLvT" | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "offlinerl_dataset = MDPDataset(\n", | |
| " observations=test_logged_dataset[\"state\"],\n", | |
| " actions=test_logged_dataset[\"action\"],\n", | |
| " rewards=test_logged_dataset[\"reward\"],\n", | |
| " terminals=test_logged_dataset[\"done\"],\n", | |
| ")" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": { | |
| "id": "3Bpn8hMUPLvT" | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "# Conservative Q-Learning 方策を利用\n", | |
| "cql = CQLConfig(\n", | |
| " actor_encoder_factory=VectorEncoderFactory(hidden_units=[30, 30]),\n", | |
| " critic_encoder_factory=VectorEncoderFactory(hidden_units=[30, 30]),\n", | |
| " q_func_factory=MeanQFunctionFactory(),\n", | |
| " action_scaler=MinMaxActionScaler(\n", | |
| " minimum=env.action_space.low, # 方策が取りうる最小の値\n", | |
| " maximum=env.action_space.high, # 方策が取りうる最大の値\n", | |
| " )\n", | |
| ").create(device=device)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": { | |
| "id": "M3LRuz9JPLvT" | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "cql.fit(\n", | |
| " offlinerl_dataset,\n", | |
| " n_steps=10000,\n", | |
| ")" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": { | |
| "id": "ZlqTivQNPLvZ" | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "# モデルの保存\n", | |
| "cql.save_model(\"d3rlpy_logs/cql_continuous.pt\")" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": { | |
| "id": "GRW5cOVcPLvZ", | |
| "outputId": "f09d7fb5-a8a1-4d41-88fe-43d5cdb0735f" | |
| }, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "2023-07-22 16:29:44 [warning ] Parameters will be reinitialized.\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "# モデルのリロード\n", | |
| "cql.build_with_env(env)\n", | |
| "cql.load_model(\"d3rlpy_logs/cql_continuous.pt\")" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": { | |
| "colab": { | |
| "referenced_widgets": [ | |
| "a0c3e1e5016d424a9089bce7c22b8d95", | |
| "92ba2e1f069847fc88ebb06371864b51", | |
| "cb9095474942427caee28dd9ecec72ac", | |
| "433d86a8d318460e95b1a06ba56487c0" | |
| ] | |
| }, | |
| "id": "eJXZaU1nPLvZ", | |
| "outputId": "0302ed03-80e9-4b65-a2b9-a36e55bd94ab" | |
| }, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "application/vnd.jupyter.widget-view+json": { | |
| "model_id": "a0c3e1e5016d424a9089bce7c22b8d95", | |
| "version_major": 2, | |
| "version_minor": 0 | |
| }, | |
| "text/plain": [ | |
| "[calculate on-policy policy value]: 0%| | 0/100 [00:00<?, ?it/s]" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| }, | |
| { | |
| "data": { | |
| "application/vnd.jupyter.widget-view+json": { | |
| "model_id": "92ba2e1f069847fc88ebb06371864b51", | |
| "version_major": 2, | |
| "version_minor": 0 | |
| }, | |
| "text/plain": [ | |
| "[calculate on-policy policy value]: 0%| | 0/100 [00:00<?, ?it/s]" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| }, | |
| { | |
| "data": { | |
| "application/vnd.jupyter.widget-view+json": { | |
| "model_id": "cb9095474942427caee28dd9ecec72ac", | |
| "version_major": 2, | |
| "version_minor": 0 | |
| }, | |
| "text/plain": [ | |
| "[calculate on-policy policy value]: 0%| | 0/100 [00:00<?, ?it/s]" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| }, | |
| { | |
| "data": { | |
| "application/vnd.jupyter.widget-view+json": { | |
| "model_id": "433d86a8d318460e95b1a06ba56487c0", | |
| "version_major": 2, | |
| "version_minor": 0 | |
| }, | |
| "text/plain": [ | |
| "[calculate on-policy policy value]: 0%| | 0/100 [00:00<?, ?it/s]" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| }, | |
| { | |
| "data": { | |
| "image/png": "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MjIyFBcXp127dunixYsKDAxUu3bt9OCDD8rDw0OnTp3Sp59+qkOHDql27doaMGCAAgMD9Z///Edz5swpsX+h5li0aJHi4+P1z3/+U99884127dqlkJAQTZw4UcuXL9f+/fstx+D27dvr3nvvLXHlpHj79957T9988422bdsms9msLl266C9/+Yu8vLws6xYWFuqrr75SQkKCCgsL1bp1az388MNl1nX8+HEtWLBABw8elMlkUvPmzTV27Fi1aNHCss5PP/2kDz74QDNmzNCmTZu0ceNGXb58Wd27d9dDDz2kS5cu6bPPPtOOHTskSf369dOECRNq/BUawmoN9vHHH2vLli267bbb1LBhQ128eFEHDhxQcnKymjRpos2bN+vSpUsaOHCgateurSNHjuiHH35QRkaG/vrXv1ra+f333zVlyhR5eHioX79+qlu3rs6ePasdO3YQVm1wo+9DUoV/JxkZGUpPT1dkZGSJ+RcuXNBrr70mf39/3X777apVq5bS0tK0devW6/5Mx48f16xZsxQQEKC7775bJpNJ8fHx8vf3L3P9AwcOaPv27Ro0aJAkaenSpXrzzTc1YsQIrV69WoMGDVJ2draWLVumf//735o6daplW2s/m8LCQuXl5V237mLFdZpMJp08eVJ9+vQptU7Tpk21e/du5eXlycfH57rtnTlzRvfee6+KiopUp04d9evXT3fddZc8PEofaiMjI3Xw4EGr6kRpGRkZevnll5Wbm6t+/fqpQYMGysjI0JYtW3Tp0iVlZ2dr+vTpunz5su644w55eXlp7dq1NfrqAEr65z//qdDQUI0bN05ms1l79uxRamqqevfurYCAAJ0+fVpr1qzR6dOn9frrr5cKfO+8845CQkI0fvx4HTt2TOvWrZO/v7/uueceyzr/+c9/lJCQoJiYGLVo0UK//vqr3nzzzVK1nDp1SlOmTJGvr69GjBghd3d3rVmzRtOnT9e0adNKXen69NNPFRAQoNGjR+vw4cNas2aNfH19dejQIQUHB2vcuHH65ZdftGzZMoWHh6tXr14V8yE6CcJqDfbLL7+oX79+uu+++yzzbr/9dsvre+65p8SBu3///goNDdWCBQuUnp6u4OBgSVf+00jS7NmzLfMkacKECRX9I9QoN/o+pIr/TpKTkyWp1BmlgwcPKicnR//4xz/UtGlTy/yxY8det71F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", | |
| "text/plain": [ | |
| "<Figure size 800x400 with 1 Axes>" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| } | |
| ], | |
| "source": [ | |
| "# オンラインでの方策性能の比較\n", | |
| "# オフラインで学習した方策もオンラインで学習した方策と同等程度の性能を達成\n", | |
| "visualize_on_policy_policy_value(\n", | |
| " env=env,\n", | |
| " policies=[sac, behavior_policy, cql, random],\n", | |
| " policy_names=[\"sac\", \"sac (sigma=0.5)\", \"cql\", \"random\"],\n", | |
| " n_trajectories=100,\n", | |
| " random_state=random_state,\n", | |
| ")" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": { | |
| "id": "nF3_BzLnPLvZ" | |
| }, | |
| "source": [ | |
| "## 3. オフ方策評価とオフライン強化学習手法の評価\n", | |
| "前章ではオンラインの性能評価 (A/Bテスト) により学習した方策の性能を確認しました.しかし,実務においては方策の性能が悪い場合に顧客の満足度を毀損してしまうなど,A/Bテストにも大きなリスクが伴うことが知られています.そこで,学習した方策が実環境でどのように動作するかを事前に見積もるために,オフラインでの方策性能の評価を行います.\n", | |
| "\n", | |
| "#### 推定目標\n", | |
| "ここでは,方策の期待性能 (*方策価値*) を推定します.\n", | |
| "\n", | |
| "$$ V(\\pi) := \\mathbb{E}\\left[\\sum_{t=1}^T \\gamma^{t-1} r_t \\mid \\pi \\right] $$" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": { | |
| "id": "r8IGfvzBPLvZ" | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "# SCOPE-RLからのopeモジュールのインポート\n", | |
| "from scope_rl.ope import CreateOPEInput\n", | |
| "from scope_rl.ope import OffPolicyEvaluation as OPE\n", | |
| "from scope_rl.ope.continuous import DirectMethod as DM\n", | |
| "from scope_rl.ope.continuous import TrajectoryWiseImportanceSampling as TIS\n", | |
| "from scope_rl.ope.continuous import PerDecisionImportanceSampling as PDIS\n", | |
| "from scope_rl.ope.continuous import DoublyRobust as DR\n", | |
| "from scope_rl.ope.continuous import SelfNormalizedTIS as SNTIS\n", | |
| "from scope_rl.ope.continuous import SelfNormalizedPDIS as SNPDIS\n", | |
| "from scope_rl.ope.continuous import SelfNormalizedDR as SNDR\n", | |
| "from scope_rl.policy import ContinuousEvalHead" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": { | |
| "id": "5ZN5g3N-PLvZ" | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "# 評価方策を定義\n", | |
| "cql_ = ContinuousEvalHead(\n", | |
| " base_policy=cql,\n", | |
| " name=\"cql\",\n", | |
| ")\n", | |
| "sac_ = ContinuousEvalHead(\n", | |
| " base_policy=sac,\n", | |
| " name=\"sac\",\n", | |
| ")\n", | |
| "evaluation_policies = [cql_, sac_]" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": { | |
| "id": "jldHZYaKPLvZ" | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "# まずOPEのインプットを準備\n", | |
| "prep = CreateOPEInput(\n", | |
| " env=env,\n", | |
| " model_args={\n", | |
| " \"fqe\": {\n", | |
| " \"encoder_factory\": VectorEncoderFactory(hidden_units=[30, 30]),\n", | |
| " \"q_func_factory\": MeanQFunctionFactory(),\n", | |
| " \"learning_rate\": 1e-4,\n", | |
| " },\n", | |
| " },\n", | |
| " state_scaler=MinMaxObservationScaler(\n", | |
| " minimum=test_logged_dataset[\"state\"].min(axis=0),\n", | |
| " maximum=test_logged_dataset[\"state\"].max(axis=0),\n", | |
| " ),\n", | |
| " action_scaler=MinMaxActionScaler(\n", | |
| " minimum=env.action_space.low,\n", | |
| " maximum=env.action_space.high,\n", | |
| " ),\n", | |
| ")" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": { | |
| "id": "KYhPmsH9PLvZ" | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "input_dict = prep.obtain_whole_inputs(\n", | |
| " logged_dataset=test_logged_dataset,\n", | |
| " evaluation_policies=evaluation_policies,\n", | |
| " require_value_prediction=True,\n", | |
| " n_trajectories_on_policy_evaluation=100,\n", | |
| " random_state=random_state,\n", | |
| ")" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": { | |
| "id": "C1Tp2kuhPLvZ" | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "with open(\"logs/ope_input_dict_continuous.pkl\", \"wb\") as f:\n", | |
| " pickle.dump(input_dict, f)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": { | |
| "id": "6_y_CQsuPLvZ" | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "with open(\"logs/ope_input_dict_continuous.pkl\", \"rb\") as f:\n", | |
| " input_dict = pickle.load(f)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": { | |
| "id": "fHxQwHi-PLva", | |
| "outputId": "31f81c30-7f85-44c3-ae26-b91b3ca9b039" | |
| }, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "{'cql': {'evaluation_policy_action_dist': None,\n", | |
| " 'evaluation_policy_action': array([[ 0.7895372 , -0.79363215, -0.52138674],\n", | |
| " [ 0.8106339 , -0.33552885, -0.45466143],\n", | |
| " [ 0.78984964, -0.4607501 , 0.70200634],\n", | |
| " ...,\n", | |
| " [ 0.78719187, 0.18121517, -0.56885785],\n", | |
| " [ 0.78742146, 0.06306946, -0.48978412],\n", | |
| " [ 0.76593447, -0.43075836, 0.6505569 ]], dtype=float32),\n", | |
| " 'state_action_value_prediction': array([[4.30566072, 4.58573961],\n", | |
| " [4.97807884, 4.73458385],\n", | |
| " [4.75874472, 4.98025274],\n", | |
| " ...,\n", | |
| " [4.28577471, 4.6361475 ],\n", | |
| " [4.45088673, 4.58396673],\n", | |
| " [4.59209585, 4.74256086]]),\n", | |
| " 'initial_state_value_prediction': array([4.58573961, 4.65792894, 4.77657366, ..., 4.72337389, 4.84374475,\n", | |
| " 4.34953928]),\n", | |
| " 'state_action_marginal_importance_weight': None,\n", | |
| " 'state_marginal_importance_weight': None,\n", | |
| " 'on_policy_policy_value': array([5.74958172, 5.31987359, 5.48685406, 5.67917462, 5.116804 ,\n", | |
| " 5.67244663, 5.33136124, 5.08846073, 5.33374774, 5.52337794,\n", | |
| " 5.3665136 , 5.51723173, 5.21675983, 5.56649301, 5.66331608,\n", | |
| " 5.5020216 , 5.42224366, 5.36061777, 5.27333682, 5.34842719,\n", | |
| " 5.21663029, 5.50297997, 5.21280586, 5.29410713, 5.27231692,\n", | |
| " 5.32935076, 5.4187381 , 5.63229718, 5.39490127, 5.55270347,\n", | |
| " 5.35659077, 5.53594237, 5.09255133, 5.5723891 , 5.51750553,\n", | |
| " 5.5278357 , 5.4170849 , 5.40114623, 5.36637647, 5.53502923,\n", | |
| " 5.42176323, 5.4504927 , 5.48108056, 5.30647794, 5.11547507,\n", | |
| " 5.42704371, 5.48291705, 5.32882222, 5.55444547, 5.54054854,\n", | |
| " 5.59120766, 5.57179807, 5.37788577, 5.45202666, 5.652961 ,\n", | |
| " 5.16112705, 5.99347832, 5.21848124, 5.62500358, 5.7027091 ,\n", | |
| " 5.49142645, 5.41976854, 6.08446954, 5.48365786, 5.60331058,\n", | |
| " 5.75577116, 5.49147728, 5.38499021, 5.58039468, 5.44336472,\n", | |
| " 5.23734497, 5.45965116, 5.56531265, 4.95377563, 5.55036139,\n", | |
| " 5.50900376, 5.14605189, 5.20541641, 5.68976302, 5.66397365,\n", | |
| " 5.39175972, 5.3144299 , 5.49217746, 5.73677416, 5.53788389,\n", | |
| " 5.61985157, 5.49950872, 5.98476523, 5.97510753, 5.47228223,\n", | |
| " 5.21004315, 5.82224613, 5.43995411, 5.32581354, 5.20931119,\n", | |
| " 5.35452023, 5.76586113, 5.74633475, 5.20548451, 5.64406232]),\n", | |
| " 'gamma': 1.0,\n", | |
| " 'behavior_policy': 'sac_sigma_0.5',\n", | |
| " 'evaluation_policy': 'cql',\n", | |
| " 'dataset_id': 0},\n", | |
| " 'sac': {'evaluation_policy_action_dist': None,\n", | |
| " 'evaluation_policy_action': array([[ 0.9611497 , -0.97684574, -0.22405702],\n", | |
| " [ 0.96218014, -0.4036672 , -0.26055682],\n", | |
| " [ 0.9764993 , -0.67134833, 0.7849159 ],\n", | |
| " ...,\n", | |
| " [ 0.9841423 , 0.20341933, -0.631484 ],\n", | |
| " [ 0.9831486 , 0.02586651, -0.55481225],\n", | |
| " [ 0.9478135 , -0.28132623, 0.5369407 ]], dtype=float32),\n", | |
| " 'state_action_value_prediction': array([[5.31686211, 6.07998896],\n", | |
| " [5.91870594, 5.75539255],\n", | |
| " [5.59816265, 5.87946272],\n", | |
| " ...,\n", | |
| " [5.02844667, 5.45477772],\n", | |
| " [5.09789944, 5.41336918],\n", | |
| " [5.25617313, 5.42402124]]),\n", | |
| " 'initial_state_value_prediction': array([6.07998896, 5.42326832, 5.73191738, ..., 5.74739695, 5.92206669,\n", | |
| " 5.41095066]),\n", | |
| " 'state_action_marginal_importance_weight': None,\n", | |
| " 'state_marginal_importance_weight': None,\n", | |
| " 'on_policy_policy_value': array([6.09022037, 6.32040044, 6.63314716, 6.32587884, 5.94799035,\n", | |
| " 6.18751298, 6.70182178, 6.18631965, 5.94538534, 6.52917627,\n", | |
| " 6.51161632, 6.37259652, 5.62279331, 6.20060001, 6.72941676,\n", | |
| " 5.75506929, 6.18472014, 6.19029891, 6.18716371, 5.91147484,\n", | |
| " 6.05846759, 6.45905514, 5.6540668 , 5.83800332, 5.59527464,\n", | |
| " 5.63868089, 6.22684424, 6.46364278, 5.95472293, 6.54427809,\n", | |
| " 5.97328679, 6.46434761, 6.02378658, 6.3989872 , 6.30630791,\n", | |
| " 6.77377617, 6.42833196, 6.1274932 , 6.13344936, 6.28930782,\n", | |
| " 6.04073885, 6.25466379, 6.18562348, 6.64294738, 5.48437976,\n", | |
| " 6.20051981, 6.30738976, 6.03213259, 6.26023494, 6.4932229 ,\n", | |
| " 6.46970749, 6.41663935, 6.03184991, 5.73305688, 6.10182476,\n", | |
| " 5.86358585, 6.61050078, 6.04027827, 6.65348242, 6.37870681,\n", | |
| " 6.6875429 , 5.97847487, 6.63592013, 6.32216829, 6.56415138,\n", | |
| " 6.40538109, 6.46079024, 5.98343649, 5.73867663, 6.28519443,\n", | |
| " 6.10751007, 6.35279383, 6.50316469, 6.00166357, 6.78168563,\n", | |
| " 6.52767799, 5.8270543 , 5.64433012, 7.06787604, 6.32129163,\n", | |
| " 5.99241529, 6.47414793, 6.64510297, 6.45757072, 5.79394901,\n", | |
| " 6.69239703, 6.13964648, 6.502342 , 6.59521697, 6.25035521,\n", | |
| " 5.62877118, 6.63336862, 6.47385173, 5.94986879, 5.69937017,\n", | |
| " 5.94733121, 6.54736512, 6.19049303, 6.08320053, 6.65535394]),\n", | |
| " 'gamma': 1.0,\n", | |
| " 'behavior_policy': 'sac_sigma_0.5',\n", | |
| " 'evaluation_policy': 'sac',\n", | |
| " 'dataset_id': 0}}" | |
| ] | |
| }, | |
| "execution_count": 43, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "input_dict" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": { | |
| "id": "0_5C0irJPLva" | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "ope = OPE(\n", | |
| " logged_dataset=test_logged_dataset,\n", | |
| " ope_estimators=[DM(), TIS(), PDIS(), DR(), SNTIS(), SNPDIS(), SNDR()],\n", | |
| " action_scaler=MinMaxActionScaler(\n", | |
| " minimum=env.action_space.low,\n", | |
| " maximum=env.action_space.high,\n", | |
| " ),\n", | |
| " bandwidth=5.0,\n", | |
| ")" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": { | |
| "id": "UKKdncJXPLva" | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "# opeによる性能評価\n", | |
| "# 計算に時間がかかります(約15分)\n", | |
| "policy_value_df_dict, policy_value_interval_df_dict = ope.summarize_off_policy_estimates(input_dict, random_state=random_state)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": { | |
| "id": "0dnwxrEsPLva", | |
| "outputId": "f4b60c8e-af09-43c8-8421-773a9188a1df" | |
| }, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "{'cql': policy_value relative_policy_value\n", | |
| " on_policy 5.466111e+00 1.000000e+00\n", | |
| " dm 4.717382e+00 8.630235e-01\n", | |
| " tis 1.348137e+20 2.466355e+19\n", | |
| " pdis -2.820616e+20 -5.160188e+19\n", | |
| " dr -1.780842e+20 -3.257968e+19\n", | |
| " sntis 1.322637e+00 2.419705e-01\n", | |
| " snpdis -3.629344e-01 -6.639719e-02\n", | |
| " sndr 3.815478e+00 6.980243e-01,\n", | |
| " 'sac': policy_value relative_policy_value\n", | |
| " on_policy 6.236361e+00 1.000000e+00\n", | |
| " dm 5.716103e+00 9.165767e-01\n", | |
| " tis 1.235306e+20 1.980812e+19\n", | |
| " pdis -2.605517e+20 -4.177945e+19\n", | |
| " dr -3.265419e+20 -5.236096e+19\n", | |
| " sntis 1.322643e+00 2.120857e-01\n", | |
| " snpdis -3.612269e-01 -5.792271e-02\n", | |
| " sndr 4.322576e+00 6.931247e-01}" | |
| ] | |
| }, | |
| "execution_count": 46, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "# 推定した方策性能\n", | |
| "policy_value_df_dict" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": { | |
| "id": "EEFDeqMsPLva", | |
| "outputId": "a7cf95b1-1c7e-43ac-8546-56c798459f88" | |
| }, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "{'cql': mean 95.0% CI (lower) 95.0% CI (upper)\n", | |
| " on_policy 5.466634e+00 5.425790e+00 5.505745e+00\n", | |
| " dm 4.717618e+00 4.713465e+00 4.722355e+00\n", | |
| " tis 1.455944e+20 1.767848e+14 4.042672e+20\n", | |
| " pdis -3.046265e+20 -8.461850e+20 1.695091e+14\n", | |
| " dr -1.923214e+20 -5.338968e+20 -3.702428e+14\n", | |
| " sntis 1.428405e+00 1.734410e-06 3.966206e+00\n", | |
| " snpdis -2.624129e-01 -1.593248e+00 7.838554e-01\n", | |
| " sndr 3.190053e+00 -6.431012e+00 1.000763e+01,\n", | |
| " 'sac': mean 95.0% CI (lower) 95.0% CI (upper)\n", | |
| " on_policy 6.238561e+00 6.165749e+00 6.299698e+00\n", | |
| " dm 5.716434e+00 5.710103e+00 5.723485e+00\n", | |
| " tis 1.334089e+20 1.605203e+14 3.704296e+20\n", | |
| " pdis -2.813959e+20 -7.816554e+20 1.602881e+14\n", | |
| " dr -3.526548e+20 -9.792319e+20 -4.095352e+14\n", | |
| " sntis 1.428410e+00 1.718692e-06 3.966192e+00\n", | |
| " snpdis -2.605759e-01 -1.591601e+00 7.864232e-01\n", | |
| " sndr 3.744827e+00 -7.261544e+00 1.096623e+01}" | |
| ] | |
| }, | |
| "execution_count": 47, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "# 推定した方策性能の信頼区間\n", | |
| "policy_value_interval_df_dict" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": { | |
| "id": "_yU4WsuBPLva" | |
| }, | |
| "source": [ | |
| "## 4. オフ方策評価手法の評価\n", | |
| "オフ方策推定量がどの程度正確に方策価値を推定できているかを評価します." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": { | |
| "id": "tferlZyxPLva", | |
| "outputId": "ff3b1391-d0a0-4e8e-f88b-2e8a536438ff" | |
| }, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "image/png": "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AFAFIRkAAACogpAMAAAAVEFIBoAW7OjRo/rFL36hqKgoeXl5yc/PT507d9bEiRO1bNkyW7vS0lK99957uu+++9SrVy/5+/vL29tbPXv21O9+9zudPn261vewWq1auXKlJk2apLCwMHl6eiosLExxcXFauHChCgsLG+OjAoChTFar1erqIgAAxjt48KCGDBmivLw89ezZUzfeeKPc3d2Vnp6u1NRUde3aVfv375ckpaenq1OnTmrTpo1uuOEGderUSQUFBdq/f79Onz6tkJAQ7dixQ926dav0HqWlpbr77ru1cuVKubm5aeDAgYqKitL58+d1+PBhZWRk6MSJE4qMjGz8LwAAGsDD1QUAAJzjL3/5i/Ly8rRgwQLNnTu30rHCwkJ9++23tu02bdpo9erVGjdunDw9PW37S0tL9dxzz+mll17S73//e61bt67Sdf7rv/5LK1euVGRkpD755BP16dPHdsxqteo///mPAgMDnfQJAcB5GEkGgBZq4sSJ+uyzz7R3717FxMQ06FodOnTQmTNnlJubq9atW0uSzp07p06dOqmkpETJycnq16+fEWUDQJPASDIAtFADBw7UZ599pkceeUTz58/XsGHD1KpVqzrPOXDggL766iudOHFCBQUFKi8vlySVlZWpvLxcaWlptsD99ddfq6SkRP369SMgA2hxCMkA0EI9+eST2rZtmzZu3Khx48bJbDarT58+Gjp0qO6++24NGDDA1ragoEAPPPCAVq1aVec18/LybK9//PFHSVKvXr2c8wEAwIVY3QIAWigfHx99+eWX2r17t55//nmNHDlSP/zwg/7yl79o4MCBmj17tq3t008/rVWrVqlXr1765JNPlJGRoeLiYlmtVlmtVt16662SrswzBoDrASPJANDCDRgwwDZqXFZWpk8++UQPPviglixZoqlTp2rEiBFasWKFJCkxMVG9e/eudo2jR49W2xcRESFJOnLkiBOrBwDXYCQZAK4jHh4emjp1qsaOHStJtiXgsrOzJUmdO3euds4XX3yh8+fPV9t/2223ydPTU3v27NHevXudVzQAuAAhGQBaqCVLluj777+vtv/MmTNKTk6W9P9C8Q033CBJ+tvf/lap7ffff6/f/OY3NV4/NDRUjzzyiCTpzjvv1MGDBysdr1gC7uLFiw37IADgAiwBBwAtVN++fXXgwAFFRUXppptu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QkIa9gFQq7CwMFeXgBaE/gSj0afQUAUFBbbX7dq1syvHwDkaHJL/+c9/qm/fvrr//vvl6empvLw8vf766/rHP/6hl156yYga62XHjh1KTEzUbbfdpjFjxjh8ncmTJ+urr75SampqrSE5ISFBkyZNsm1X/LaXlZWlsrIyh98b1ZlMJoWFhenMmTOyWq2uLgfNHP0JRqNPwSgWi8X2+uzZs7a/UMM4Hh4edg1o2h2Sly5dqnvvvVd+fn6V9mdmZuqBBx6wrUfs7++vgQMH6sMPP6xnyQ2XkpKiRYsWKSYmRg8//HCDrlXx5MD8/Pxa25jNZpnN5hqP8UPSOaxWK98tDEN/gtHoU2ioq/sP/cm17F7dIicnR7/97W/12Wefqby83LY/Ojpa7777rr777judOXNGe/bs0bp16xQdHe2Ugmtz9OhRvfrqq+ratasee+yxBs+JPnv2rKQroR8AAADXF7tHkp966int379f77zzjr788ks99NBD6tu3r2bOnKl//vOfeuGFF3T58mW5ublpwIABmjlzpjPrriQ9PV0vv/yyQkND9dRTT9X5lL2MjAx5eXkpODhY0pU/a1QdEbZarVq5cqWkK0/dAwAAwPWlXnOS+/btq969e+vzzz/XG2+8oR49emj69On63e9+p0cffVSXLl1S69at5eZm3PLL69evV0FBgXJyciRJycnJunDhgiRp/PjxMplMevHFF5Wfn6/Jkydr7969lc4PCwurNKd4zpw5io6O1rx58yRJJ06c0BtvvKEhQ4YoLCxMJSUl2r17t77//nuNGjVKXbp0MeyzAAAAoHmo9417bm5umjhxouLj4/XBBx/oySef1JgxY3TnnXeqTZs2hhe4du1aZWVl2bZ3796t3bt3S5Li4+MlyRaaly9fXu38YcOG1XrjnSSFhISoV69e2r17t3Jzc+Xm5qYOHTro4Ycf1qhRo4z8KAAAAGgmTNZ6zggvKytTSUmJfHx8JEknT57UsmXLdPr0ad11110aOXLkdb+mX1ZWVqX1k9FwJpNJ4eHhyszM5CYGNBj9CUajT8EoFotF3bt3lySlpaWxuoUTmM1mY1e3yMnJ0d///nelpKTIarUqLCxMv/71rxUdHa358+drx44deu+997RhwwZNnz690W/cAwAAAIxi9+ThpUuXKisrS88++6xeeeUVRUZG6s9//rOKi4slSbGxsXr99dfVv39/vfTSS/rLX/7itKIBAAAAZ7I7JH/33XeaMGGCoqOj1blzZ913333Kz89Xenq6rY2np6emTZum11577bqfcgEAAIDmy+6QHBgYqKNHj9q2K14HBARUaxscHKw5c+Y0vDoAAADABeyek3zPPffojTfe0JEjR+Tr66vjx49r/PjxtifTAQAAAC2F3SF54MCBeu2113TgwAGVlJTooYceUq9evZxZGwAAAOAS9VonOTQ0VKNHj3ZWLQAAAECTUO+HidQkOztb+fn58vf3r3GOMgAAANCc2B2Sd+zYoR49eig4ONi2b9++fXrnnXd0+vRp277IyEhNnz5dN9xwg7GVAgAAAI3E7tUtKm7aq5CSkqKFCxeqoKBAt99+u375y19q4sSJysrK0oIFC3Ty5Eln1AsAAAA4ncPTLT744AMFBQVp4cKF8vPzs+2fNGmSnnzySa1cuVKPPfaYIUUCAAAAjcnukeSrlZWV6fjx45o0aVKlgCxJbdu21ahRo/Tdd98ZUiAAAADQ2BwKyZcvX5YktWvXrsbjoaGhKigocLwqAAAAwIXqNd1i7969ys3NlSS1atVK2dnZNbbLycmRr69vg4sDAAAAXKFeIXn79u3avn27bXv37t0aNWpUtXapqanq2LFjw6sDAAAAXMDukLxo0aJq+0wmU7V9eXl5ateunfr27dugwgAAAABXsTskh4SE2NXO399fs2bNcrggAAAAwNUcunEPAAAAaMnqvU7y3r17tX37dh0/flzZ2dkqKSlRq1at1L59e918880aPXq0goKCnFErAAAA0CjsDsnFxcX685//rAMHDlTa7+7urvbt2+v8+fNatWqVPvvsM/3qV79SXFyc4cUCAAAAjcHukJyYmKjU1FTNmDFDQ4YMkZeXlw4fPqy33npL0dHRuu+++5Senq733ntPixYtUtu2bRUdHe3M2gEAAACnsHtO8o4dOzR27FiNGzdOrVu3lqenp/r27auZM2fq008/1cWLF9WxY0c99dRT6tq1q1auXOnMugEAAACnsTskX7p0qca1jzt27Kjy8nJlZmZKurIsXFxcnNLS0oyrEgAAAGhEdofk0NBQHTx4sNr+Q4cOSZICAgJs+9zd3WW1WhteHQAAAOACds9JHjt2rJYtWyZPT0/FxsbK09NTR44c0erVq9WrVy+FhYXZ2p48ebLS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", | |
| "text/plain": [ | |
| "<Figure size 800x800 with 2 Axes>" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| } | |
| ], | |
| "source": [ | |
| "# opeの結果の比較・可視化\n", | |
| "# 多くのオフライン指標が方策価値を過小評価しています\n", | |
| "# これはオフラインデータが, 評価方策が取りうるデータを十分にカバーできていないことが原因です\n", | |
| "\n", | |
| "ope.visualize_off_policy_estimates(\n", | |
| " input_dict,\n", | |
| " compared_estimators=[\"dm\", \"sntis\", \"snpdis\", \"sndr\"],\n", | |
| " random_state=random_state,\n", | |
| " sharey=True,\n", | |
| ")" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": { | |
| "id": "leeDs-2XPLva", | |
| "outputId": "b23ce996-f978-4254-bd61-d192a0fcdc52" | |
| }, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<div>\n", | |
| "<style scoped>\n", | |
| " .dataframe tbody tr th:only-of-type {\n", | |
| " vertical-align: middle;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe tbody tr th {\n", | |
| " vertical-align: top;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe thead th {\n", | |
| " text-align: right;\n", | |
| " }\n", | |
| "</style>\n", | |
| "<table border=\"1\" class=\"dataframe\">\n", | |
| " <thead>\n", | |
| " <tr style=\"text-align: right;\">\n", | |
| " <th></th>\n", | |
| " <th>cql</th>\n", | |
| " <th>sac</th>\n", | |
| " </tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr>\n", | |
| " <th>dm</th>\n", | |
| " <td>5.605949e-01</td>\n", | |
| " <td>2.706679e-01</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>tis</th>\n", | |
| " <td>1.817473e+40</td>\n", | |
| " <td>1.525981e+40</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>pdis</th>\n", | |
| " <td>7.955874e+40</td>\n", | |
| " <td>6.788720e+40</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>dr</th>\n", | |
| " <td>3.171398e+40</td>\n", | |
| " <td>1.066296e+41</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>sntis</th>\n", | |
| " <td>1.716838e+01</td>\n", | |
| " <td>2.414463e+01</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>snpdis</th>\n", | |
| " <td>3.397777e+01</td>\n", | |
| " <td>4.352817e+01</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>sndr</th>\n", | |
| " <td>2.724589e+00</td>\n", | |
| " <td>3.662573e+00</td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "</div>" | |
| ], | |
| "text/plain": [ | |
| " cql sac\n", | |
| "dm 5.605949e-01 2.706679e-01\n", | |
| "tis 1.817473e+40 1.525981e+40\n", | |
| "pdis 7.955874e+40 6.788720e+40\n", | |
| "dr 3.171398e+40 1.066296e+41\n", | |
| "sntis 1.716838e+01 2.414463e+01\n", | |
| "snpdis 3.397777e+01 4.352817e+01\n", | |
| "sndr 2.724589e+00 3.662573e+00" | |
| ] | |
| }, | |
| "execution_count": 49, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "# OPEの推定の正確さを測るために2乗誤差を利用します\n", | |
| "eval_metric_ope_df = ope.evaluate_performance_of_ope_estimators(\n", | |
| " input_dict,\n", | |
| " metric=\"se\",\n", | |
| " return_by_dataframe=True,\n", | |
| ")\n", | |
| "eval_metric_ope_df" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": { | |
| "id": "mQhh3C4APLva" | |
| }, | |
| "source": [ | |
| "OPEのより発展的なトピック(累積分布関数の推定など) やオフ方策選択 (OPS) は,[examples/quickstart_ja/basic/basic_synthetic_continuous_advanced_ja.ipynb](https://github.com/hakuhodo-technologies/scope-rl/blob/main/examples/quickstart_ja/basic/basic_synthetic_continuous_advanced_ja.ipynb)を参照してください.\n", | |
| "\n", | |
| "OPEのより発展的な推定量 (state(-action) marginal estimators や double reinforcement learningなど) は[examples/quickstart_ja/basic/basic_synthetic_continuous_zoo_ja.ipynb](https://github.com/hakuhodo-technologies/scope-rl/blob/main/examples/quickstart_ja/basic/basic_synthetic_continuous_zoo_ja.ipynb)を参照してください.\n", | |
| "\n", | |
| "離散的な行動空間に対する例は[examples/quickstart_ja/basic/basic_synthetic_discrete_basic_ja.ipynb](https://github.com/hakuhodo-technologies/scope-rl/blob/main/examples/quickstart_ja/basic/basic_synthetic_discrete_basic_ja.ipynb)を参照してください." | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": { | |
| "id": "aCcU2xn0PLva" | |
| }, | |
| "source": [ | |
| "## 参考文献\n", | |
| "\n", | |
| "- Haanvid Lee, Jongmin Lee, Yunseon Choi, Wonseok Jeon, Byung-Jun Lee, Yung-Kyun Noh, and Kee-Eung Kim. \\\n", | |
| "\"Local Metric Learning for Off-Policy Evaluation in Contextual Bandits with Continuous Actions.\", 2022.\n", | |
| "\n", | |
| "- Yuta Saito, Shunsuke Aihara, Megumi Matsutani, and Yusuke Narita. \\\n", | |
| "\"Open Bandit Dataset and Pipeline: Towards Realistic and Reproducible Off-Policy Evaluation.\", 2021.\n", | |
| "\n", | |
| "- Takuma Seno and Michita Imai. \\\n", | |
| "\"d3rlpy: An Offline Deep Reinforcement Library.\", 2021.\n", | |
| "\n", | |
| "- Sergey Levine, Aviral Kumar, George Tucker, and Justin Fu. \\\n", | |
| "\"Offline Reinforcement Learning: Tutorial, Review, and Perspectives on Open Problems.\" 2020.\n", | |
| "\n", | |
| "- Aviral Kumar, Aurick Zhou, George Tucker, and Sergey Levine. \\\n", | |
| "\"Conservative Q-Learning for Offline Reinforcement Learning.\", 2020.\n", | |
| "\n", | |
| "- Nathan Kallus and Angela Zhou. \\\n", | |
| "\"Policy Evaluation and Optimization with Continuous Treatments.\", 2019.\n", | |
| "\n", | |
| "- Nathan Kallus and Masatoshi Uehara. \\\n", | |
| "\"Intrinsically Efficient, Stable, and Bounded Off-Policy Evaluation for Reinforcement Learning.\", 2019.\n", | |
| "\n", | |
| "- Hoang Le, Cameron Voloshin, and Yisong Yue. \\\n", | |
| "\"Batch Policy Learning under Constraints.\", 2019.\n", | |
| "\n", | |
| "- Tuomas Haarnoja, Aurick Zhou, Pieter Abbeel, and Sergey Levine. \\\n", | |
| "\"Soft Actor-Critic: Off-Policy Maximum Entropy Deep Reinforcement Learning with a Stochastic Actor.\" 2018.\n", | |
| "\n", | |
| "- Di Wu, Xiujun Chen, Xun Yang, Hao Wang, Qing Tan, Xiaoxun Zhang, Jian Xu, and Kun Gai. \\\n", | |
| "\"Budget Constrained Bidding by Model-free Reinforcement Learning in Display Advertising.\", 2018.\n", | |
| "\n", | |
| "- Jun Zhao, Guang Qiu, Ziyu Guan, Wei Zhao, and Xiaofei He. \\\n", | |
| "\"Deep Reinforcement Learning for Sponsored Search Real-time Bidding.\", 2018.\n", | |
| "\n", | |
| "- Nan Jiang and Lihong Li. \\\n", | |
| "\"Doubly Robust Off-policy Value Evaluation for Reinforcement Learning.\", 2016.\n", | |
| "\n", | |
| "- Philip S. Thomas and Emma Brunskill. \\\n", | |
| "\"Data-Efficient Off-Policy Policy Evaluation for Reinforcement Learning.\", 2016.\n", | |
| "\n", | |
| "- Greg Brockman, Vicki Cheung, Ludwig Pettersson, Jonas Schneider, John Schulman, Jie Tang, and Wojciech Zaremba. \\\n", | |
| "\"OpenAI Gym.\", 2016.\n", | |
| "\n", | |
| "- Adith Swaminathan and Thorsten Joachims. \\\n", | |
| "\"The Self-Normalized Estimator for Counterfactual Learning.\", 2015.\n", | |
| "\n", | |
| "- Miroslav Dudík, Dumitru Erhan, John Langford, and Lihong Li. \\\n", | |
| "\"Doubly Robust Policy Evaluation and Optimization.\", 2014.\n", | |
| "\n", | |
| "- Alex Strehl, John Langford, Sham Kakade, and Lihong Li. \\\n", | |
| "\"Learning from Logged Implicit Exploration Data.\", 2010.\n", | |
| "\n", | |
| "- Alina Beygelzimer and John Langford. \\\n", | |
| "\"The Offset Tree for Learning with Partial Labels.\", 2009.\n", | |
| "\n", | |
| "- Doina Precup, Richard S. Sutton, and Satinder P. Singh. \\\n", | |
| "\"Eligibility Traces for Off-Policy Policy Evaluation.\", 2000." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": { | |
| "id": "UvckNFq5PLva" | |
| }, | |
| "outputs": [], | |
| "source": [] | |
| } | |
| ], | |
| "metadata": { | |
| "kernelspec": { | |
| "display_name": "Python 3 (ipykernel)", | |
| "language": "python", | |
| "name": "python3" | |
| }, | |
| "language_info": { | |
| "codemirror_mode": { | |
| "name": "ipython", | |
| "version": 3 | |
| }, | |
| "file_extension": ".py", | |
| "mimetype": "text/x-python", | |
| "name": "python", | |
| "nbconvert_exporter": "python", | |
| "pygments_lexer": "ipython3", | |
| "version": "3.9.6" | |
| }, | |
| "vscode": { | |
| "interpreter": { | |
| "hash": "70404ee114725fce8ed9e697d67827f8546c678889944e6d695790702cbfe1f5" | |
| } | |
| }, | |
| "colab": { | |
| "provenance": [], | |
| "include_colab_link": true | |
| } | |
| }, | |
| "nbformat": 4, | |
| "nbformat_minor": 0 | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment