[強化学習]は、制御理論内のサブフィールドであり、時間の経過とともに変化するシステムの制御に関するもので、自動運転車、ロボット、ゲーム用ボットなどのアプリケーションが広く含まれます。このガイドでは、強化学習を使用してAtariビデオゲーム用のボットを構築します。このボットには、ゲームに関する内部情報へのアクセスは許可されていません。代わりに、ゲームのレンダリングされたディスプレイへのアクセスとそのディスプレイに対する報酬のみが与えられます。人間のプレーヤーが見るものしか見ることができません。機械学習では、ボットは正式に_agent_として知られています。このチュートリアルの場合、エージェントは、_policy_と呼ばれる意思決定機能に従って動作するシステム内の「プレーヤー」です。主な目標は、強力なポリシーで武装して強力なエージェントを開発することです。言い換えれば、私たちの目的は、強力な意思決定能力を備えたインテリジェントボットを開発することです。Invadersをプレイするときにランダムアクションを実行する基本的な強化学習エージェントをトレーニングします。gymに含まれるシンプルなゲーム環境。openai.com/[Gym]、https://openai.com/[OpenAI]によってリリースされた強化学習ツールキット。このチュートリアルに従うことにより、機械学習でのモデルの複雑さの選択を支配する基本概念を理解できます。前提条件このチュートリアルを完了するには、次のものが必要です。18.04を実行するサーバー。+」権限が設定された非ルートユーザーと、UFWで設定されたファイアウォールが必要です。18.04の初期サーバーセットアップガイド]に従ってください。3をインストールしてプログラミング環境をセットアップする方法]。3をインストールし、ローカルプログラミング環境をセットアップできます。-python-3のローカルプログラミング環境のインストールとセットアップ[Pythonインストールおよびセットアップシリーズ]。手順1-プロジェクトの作成と依存関係のインストールボットの開発環境を設定するには、ゲーム自体と計算に必要なライブラリをダウンロードする必要があります。+`という名前のこのプロジェクトのワークスペースを作成することから始めます。~/AtariBot次に、プロジェクトの新しい仮想環境を作成します。この仮想環境には任意の名前を付けることができます。+」という名前を付けます。venv環境をアクティブにします。/bin/activateUbuntuでは、バージョン16.04の時点で、OpenCVは機能するためにさらにいくつかのパッケージをインストールする必要があります。これらには、ソフトウェアビルドプロセスを管理するアプリケーションであるCMakeのほか、セッションマネージャー、その他の拡張機能、デジタル画像合成が含まれます。次のコマンドを実行して、これらのパッケージをインストールします。`パッケージをインストールします。+`ファイルを操作するためのコマンドラインツールを含みます。+」に加えて、次のパッケージをインストールする必要があります。Gym、さまざまなゲームを研究に利用できるようにするPythonライブラリ、およびAtariゲームのすべての依存関係。OpenAIによって開発されたGymは、さまざまなエージェントとアルゴリズムのパフォーマンスを均一に評価できるように、各ゲームの公開ベンチマークを提供しています。Tensorflow、深層学習ライブラリ。このライブラリにより、計算をより効率的に実行することができます。具体的には、GPU上で排他的に実行されるTensorflowの抽象化を使用して数学関数を構築することにより、これを行います。OpenCV、前述のコンピュータービジョンライブラリ。SciPy、効率的な最適化アルゴリズムを提供する科学計算ライブラリ。NumPy、線形代数ライブラリ。次のコマンドを使用して、これらの各パッケージをインストールします。このコマンドは、インストールする各パッケージのバージョンを指定することに注意してください。+」をもう一度使用して、ジムのAtari環境をインストールします。これには、スペースインベーダーを含むさまざまなAtariビデオゲームが含まれます。atari-py-0.1.7これらの依存関係がインストールされたら、次に進み、ランダムに再生して比較のベースラインとして機能するエージェントを作成します。Invadersをプレイするエージェントをセットアップします。どの実験でも、モデルのパフォーマンスを理解するのに役立つベースラインを取得する必要があります。このエージェントは各フレームでランダムなアクションを実行するため、ランダムなベースラインエージェントと呼びます。この場合、このベースラインエージェントと比較して、後の手順でエージェントのパフォーマンスを確認します。ジムでは、独自のゲームループを維持できます。これは、ゲームの実行のすべてのステップを処理することを意味します。state_を要求します。このチュートリアルでは、ゲームの状態は、特定のタイムステップでのゲームの外観であり、ゲームをプレイしている場合に表示されるものです。`という名前のPythonファイルを作成します。bot_2_random.py次の強調表示された行を追加して、このスクリプトを開始します。+`ステートメントが含まれています。+`関数を追加します。+`を使用してゲームを初期化します。+`関数を追加します。この関数は、次の種類の値を返すことができます。+:提供されたアクションを適用した後のゲームの新しい状態。+:州が被るスコアの増加。例として、これは、弾丸がエイリアンを破壊し、スコアが50ポイント増加した場合です。スコアベースのゲームをプレイする場合、プレーヤーの目標はスコアを最大化することです。これは、総報酬を最大化することと同義です。+:エピソードが終了したかどうか。これは通常、プレイヤーがすべての命を失ったときに発生します。+:とりあえず脇に置く余分な情報。」を使用して、プレーヤーがいつ死亡するかを決定します。次のゲームループを追加します。これは、プレーヤーが死ぬまでループするようにゲームに指示します。`チェックを含めます。`がトリガーされます*。+`関数に配置することをお勧めします。breakファイルを保存し、エディターを終了します。次に、次のように入力してスクリプトを実行します。bot_2_random.pyプログラムは、次のような数値を出力します。ファイルを実行するたびに、異なる結果が得られることに注意してください。SpaceInvaders-v0Reward:これらのランダムな結果には問題があります。他の研究者や実務家が恩恵を受けることができる仕事を生み出すためには、結果と試験が再現可能でなければなりません。これを修正するには、スクリプトファイルを再度開きます。random.seed(0)`を追加します。env.seed(0)+`を追加します。これらのラインを組み合わせることで、一貫した開始点で環境を「シード」し、結果が常に再現可能になるようにします。最終的なファイルは、次と正確に一致します。main()ファイルを保存してエディターを閉じ、ターミナルで次のように入力してスクリプトを実行します。bot_2_random.pyこれにより、正確に次の報酬が出力されます。555.0これは非常に最初のボットですが、意思決定の際に周囲の環境を考慮していないため、ややインテリジェントではありません。ボットのパフォーマンスをより確実に推定するために、エージェントを一度に複数のエピソードで実行し、複数のエピソード全体の平均報酬を報告することができます。これを設定するには、最初にファイルを再度開きます。random.seed(0)+`の後に、次の強調表示された行を追加します。これは、10エピソードでゲームをプレイするようエージェントに指示します。env.seed(0)+`の直後に、新しい報酬リストを開始します。+」の直前に、現在のエピソードの報酬をすべての報酬のリストに追加します。.ファイルは次のようになります。次のコードブロックには、スクリプトの重要な部分を明確にするためのコメントがいくつか含まれていることに注意してください。main()ファイルを保存し、エディターを終了して、スクリプトを実行します。bot_2_random.pyこれにより、次の平均報酬が正確に印刷されます。163.50ベースラインスコアのより信頼できる推定値が得られました。優れたエージェントを作成するには、強化学習のフレームワークを理解する必要があります。「意思決定」の抽象的な概念をより具体的にするにはどうすればよいですか?強化学習についてどのゲームでも、プレーヤーの目標はスコアを最大化することです。このガイドでは、プレーヤーのスコアは「報酬」と呼ばれます。報酬を最大化するには、プレイヤーは意思決定能力を磨くことができなければなりません。正式には、決定とは、ゲームを見たり、ゲームの状態を観察したり、アクションを選択したりするプロセスです。私たちの意思決定機能は_policy_と呼ばれます。ポリシーは状態を入力として受け入れ、アクションを「決定」します。actionそのような関数を構築するために、強化学習における_Q学習アルゴリズム_と呼ばれる特定のアルゴリズムのセットから始めます。これらを説明するために、ゲームの初期状態を考えます。宇宙船とエイリアンはすべて開始位置にあります。次に、各アクションが獲得する報酬を示す魔法の「Qテーブル」にアクセスできると仮定します。+`アクションは報酬を最大化します。最高の価値を持つ報酬が得られるためです:10。ご覧のとおり、Qテーブルは、観察された状態に基づいて、決定を下す簡単な方法を提供します。rewardただし、ほとんどのゲームには状態が多すぎてテーブルにリストできません。そのような場合、Q学習エージェントはQテーブルではなく_Q関数_を学習します。このQ関数は、以前のQテーブルの使用方法と同様に使用します。テーブルエントリを関数として書き換えると、次のことがわかります。3特定の状態を考えると、簡単に判断できます。考えられる各アクションとその報酬を確認し、予想される最高の報酬に対応するアクションを実行するだけです。以前のポリシーをより正式に再編成すると、次のようになります。action)これは、意思決定機能の要件を満たします。ゲーム内の状態を考えると、アクションを決定します。Q(state、action)」を知っていることに依存しています。Q(state、action)+`を推定するには、次のことを考慮してください。エージェントの状態、アクション、および報酬の多くの観察を考えると、移動平均を取ることによって、すべての状態およびアクションの報酬の推定値を取得できます。Invadersは、報酬が遅れるゲームです。プレイヤーは、エイリアンが爆発したときに報酬が与えられます。射撃によってアクションをとるプレーヤーは、報酬の真の推進力です。`(state0、shoot)`に肯定的な報酬を割り当てなければなりません。これらの2つの洞察は、次の方程式で体系化されています。action')これらの方程式は、次の定義を使用します。Q-Learning]のこの記事を参照してください。強化学習のこの理解を念頭に置いて、残っているのは、実際にゲームを実行し、新しいポリシーのこれらのQ値の推定値を取得することです。Lake用の単純なQ学習エージェントの作成ベースラインエージェントができたので、新しいエージェントの作成を開始し、元のエージェントと比較できます。[Q-learning]を使用するエージェントを作成します。これは、特定の状態でどのアクションを実行するかをエージェントに教えるために使用される強化学習手法です。[FrozenLake]という新しいゲームをプレイします。このゲームのセットアップは、ジムのWebサイトで次のように説明されています。あなたとあなたの友人は、フリスビーを湖の真ん中に置き去りにした野生の投げをしたときに、公園でフリスビーを投げ回していました。水はほとんど凍っていますが、氷が溶けている穴がいくつかあります。これらの穴のいずれかに足を踏み入れると、凍った水の中に落ちます。現時点では、国際的なフリスビー不足が発生しているため、湖を渡ってディスクを回収することが絶対に不可欠です。氷は滑りやすいため、常に意図した方向に移動するとは限りません。表面は、次のようなグリッドを使用して記述されます。」で示される右下のゴールに向かって進みます。*であり、目標に到達するとスコア1になります。+」と示された多数の穴があり、1つに陥るとすぐにスコアが0になります。このセクションでは、簡単なQ学習エージェントを実装します。以前に学んだことを使用して、_exploration_と_exploitation_の間でトレードオフするエージェントを作成します。この文脈では、探索とはエージェントがランダムに行動することを意味し、搾取とはQ値を使用して最適な行動と思われるものを選択することを意味します。Q値を保持するためのテーブルを作成し、エージェントが行動して学習するにつれて、増分的に更新します。手順2のスクリプトのコピーを作成します。bot_3_q_table.py次に、編集のためにこの新しいファイルを開きます。bot_3_q_table.pyスクリプトの目的を説明するファイルの上部にあるコメントを更新することから始めます。これは単なるコメントであるため、この変更はスクリプトが正常に機能するために必要ではありませんが、スクリプトの動作を追跡するのに役立ちます。`をインポートする必要があります。+」のすぐ下に、強調表示された行を追加します。+`のシードを追加します。.次に、ゲームの状態にアクセスできるようにします。+`にゲームの初期状態を保存します。