強化学習実験におけるジムプラットフォームの応用

元のソース:https//zhuanlan.zhihu.com/p/114392519。ほとんど知っている

強化学習アルゴリズムの実装には、適切なプラットフォームとツールが必要です。このケースでは、最初に、一般的に使用される強化学習実装プラットフォームであるGymの基本的な使用方法を紹介し、次に、強力な強化学習アルゴリズムの構築と評価の強固な基盤を築く実験ツールTensorFlowの基本的な操作方法を紹介します。

目次

1.一般的な強化学習実験プラットフォームの概要
2.実験プラットフォームジム
2.1ジムのインストール
2.2ジムの組み込み環境]
2.3ジムの基本的な使用法]
33。実験ツールTensorFlow3.1TensorFlowの
インストール]
3.2TensorFlowを使用して完全に構築する接続されたニューラルネットワークおおよその状態値関数
4.まとめ

1.一般的な強化学習実験プラットフォームの概要

強化学習アルゴリズムの品質をどのように検証しますか?データセットと同様に、環境内の強化学習アルゴリズムをシミュレート、構築、レンダリング、および実験するための認識されたプラットフォームが必要です。強化学習には多くの実験プラットフォームがあります。

DeepMindラボ

DeepMind Labは、強化学習に基づく優れた研究プラットフォームであり、豊富なシミュレーション環境を提供します。同時に、豊富なビジュアルコンテンツ、SFスタイル、リアルな効果を備えた、高度なカスタマイズと拡張が可能です。

プロジェクトマルメ

Project Malmoは、MicrosoftがMinecraftに基づいて開発した強化学習実験プラットフォームであり、カスタマイズされた環境に優れた柔軟性を提供でき、複雑な環境にも適しています。ただし、Malmoは現在Minecraftゲーム環境のみを提供しています。

VizDoom

VizDoomは、Doomゲーム(Doom)に基づく強化学習実験プラットフォームです。競争の激しい環境でマルチエージェントとテストエージェントをサポートします。ただし、VizDoomはDoomゲーム環境のみをサポートします。さらに、オフスクリーンレンダリングとシングル/マルチプレイヤーをサポートします。

OpenAIジム

ジムは現在、最も広く使用されている強化学習実験プラットフォームです。以下では、その使用方法に焦点を当てます。

2.実験プラットフォームジム

OpenAIは、ElonMuskとSamAltmanによって設立された非営利のオープンソース人工知能研究会社です。Gymは、OpenAIによって立ち上げられた強化学習実験環境ライブラリであり、実際の環境をシミュレートし、強化学習アルゴリズムを構築し、これらの環境でエージェントをテストするために使用できます。Gymは、TensorFlow、Theano、Keras、およびその他のフレームワークで記述されたアルゴリズムと互換性があります。少数の商用ライブラリに依存していることに加えて、プロジェクト全体がオープンソースで無料です。

2.1ジムの設置

GymはWindows、Linux、およびMacOSシステムをサポートしています。GymライブラリをAnaconda 3環境にインストールします(Pythonバージョン3.5以降が必要です)。インストールコマンドは次のとおりpip install gymです。インストールが完了したら、Pythonにインポートするだけです。

import gym

2.2ジムの組み込み環境

強化学習のための何百もの実験環境がジムライブラリに構築されています。

  • クラシックな制御環境
  • シンプルなテキスト環境
  • アルゴリズム環境
  • Box2D環境
  • Atariゲーム環境
  • 機械制御環境
  • ……

これらの環境はすべてサブモジュールenvにカプセル化されています。次の方法を使用して、含まれているすべての環境を表示します。数が多すぎるため、最初の10個のみを出力します。

from gym import envs
env_spaces = envs.registry.all()
env_ids = [env_space.id for env_space in env_spaces]
print(env_ids[:10])

['Copy-v0'、 'RepeatCopy-v0'、 'ReversedAddition-v0'、 'ReversedAddition3-v0'、 'DuplicatedInput-v0'、 'Reverse-v0'、 'C​​artPole-v0'、 'C​​artPole-v1'、 ' MountainCar-v0 '、' MountainCarContinuous-v0 ']

