こんにちは､ このチュートリアルにようこそ｡
これで､ モデルの脳ができました｡
また､ オプティマイザーもあります｡
ですから､ 基本的にはさまざまなエージェントを訓練する準備はできています｡
それが私たちの異なる脳です｡
というわけで､ これからはa3cのアルゴリズムをすべて含んだこの大きな訓練関数を作っていくことになります｡
したがって､ これからこの列車に実装するのは､ このPファイルは巨大な列車関数に過ぎないのです｡
彼らはこの大きな電車の機能だけで､ 他には何もなく､ 気品もないでしょう｡
しかし､ このモジュールの最後のステップで､ この列車関数をメインコードで使用することになります｡
そうそう､ そうなんです｡
しかし､ 始める前に､ まあ､ 最初にいくつかのライブラリをインポートしていることにお気づきでしょう｡
つまり､ クラシックなライブラリにトーチモジュール､ つまりトーチライブラリ､ それからアタリ環境を作るためのエンドライブラリ､
これがブレークアウトになるわけです｡
そして､ もちろん､ モデルファイルからアクティブなクラスをインポートしますこの｡
そして最後に､ torch undergradの変数を使って､ ダイナミックグラフのおかげで勾配の高性能計算を実行する予定です｡
なぜなら､ まずこれは､ エージェントが使用するモデルが共有グラデーションを持っていない場合に､
すべてが正しく動作することを確認するための関数だからです｡
だから､ 共有グラッツの確保というわけです｡
そしてもうひとつは､ この機能は必要ないと思うのですが､ どうでしょう｡
そして､ 少なくともこれで､ コードが正しく実行されることを100％確信できる｡
でも､ そんなことはどうでもいいんです｡
注目すべきは､ これから作り始めるこの電車の機能です｡
さあ､ デヴとトレーニングだ｡
ここでは単に電車と呼ぶことにします｡
そして､ この列車関数はいくつかの引数を取ることになる｡
1つ目はランクです｡
それが何であるかは､ 2番目で説明するつもりです｡
2つ目のパラメータはparamsで､ 環境のすべてのパラメータを指定し､ 3つ目のパラメータは共有モデルになります｡
つまり､ 共有モデルは､ エージェントが一定のステップ数で小さな探索を実行するために取得するものなんですね｡
そして､ 最後の引数がオプティマイザーになります｡
それが､ 先ほど作ったものです｡
とても完璧です｡
これが私たちの4つの主張です｡
そして､ いよいよこの電車機能の実装に取り掛かります｡
そこでまず､ a3cの略称を覚えているかどうかです｡
同期型アクティブクリティックエージェントの略｡
a3cでは､ シンクロがあるわけです｡
そこで､ ご理解いただいたように､ 各トレーニングエージェントを同期させる必要があるのですが､ 同期させるために､
ランクを使って各シードをこのランクでシフトさせることにします｡
つまり､ このランクパラメータは､ 各トレーニングエージェントが同期するようにシードを移動させるだけなのです｡
つまり､ 例えば学習エージェントがn人いるとすると､ ランクは1からNまであり､ 1エージェントあたり1からnまで1つの整数が存在することになるのです｡
そのため､ 1スレッドずつ種をずらすと､ そのスレッドが作成するすべての疑似乱数は､ 他のスレッドから完全に独立したものになります｡
しかし､ 種は固定数なので､ その体験を再現すると全く同じ事象が見つかり､
それは種に関して決定論的であるからです｡
だから､ それを理解することが大切なんです｡
そして､ ここでランクを使ってシードをずらすことで､ 各トレーニングエージェントを同期させることがまず必要なわけです｡
では､ こうしてみましょう｡
そのために､ トーチライブラリを利用するのです｡
そして､ 手動でアンダースコア､ シード括弧でシードを取得することになります｡
これは機能です｡
そして､ これから params dot seed でアクセスできるすべてのエージェントのシードを取得し､ それをランクでシフトして､
それぞれのエージェントを同期させます｡
ここにプラスランクをつけるだけです｡
そして､ 各トレーニングエージェントには1つのシードがあるため､ 各トレーニングエージェントの権利を剥奪するために､ ランクを持ったシードを移動させることになります｡
よし､ まずは完了だ｡
そして､ 次のステップです｡
次は環境の整備です｡
そこで､ envと呼ぶ新しい変数を作成し､ 今度はendモジュールのcreate Atari
end関数を使って､ ブレイクアウトのための環境を作成することにします｡
それは､ ブレイクアウトの環境を手に入れることです｡
そこで､ この機能を利用して､ アタリを作り､ ｡
そして､ 今､ 私たちはただ一つの引数を入力しなければならない｡ それは､ 環境のパラメータであり､ これは訓練関数の入力の一つであるため､
私たちはそれらを持っている｡
これは､ ブレイクアウトの環境のパラメータとなるこのパラメータです｡
そのため､ ブレイクアウト環境を取得するために､ このパラメータ引数を取り､ ドットで囲んで､ envの名前を取得します｡
今後､ コード全体を実行するメイン関数の次のコードでは､ ブレイクアウトブレイクアウト年になります｡
わかりました｡
それで､ 環境は完璧に整いました｡
そして､ 次のステップは､ 環境の種をエージェントの種に合わせることです｡
そして､ なぜそんなことをするのか？
それは､ a3cモデルの各エージェントが､ 環境のコピーのような独自のビジョンを持っていることを覚えているからです｡
そのため､ 各エージェントをある特定のバージョンの環境に揃える必要があります｡
そのためには､ 種を使うことになります｡ 種はそれぞれ特定の環境を決定するからです｡
ですから､ それぞれのエージェントに異なるシードを関連付けることで､ まあ､ 思い通りになるわけです｡
それは､ 各エージェントが独自の環境を持つことです｡
では､ どうすればいいのでしょうか｡
環境を取り､ それを足し､ そしてseed関数で環境に対して得たい種を選べばいいのです｡
環境の種をエージェントの種に合わせるには､ 単純にこれを取得する必要があります｡
これは､ エージェントの種に対応するもので､ この同期した学習エージェントを取得するために､ ランクのおかげでシフトされたものです｡
だから､ それをここに配置すればいいんです｡
そして､ これによって､ 環境の種をエージェントの種に揃えることができるのです｡
なるほど｡
さて､ これから3つのキーブレインであるモデルを手に入れます｡
これで､ モデルファイルからアクティブクリティッククラスを使用することになります｡
そこで､ 基本的にはこのアクタークラスのオブジェクトを作成し､ このオブジェクトモデル､ あるいはブレーンとでも呼ぶことにしましょう｡
しかし､ 基本的にこのオブジェクトには､ すべての畳み込み､ STM､ 線形完全接続､ 信号を伝搬させるための前進関数が含まれることになる｡
つまり､ 基本的には俳優と批評家の脳を含み､ 脳全体に信号を伝播して最終的なアウトプットを得る機能を持つことになります｡
では､ こうしてみましょう｡
では､ モデルを作ってみましょう｡
そこで､ 先ほど言ったように､ このオブジェクトモデルを呼び出したいと思います｡
そして､ actクラスのオブジェクトを作成し､ したがって､ クラス､ actor､ criticを取り､ 今度は､ どのような引数を入力する必要があるか覚えています｡
これは実はinit関数の引数なので､ 自分では入力する必要がないのです｡
それが､ initメソッドでオブジェクトを使用するために必要なことです｡
しかし､ その場合､ 入力しなければならない引数は､ 入力形状であるノム入力となります｡
つまり､ 入力､ 画像､ そして行動の集合を含む行動空間の次元です｡
そこで､ これらの引数をtrain関数に入力してみましょう｡
そこで､ まず､ 環境とドットで取得し､ 観測空間を利用する｡
つまり､ これが観測空間であり､ ダットであり､ そして入力の数を得るために形状を得るのです｡
ブラケットゼロ｡
わかりました｡
つまり､ 4つの無感覚な入力です｡
そして､ 次はアクションスペースです｡
まあ､ ほとんど同じですね｡
しかし､ 私たちが輸入している環境から得る必要があるのです｡
次にダット､ そしてアクションスペース｡
わかりました｡
そして､ これでオブジェクトを作成するときに入力する必要がある引数を得ることができます｡
クラスを作るという行為のモラル｡
さて､ これでモデルができたので､ 次は入力状態を準備します｡
ですから､ 私たちは今も深い強化学習を行っていることを忘れないでください｡
つまり､ 入力状態は入力画像であり､ したがってこれは元々､ 白黒画像を扱うので1チャンネルを含むnumpy配列となり､
42×42の寸法となります｡
しかし､ ここで重要なのは､ 入力状態が入力画像であることを理解し､ 心に留めておくことです｡
そこでまず､ やるべきことはナンバリングを取得し､ それをトーチテンソルに変換することである｡
しかし､ 私たちが以前行ったように､ 最初のステップは帝国を正しく理解することであり､ それを得ることは実はとても簡単なことなのです｡
まず､ 入力状態の変数を作成する必要があります｡ これをstateと呼び､
配列を取得するために､ 単に環境を取得し､ それを追加して､ reset関数を使用します｡
1は1チャンネル､ つまり白黒の画像､ 42×42はもちろん画像の寸法で､
幅と高さのピクセル数です｡
だから､ 基本的にはこの寸法で､ 作業することになります｡
そして今､ 私たちは実際に右によって､ このような寸法の画像をアレイで得ることができますので､
今度はそれをトーチセンサーに変換することができます｡
そして､ これをうまくやるには､ ウイルスを保持する必要がないので､ また状態を更新することになるのです｡
そこで､ トーチ・モジュールを使っているのです｡
そして忘れてはならないのは､ 我々はすでにドゥームのためにそれをやったということだ｡
アンダースコアのnumを括弧でくくったものを関数とし､ その中にトーチテンソルに変換したい数値を入力する必要がある｡
そして､ それが国家である｡
以前のバージョンのnumpy配列の状態は､ from them by関数でトーチテンソルを適用することによって､ なるようになります｡
つまり､ 状態からテンソルを作成し､ あとはdone変数を初期化するだけだ｡
done変数は一般的にエピソードが終わったか､ ゲームが終わったかを示す変数であることを思い出してください｡
ここではこのdone変数を導入してtrueに初期化し､ ゲームが終了したときにこのdone変数がtrueになることを指定したいだけです｡
だから､ AIが脱走するために無限にプレイすることがないように､ それは後々役に立つと思います｡
わかりました｡
これが､ この列車機能の基本的な始まりで､ いくつかの初期設定とやらなければならないことがありました｡
ここで一番重要なのは､ 各トレーニングエージェントを同期させることでした｡
それがa3cモデルの1/1の原則を適用しなければならないわけです｡
そして､ 次のチュートリアルでは､ 共有モデルとの同期に進みます｡
異なるモデルだけでなく､ すべてのエージェントが共有するモデルであるシェアードモデルがあることも忘れてはならない｡
そして､ 各エージェントがこの共有モデルを取得して､ あるステップ数の小さな探索に進めるように､
この共有モデルと同期させなければならないわけです｡
というわけで､ 次のチュートリアルでは､ それをやってみましょう｡
そしてそれまで､ お楽しみに｡
I.