WEBVTT

00:00.150 --> 00:02.010
こんにちは､ このチュートリアルにようこそ｡ 

00:02.040 --> 00:04.870
3で終わっていることを改めてお祝いします｡ 

00:04.900 --> 00:06.170
ほら､ できたよ｡ 

00:06.180 --> 00:08.180
私たちは頭脳を作り､ それを訓練しているのです｡ 

00:08.190 --> 00:14.940
しかし､ 今はまだテストエージェントを作らなければなりません｡ テストエージェントはモデルを全く更新せず､

00:14.940 --> 00:19.260
ただ共有されたモデルを使って独自の探索を行うだけなのです｡

00:19.290 --> 00:27.660
そしてもちろん､ このコードでは､ いくつかのビデオを録画し､ これらは､ このテストエージェントがあるスコアでブレイクアウトをプレイしているビデオとなります｡

00:28.560 --> 00:30.710
では､ このコードを見てみましょう｡ 

00:30.720 --> 00:31.980
最も重要なことが行われます｡ 

00:31.980 --> 00:38.520
ですから､ 先ほどお話したように､ 一行ずつコーディングするわけではありませんが､ ここで何が起こっているのかを理解していただくことが重要だと思います｡

00:38.520 --> 00:40.710
そこで､ このコードです｡ 

00:40.740 --> 00:47.280
最初のセクションでは､ お気づきのように､ ライブラリをインポートし､ このテスト関数を定義して､ このテストエージェントを独自の探索に導き､

00:47.280 --> 00:52.170
ブレイクアウトゲームをプレイさせます｡

00:52.350 --> 00:53.070
そうそう､ そうなんです｡ 

00:53.070 --> 00:55.230
このテスト関数は3つの引数を取る｡ 

00:55.230 --> 01:01.950
1つ目はランクで､ トレーニングエージェントで行ったようにテストエージェントの同期を行うことです｡

01:01.950 --> 01:05.100
それから､ もちろんパラメータも必要ですから｡ 

01:05.100 --> 01:13.140
そしてもちろん､ このテストエージェントが独自の探索を行うために共有モデルを使用するため､ 共有モデルを持っています｡

01:13.170 --> 01:20.190
さて､ 次にこのコードの行で関数内に入り､ 前と同じようにテストエージェントを同期させました｡

01:20.520 --> 01:22.950
そして､ 環境を取り込みます｡ 

01:22.950 --> 01:28.530
次のチュートリアルにあるメインコードでは､ breakout zeroの環境に入ってゲームをプレイできるように､

01:28.530 --> 01:35.010
ここのend of nameをbreakout with zeroに置き換えることを思い出します｡

01:35.010 --> 01:39.960
そして､ ビデオイコールトゥルーとは､ パイプラインブレイクアウトのビデオを手に入れることができるということです｡ 

01:39.960 --> 01:46.410
つまり､ 基本的にこのコードの行を合計すると､ 動画で1つの環境を実行することになります｡ 

01:46.830 --> 01:54.090
そして､ 次の行で､ この環境を同期させるので､ 訓練された関数と全く同じ原理です｡

01:54.450 --> 02:02.100
次に､ モデルを取得します｡ これを行うには､ アクティブクラスのオブジェクトを作成し､ 環境､

02:02.100 --> 02:06.330
観察､ 空間､ 形状ゼロで入力形状を入力します｡

02:06.330 --> 02:13.590
つまり､ 訓練関数と出力､ つまり行動空間での行動と全く同じです｡ 

02:13.590 --> 02:17.310
つまり､ 今までと全く同じでありながら､ 何か新しいことが起こるということです｡ 

02:17.310 --> 02:23.400
トレーニングが終わったので､ モデルをtrainモードにはしたくありません｡

02:23.400 --> 02:29.640
なぜなら､ 単にトレーニングさせたくないからです｡

02:29.640 --> 02:37.950
つまり､ 基本的にはテストエージェントをテストするモードにし､ その性能を評価するためのものです｡

02:38.460 --> 02:46.560
次に､ ゲームからの入力画像である入力状態を取得します｡ この時点では､ 配列で行います｡

02:46.560 --> 02:49.230
そして､ ここではトーチセンサーに変換しています｡ 