各環境には、「CartPole-v0」などの「xxxxx-vd」の形式のIDがあり、IDには環境名とバージョン番号が含まれています。以下では、Gymライブラリの基本的な使用法をさらに紹介するために、実験オブジェクトとして環境を選択します。

2.3ジムの基本的な使用法

実験対象として「CliffWalking-v0」(中国語名「CliffPathfinder」)を選択します。この環境で解決する必要のある問題は、4×12グリッドにあります。エージェントはグリッドの左下から開始します(番号は36)、そして下の図に示すように、ステップ数が最も少ない右下隅のグリッド(番号47)に移動したいと思います。37〜46は崖を表しています。

エージェントは、上、下、左、右の4つのアクションを実行して移動できます。

  • 崖以外のグリッドに到達した場合の報酬は-1です。
  • 崖に到達して出発点に戻ることに対する報酬は-100です
  • グリッドを離れるアクションは、現在の状態を維持し、-1を報酬します

まず、make関数を使用して「崖の経路探索」環境をロードします。他の環境をロードする必要がある場合makeは、関数のパラメーターを他の環境のIDに置き換えるだけです。

env = gym.make('CliffWalking-v0')

各環境は、独自の状態空間とアクション空間を定義します。環境をロードした後、環境のobservation_spaceプロパティを使用して状態空間action_spaceを表示し、プロパティを使用してアクション空間を表示します。

print('状态空间:',env.observation_space)
print('动作空间:',env.action_space)

状態空間:離散(48)
アクション空間:離散(4)

ジムでは、離散空間は一般にgym.spaces.Discreteクラスで表され、連続空間は一般にgym.spaces.Boxクラスで表されます。

崖の経路探索問題でDiscrete(48)は、状態空間が離散的であり、値が[公式]であるDiscrete(4)ということです。これは、アクション空間が離散的であり、値がであるということです[公式]

P属性を使用して、さまざまなアクションと状態の間の遷移関係を表示します。ネストされたディクショナリオブジェクトを返し、キーは状態であり、値は引き続きディクショナリオブジェクトです。例として状態30を取り上げます。

env.P[30]

{0:[(1.0、18、-1、False)]、
1:[(1.0、31、-1、False)]、
2:[(1.0、36、-100、False)]、
3:[( 1.0、29、-1、False)]}

上記の辞書オブジェクトでは、キーはさまざまなアクションを表し、値はタプルのリストです。その中の要素は、キーに対応するアクションの下での遷移確率、到着の状態、フィードバックの報酬、およびシグナルを表します。終わりに達するの。

たとえば、状態30の場合、0、1、2、3はそれぞれ上、右、下、左に移動することを意味します。2を選択すると、下に移動して確率1で崖に入り、初期状態36に戻ってフィードバックします。 100報酬、終わりに達しませんでした。

次に、環境を使用するコアメソッドであるメソッドを紹介します。このstepメソッドは、エージェントのアクションをパラメーターとして受け取り、次の4つの値を返します。

  • 観察:現在の行動をとった後に到達した状態
  • 報酬:現在の行動を取ることによって得られる報酬
  • 完了:終了状態に到達したかどうかを示すブール変数
  • info:ディクショナリタイプの値。状態間の遷移確率など、いくつかのデバッグ情報が含まれます。

各タイムステップで、エージェントはアクションを選択し、次の状態に戻って報酬を受け取ります。

stepメソッドを使用する前にメソッドを使用しresetて環境を初期化する必要があります。メソッドはエージェントの初期状態に戻ります。ラウンドが終了するたびに、resetメソッドを使用して次のラウンドを開始できます

env.reset()

stepこのメソッドには、パラメーターとしてアクションが必要です。このsampleメソッドを使用して、アクションスペースからアクションをランダムに選択できます。

env.action_space.sample()

stepメソッドを呼び出した後renderメソッドを使用して現在の環境をグラフィカルに表示できます。

env.render()

stepメソッドが呼び出されるたびに、1ステップだけ進むため、ループ構造を使用してstepメソッドをループし、ラウンド全体を完了することがよくあります

