ニューラルネットワークによる強化学習
1. 序章
このチュートリアルでは、強化学習の基本と、その中でニューラルネットワークを使用する方法について説明します。 さらに、基本的な概念を実行するための小さなアプリケーションを開発します。
2. いくつかの基本
始める前に、強化学習とニューラルネットワークの意味を理解してみましょう。
2.1. 機械学習と強化学習
機械学習とは、経験に基づいて自動的に改善することを約束するアルゴリズムのクラスを指します。 より一般的には、機械学習は人工知能の一部であり、1956年に設立されたインテリジェントエージェントの研究です。
アルゴリズムが時間の経過とともに学習するために利用できるフィードバックに応じて、機械学習を大きく3つのカテゴリに分類できます。
- 教師あり学習:教師あり学習の目的は、ラベル付けされた一連のトレーニングデータを活用して、入力を出力にマッピングできる関数を学習することです。
- 教師なし学習:対照的に、教師なし学習とは、既存のラベルを使用せずに探索することで、データ内の検出されないパターンを学習することです。
- 強化学習:最後に、強化学習の目標は、探索と活用のバランスを取りながら、環境内でアクションを実行することにより、累積報酬を最大化することです。
2.2. ニューラルネットワークとディープラーニング
ここで、ニューラルネットワークの意味を理解しましょう。 教師あり学習のように、機械学習の問題を解決する手法として、ニューラルネットワークをよく使用します。
ニューラルネットワークは、人間の脳の働きに基づいて相互接続され、大まかに接続された多くの単純な処理ノードで構成されています。 通常、これらのノードをレイヤーに配置し、それらの間の接続に重みを割り当てます。 目的は、ネットワークを介したトレーニングデータのフィードフォワードおよびバックワード伝播を数回繰り返すことで、これらの重みを学習することです。
では、ディープラーニングとは何ですか?それはニューラルネットワークとどのように関連していますか? 私たちが今知っているように、ニューラルネットワークは層状に配置された処理ノードで構成されています。 ほんの数個のノードとレイヤーから、ネットワークは数千のレイヤーに配置された数百万のノードに成長する可能性があります。
通常、これらのネットワークを構築して高度な問題を解決し、ディープラーニングとして分類します。 強化学習のコンテキストで深層学習を適用する場合、それを深層強化学習と呼ぶことがよくあります。
3. 強化学習入門書
強化学習は、特定の環境で報酬を最大化するために適切なアクションを実行する自律エージェントに関するものです。 時間の経過とともに、エージェントはその経験から学び、可能な限り最高の動作を採用しようとします。
強化学習の場合、人間の相互作用を環境状態の変化、および報酬とペナルティのシステムに限定します。 このセットアップは、マルコフ決定過程として知られています。
3.1. 例
これをよりよく理解するために、ペットを訓練する例を見てみましょう。 W eは、ペットを自律エージェントと見なすことができます。 私たちが居間でペットを訓練しようとしている場合、それは環境と見なすことができます:
ボールを投げて、ペットが走ってそれをフェッチすることを期待できます。 ここで、ボールを投げることは環境が提示する状態を表し、ボールをフェッチするために走ることはペットがとることができる行動を表します。 最後に、背中を軽くたたく形でペットに報酬を与えるか、無視してペットにペナルティを科す場合があります。
W e
3.2. 環境の種類
強化学習は、主に2種類の環境で構成されています。
- 決定論的:これは、状態遷移モデルと報酬モデルの両方が決定論的関数である場合を指します。 簡単に言えば、エージェントが特定の状態でアクションを繰り返す場合、エージェントは同じ報酬と次の状態を期待できます。
- 確率論的:確率論的とは、ランダムに発生する確率を持つものを指します。 このような環境で、ある状態でエージェントが繰り返し行動を起こした場合、同じ報酬や次の状態を受け取ることを保証することはできません。
3.3. 強化学習の種類
一般に、強化学習には2つのタイプがあります。
- モデルベース:モデルベースのアルゴリズムでは、エージェントは経験を使用して、環境内の遷移と即時の結果の内部モデルを構築し、それを参照して適切なアクションを選択します。 エージェントは、状態遷移と報酬確率関数を外部から受け取ることができます。
- モデルフリー:対照的に、モデルフリーアルゴリズムでは、エージェントは経験を使用して、環境のモデルを使用せずにポリシーまたは値関数を直接学習します。 ここでは、エージェントは環境内で可能な状態とアクションについてのみ知っており、状態遷移と報酬確率関数については何も知りません。
3.4. 価値関数とポリシー
報酬は、エージェントが特定の状態で実行するアクションに対して環境から受け取る即時のフィードバックです。 さらに、エージェントは、環境との相互作用において、離散時間ステップで一連の報酬を受け取ります。
強化学習の目的は、この累積的な報酬を最大化することです。これは、価値としても知られています。 エージェントが従う戦略はpolicyと呼ばれ、値を最大化するpolicyは最適ポリシーと呼ばれます。
正式には、強化学習における価値の概念は価値関数として表されます。
ここで、この関数は、特定のポリシーに基づく状態で開始する割引された将来の報酬を考慮に入れます。 これは、このポリシーの状態値関数としても知られています。 右側の方程式は、動的計画法の最適条件に関連付けられているベルマン方程式と呼ばれるものです。
3.5. Q値とQ学習
Q値は、ポリシーに基づく状態のエージェントの長期的な収益の尺度ですが、エージェントがその状態で実行するアクションも考慮に入れます。 基本的な考え方は、異なる州での同じ行動が異なる報酬を生む可能性があるという事実を捉えることです。
ここで、関数は報酬への状態とアクションのペアのマップを作成します。 これは、ポリシーのアクション値関数としても知られています。
Q値は、 Q学習で使用する尺度です。これは、モデルフリーの強化学習に向けて使用する主要なアプローチの1つです。 Q学習は、特定のアクションが、ポリシーに基づく状態で将来の報酬を獲得するのにどれほど役立つかを強調します。
4. 強化学習の実装
十分な基本をカバーしたので、強化学習の実装を試みることができるはずです。 このチュートリアルでは、q学習アルゴリズムを実装します。
4.1. テスト環境
OpenAI は、人工知能の標準化と幅広い採用のためにいくつかのツールとテクノロジーを開発した会社です。 Gymは、OpenAI のツールキットであり、強化学習アルゴリズムの評価と比較に役立ちます。
基本的に、 Gymは、Pythonで記述された共有インターフェイスを備えたテスト環境のコレクションです。 これらの環境は、ゲーム、たとえばFrozenLake環境と見なすことができます。 FrozenLakeは、グリッドの世界でエージェントの動きを制御するシンプルなゲームです。
このゲームのルールは次のとおりです。
- グリッドは、4×4に設定された16個のタイルで構成されています
- 開始タイル(S)とゴールタイル(G)があります
- 一部のタイルは歩きやすく(F)、他のタイルはエージェントを殺すことができます(H)
- エージェントの動きはほとんど制御できません
- エージェントは、開始タイルから目標タイルまでの歩行可能なパスを見つけると報酬が与えられます
この環境を使用して、後続のセクションで開発する強化学習アルゴリズムをテストします。
4.3. Q学習プロセス
q-learningアルゴリズムの実装を開始する前に、一般的なq-learningプロセスがどのように見えるかを理解することは価値があります。
q値は、環境のアクションと状態の数に一致するディメンションを持つqテーブルに格納および更新されます。 このテーブルは、プロセスの開始時にゼロで初期化されます。
上の図から明らかなように、q学習プロセスは、qテーブルを参照してアクションを選択することから始まります。 選択したアクションを実行すると、環境から報酬を受け取り、qテーブルを新しいq値で更新します。 これを数回繰り返して、妥当なqテーブルを取得します。
4.4. アクションの選択
プロセスが開始されると、qテーブルはすべてゼロであることが以前にわかりました。 したがって、エージェントが選択するアクションはqテーブルに基づくことはできず、ランダムである必要があります。 ただし、qテーブルが更新され始めると、エージェントは状態の最大q値に基づいてアクションを選択します。
これにより、エージェントが最適ではなかった初期決定の一部を繰り返すことをロックする可能性があります。 基本的に、エージェントは環境の探索から活用に移行するのが早すぎます。 したがって、と呼ばれるアクション選択ポリシーを導入する必要があります。
ここでは乱数をサンプリングし、それがたまたまより小さい場合、アクションはランダムに選択されます。 このにより、エージェントのランダムな探索が可能になります。これは、特に最初の反復で非常に役立ちます。 もちろん、学習が成熟するにつれて、このパラメータの影響をゆっくりと減衰させて、搾取の側に寄りかかります。
4.5. Q値の更新
q値の計算はベルマン方程式に従うことはすでに見てきましたが、実際にはどのように機能するのでしょうか。 この方程式のさまざまな部分をもう少しよく理解しましょう。
したがって、基本的には、状態とアクションのペアの現在のq値に時間差を追加し続けます。 ここには、賢明に選択することが重要な2つの重要なパラメーターがあります。
- 学習率:これは、アルゴリズムが学習できるペースを制御するために使用できるパラメーターです。 有効値0でoと1の間に設定します。これは、学習がまったくないことを意味します。
- 割引係数:先ほど、将来の報酬は現在のアクションにとってそれほど重要ではないことを確認しました。 これも割引係数を使用してモデル化し、0から1の間に設定します。
4.6. Q学習アルゴリズムの設定
ここで、これまでに説明したすべてのステップを、q学習アルゴリズムを実行するためのプログラムの形で配置しましょう。 Pythonを使用して、デモンストレーションの基本的な例を開発します。主な理由は、Pythonにはデータ操作と機械学習用のライブラリの豊富なエコシステムがあるためです。
まず、必要なインポートを行います。
import gym
import numpy as np
次に、前に説明したように、テスト環境であるFrozenLakeを取得しましょう。
env = gym.make('FrozenLake-v0')
次に、割引係数、ϵ値とその減衰パラメーター、学習率、実行するエピソードの数など、いくつかの学習パラメーターを設定する必要があります。
discount_factor = 0.95
eps = 0.5
eps_decay_factor = 0.999
learning_rate = 0.8
num_episodes = 500
ここで選択した値は経験に基づいており、調整のためのハイパーパラメータとして扱う必要があります。 準備の最後のビットとして、qテーブルを初期化する必要があります。
q_table = np.zeros([env.observation_space.n,env.action_space.n])
4.7. Q学習アルゴリズムの実行
これで、選択した環境でエージェントの学習プロセスを開始する準備が整いました。
for i in range(num_episodes):
state = env.reset()
eps *= eps_decay_factor
done = False
while not done:
if np.random.random() < eps or np.sum(q_table[state, :]) == 0:
action = np.random.randint(0, env.action_space.n)
else:
action = np.argmax(q_table[state, :])
new_state, reward, done, _ = env.step(action)
q_table[state, action] +=
reward +
learning_rate *
(discount_factor * np.max(q_table[new_state, :]) - q_table[state, action])
state = new_state
このコードブロックで何が起こっているのかを理解しましょう。
- 選択した反復回数をループし、減衰パラメーターによってϵ値を減らします。
- 各反復では、ゲームが完了するまでステップします(固定回数だけステップすることもできます)。
- アクション選択ポリシーに従って、ランダムアクションまたはq-tableによって提案されたアクションを選択しています。
- 私たちは行動し、環境から報酬と新しい状態を受け取ります
- 最も重要なことは、ベルマン方程式を使用して現在の状態のq値を更新し、qテーブルでアクションを選択したことです。
- 最後に、状態を環境から受け取った新しい状態として設定し、手順を繰り返します。
上記のアルゴリズムを十分な回数実行すると、ゲーム内のアクションを非常に効率的に予測できるqテーブルに到達します。 これは、すべてのステップでフィードバックループを使用してエクスペリエンスを充実させ、その恩恵を受けるq学習アルゴリズムの目的です。
5. ニューラルネットワークによる強化学習
単純な環境ではq-tableを作成して使用することは管理可能ですが、実際の環境では非常に困難です。 実際の環境でのアクションと状態の数は数千になる可能性があるため、テーブルでq値を管理することは非常に非効率的です。
ここで、テーブルを使用する代わりに、ニューラルネットワークを使用して特定の状態のアクションのq値を予測できます。 q-learningプロセスでq-tableを初期化して更新する代わりに、ニューラルネットワークモデルを初期化してトレーニングします。
5.1. ニューラルネットワークアーキテクチャの選択
すでに説明したように、ニューラルネットワークは、通常は密に接続されている複数のレイヤーに形成された複数の処理ノードで構成されています。
これらのレイヤーは次のもので構成されます。
- 入力層:入力層のノード数は通常固定されており、入力データ(環境内の状態の数など)に対応します。
- 隠れ層:通常、ニューラルネットワークアーキテクチャには1つ以上の隠れ層があります。 レイヤーと各レイヤーのノード数は、アーキテクチャのハイパーパラメータです。
- 出力レイヤー:最後に、出力レイヤーには、必要な出力に対応する固定数のノードもあります。たとえば、環境内のアクションの数です。
q-learningアルゴリズムで以前に使用したテスト環境の単純なニューラルネットワークアーキテクチャを見てみましょう。
ここで、入力レイヤーには16個のノードがあり、これは環境の状態の数に対応します。 ワンホットエンコードされた状態入力ベクトルを入力として受け取ります。 20個のノードで構成される単一の完全に接続された隠れ層があります。 最後に、この環境でのアクションの数に対応する4つのノードで構成される出力レイヤーがあります。
5.2. 活性化関数の選択
ニューラルネットワークの処理ノードは、先行するノードから受け取った入力、重み、および学習したバイアスに基づいて出力を生成します。
上記の処理ノードでわかるように、も活性化関数を利用しています。 これが必要な最も重要な理由の1つは、出力に非線形性を提供することです。それ以外の場合はかなり線形です。 この非線形性により、ニューラルネットワークは複雑で現実世界のパターンを学習できるようになります。
ニューラルネットワークの活性化関数の選択は最適化の問題であるため、ハイパーパラメーターのリストに分類されます。 ただし、入力データの性質と必要な出力は、良いスタートを切るのに役立ちます。 隠れ層の活性化関数としてRectifierLinearUnit(ReLU)を使用し、出力層の線形活性化関数として使用します。
5.3. 損失関数とオプティマイザー
ニューラルネットワークは、モデルの重みとバイアスを繰り返し更新して、モデルが作成できる予測のエラーを減らすことで機能します。 したがって、は任意の時点でモデル誤差を計算できる必要があります。 損失関数を使用すると、それを実行できます。 通常、ニューラルネットワークモデルでは、クロスエントロピーや平均二乗誤差などの損失関数を使用します。
平均二乗誤差損失関数は、予測とターゲットの差の二乗値を測定します。
損失関数の計算の背後にある直感は、ネットワークを介してフィードバックを逆方向に取得し、重みを更新することです。 これをバックプロパゲーションと呼び、古典的な確率的勾配降下法から始めて、いくつかのアルゴリズムを使用してそれを実現できます。 Adam (Adaptive MomentEstimationから派生)のように、一部のアルゴリズムは計算上より効率的で、メモリ要件が少なくなります。 これをアルゴリズムのモデルで使用します。
5.4. ニューラルネットワークを使用したQ学習の設定
Keras は、TensorflowやTheanoなどのデータフロー計算ライブラリ上で機能する上位レベルのライブラリです。 Kerasを使用して、ニューラルネットワークでq学習アルゴリズムを構築します。
q-learningアルゴリズムの全体的な構造は、以前に実装したものと同じままです。 の主な変更点は、q-tableの代わりにニューラルネットワークモデルを使用することですと、ステップごとに更新する方法です。
必要なルーチンをインポートすることから始めましょう:
import gym
import numpy as np
from keras.models import Sequential
from keras.layers import InputLayer
from keras.layers import Dense
次に、アルゴリズムを実行するためのテスト環境FrozenLakeを取得します。
env = gym.make('FrozenLake-v0')
次に、適切なデフォルトを使用して、いくつかの必要なハイパーパラメータを設定します。
discount_factor = 0.95
eps = 0.5
eps_decay_factor = 0.999
num_episodes=500
ここに新しいものはありません。 ただし、次のステップは、Kerasでニューラルネットワークモデルを設定することです。 また、Kerasが次のような複雑なモデルを簡単に定義していることも理解できます。
model = Sequential()
model.add(InputLayer(batch_input_shape=(1, env.observation_space.n)))
model.add(Dense(20, activation='relu'))
model.add(Dense(env.action_space.n, activation='linear'))
model.compile(loss='mse', optimizer='adam', metrics=['mae'])
これは、そのようなジョブのニューラルネットワークアーキテクチャの選択について前に説明したとおりです。 注意すべき主な点は、 KerasクラスSequentialの使用です。これにより、モデルでレイヤーを次々にスタックできます。
5.5. ニューラルネットワークを使用したQ学習の実行
必要なセットアップをすべて実行したので、ニューラルネットワークを使用してq学習アルゴリズムを実装する準備が整いました。
for i in range(num_episodes):
state = env.reset()
eps *= eps_decay_factor
done = False
while not done:
if np.random.random() < eps:
action = np.random.randint(0, env.action_space.n)
else:
action = np.argmax(
model.predict(np.identity(env.observation_space.n)[state:state + 1]))
new_state, reward, done, _ = env.step(action)
target = reward +
discount_factor *
np.max(
model.predict(
np.identity(env.observation_space.n)[new_state:new_state + 1]))
target_vector = model.predict(
np.identity(env.observation_space.n)[state:state + 1])[0]
target_vector[action] = target
model.fit(
np.identity(env.observation_space.n)[state:state + 1],
target_vec.reshape(-1, env.action_space.n),
epochs=1, verbose=0)
state = new_state
アルゴリズムは、以前に実装したものと非常によく似ています。 したがって、ニューラルネットワークがもたらす顕著な変化についてのみ説明します。
- 以前と同じようにアクションを選択していることに注意してください。ただし、ニューラルネットワークモデルを使用して予測を行います。
- 新しい状態のモデル予測を使用して、ベルマン方程式に基づいて目標値を計算しています。
- 最後に、ワンホットエンコードされた現在の状態を使用し、ターゲット値をベクトルとして変換して、モデルを単一のステップでトレーニングします。
このアルゴリズムを十分な反復回数実行すると、ゲーム内の特定の状態のアクションをより正確に予測できるニューラルネットワークモデルが得られます。 もちろん、ニューラルネットワークモデルは、単純なqテーブルよりも複雑なパターンをはるかに認識できます。
6. 結論
この記事では、強化学習の基本について説明しました。 特に、q学習アルゴリズムについて詳しく調べました。
最後に、ニューラルネットワークとそれらが強化学習にどのように役立つかを調べました。