HuggingFace ブログ : Decision Transformers の紹介

HuggingFace ブログ : Hugging Face 🤗 の Decision Transformers の紹介 (翻訳/解説)

翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 11/08/2022

* 本ページは、HuggingFace Blog の以下のドキュメントを翻訳した上で適宜、補足説明したものです:

* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。

 

クラスキャット 人工知能 研究開発支援サービス

クラスキャット は人工知能・テレワークに関する各種サービスを提供しています。お気軽にご相談ください :

◆ 人工知能とビジネスをテーマに WEB セミナーを定期的に開催しています。スケジュール
  • お住まいの地域に関係なく Web ブラウザからご参加頂けます。事前登録 が必要ですのでご注意ください。

お問合せ : 本件に関するお問い合わせ先は下記までお願いいたします。

  • 株式会社クラスキャット セールス・マーケティング本部 セールス・インフォメーション
  • sales-info@classcat.com  ;  Web: www.classcat.com  ;   ClassCatJP

 

 

HuggingFace ブログ : Hugging Face 🤗 の Decision Transformers の紹介

Hugging Face では、深層強化学習の研究者と熱狂者のためのエコシステムに貢献しています。最近では、Stable-Baselines3 のような深層 RL フレームワークを統合しました。

そして本日、Decision Transformer, オフライン強化学習の手法を 🤗 transformers ライブラリと Hugging Face ハブに統合したことを発表できることを嬉しく思います。私たちは深層 RL の分野のアクセスのしやすさを改良するために幾つかのエキサイティングな計画を持ち、今後の数週間、数ヶ月に渡りそれらを貴方と共有できることを期待しています。

  • オフライン強化学習とは何か?
  • Decision Transformers の紹介
  • 🤗 Transformers で Decision Transformer を使用する
  • 結論
  • What’s next?
  • リファレンス

 

オフライン強化学習とは何か?

深層強化学習 (RL) は decision-making (意思決定) エージェントを構築するためのフレームワークです。これらのエージェントは、試行錯誤しながら環境と相互作用して特有のフィードバックとして報酬を受取ることにより、最適な行動 (ポリシー) を学習することを目標としています。

エージェントのゴールは リターンと呼ばれる累積報酬 を最大化することです。RL は報酬仮説 (= reward hypothesis) に基づくため : すべてのゴールは期待される累積報酬の最大化として記述できます

深層強化学習のエージェントは経験のバッチで学習します。問題は、それをどのように集めるか?です :


オンラインとオフライン設定の強化学習間の比較、図は この記事 から引用

オンライン強化学習では、エージェントはデータを直接集めます : それは環境と相互作用することで経験のバッチを収集します。そして、それから学習する (ポリシーを更新する) ためにこの体験を直ちに (or 再生バッファを通して) 利用します。

しかしこれは、エージェントを実世界で直接訓練するか、シミュレータを持つかのいずれかであることを意味しています。それを持たない場合、それを構築する必要がありますが、これは非常に複雑で (実世界の複雑なリアリティを環境でどのように反映させるのでしょう?) 高価であり、そして安全ではない可能性があります。シミュレータが不具合を持ちながら競争上の優位性を提供する場合、エージェントはそれらを利用するからです。

他方、オフライン強化学習では、エージェントは他のエージェントや人間の実演から集められたデータのみを使用します。それは 環境と相互作用しません

そのプロセスは以下のようなものです :

  1. 一つまたはそれ以上のポリシー and/or 人間の相互作用を使用してデータセットを作成する。

  2. ポリシーを学習するためにこのデータセット上でオフライン RL を実行する。

この手法は一つの欠点を持ちます : 反実仮想 (= counterfactual) クエリ問題です。エージェントがデータを持たない何かを行なうことを決めた場合、私たちは何をするべきでしょう?例えば、交差点で右折するが、この軌跡を持たない場合です。

このトピックについて既に幾つかの解法が存在しますが、オフライン強化学習について更に知りたい場合は この動画 を見ることができます。

 

Decision Transformer の紹介

Decision Transformer モデルは “Decision Transformer: Reinforcement Learning via Sequence Modeling” by Chen L. et al. により紹介されました。それは強化学習を 条件付きシークエンス・モデリング問題 として抽象化しています。

主要なアイデアは、価値関数を適合させるような、RL 手法を使用して (どのアクションを取ればリターン (累積報酬) を最大化するかを教えてくれる) ポリシーを訓練する代わりに、望ましいリターン, 過去の状態とアクションが与えられたとき、この望ましいリターンを獲得する未来のアクションを生成するシークエンスモデリング・アルゴリズム (Transformer) を使用するということです。それは、望ましいリターン, 過去の状態とアクションで条件付けられた自己回帰モデルで、その望ましいリターンを獲得する未来のアクションを生成します。

