こんにちは､ このチュートリアルにようこそ｡
3で終わっていることを改めてお祝いします｡
ほら､ できたよ｡
私たちは頭脳を作り､ それを訓練しているのです｡
しかし､ 今はまだテストエージェントを作らなければなりません｡ テストエージェントはモデルを全く更新せず､
ただ共有されたモデルを使って独自の探索を行うだけなのです｡
そしてもちろん､ このコードでは､ いくつかのビデオを録画し､ これらは､ このテストエージェントがあるスコアでブレイクアウトをプレイしているビデオとなります｡
では､ このコードを見てみましょう｡
最も重要なことが行われます｡
ですから､ 先ほどお話したように､ 一行ずつコーディングするわけではありませんが､ ここで何が起こっているのかを理解していただくことが重要だと思います｡
そこで､ このコードです｡
最初のセクションでは､ お気づきのように､ ライブラリをインポートし､ このテスト関数を定義して､ このテストエージェントを独自の探索に導き､
ブレイクアウトゲームをプレイさせます｡
そうそう､ そうなんです｡
このテスト関数は3つの引数を取る｡
1つ目はランクで､ トレーニングエージェントで行ったようにテストエージェントの同期を行うことです｡
それから､ もちろんパラメータも必要ですから｡
そしてもちろん､ このテストエージェントが独自の探索を行うために共有モデルを使用するため､ 共有モデルを持っています｡
さて､ 次にこのコードの行で関数内に入り､ 前と同じようにテストエージェントを同期させました｡
そして､ 環境を取り込みます｡
次のチュートリアルにあるメインコードでは､ breakout zeroの環境に入ってゲームをプレイできるように､
ここのend of nameをbreakout with zeroに置き換えることを思い出します｡
そして､ ビデオイコールトゥルーとは､ パイプラインブレイクアウトのビデオを手に入れることができるということです｡
つまり､ 基本的にこのコードの行を合計すると､ 動画で1つの環境を実行することになります｡
そして､ 次の行で､ この環境を同期させるので､ 訓練された関数と全く同じ原理です｡
次に､ モデルを取得します｡ これを行うには､ アクティブクラスのオブジェクトを作成し､ 環境､
観察､ 空間､ 形状ゼロで入力形状を入力します｡
つまり､ 訓練関数と出力､ つまり行動空間での行動と全く同じです｡
つまり､ 今までと全く同じでありながら､ 何か新しいことが起こるということです｡
トレーニングが終わったので､ モデルをtrainモードにはしたくありません｡
なぜなら､ 単にトレーニングさせたくないからです｡
つまり､ 基本的にはテストエージェントをテストするモードにし､ その性能を評価するためのものです｡
次に､ ゲームからの入力画像である入力状態を取得します｡ この時点では､ 配列で行います｡
そして､ ここではトーチセンサーに変換しています｡
ここでは､ 報酬の一部を初期化します｡
ここでは､ downをtrueに初期化する｡
だから､ 前回と同じようにまだ､ そしてまた新しい何かがある｡
この第3の時間変数をtime to time関数で導入し､ 計算の時間を計測する｡
このように､ 右から､ あるいは左からキューに要素を追加することができる､
非常に実用的なタイプのキューを使用しています｡
というわけで､ 非常に実用的な内容になっていますので､ 推奨版のコードで参考リンクを貼っておきます｡
だから､ この日行列がどうなっているのかを見てもらうことで､ それが可能になるわけです｡
そして､ エピソードの長さをもちろんゼロで初期化し､ この井戸端ループでサイズをインクリメントしていくのです｡
そこで､ ここでも同じように while true を使って､ ループの中でエピソードの長さを1つずつ増やしていきます｡
ゲームが終わったら､ 共有モデルの最後のセットを再読み込みする｡
他のモデルによって更新された共有モデル｡
ここでは､ この共有モデルが更新されなくなったことを忘れないでください｡
それならまだしも､ もしゲームが終わってしまったら､ 私たちはその中にいるのです｡
セルの状態､ see x と隠された状態 h x を再初期化し､ 他にゲームが終わっていなければ､ まあ､ 同じセルの状態と隠された状態を維持しますが､
それらがグラデーションに付けられるように全変数になるようにします｡
これは､ すでにtrain関数でやったことで､ さらにwild loopでもやっています｡
そして､ ここでの2つのケースに応じて､ 正しい方法で非表示状態のセルの状態を更新した後｡
さて､ どうしましょうか？
モデルの予測値を得ることができる｡
だから､ このコードの行はまさにそれを行うものなのです｡
つまり､ 評論家の出力である値､ アクターの出力であるアクションの値､ そして一番上の､
すべての隠れ状態､ h､ x､ セルの状態はxを参照しています｡
そして､ ここでQ値の行動値である行動の確率分布を生成する｡
そして､ これをmax関数で行うのです｡
そしてもちろん､ これはテストエージェントに対するトレーニングのためだけなので､ ここで対数確率を求める必要はありません｡
ドゥームのように使うだけのアクションを､ ソフトMAXのボディで再生してくれるのです｡
でも､ ここではトレーニングをするわけではないので､ 支柱だけです｡
そして､ このプローブから､ この確率の最大値を直接取ってアクションを実行するのです｡
つまり､ 最も確率の高い行動をとるのである｡
そして､ その理由は､ テストエージェントが探索を行わないからです｡
ということを忘れないでください｡
他のアクションを探索したいときに､ 確率の低いアクションをピックアップする機会を持つことで､
最も確率の高いアクションを毎回取ることがない｡
しかし､ ここではテストエージェントは何の探索もしない｡
だからこそ､ 最大の確率を持つ行動を直接取るわけです｡
そして､ アクションをプレイしたら次の状態になり､ 次の報酬を得て､ doneはゲームオーバーかどうかが更新されるのです｡
つまり､ このコードで､ アクションを選択した後に再生することで､ このようなことが可能になるのです｡
つまり､ ここでアクションを実行すると､ 状態が取得され､ 報酬が得られ､ downが更新されるのです｡
そして､ 新しい報酬を得たばかりなので､ この新しい報酬を追加するだけで､ 報酬の合計を更新することになります｡
そして最後に､ ゲームが終了するたびに
ゲームが終了したら､ AIがゲームを終了したら､ 時間､ エピソード､ エピソードの長さ､
つまり､ どれくらいの時間､ ブレイクアウトをプレイし続けたかという結果をプリントすることになりますね｡
そして､ このような時間のトリックを使って､ すべての変数をプリントしているところです｡
だから､ その時のためにね｡
そして､ リワードサムはリワードの合計を表す変数､ エピソードレングスはエピソードの長さを表す変数に過ぎません｡
OCして､ すべての結果をプリントしたら､ まあ､ ゲームは終わったので､ 新しいゲームを始めたいので､
報酬の合計であるものをすべてゼロに初期化しなおします｡
1話の長さを0にする｡
このクリア機能を使って､ すべてのアクションを再始動させます｡
入力画像をリセットする......つまり､ レンガを全部並べ直すんです｡
そして最後に､ この60秒間のスリープ時間を使って､ 他のエージェントに練習させるために1分間の休憩をします｡
そして最後に､ 新しい状態を取得するコードの行があり､ それから前に進むことができます｡
私たちはこの新しいゲームで続けることができます｡
そうそう､ そうなんです｡
これがテスト機能で､ このおかげで1､ 2回のチュートリアルでビデオを見ることができます｡
前回のように､ みんなで一緒に結果を見たいと思います｡
それは､ あなたやキャロル､ そして私と一緒です｡
それは楽しみですね｡
そして､ 良い結果を期待する､ と言っています｡
しかし､ この脱力系のゲームは超難易度が高いということを肝に銘じておいてください｡
最初は一番シンプルなゲームだと思っていたのですが､ 全然違いましたね｡
実は『ドゥーム』よりもずっと難しいことがわかったので､ 最後のモジュールに入れました｡
でも､ とにかく､ ここが一番重要ではないと言って､ 次のチュートリアルでこの関数をメインに作りましょう｡
a3cがすべて実装された今｡
ですから､ 一行一行のコーディングは行いません｡
コードを展開し､ 非常に迅速に結果を得ることができます｡
それまではお楽しみに｡
I.