02:49.230 --> 02:51.750
ここでは､ 報酬の一部を初期化します｡ 

02:52.080 --> 02:54.960
ここでは､ downをtrueに初期化する｡ 

02:54.960 --> 02:58.770
だから､ 前回と同じようにまだ､ そしてまた新しい何かがある｡ 

02:58.770 --> 03:05.730
この第3の時間変数をtime to time関数で導入し､ 計算の時間を計測する｡ 

03:06.000 --> 03:11.760
このように､ 右から､ あるいは左からキューに要素を追加することができる､

03:11.760 --> 03:16.410
非常に実用的なタイプのキューを使用しています｡

03:16.410 --> 03:21.930
というわけで､ 非常に実用的な内容になっていますので､ 推奨版のコードで参考リンクを貼っておきます｡ 

03:21.930 --> 03:27.060
だから､ この日行列がどうなっているのかを見てもらうことで､ それが可能になるわけです｡ 

03:27.210 --> 03:34.620
そして､ エピソードの長さをもちろんゼロで初期化し､ この井戸端ループでサイズをインクリメントしていくのです｡

03:34.620 --> 03:42.240
そこで､ ここでも同じように while true を使って､ ループの中でエピソードの長さを1つずつ増やしていきます｡ 

03:42.240 --> 03:48.660
ゲームが終わったら､ 共有モデルの最後のセットを再読み込みする｡ 

03:48.690 --> 03:51.330
他のモデルによって更新された共有モデル｡ 

03:51.330 --> 03:54.750
ここでは､ この共有モデルが更新されなくなったことを忘れないでください｡ 

03:54.960 --> 04:00.270
それならまだしも､ もしゲームが終わってしまったら､ 私たちはその中にいるのです｡ 

04:00.270 --> 04:09.750
セルの状態､ see x と隠された状態 h x を再初期化し､ 他にゲームが終わっていなければ､ まあ､ 同じセルの状態と隠された状態を維持しますが､

04:09.930 --> 04:18.030
それらがグラデーションに付けられるように全変数になるようにします｡

04:18.360 --> 04:24.030
これは､ すでにtrain関数でやったことで､ さらにwild loopでもやっています｡ 

04:24.030 --> 04:30.780
そして､ ここでの2つのケースに応じて､ 正しい方法で非表示状態のセルの状態を更新した後｡

04:30.780 --> 04:31.800
さて､ どうしましょうか？

04:31.800 --> 04:34.260
モデルの予測値を得ることができる｡ 

04:34.260 --> 04:37.230
だから､ このコードの行はまさにそれを行うものなのです｡ 

04:37.530 --> 04:42.600
つまり､ 評論家の出力である値､ アクターの出力であるアクションの値､ そして一番上の､

04:42.600 --> 04:47.610
すべての隠れ状態､ h､ x､ セルの状態はxを参照しています｡

04:48.030 --> 04:54.060
そして､ ここでQ値の行動値である行動の確率分布を生成する｡

04:54.060 --> 04:56.280
そして､ これをmax関数で行うのです｡ 

04:56.280 --> 05:02.520
そしてもちろん､ これはテストエージェントに対するトレーニングのためだけなので､ ここで対数確率を求める必要はありません｡

05:02.520 --> 05:08.670
ドゥームのように使うだけのアクションを､ ソフトMAXのボディで再生してくれるのです｡ 

05:08.670 --> 05:12.240
でも､ ここではトレーニングをするわけではないので､ 支柱だけです｡ 

05:12.240 --> 05:18.960
そして､ このプローブから､ この確率の最大値を直接取ってアクションを実行するのです｡ 

05:18.960 --> 05:22.530
つまり､ 最も確率の高い行動をとるのである｡ 

05:22.530 --> 05:26.610
そして､ その理由は､ テストエージェントが探索を行わないからです｡ 

05:26.610 --> 05:28.140
ということを忘れないでください｡ 

05:28.260 --> 05:34.170
他のアクションを探索したいときに､ 確率の低いアクションをピックアップする機会を持つことで､

05:34.170 --> 05:39.560
最も確率の高いアクションを毎回取ることがない｡