これは強化学習パラダイムにおける完全なシフトです、何故ならば従来の RL アルゴリズムを置き換えるために生成的軌道 (= generative trajectory) モデリング (状態, アクションと報酬のシークエンスの同時分布のモデリング) を使用するからです。それは、Decision Transformer では、リターンを最大化するのではなく、望ましいリターンを獲得する未来のアクションの系列を生成することを意味します。

そのプロセスはこのように進みます :

  1. 最後の K 個の時間ステップを Decision Transformer に 3 つの入力とともに供給します :
    • Return-to-go
    • 状態
    • アクション
  2. トークンは状態がベクトルであれば線形層で埋め込まれ、それがフレームであれば CNN エンコーダで埋め込まれます。

  3. 入力は GPT-2 モデルにより処理されます、これは自己回帰モデリングを通して未来のアクションを予測します。

Decision Transformer アーキテクチャ。状態, アクションとリターンがモダリティ固有の線形埋め込みに供給され、位置的エピソードの (= positional episodic) 時間ステップ・エンコーディングが追加されます。トークンは GPT アーキテクチャに供給されます、これは causal 自己アテンションマスクを使用してアクションを自己回帰的に予測します。図は [1] から引用。

 

🤗 Transformers で Decision Transformer を利用する

Decision Transformer は今では 🤗 transformers ライブラリの一部として利用可能です。更に、Gym 環境の連続的制御タスクのための 9 個の事前訓練済みモデル・チェックポイント を共有しています。

Gym Walker2d 環境でオフライン RL を使用して学習された、“expert” な Decision Transformers モデル。

 

パッケージのインストール

pip install git+https://github.com/huggingface/transformers

 

モデルのロード

Decision Transformer の使用は比較的容易ですが、それは自己回帰モデルですので、各時間ステップでモデルの入力を準備するためには幾つかの注意が必要です。このモデルを使用する方法を実演する Python スクリプトColab ノートブック の両者を準備しました。

事前訓練済み Decision Transformer のロードは 🤗 transformers ライブラリで単純です :

from transformers import DecisionTransformerModel

model_name = "edbeeching/decision-transformer-gym-hopper-expert"
model = DecisionTransformerModel.from_pretrained(model_name)

 

環境の作成

Gym Hopper, Walker2D と Halfcheetah のための事前訓練済みチェックポイントを提供しています。Atari 環境のためのチェックポイントも間もなく利用可能になります。

import gym
env = gym.make("Hopper-v3")
state_dim = env.observation_space.shape[0] # state size
act_dim = env.action_space.shape[0] # action size

 

自己回帰予測関数

モデルは 自己回帰予測 を行います : これはつまり、現在の時間ステップ t で行なわれた予測は逐次的に前の時間ステップからの出力で条件付けられたものです。この関数はかなり内容が濃いので、それをコメント內で說明するつもりです。

# Function that gets an action from the model using autoregressive prediction 
# with a window of the previous 20 timesteps.
def get_action(model, states, actions, rewards, returns_to_go, timesteps):
    # This implementation does not condition on past rewards
    
    states = states.reshape(1, -1, model.config.state_dim)
    actions = actions.reshape(1, -1, model.config.act_dim)
    returns_to_go = returns_to_go.reshape(1, -1, 1)
    timesteps = timesteps.reshape(1, -1)
    
    # The prediction is conditioned on up to 20 previous time-steps
    states = states[:, -model.config.max_length :]
    actions = actions[:, -model.config.max_length :]
    returns_to_go = returns_to_go[:, -model.config.max_length :]
    timesteps = timesteps[:, -model.config.max_length :]
    
    # pad all tokens to sequence length, this is required if we process batches
    padding = model.config.max_length - states.shape[1]
    attention_mask = torch.cat([torch.zeros(padding), torch.ones(states.shape[1])])
    attention_mask = attention_mask.to(dtype=torch.long).reshape(1, -1)
    states = torch.cat([torch.zeros((1, padding, state_dim)), states], dim=1).float()
    actions = torch.cat([torch.zeros((1, padding, act_dim)), actions], dim=1).float()
    returns_to_go = torch.cat([torch.zeros((1, padding, 1)), returns_to_go], dim=1).float()
    timesteps = torch.cat([torch.zeros((1, padding), dtype=torch.long), timesteps], dim=1)
    
    # perform the prediction
    state_preds, action_preds, return_preds = model(
            states=states,
            actions=actions,
            rewards=rewards,
            returns_to_go=returns_to_go,
            timesteps=timesteps,
            attention_mask=attention_mask,
            return_dict=False,)
    return action_preds[0, -1]

 

