Amazon Web Services ブログ

Amazon SageMaker 強化学習を使用したバッチ強化学習ポリシーのトレーニング



Amazon SageMaker は、開発者やデータサイエンティストがあらゆる規模の機械学習 (ML) モデルを迅速かつ簡単に構築、トレーニング、デプロイできるようにする完全マネージド型サービスです。教師ありおよび教師なし学習手法をより一般的に使用した機械学習モデルの構築に加えて、Amazon SageMaker 強化学習を使用して強化学習 (RL) モデルを構築することもできます。

Amazon SageMaker 強化学習には、強化学習の開始を容易にする、事前に構築された強化学習ライブラリとアルゴリズムが含まれています。詳細については、Amazon SageMaker 強化学習 – Amazon SageMaker での管理強化学習を参照してください。Amazon SageMaker 強化学習を使用すると、AWS RoboMakerOpen AI Gym、オープンソース環境、強化学習モデルをトレーニングするためのカスタムビルド環境など、さまざまなシミュレーション環境と簡単に統合できます。また、Open AI Gym、Intel Coach、および Berkeley Ray RLLib を含む Amazon 強化学習コンテナ (MXNet および TensorFlow) を使用することもできます。

この記事では、Amazon SageMaker 強化学習を使用してバッチ強化学習 (バッチ RL) の実装方法を示しています。ここでは、学習経験量の全部 (通常、システムからサンプリングされた一連の移行) が事前に提供されます。この手法では、以前のポリシーから一連の状態とアクション移行を収集し、それらを使用して、環境と相互作用せずに新しい強化学習ポリシーをトレーニングする必要があります。

この記事では、Amazon SageMaker 強化学習を使用して、初期ランダムポリシーからオフラインデータを収集し、オフラインデータで強化学習ポリシーをトレーニングし、トレーニング済みのポリシーからアクション予測を取得する方法を示しています。この方法は、次の強化学習ポリシートレーニングのオフラインデータを収集するために使用できます。

バッチ強化学習

強化学習は、ポートフォリオ管理、エネルギー最適化、ロボット工学など、複数のドメインにわたる問題を解決するのに有用です。強化学習は、存在するトレーニングデータに依存しない機械学習のカテゴリです。代わりに、強化学習で、学習エージェントは環境 (実際またはシミュレート) と相互作用し、実行するアクションの最適なシーケンスを提供するポリシーを学習します。エージェントが学習するポリシーは、各アクションが受け取る報酬またはペナルティに基づいています。

ただし、実際の多くの問題では、強化学習エージェントは、デプロイされたポリシーが生成した履歴データから学習する必要があります。たとえば、ゲームをプレイしている専門家の履歴データ、ウェブサイトを操作するユーザー、またはコントロールシステムからのセンサーデータが存在する場合があります。このデータを入力として使用して、デプロイされた既存のポリシーの結果として履歴データを扱うことにより、新しく改善された強化学習ポリシーをトレーニングできます。

この強化学習へのアプローチはバッチ強化学習と呼ばれ、学習エージェントは固定されたオフラインデータセットサンプルのバッチから改善されたポリシーを導き出します。詳細については、書籍『強化学習: 最先端』から「バッチ強化学習」の章を参照してください。

この記事には、バッチ強化学習を使用して、以前にデプロイされたポリシーの予測で作成されたオフラインデータセットから新しいポリシーをトレーニングする方法の例が記載されたノートブックが含まれています。詳細については、GitHub リポジトリを参照してください。

以前にデプロイされたモデルからオフラインデータセットを作成するために、この記事では Amazon SageMaker バッチ変換を使用します。これは、大規模なデータセットの推論を生成するための Amazon SageMaker の高性能かつ高スループットの機能です。バッチ変換の推論と環境の報酬を収集して、バッチ強化学習でより良いポリシーをトレーニングできます。詳細については、バッチ変換を使用したデータセット全体の推論を取得するを参照してください。

Amazon SageMaker 強化学習のバッチ強化学習

この記事では、CartPole バランシング問題にバッチ強化学習を適用しています。この問題では、非作動結合が、干渉のないトラックに沿って移動するカートにポールを取り付けます。