env.reset() # 初始化环境
for t in range(10):
    # 在动作空间中随机选择一个动作
    action = env.action_space.sample()
    # 采取一个动作
    observation, reward, done, info = env.step(action)
    print("action:{},observation:{},reward:{}, done:{}, info:{}".format(action, observation, reward, done, info))
    # 图形化显示
    env.render()     

3.実験ツールTensorFlow

TensorFlowは、数値計算にデータフローグラフを使用するオープンソースソフトウェアライブラリです。その柔軟なアーキテクチャは、複数のプラットフォームでの計算に使用できます。TensorFlowは元々、機械学習とディープニューラルネットワークの研究に使用されていましたが、このシステムの汎用性により、他のコンピューティング分野で広く使用できます。

強化学習では、状態空間が大きく、行動空間が連続である場合、モデルを使用してDQNアルゴリズムなどの価値関数を推定し、ディープニューラルネットワークを使用して価値関数を推定します。 TensorFlowを使用してディープニューラルネットワークを構築し、Gym RealizeDQNアルゴリズムと組み合わせる必要があります。

計算グラフとも呼ばれるデータフローグラフは、TensorFlowの基本的な計算フレームワークであり、ディープラーニングのネットワーク構造を定義するために使用されます。TensorFlowの基本的なデータフローグラフは静的グラフです。つまり、作成されると動的変更はサポートされません。動的グラフメカニズム(Eager)もTensorFlowに導入されています。

データフローグラフには、計算ノードと呼ばれるいくつかの操作(操作)オブジェクトが含まれ、テンソル(テンソル)オブジェクトは、異なる操作間のデータノードを表します。グラフを定義するときに、さまざまな名前ドメインを定義し、それらのドメインで変数と操作を定義して、後続の検索を容易にすることができます。

3.1TensorFlowのインストール

TensorFlowにはCPUとGPUの2つのバージョンがあります。例としてAnaconda3を取り上げます。Windowsシステムに安定したCPUバージョン1.12をインストールします。最初にcondaを使用してPython3.6環境を作成し、次にこの環境に入り、コマンドpip install tensorflow==1.12使用してインストールします。WindowsシステムにインストールするにはGPUバージョン1.12では、次の手順を順番に完了する必要があります。

  1. VS2015をインストールします
  2. CUDAとCUDNNをインストールし(バージョンはコンピューターのグラフィックカードのバージョンに対応している必要があります)、環境変数を追加します
  3. condaを使用してPython3.6環境を作成します
  4. コマンドpip install tensorflow-gpu==1.12使用してインストールします

3.2 TensorFlowを使用して、完全に接続されたニューラルネットワークの近似状態値関数を構築します

例を通してニューラルネットワークを構築するためのTensorFlowの方法を紹介します。ニューラルネットワークは「普遍関数近似器」と呼ばれるため、ニューラルネットワークを使用して状態値関数を近似できます。

[公式]

それらの中に[公式]はニューラルネットワークのパラメータがあり、ニューラルネットワークの入力は状態[公式]であり、出力は状態値[公式]です。

ここでは、完全に接続されたニューラルネットワークを例として取り上げます。具体的なネットワーク構造は次のとおりです。

  • 入力層:状態[公式]、寸法は1×1
  • 隠れ層:5ニューロン
  • 出力層:状態値[公式]、寸法は1×1

最初にトレーニングデータを読みます。

import numpy as np
import pandas as pd
data = pd.read_csv('./input/value_function.csv')
data.head()

上記の結果から、データに2つの列が含まれていることがわかります。state列はステータスを表し、列はステータスにvalue対応する値を表します。2つの列を別々に保存します。

# 神经网络的输入数据
x = data['state'].values
# 神经网络的输出数据
y = data['value'].values

プレースホルダーを定義する

TensorFlowの基本的なデータフローグラフは静的グラフであるため、ディープニューラルネットワークを構築するときに固定位置を占めるプレースホルダーを定義する必要があります。プレースホルダーはTensorのタイプとディメンションを定義するだけで、値を割り当てません。TensorFlowはplaceholder関数を使用してプレースホルダーを作成できますshapeデータディメンションを指定するパラメーターがあります。にshape設定するとNone、任意のディメンションのデータを入力できます。まず、プレースホルダーを使用して、ニューラルネットワークの入力と出力を定義します。