モデルの評価

モデルを評価するため、幾つかの追加の情報を必要とします ; 訓練の間に使用された状態の平均と標準偏差です。幸い、これらは Hugging Face ハブの各々のチェックポイントの モデルカード で利用可能です。

モデルのためにターゲット・リターンも必要です。これはオフライン強化学習で条件付けられたリターンの威力です : ポリシーの性能を制御するためにターゲット・リターンを使用できます。これは、プレイヤーに適切な難易度であるように対戦相手のボットの性能を調整したいような、マルチプレイヤー設定で非常にパワフルであり得ます。著者らは論文でこれの素晴らしいプロットを示しています!

指定されたターゲット (望ましい) リターン上で条件付けられたとき Decision Transformer により蓄積されたサンプリング (評価) リターン。トップ : Atari。ボトム : D4RL medium-replay データセット。[1] から引用された図。

TARGET_RETURN = 3.6 # This was normalized during training
MAX_EPISODE_LENGTH = 1000 

state_mean = np.array(
    [1.3490015,  -0.11208222, -0.5506444,  -0.13188992, -0.00378754,  2.6071432,
     0.02322114, -0.01626922, -0.06840388, -0.05183131,  0.04272673,])

state_std = np.array(
    [0.15980862, 0.0446214,  0.14307782, 0.17629202, 0.5912333,  0.5899924,
         1.5405099,  0.8152689,  2.0173461,  2.4107876,  5.8440027,])

state_mean = torch.from_numpy(state_mean)
state_std = torch.from_numpy(state_std)

state = env.reset()
target_return = torch.tensor(TARGET_RETURN).float().reshape(1, 1)
states = torch.from_numpy(state).reshape(1, state_dim).float()
actions = torch.zeros((0, act_dim)).float()
rewards = torch.zeros(0).float()
timesteps = torch.tensor(0).reshape(1, 1).long()

# take steps in the environment
for t in range(max_ep_len):
    # add zeros for actions as input for the current time-step
    actions = torch.cat([actions, torch.zeros((1, act_dim))], dim=0)
    rewards = torch.cat([rewards, torch.zeros(1)])

    # predicting the action to take
    action = get_action(model,
                        (states - state_mean) / state_std,
                        actions,
                        rewards,
                        target_return,
                        timesteps)
    actions[-1] = action
    action = action.detach().numpy()

    # interact with the environment based on this action
    state, reward, done, _ = env.step(action)
    
    cur_state = torch.from_numpy(state).reshape(1, state_dim)
    states = torch.cat([states, cur_state], dim=0)
    rewards[-1] = reward
    
    pred_return = target_return[0, -1] - (reward / scale)
    target_return = torch.cat([target_return, pred_return.reshape(1, 1)], dim=1)
    timesteps = torch.cat([timesteps, torch.ones((1, 1)).long() * (t + 1)], dim=1)
    
    if done:
        break

Colab ノートブック でエージェントの動画の作成による、より詳細なサンプルを見つけられます。

 

まとめ

Decision Transformers に加えて、深層強化学習コミュニティからのより多くのユースケースとツールをサポートすることを望みます。Therefore, it would be great to hear your feedback on the Decision Transformer model, and more generally anything we can build with you that would be useful for RL. Feel free to reach out to us.

 

What’s next?

今後数週間か数ヶ月の間に、エコシステムからの他のツールをサポートする予定です :

  • RL-baselines3-zoo の統合

  • RL-trained-agents モデル のハブへのアップロード : stable-baselines3 を使用した、事前訓練済み強化学習エージェントの大きなコレクション

  • 他の深層強化学習ライブラリの統合

  • Atari 用の畳み込み Decision Transformer の実装

  • And more to come 🥳

The best way to keep in touch is to join our discord server to exchange with us and with the community.

 

References

  • [1] Chen, Lili, et al. “Decision transformer: Reinforcement learning via sequence modeling.” Advances in neural information processing systems 34 (2021).

  • [2] Agarwal, Rishabh, Dale Schuurmans, and Mohammad Norouzi. “An optimistic perspective on offline reinforcement learning.” International Conference on Machine Learning. PMLR, 2020.

 

Acknowledgements

We would like to thank the paper’s first authors, Kevin Lu and Lili Chen, for their constructive conversations.

 

以上