まず、カートとポールのバランス問題を次の強化学習用語で定式にする必要があります。

  1. 目的 – ポールが倒れないようにする
  2. 環境 – この記事で使用する環境は OpenAI Gym の一部である
  3. 状態 – カートの位置、カートの速度、ポールの角度、ポール先端の速度
  4. アクション – カートを左右に押す
  5. 報酬 – 終了ステップを含め、実行されたすべてのステップに対して 1

詳細については、Amazon SageMaker で強化学習を使用するを参照してください。

高レベルでは、バッチ強化学習の実装に次の手順が含まれます。

  1. 初期ポリシーをシミュレートし、このポリシーからデータを収集する
  2. シミュレーターと相互作用せずに、初期ポリシーのオフラインデータを使用して強化学習ポリシーをトレーニングします。
  3. トレーニングされた強化学習ポリシーのパフォーマンスを視覚化して評価する
  4. Amazon SageMaker バッチ変換を使用して、トレーニング済みの強化学習ポリシーからバッチ推論を行う

これらの手順は、Amazon SageMaker でのバッチ強化学習実装の固有のものです。他には、ライブラリのインポート、アクセス許可の設定、およびこの記事で説明していないその他の機能に必要な手順があります。詳細については、GitHub リポジトリを参照してください。

ランダムポリシーのシミュレーションとデータの収集

バッチ強化学習トレーニングの場合、以前にデプロイされたポリシーによって生成されたデータのバッチをシミュレートする必要があります。実際の使用例では、既存のポリシーを使用してライブ環境と相互作用することにより、ポリシー外のデータを収集できます。この記事では、OpenAI Gym Cartpole-v0 を環境として使用してライブ環境を模倣し、アクションの一様分布を使用したランダムポリシーを使って、デプロイされたエージェントを模倣します。

