+`ループは次のように一致します。」ループのすぐ上に、次の2つの強調表示された行を追加します。これらの行はTensorflowセッションを初期化し、GPUで操作を実行するために必要なリソースを順番に管理します。2行目は、計算グラフのすべての変数を初期化します。重みを更新する前に0に初期化します。+`ループ全体を4つのスペースでインデントします。次のコードは、対応するプレースホルダーを評価し、アクションを何らかの確率でランダムアクションに置き換えます。env.step(action)+`を含む行の後に、Q値関数の推定でニューラルネットワークをトレーニングするために次を挿入します。.最終ファイルはhttps://github.com/do-community/bots-for-atari-games/blob/master/src/bot_4_q_network.py[GitHubでホストされているこのファイル]と一致します。ファイルを保存し、エディターを終了して、スクリプトを実行します。bot_4_q_network.py出力は、正確には次のようになります。-1)これで、初めてのディープQラーニングエージェントのトレーニングが完了しました。FrozenLakeのような単純なゲームの場合、Qディープラーニングエージェントはトレーニングに4000エピソードを必要としました。ゲームがはるかに複雑だったと想像してください。結局のところ、エージェントは_数百万のサンプルを必要とする可能性があります。必要なサンプル数は「サンプルの複雑さ」と呼ばれ、次のセクションでさらに詳しく説明します。バイアスと分散のトレードオフを理解する一般的に、サンプルの複雑度は機械学習のモデルの複雑度と対立します。モデルの複雑さ:問題を解決するために十分に複雑なモデルが必要です。線のような単純なモデルは、車の軌道を予測するのに十分複雑ではありません。サンプルの複雑さ:多くのサンプルを必要としないモデルが必要です。これは、ラベル付きデータへのアクセスが制限されている、計算能力が不十分、メモリが限られているなどの理由による可能性があります。2つのモデルがあるとします。1つは単純なモデルで、もう1つは非常に複雑なモデルです。両方のモデルが同じパフォーマンスを達成するために、バイアス分散は、非常に複雑なモデルではトレーニングに指数関数的に多くのサンプルが必要になることを示しています。適切な事例:ニューラルネットワークベースのQ学習エージェントは、FrozenLakeを解決するために4000エピソードを必要としました。ニューラルネットワークエージェントに2番目のレイヤーを追加すると、必要なトレーニングエピソードの数が4倍になります。複雑なニューラルネットワークでは、この格差は大きくなります。同じエラー率を維持するために、モデルの複雑さを増やすと、サンプルの複雑さが指数関数的に増加します。同様に、サンプルの複雑さを減らすと、モデルの複雑さが減ります。したがって、モデルの複雑さを最大化することはできず、サンプルの複雑さを最小限に抑えることはできません。このトレードオフに関する知識を活用できます。Tradeoff]を参照してください。高レベルでは、バイアス分散分解は、「真のエラー」を2つのコンポーネント(バイアスと分散)に分解したものです。「真の誤差」を_平均二乗誤差(MSE)と呼びます。これは、予測されたラベルと真のラベルの予想される差です。以下は、モデルの複雑さが増すにつれて「真のエラー」の変化を示すプロットです。「線形回帰」としても知られる「最小二乗法」は、数学およびデータサイエンスの分野で広く使用されている回帰分析の手段です。機械学習では、2つのパラメーターまたはデータセットの最適な線形モデルを見つけるためによく使用されます。ステップ4では、Q値を計算するニューラルネットワークを構築しました。このステップでは、ニューラルネットワークの代わりに、最小二乗法の変形であるリッジ回帰を使用して、このQ値のベクトルを計算します。希望は、最小二乗として複雑でないモデルで、ゲームを解くのに必要なトレーニングエピソードが少なくなることです。手順3のスクリプトを複製することから始めます。bot_5_ls.py新しいファイルを開きます。bot_5_ls.py繰り返しますが、このスクリプトが何をするかを説明するファイルの上部にあるコメントを更新します。.ファイルの上部にあるインポートのブロックの前に、型チェックのためにさらに2つのインポートを追加します。」を追加して、2番目のQ関数の学習率を制御します。エピソードの数を5000に、割引率を「+0.85」に更新します。+`の両方のハイパーパラメーターをより大きな値に変更することにより、エージェントはより強力なパフォーマンスを発行できます。+`関数の前に、次の高階関数を追加します。モデルを抽象化するラムダ(匿名関数)を返します。+`メソッドを追加し、新しいモデルで古いモデルを重み付けします。モデルと抽象化されたQ関数の両方を返します。+」を追加して、状態とアクションのワンホットエンコーディングを実行します。.これに続いて、トレーニングロジックを変更する必要があります。あなたが書いた前のスクリプトでは、Q-tableは反復ごとに更新されました。このスクリプトは、タイムステップごとにサンプルとラベルを収集し、10ステップごとに新しいモデルをトレーニングします。Qテーブルまたはニューラルネットワークを保持する代わりに、最小二乗モデルを使用してQ値を予測します。for」ループの前にスクロールダウンします。+」リストをリセットする次の行を追加します。env.reset()+`を定義するこの行の直後の行を変更します。これは、その使用のすべてがワンホットベクトルを必要とするため、状態をすぐにワンホットエンコードします。+」のリストを修正します。+`の計算を更新し、ノイズの確率を減らし、Q関数の評価を修正します。+`の定義でQ関数呼び出しを修正します。+`を更新する行を削除し、次の行に置き換えます。このコードは、現在のモデルの出力を取得し、現在のアクションに対応するこの出力の値のみを更新します。その結果、他のアクションのQ値には損失が生じません。+」の直後に、モデルに定期的な更新を追加します。これにより、10時間ステップごとにモデルがトレーニングされます。[ソースコード]と一致することを再確認してください。次に、ファイルを保存し、エディターを終了して、スクリプトを実行します。bot_5_ls.pyこれは以下を出力します。pageによると、ゲームを「解決する」とは、平均100エピソード0.78を達成することを意味することを思い出してください。ここでは、エージェントは平均0.82を達成し、5000エピソードでゲームを解決できたことを意味します。これは、より少ないエピソードでゲームを解決しませんが、この基本的な最小二乗法は、おおよそ同じ数のトレーニングエピソードを持つ単純なゲームを解決できます。ニューラルネットワークは複雑になりますが、FrozenLakeには単純なモデルで十分であることを示しました。これで、3つのQ学習エージェントを探索しました。1つはQテーブルを使用し、もう1つはニューラルネットワークを使用し、3つ目は最小二乗を使用します。次に、より複雑なゲームのための深層強化学習エージェント、スペースインベーダーを構築します。ステップ6-スペースインベーダー用のディープQラーニングエージェントの作成ニューラルネットワークを選択したか最小二乗法を選択したかに関係なく、以前のQ学習アルゴリズムのモデルの複雑さとサンプルの複雑さを完全に調整したとします。結局のところ、この非インテリジェントなQラーニングエージェントは、特に多数のトレーニングエピソードがあっても、より複雑なゲームでは依然として不十分なパフォーマンスを発揮します。このセクションでは、パフォーマンスを改善できる2つの手法について説明します。次に、これらの手法を使用してトレーニングされたエージェントをテストします。人間の介入なしでその動作を継続的に適応させることができる最初の汎用エージェントは、DeepMindの研究者によって開発されました。DeepMindのオリジナルのディープQラーニング(DQN)ペーパーは、2つの重要な問題を認識しました。相関状態:時間0でのゲームの状態を取得します。Q(s0)を更新するとします。Q(s1)を更新します。時間0でのゲームの状態は、時間1での状態と非常に似ていることに注意してください。スペースインベーダーでは、エイリアンがそれぞれ1ピクセルずつ移動した可能性があります。Q(s1)も非常に似ていると予想されるため、一方を更新すると他方に影響します。Q(s1)への更新に対抗する可能性があるため、これによりQ値が変動します。は_correlated_です。Q(s0)*と相関しています。関数は、トレーニングするモデルであり、ラベルのソースでもあることを思い出してください。実際に表すランダムに選択された値であるとします。これは、モデルが移動するターゲットを学習しようとしていることを意味します。使用するモデルは固定分布を前提としているため、これは問題です。buffer_と呼ばれる状態のリストを保持できます。タイムステップごとに、観察するゲームの状態をこのリプレイバッファーに追加します。このリストから州のサブセットをランダムにサンプリングし、それらの州で訓練します。Q(s、a)を複製しました。Q_current(s、a)と呼ばれ、更新するQ関数です。’、a’)が必要ですが、これは更新しません。‘、a’)はラベルの生成に使用されます。分離し、後者を修正することにより、ラベルがサンプリングされる分布を修正します。その後、ディープラーニングモデルはこの分布を短時間で学習できます。これらを自分で実装することはありませんが、これらのソリューションでトレーニングした事前トレーニング済みのモデルをロードします。これを行うには、これらのモデルのパラメーターを保存する新しいディレクトリを作成します。+」を使用して、事前学習済みのスペースインベーダーモデルのパラメーターをダウンロードします。models次に、ダウンロードしたばかりのパラメーターに関連付けられたモデルを指定するPythonスクリプトをダウンロードします。この事前学習済みモデルには、入力に注意する必要がある2つの制約があることに注意してください。84に縮小する必要があります。入力は、積み重ねられた4つの状態で構成されます。これらの制約については、後ほど詳しく説明します。今のところ、次のように入力してスクリプトをダウンロードします。Invadersエージェントを実行して、パフォーマンスを確認します。過去に使用したいくつかのボットとは異なり、このスクリプトはゼロから作成します。新しいスクリプトファイルを作成します。bot_6_dqn.pyこのスクリプトを開始するには、ヘッダーコメントを追加し、必要なユーティリティをインポートして、メインのゲームループを開始します。/AtariBot/bot_6_dqn.pyインポート直後に、ランダムシードを設定して結果を再現可能にします。+`関数を定義します。84の画像で学習されているため、すべての画像を事前学習済みのニューラルネットワークに渡す前にダウンサンプリングします。.環境シードの直後に、空のリストを初期化して報酬を保持します。.この手順の最初にダウンロードした事前学習済みモデルパラメーターを使用して、事前学習済みモデルを初期化します。」回繰り返して平均パフォーマンスを計算し、各エピソードの報酬を0に初期化するように指示する行を追加します。.一度に1つの状態を受け入れる代わりに、新しいニューラルネットワークは一度に4つの状態を受け入れます。`のリストに少なくとも4つの状態が含まれるまで待つ必要があります。True:+」と表示されている行の下に次の行を追加します。これらは、4つ未満の状態がある場合にランダムアクションを実行するか、状態が連結されて少なくとも4つある場合に事前トレーニングモデルに渡すようにエージェントに指示します。.次に、アクションを実行し、関連データを更新します。観測された状態のダウンサンプリングバージョンを追加し、このエピソードの報酬を更新します。+」ループを早期に中断します。for」ループの外側で、平均報酬を出力します。breakファイルが次と一致することを確認します。main()ファイルを保存して、エディターを終了します。次に、スクリプトを実行します。bot_6_dqn.py出力は次で終了します。2756.00これを、スペースインベーダーのランダムエージェントを実行した最初のスクリプトの結果と比較します。その場合の平均報酬は約150でした。この結果は20倍以上優れています。遅いため、コードを実行したのは3つのエピソードだけであり、3つのエピソードの平均は信頼できる指標ではありません。これを10エピソード以上実行すると、平均は2756です。100以上のエピソード、平均は約2500です。これらの平均値を使用した場合にのみ、エージェントが実際に1桁優れたパフォーマンスを発揮し、スペースインベーダーを合理的にうまくプレイできるエージェントがいると快適に結論付けることができます。サンプルの複雑さに関して前のセクションで提起された問題を思い出してください。Invadersエージェントは何百万ものサンプルを使ってトレーニングします。GPUで24時間を必要としました。適切なトレーニングを行うにはかなりの量の計算が必要でした。前の手順で、この質問の調査を開始するのに十分な知識を習得する必要があります。はるかに単純なモデルとバイアス分散ごとのトレードオフを使用すると、可能性があります。結論このチュートリアルでは、ゲーム用のいくつかのボットを構築し、バイアス分散と呼ばれる機械学習の基本概念を探りました。結局のところ、これは保留中の研究の質問であり、Google、DeepMind、およびBlizzardの協力者からのオープンソースツールで補完されています。[OpenAIでの研究の公募]を参照してください。このチュートリアルの主なポイントは、バイアスと分散のトレードオフです。モデルの複雑さの影響を考慮するのは、機械学習の実践者次第です。非常に複雑なモデルを活用して、過剰な量の計算、サンプル、および時間を重ねることができますが、モデルの複雑さを軽減すると、必要なリソースを大幅に削減できます。