import tensorflow as tf
# 重置计算图
tf.reset_default_graph()
# 定义输入占位符
x_ = tf.placeholder(shape=[None, 1], dtype=tf.float32, name='x_')
# 定义输出占位符
y_ = tf.placeholder(shape=[None, 1], dtype=tf.float32, name='y_')

パラメータを定義する

TensorFlowでは、定数は値を変更できないTensorです。値が割り当てられると、変更することはできません。constant関数を使用してTensorFlow定数を作成できます。

変数は変数Tensorであり、グラフ内の他の操作の入力を計算するために使用されます。ニューラルネットワークのパラメーターは変数と見なすことができ、Variable関数を使用してTensorFlow変数作成できます。

複雑なニューラルネットワーク構造では、レイヤー間およびノー​​ド間の接続に多くの変数または操作があり、変数の混乱を引き起こします。variable_scope関連する変数の操作によって設定された関数変数の範囲を使用したり、モデルの範囲に集中したレイヤーを使用して理解を深めることができます。

以下では、ニューラルネットワークの隠れ層と出力層の重みとバイアスを定義します。

# 定义隐藏层的权重和偏置
with tf.variable_scope('hidden'):
    # 使用截断正态分布初始化权重
    w_hidden = tf.Variable(tf.truncated_normal(shape=[1, 5], dtype=tf.float32), name='w_hidden')
    # 定义偏置
    b_hidden = tf.Variable(tf.truncated_normal(shape=[5], dtype=tf.float32), name='b_hidden')
    # 定义输出层的权重和偏置
with tf.variable_scope('out'):
    # 定义权重
    w_out = tf.Variable(tf.truncated_normal(shape=[5, 1], dtype=tf.float32), name='w_out')
    # 定义偏置
    b_out = tf.Variable(tf.truncated_normal(shape=[1], dtype=tf.float32), name='b_out')

順伝播の定義

ニューラルネットワークの入力、出力、およびパラメーターを定義した後、順伝播計算を定義します。TensorFlowには、matmul関数を使用してaddテンソル積を計算したり関数を使用してテンソルの合計を計算したりするなど、基本的なテンソル演算関数が含まれています

順伝播の過程で、ニューロンの入力は活性化関数を介して非線形にマッピングされます。TensorFlowのnnモジュールでは、一般的に使用されるいくつかの活性化関数がカプセル化されます。ここでは、活性化関数としてReLUを使用します。

# 定义前向传播
layer_1 = tf.nn.relu(tf.add(tf.matmul(x_, w_hidden), b_hidden))
y_pred = tf.add(tf.matmul(layer_1, w_out), b_out)

TensorFlowで一般的に使用されるアクティベーション関数呼び出しメソッドは次のとおりです。

活性化関数呼び出しメソッドReLUtf.nn.reluSigmoidtf.nn.sigmoidtanhtf.nn.tanhSoftmaxtf.nn.softmaxSoftplustf.nn.softplus

損失関数とオプティマイザを定義する

TensorFlowは、ニューラルネットワークのトレーニング時に定義する必要のある損失関数もカプセル化します。平均二乗誤差は回帰問題の損失関数としてよく使用され、クロスエントロピーは分類問題の損失関数としてよく使用されます。近似関数は回帰問題と見なすことができるため、平均二乗誤差が損失関数として使用されます。

ニューラルネットワークをトレーニングするときは、適切な最適化方法を選択することが非常に重要です。これは、ニューラルネットワークのトレーニング効果に直接影響します。勾配降下アルゴリズムファミリーで一般的に使用されるアルゴリズムは、TensorFlowのtrainモジュールにカプセル化されています。ここでは、オプティマイザーとしてAdamメソッドを使用します。

# 定义损失函数
loss = tf.losses.mean_squared_error(predictions=y_pred, labels=y_)
# 定义优化器,学习率设为0.01,设定目标为极小化损失函数loss
train_op = tf.train.AdamOptimizer(0.01).minimize(loss)