次の手順を完了してください。

  1. Cartpole-v0 の環境を 100 種作成し、それぞれから 5 つのデータエピソードを収集します。次のコードを参照してください。
    # ロールアウトデータを収集するために 100 の環境を開始する
    NUM_ENVS = 100
    NUM_EPISODES = 5
    vectored_envs = VectoredGymEnvironment('CartPole-v0', NUM_ENVS)

    これにより、トレーニングに合計 500 エピソードが提供されます。複数の環境を同時に操作することで、環境からより多くの軌道を収集できます。

  2. すべての状態機能に対して一様なアクション確率を持つランダムポリシーから開始します。次のコードを参照してください。
    # アクション確率を一様分布として設定することにより、ランダムなポリシーを開始します 
    action_probs = [[1/2, 1/2] for _ in range(NUM_ENVS)]
    df = vectored_envs.collect_rollouts_with_given_action_probs(action_probs=action_probs, num_episodes=NUM_EPISODES)
    
    # ロールアウトデータフレームには、action、all_action_probabilities、episode_id、reward、cumulative_rewards、state_features の属性が含まれます。
    df.head()
    
    # 各エピソードの平均累積報酬
    avg_rewards = df['cumulative_rewards’].sum() / (NUM_ENVS * NUM_EPISODES)
    print(‘Average cumulative rewards over {} episodes rollouts was {}.”.format((NUM_ENVS * NUM_EPISODES), avg_rewards))

    500 エピソードの平均累積報酬は 22.22 です

  1. データフレームを CSV ファイルとして保存して、後で使用します。次のコードを参照してください。
    # データフレームを csv ファイルとしてダンプする
    df.to_csv("src/cartpole_dataset.csv", index=False)

オフラインデータを使用した強化学習ポリシーのトレーニング

これでオフラインデータを取得し、そのデータを使用して強化学習ポリシーをトレーニングできます。

この記事では、ダブル Q ラーニングを使用した深層強化学習 (DDQN) アルゴリズムを使用して、ポリシー外の方法でポリシーを更新します。詳細については、ArXiv のダブル Q ラーニングを使用した深層強化学習を参照してください。バッチ制約付きの深層 Q ラーニング BCQ アルゴリズムと組み合わせて、見えない状態アクションペアの不正確な推定値によって引き起こされるエラーに対処します。トレーニングは完全にオフライン状態です。DDQN は強化学習の従来の Q ラーニングにおける潜在的な過大評価問題に対処していますが、BCQ は、推定エラーを軽減するアクションが制限されている特定のデータセットの改善されたポリシーを学習するように設計されています。データセットにはアルゴリズムの探索による相互作用が必要です。これにより、有用な情報を学習できます。  詳細については、研究論文探索なしのポリシー外の深層強化学習を参照してください。

強化学習パラメータは、preset-cartpole-ddqnbcq.py でキャプチャされます。プリセットファイルを使用して、エージェントパラメータを定義し、特定のエージェントアルゴリズムを選択できます。スケジュールパラメータ、オフラインデータセットパラメータ、および視覚化パラメータも定義できます。このプリセットファイルでは、環境のパラメータを設定せずに BatchRLGraphManager を使用します。次のコードを参照してください。

agent_params = DDQNBCQAgentParameters() 
agent_params.network_wrappers['main'].batch_size = 128
agent_params.algorithm.num_steps_between_copying_online_weights_to_target = TrainingSteps(50)
agent_params.algorithm.discount = 0.99

DATATSET_PATH = 'cartpole_dataset.csv' 
agent_params.memory = EpisodicExperienceReplayParameters() agent_params.memory.load_memory_from_file_path =     CsvDataset(DATATSET_PATH, is_episodic = True)  
            spaces = SpacesDefinition(state=StateSpace({'observation':VectorObservationSpace(shape=4)}),                          
goal=None,                          
action=DiscreteActionSpace(2),                          
reward=RewardSpace(1))

graph_manager = BatchRLGraphManager(agent_params=agent_params,
    env_params=None,
    spaces_definition=spaces,
    schedule_params=schedule_params,
    vis_params=vis_params,
    reward_model_num_epochs=30,
    train_to_eval_ratio=0.4,
    preset_validation_params=preset_validation_params)

Amazon SageMaker 強化学習 RLEstimator オブジェクトを使用して、トレーニングコードを提供するスクリプト train-coach.py をポイントします。詳細については、GitHub リポジトリを参照してください。この記事では、Amazon SageMaker スクリプトモードを使用します。これにより、ローカル環境 (ラップトップや Amazon SageMaker ノートブックなど) で開発するトレーニングスクリプトをカスタマイズできます。詳細については、Amazon SageMaker スクリプトモードでの TensorFlow Eager Execution の使用を参照してください。

インスタンスタイプは、local_mode のセットアップに基づいて変更されます。Amazon SageMaker ノートブックインスタンスでは、ローカルモードを使用して強化学習モデルをトレーニングできます。ローカルモードでは、ノートブックインスタンスで直接起動されたコンテナのポリシーをトレーニングし、反復テストとデバッグを高速化します。詳細については、Amazon SageMaker ローカルモードを使用してノートブックインスタンスでトレーニングするを参照してください。Amazon SageMaker では、1 行のコードを変更するだけで、ローカルトレーニングと分散型のマネージドトレーニングをシームレスに切り替えることができます。次のコードを参照してください。

%%time

if local_mode:
    instance_type = 'local'
else:
    instance_type = "ml.m4.xlarge"
        
estimator = RLEstimator(entry_point="train-coach.py",
                        source_dir='src',
                        dependencies=["common/sagemaker_rl"],
                        image_name=image,
                        role=role,
                        train_instance_type=instance_type,
                        train_instance_count=1,
                        output_path=s3_output_path,
                        base_job_name=job_name_prefix,
                        hyperparameters = {
                          "RLCOACH_PRESET": "preset-cartpole-ddqnbcq",
                          "save_model": 1
                        }
                    )
estimator.fit()

次のコードで中間トレーニング出力とモデルチェックポイントを保存します。

job_name=estimator._current_job_name
print("Job name: {}".format(job_name))

s3_url = "s3://{}/{}".format(s3_bucket,job_name)

if local_mode:
    output_tar_key = "{}/output.tar.gz".format(job_name)
else:
    output_tar_key = "{}/output/output.tar.gz".format(job_name)

intermediate_folder_key = "{}/output/intermediate/".format(job_name)
output_url = "s3://{}/{}".format(s3_bucket, output_tar_key)
intermediate_url = "s3://{}/{}".format(s3_bucket, intermediate_folder_key)

print("S3 job path: {}".format(s3_url))
print("Output.tar.gz location: {}".format(output_url))
print("Intermediate folder path: {}".format(intermediate_url))
    
tmp_dir = "/tmp/{}".format(job_name)
os.system("mkdir {}".format(tmp_dir))
print("Create local folder {}".format(tmp_dir))

トレーニングジョブのメトリックを視覚化できるようになりました。中間結果を使用してトレーニングのポリシー外評価 (OPE) メトリックを引き出し、そのメトリックをプロットして、時間の経過によるモデルのパフォーマンスを確認します。

一連のメソッドを使用して、シミュレーターまたはライブ環境と相互作用することなく、現在のトレーニング済みポリシーのパフォーマンスを調査できます。これらを使用して、他のポリシーから収集されたデータセットに基づいてポリシーの有効性を推定できます。次のコードでは、加重重要度サンプリング (WIS) と順次二重ロバスト (SDR) の 2 つの OPE メトリックを使用しています。

%matplotlib inline
import pandas as pd
import matplotlib.pyplot as plt

csv_file_name = "worker_0.batch_rl_graph.main_level.main_level.agent_0.csv"
key = os.path.join(intermediate_folder_key, csv_file_name)
wait_for_s3_object(s3_bucket, key, tmp_dir, training_job_name=job_name)

csv_file = "{}/{}".format(tmp_dir, csv_file_name)
df = pd.read_csv(csv_file)
df = df.dropna(subset=['Sequential Doubly Robust'])
df.dropna(subset=['Weighted Importance Sampling'])
    
plt.figure(figsize=(12,5))
plt.xlabel('Number of epochs')

ax1 = df['Weighted Importance Sampling'].plot(color='blue', grid=True, label='WIS')
ax2 = df['Sequential Doubly Robust'].plot(color='red', grid=True, secondary_y=True, label='SDR')

h1, l1 = ax1.get_legend_handles_labels()
h2, l2 = ax2.get_legend_handles_labels()

plt.legend(h1+h2, l1+l2, loc=1)
plt.show()

次のグラフは、学習エージェントが指定されたデータセットに対して複数のエポックを繰り返したことで、これらのメトリックが改善されたことを示しています。

強化学習ポリシーのパフォーマンスの評価

オフラインデータでトレーニングされたモデルを評価するには、環境と相互作用して、エージェントの累積報酬を確認する必要があります。最後のチェックポイントモデルを使用して、強化学習エージェントの評価を実行します。以前にトレーニングされたモデルからのチェックポイントデータは、チェックポイントチャネルでの評価と推論のために渡されます。次のコードを参照してください。

estimator_eval = RLEstimator(entry_point="evaluate-coach.py",
                        source_dir='src',
                        dependencies=["common/sagemaker_rl"],
                        image_name=image,
                        role=role,
                        train_instance_type=instance_type,
                        train_instance_count=1,
                        output_path=s3_output_path,
                        base_job_name=job_name_prefix,
                        hyperparameters = {
                             "RLCOACH_PRESET": " preset-cartpole-ddqnbcq-env",
                             "evaluate_steps": 1000
                        }
                    )

estimator_eval.fit({'checkpoint': checkpoint_path})

次のスクリーンショットは、エージェントの合計報酬が 195.33 であることを示しています。

これをランダムポリシーで達成された累積報酬 22.22 と比べると、オフラインデータを使用してトレーニングした強化学習ポリシーの改善具合を確認できます。収集されたデータセットがランダムであるため、ノートブックを実行する時の正確な報酬値は異なる場合があります。

Amazon SageMaker バッチ変換を使用してバッチ推論を行う

強化学習ポリシーをトレーニングした後、バッチ変換を使用できます。バッチ変換では、一連の入力状態機能を提供し、高いスループットで推論を取得します。推論と結果の環境報酬を使用して、次のバッチ強化学習ポリシートレーニングのためにオフラインデータを準備できます。

次のコードでは、環境の状態をバッチ変換の入力として使用しています。

transformer = model.transformer(instance_count=1, instance_type=instance_type, output_path=batch_output, assemble_with = 'Line', accept = 'application/jsonlines', strategy='SingleRecord')

transformer.transform(data=batch_input, data_type='S3Prefix', content_type='application/jsonlines', split_type='Line', join_source='Input')

transformer.wait()

本番環境でバッチ変換推論を使用して、次の強化学習ポリシーをトレーニングする方法を確認できます。この記事では、シミュレーション環境を使用して、ランダムポリシーのロールアウトデータを収集します。更新されたポリシーがデプロイするのに十分であると想定すると、バッチ変換を使用してこのポリシーからロールアウトデータを収集できます。処理には次の手順が含まれます。

  1. バッチ変換を使用して、タイムステップ t でライブ環境から観測機能を提供し、アクション予測を取得します。
  2. デプロイされたエージェントは、タイムステップ t で環境 (シミュレーターまたは現実) に対して勧められたアクションを実行します。
  3. 環境は、タイムステップ t+1 の新しい観測機能と報酬を返します。
  4. タイムステップ t+1 でバッチ変換を使用してアクション予測を取得する段階に戻ります。

この反復手順により、エピソード全体をカバーできる一連のデータを収集できます。データが十分な場合、そのデータを使用してバッチ強化学習トレーニングを再び開始できます。

まとめ

この記事では、Amazon SageMaker 強化学習でバッチ強化学習を実装するための詳細な手順を示しました。この記事では、CartPole の簡単なゲームを使用して、関連するさまざまな手順について詳しく説明していますが、適切な変更を行って、これらの手順を他の問題に適用することもできます。さらに、GitHub リポジトリの最終ソリューションでは、バッチ強化学習ポリシーのトレーニング方法を示しています。この記事では、バッチ変換機能を使用してポリシー外のデータを収集し、そのデータを使用して将来の強化学習ポリシーをトレーニングする方法も示しました。バッチ変換を使用して、数百万のユーザーコンテキストからロールアウトデータを効率的かつ同時に収集し、収集したロールアウトデータを使用してより良いポリシーをトレーニングできます。

CartPole 問題にバッチ強化学習を使用する方法を見てみたので、以前にデプロイされたポリシーから収集されたデータを使用して新しいポリシーをトレーニングする必要がある、他の強化学習問題にこの手法を適用できます。たとえば、電子メールキャンペーンで、各電子メールユーザーは、デプロイされたポリシーと相互作用する独立したエピソードです。この記事で使用されている手法を新しい問題に適用し、すばやく反復して、Amazon SageMaker が管理するクラスターで大規模のトレーニングとデプロイを行えます。

バッチ強化学習をお試しいただいてから、ご意見やご質問をコメントにお寄せください。


著者について

Sireesha Muppala は、AWS の AI/機械学習スペシャリストソリューションアーキテクトであり、大規模な機械学習ソリューションの設計と実装に関するガイダンスをお客様に提供しています。彼女はコロラド大学コロラドスプリングス校でコンピュータサイエンスの博士号を取得しました。Sireesha は、余暇にはコロラドの小道を走ったりハイキングしたりするのを楽しんでいます。

 

 

 

Yijie Zhuang は AWS SageMaker のソフトウェアエンジニアです。彼はデューク大学でコンピューター工学の修士号を取得しました。彼は、スケーラブルなアルゴリズムと強化学習システムの構築に関心を持っています。彼は Amazon SageMaker 組み込みアルゴリズムと Amazon SageMaker 強化学習に貢献しました。

 

 

 

Anna Luo は AWS のアプライドサイエンティストです。彼女は、サプライチェーンや推奨システムなど、さまざまな分野で RL テクニックを活用しています。彼女はカリフォルニア大学サンタバーバラ校の統計学で博士号を取得しました。

 

 

 

Bharathan Balaji は AWS のリサーチサイエンティストで、彼の研究対象は強化学習システムとアプリケーションです。彼は Amazon SageMaker RL と AWS DeepRacer の立ち上げに貢献しました。彼はカリフォルニア大学サンディエゴ校でコンピューターサイエンスとエンジニアリングの博士号を取得しました。