05:39.600 --> 05:42.240
しかし､ ここではテストエージェントは何の探索もしない｡ 

05:42.240 --> 05:46.800
だからこそ､ 最大の確率を持つ行動を直接取るわけです｡ 

05:47.520 --> 05:56.870
そして､ アクションをプレイしたら次の状態になり､ 次の報酬を得て､ doneはゲームオーバーかどうかが更新されるのです｡

05:56.880 --> 06:04.550
つまり､ このコードで､ アクションを選択した後に再生することで､ このようなことが可能になるのです｡

06:04.560 --> 06:10.980
つまり､ ここでアクションを実行すると､ 状態が取得され､ 報酬が得られ､ downが更新されるのです｡ 

06:11.610 --> 06:18.900
そして､ 新しい報酬を得たばかりなので､ この新しい報酬を追加するだけで､ 報酬の合計を更新することになります｡

06:18.900 --> 06:21.420
そして最後に､ ゲームが終了するたびに

06:21.420 --> 06:27.510
ゲームが終了したら､ AIがゲームを終了したら､ 時間､ エピソード､ エピソードの長さ､

06:27.510 --> 06:37.140
つまり､ どれくらいの時間､ ブレイクアウトをプレイし続けたかという結果をプリントすることになりますね｡

06:37.140 --> 06:42.690
そして､ このような時間のトリックを使って､ すべての変数をプリントしているところです｡ 

06:42.690 --> 06:43.890
だから､ その時のためにね｡ 

06:43.890 --> 06:50.400
そして､ リワードサムはリワードの合計を表す変数､ エピソードレングスはエピソードの長さを表す変数に過ぎません｡

06:51.130 --> 06:57.370
OCして､ すべての結果をプリントしたら､ まあ､ ゲームは終わったので､ 新しいゲームを始めたいので､

06:57.370 --> 07:02.020
報酬の合計であるものをすべてゼロに初期化しなおします｡

07:02.050 --> 07:03.940
1話の長さを0にする｡ 

07:03.970 --> 07:07.660
このクリア機能を使って､ すべてのアクションを再始動させます｡ 

07:07.960 --> 07:13.330
入力画像をリセットする......つまり､ レンガを全部並べ直すんです｡ 

07:13.330 --> 07:21.550
そして最後に､ この60秒間のスリープ時間を使って､ 他のエージェントに練習させるために1分間の休憩をします｡

07:21.550 --> 07:32.110
そして最後に､ 新しい状態を取得するコードの行があり､ それから前に進むことができます｡

07:32.110 --> 07:34.030
私たちはこの新しいゲームで続けることができます｡ 

07:34.300 --> 07:35.710
そうそう､ そうなんです｡ 

07:35.710 --> 07:40.360
これがテスト機能で､ このおかげで1､ 2回のチュートリアルでビデオを見ることができます｡ 

07:40.360 --> 07:43.900
前回のように､ みんなで一緒に結果を見たいと思います｡ 

07:43.900 --> 07:46.210
それは､ あなたやキャロル､ そして私と一緒です｡ 

07:46.210 --> 07:47.260
それは楽しみですね｡ 

07:47.260 --> 07:50.260
そして､ 良い結果を期待する､ と言っています｡ 

07:50.260 --> 07:54.820
しかし､ この脱力系のゲームは超難易度が高いということを肝に銘じておいてください｡ 

07:54.820 --> 07:58.330
最初は一番シンプルなゲームだと思っていたのですが､ 全然違いましたね｡ 

07:58.330 --> 08:03.790
実は『ドゥーム』よりもずっと難しいことがわかったので､ 最後のモジュールに入れました｡ 

08:03.940 --> 08:11.740
でも､ とにかく､ ここが一番重要ではないと言って､ 次のチュートリアルでこの関数をメインに作りましょう｡

08:11.740 --> 08:14.440
a3cがすべて実装された今｡ 

08:14.440 --> 08:16.120
ですから､ 一行一行のコーディングは行いません｡ 

08:16.120 --> 08:20.320
コードを展開し､ 非常に迅速に結果を得ることができます｡ 

08:20.320 --> 08:21.610
それまではお楽しみに｡ 

08:21.610 --> 08:21.970
I.