TensorFlowで一般的に使用される損失関数呼び出しメソッドは次のとおりです。

損失関数呼び出しメソッド平均二乗誤差tf.losses.mean_squared_error2クラスクロスエントロピーtf.nn.sigmoid_cross_entropy_with_logitsマルチクラスクロスエントロピーtf.nn.softmax_cross_entropy_with_logits_v2マルチクラススパースクロスエントロピーtf.nn.sparse_softmax_

TensorFlowで一般的に使用されるオプティマイザー呼び出しメソッドは次のとおりです。

オプティマイザーは、メソッド勾配降下tf.train.GradientDescentOptimizer運動量メソッドtf.train.MomentumOptimizerRMSproptf.train.RMSPropOptimizerAdamtf.train.AdamOptimizerAdadeltatf.train.AdadeltaOptimizerAdagradtf.train.AdagradOptimizerを呼び出します。

セッショントレーニングネットワークを作成する

データフローグラフの計算を実行するには、データフローグラフをセッション(セッション)で開始する必要があり、セッションはグラフ操作をCPU、GPU、およびその他のデバイスに割り当てて実行します。

計算グラフを開始するには、まずSessionクラスを使用してセッションオブジェクトを作成し、次にrunメソッドを呼び出して計算グラフを実行します。セッションを使用した後、closeメソッドを呼び出してセッションを閉じ、リソースを解放します。Pythonのコンテキスト管理プロトコルを使用してwith…as、セッション自動的に閉じることもできます

セッションを作成して、ネットワークのトレーニングを開始しましょう。

# 设定迭代轮数
training_epochs = 500
# 设定batch大小
batch_size = 10
# 创建会话
with tf.Session() as sess: 
    # 变量初始化
    sess.run(tf.global_variables_initializer())  
    for epoch in range(training_epochs):
        for i in range(10):         
            # 将所有训练数据分割为batch,batch大小为10,共10个
            # 将batch_x、batch_y转换成与占位符x_、y_相同的维度
            batch_x = x[i*batch_size:(i+1)*batch_size].reshape(-1, 1)
            batch_y = y[i*batch_size:(i+1)*batch_size].reshape(-1, 1)          
            # 使用参数feed_dict传入数据,进行反向转播更新参数
            _, cost = sess.run([train_op, loss], feed_dict={x_:batch_x, y_:batch_y})         
        # 每20轮输出训练集的损失函数值
        if epoch % 20 == 0:
            print("epoch", epoch, "training loss", sess.run(loss, feed_dict={x_:x.reshape(-1, 1), y_:y.reshape(-1, 1)}))         
    print("隐藏层权重:",w_hidden.eval())
    print("隐藏层偏置:",b_hidden.eval())
    print("输出层权重:",w_out.eval())
    print("输出层偏置:",b_out.eval())

トレーニングラウンド数が増加し続けると、トレーニングセットの損失が減少し続け、最終的にニューラルネットワークのパラメータが出力され、完全に接続されたニューラルネットワークのトレーニングが完了することがわかります。

4.まとめ

今回は、ジムの設置や組み込み環境の利用など、最も広く使われている強化学習実験プラットフォームであるOpenAIジムの基本的な使い方を紹介します。その後は、ジムを実験評価として使用します。アルゴリズム評価のための強化学習アルゴリズム。評価とデバッグ。

次に、実験ツールTensorFlowを紹介し、例を通してニューラルネットワークを構築するプロセスを説明しました。その後の強化学習アルゴリズムの実践では、TensorFlowを使用してディープニューラルネットワークを構築し、それらをGymと組み合わせて、いくつかの古典的な強化学習アルゴリズムを実装します。

このケースを通じて、皆さんがTensorFlowとGymの基本を理解し、強化学習アルゴリズムの将来の実践に備えることができることを願っています。

「この場合の表示完全なデータ、コードおよびレポートは(ログインデータkukeを喜ば cookdata.cn )ケースセクション。

おすすめ

転載: blog.csdn.net/SL_World/article/details/108753666