WEBVTT

00:00.390 --> 00:02.370
こんにちは､ このチュートリアルにようこそ｡ 

00:02.490 --> 00:04.470
これで､ モデルの脳ができました｡ 

00:04.500 --> 00:06.170
また､ オプティマイザーもあります｡ 

00:06.180 --> 00:09.810
ですから､ 基本的にはさまざまなエージェントを訓練する準備はできています｡ 

00:09.810 --> 00:11.520
それが私たちの異なる脳です｡ 

00:11.520 --> 00:18.180
というわけで､ これからはa3cのアルゴリズムをすべて含んだこの大きな訓練関数を作っていくことになります｡ 

00:18.180 --> 00:25.080
したがって､ これからこの列車に実装するのは､ このPファイルは巨大な列車関数に過ぎないのです｡ 

00:25.080 --> 00:29.220
彼らはこの大きな電車の機能だけで､ 他には何もなく､ 気品もないでしょう｡ 

00:29.220 --> 00:33.840
しかし､ このモジュールの最後のステップで､ この列車関数をメインコードで使用することになります｡ 

00:33.840 --> 00:34.850
そうそう､ そうなんです｡ 

00:34.860 --> 00:39.000
しかし､ 始める前に､ まあ､ 最初にいくつかのライブラリをインポートしていることにお気づきでしょう｡ 

00:39.000 --> 00:44.700
つまり､ クラシックなライブラリにトーチモジュール､ つまりトーチライブラリ､ それからアタリ環境を作るためのエンドライブラリ､

00:44.700 --> 00:48.900
これがブレークアウトになるわけです｡

00:48.900 --> 00:55.710
そして､ もちろん､ モデルファイルからアクティブなクラスをインポートしますこの｡ 

00:56.130 --> 01:05.550
そして最後に､ torch undergradの変数を使って､ ダイナミックグラフのおかげで勾配の高性能計算を実行する予定です｡

01:05.730 --> 01:11.880
なぜなら､ まずこれは､ エージェントが使用するモデルが共有グラデーションを持っていない場合に､

01:11.880 --> 01:20.250
すべてが正しく動作することを確認するための関数だからです｡

01:20.250 --> 01:22.980
だから､ 共有グラッツの確保というわけです｡ 

01:22.980 --> 01:27.870
そしてもうひとつは､ この機能は必要ないと思うのですが､ どうでしょう｡ 

01:27.870 --> 01:32.820
そして､ 少なくともこれで､ コードが正しく実行されることを100％確信できる｡ 

01:32.820 --> 01:34.620
でも､ そんなことはどうでもいいんです｡ 

01:34.620 --> 01:40.410
注目すべきは､ これから作り始めるこの電車の機能です｡ 

01:40.770 --> 01:44.280
さあ､ デヴとトレーニングだ｡ 

01:44.280 --> 01:45.960
ここでは単に電車と呼ぶことにします｡ 

01:45.960 --> 01:48.720
そして､ この列車関数はいくつかの引数を取ることになる｡ 

01:48.810 --> 01:50.220
1つ目はランクです｡ 

01:50.220 --> 01:52.440
それが何であるかは､ 2番目で説明するつもりです｡ 

01:52.710 --> 02:02.640
2つ目のパラメータはparamsで､ 環境のすべてのパラメータを指定し､ 3つ目のパラメータは共有モデルになります｡

02:02.910 --> 02:09.990
つまり､ 共有モデルは､ エージェントが一定のステップ数で小さな探索を実行するために取得するものなんですね｡

02:10.410 --> 02:14.910
そして､ 最後の引数がオプティマイザーになります｡ 

02:14.910 --> 02:16.980
それが､ 先ほど作ったものです｡ 

02:17.620 --> 02:18.480
とても完璧です｡ 

02:18.490 --> 02:19.930
これが私たちの4つの主張です｡ 

02:19.930 --> 02:23.870
そして､ いよいよこの電車機能の実装に取り掛かります｡ 

02:23.890 --> 02:28.840
そこでまず､ a3cの略称を覚えているかどうかです｡ 

02:28.840 --> 02:32.320
同期型アクティブクリティックエージェントの略｡ 

02:32.320 --> 02:34.780
a3cでは､ シンクロがあるわけです｡ 

02:34.780 --> 02:40.900
そこで､ ご理解いただいたように､ 各トレーニングエージェントを同期させる必要があるのですが､ 同期させるために､

02:40.900 --> 02:45.460
ランクを使って各シードをこのランクでシフトさせることにします｡

02:45.460 --> 02:52.030
つまり､ このランクパラメータは､ 各トレーニングエージェントが同期するようにシードを移動させるだけなのです｡ 

02:52.360 --> 03:02.360
つまり､ 例えば学習エージェントがn人いるとすると､ ランクは1からNまであり､ 1エージェントあたり1からnまで1つの整数が存在することになるのです｡

03:02.380 --> 03:10.990
そのため､ 1スレッドずつ種をずらすと､ そのスレッドが作成するすべての疑似乱数は､ 他のスレッドから完全に独立したものになります｡

03:11.320 --> 03:18.550
しかし､ 種は固定数なので､ その体験を再現すると全く同じ事象が見つかり､

03:18.550 --> 03:23.440
それは種に関して決定論的であるからです｡

03:23.440 --> 03:25.390
だから､ それを理解することが大切なんです｡ 

03:25.390 --> 03:34.120
そして､ ここでランクを使ってシードをずらすことで､ 各トレーニングエージェントを同期させることがまず必要なわけです｡

03:34.120 --> 03:35.020
では､ こうしてみましょう｡ 

03:35.020 --> 03:38.710
そのために､ トーチライブラリを利用するのです｡ 

03:39.010 --> 03:45.250
そして､ 手動でアンダースコア､ シード括弧でシードを取得することになります｡ 

03:45.250 --> 03:46.420
これは機能です｡ 

03:46.420 --> 03:53.020
そして､ これから params dot seed でアクセスできるすべてのエージェントのシードを取得し､ それをランクでシフトして､

03:53.020 --> 03:56.620
それぞれのエージェントを同期させます｡

03:56.620 --> 03:59.650
ここにプラスランクをつけるだけです｡ 

04:00.340 --> 04:09.370
そして､ 各トレーニングエージェントには1つのシードがあるため､ 各トレーニングエージェントの権利を剥奪するために､ ランクを持ったシードを移動させることになります｡

04:09.820 --> 04:11.380
よし､ まずは完了だ｡ 

04:11.380 --> 04:13.090
そして､ 次のステップです｡ 

04:13.090 --> 04:15.310
次は環境の整備です｡ 

04:15.310 --> 04:20.770
そこで､ envと呼ぶ新しい変数を作成し､ 今度はendモジュールのcreate Atari

04:20.770 --> 04:25.990
end関数を使って､ ブレイクアウトのための環境を作成することにします｡

04:25.990 --> 04:27.930
それは､ ブレイクアウトの環境を手に入れることです｡ 

04:27.940 --> 04:33.460
そこで､ この機能を利用して､ アタリを作り､ ｡ 

04:34.040 --> 04:39.680
そして､ 今､ 私たちはただ一つの引数を入力しなければならない｡ それは､ 環境のパラメータであり､ これは訓練関数の入力の一つであるため､

04:39.680 --> 04:42.550
私たちはそれらを持っている｡

04:42.560 --> 04:47.270
これは､ ブレイクアウトの環境のパラメータとなるこのパラメータです｡ 

04:47.270 --> 04:54.920
そのため､ ブレイクアウト環境を取得するために､ このパラメータ引数を取り､ ドットで囲んで､ envの名前を取得します｡

04:54.920 --> 05:05.020
今後､ コード全体を実行するメイン関数の次のコードでは､ ブレイクアウトブレイクアウト年になります｡

05:05.850 --> 05:06.180
わかりました｡ 

05:06.180 --> 05:08.940
それで､ 環境は完璧に整いました｡ 

05:09.330 --> 05:15.810
そして､ 次のステップは､ 環境の種をエージェントの種に合わせることです｡ 

05:15.900 --> 05:17.340
そして､ なぜそんなことをするのか？

05:17.370 --> 05:25.770
それは､ a3cモデルの各エージェントが､ 環境のコピーのような独自のビジョンを持っていることを覚えているからです｡

05:25.770 --> 05:31.890
そのため､ 各エージェントをある特定のバージョンの環境に揃える必要があります｡ 

05:31.890 --> 05:37.230
そのためには､ 種を使うことになります｡ 種はそれぞれ特定の環境を決定するからです｡ 

05:37.230 --> 05:42.060
ですから､ それぞれのエージェントに異なるシードを関連付けることで､ まあ､ 思い通りになるわけです｡ 

05:42.090 --> 05:45.960
それは､ 各エージェントが独自の環境を持つことです｡ 

05:46.350 --> 05:47.730
では､ どうすればいいのでしょうか｡ 

05:47.730 --> 05:57.270
環境を取り､ それを足し､ そしてseed関数で環境に対して得たい種を選べばいいのです｡

05:57.270 --> 06:02.460
環境の種をエージェントの種に合わせるには､ 単純にこれを取得する必要があります｡

06:02.460 --> 06:13.800
これは､ エージェントの種に対応するもので､ この同期した学習エージェントを取得するために､ ランクのおかげでシフトされたものです｡

06:13.950 --> 06:16.350
だから､ それをここに配置すればいいんです｡ 

06:16.350 --> 06:20.220
そして､ これによって､ 環境の種をエージェントの種に揃えることができるのです｡ 

06:20.970 --> 06:21.530
なるほど｡ 

06:21.990 --> 06:26.940
さて､ これから3つのキーブレインであるモデルを手に入れます｡ 

06:26.940 --> 06:32.070
これで､ モデルファイルからアクティブクリティッククラスを使用することになります｡ 

06:32.070 --> 06:40.950
そこで､ 基本的にはこのアクタークラスのオブジェクトを作成し､ このオブジェクトモデル､ あるいはブレーンとでも呼ぶことにしましょう｡

06:40.950 --> 06:49.350
しかし､ 基本的にこのオブジェクトには､ すべての畳み込み､ STM､ 線形完全接続､ 信号を伝搬させるための前進関数が含まれることになる｡

06:49.350 --> 06:58.590
つまり､ 基本的には俳優と批評家の脳を含み､ 脳全体に信号を伝播して最終的なアウトプットを得る機能を持つことになります｡

06:59.010 --> 07:00.000
では､ こうしてみましょう｡ 

07:00.000 --> 07:02.520
では､ モデルを作ってみましょう｡ 

07:02.520 --> 07:06.570
そこで､ 先ほど言ったように､ このオブジェクトモデルを呼び出したいと思います｡ 

07:06.900 --> 07:17.130
そして､ actクラスのオブジェクトを作成し､ したがって､ クラス､ actor､ criticを取り､ 今度は､ どのような引数を入力する必要があるか覚えています｡

07:17.130 --> 07:22.350
これは実はinit関数の引数なので､ 自分では入力する必要がないのです｡ 

07:22.560 --> 07:26.250
それが､ initメソッドでオブジェクトを使用するために必要なことです｡ 

07:26.250 --> 07:31.500
しかし､ その場合､ 入力しなければならない引数は､ 入力形状であるノム入力となります｡ 

07:31.500 --> 07:38.460
つまり､ 入力､ 画像､ そして行動の集合を含む行動空間の次元です｡

07:38.460 --> 07:42.480
そこで､ これらの引数をtrain関数に入力してみましょう｡ 

07:42.480 --> 07:49.770
そこで､ まず､ 環境とドットで取得し､ 観測空間を利用する｡ 

07:50.980 --> 07:56.800
つまり､ これが観測空間であり､ ダットであり､ そして入力の数を得るために形状を得るのです｡ 

07:57.470 --> 07:58.970
ブラケットゼロ｡ 

07:59.000 --> 07:59.390
わかりました｡ 

07:59.390 --> 08:01.010
つまり､ 4つの無感覚な入力です｡ 

08:01.010 --> 08:04.550
そして､ 次はアクションスペースです｡ 

08:04.580 --> 08:06.080
まあ､ ほとんど同じですね｡ 

08:06.080 --> 08:09.620
しかし､ 私たちが輸入している環境から得る必要があるのです｡ 

08:09.620 --> 08:11.900
次にダット､ そしてアクションスペース｡ 

08:12.740 --> 08:13.160
わかりました｡ 

08:13.160 --> 08:17.770
そして､ これでオブジェクトを作成するときに入力する必要がある引数を得ることができます｡ 

08:17.780 --> 08:20.030
クラスを作るという行為のモラル｡ 

08:20.630 --> 08:25.000
さて､ これでモデルができたので､ 次は入力状態を準備します｡ 

08:25.010 --> 08:27.530
ですから､ 私たちは今も深い強化学習を行っていることを忘れないでください｡ 

08:27.530 --> 08:34.340
つまり､ 入力状態は入力画像であり､ したがってこれは元々､ 白黒画像を扱うので1チャンネルを含むnumpy配列となり､

08:34.340 --> 08:40.580
42×42の寸法となります｡

08:40.730 --> 08:46.250
しかし､ ここで重要なのは､ 入力状態が入力画像であることを理解し､ 心に留めておくことです｡ 

08:46.400 --> 08:51.800
そこでまず､ やるべきことはナンバリングを取得し､ それをトーチテンソルに変換することである｡ 

08:51.800 --> 08:58.880
しかし､ 私たちが以前行ったように､ 最初のステップは帝国を正しく理解することであり､ それを得ることは実はとても簡単なことなのです｡

08:58.880 --> 09:05.030
まず､ 入力状態の変数を作成する必要があります｡ これをstateと呼び､

09:05.030 --> 09:12.770
配列を取得するために､ 単に環境を取得し､ それを追加して､ reset関数を使用します｡

09:12.920 --> 09:22.340
1は1チャンネル､ つまり白黒の画像､ 42×42はもちろん画像の寸法で､

09:22.340 --> 09:30.620
幅と高さのピクセル数です｡

09:30.620 --> 09:34.490
だから､ 基本的にはこの寸法で､ 作業することになります｡ 

09:34.520 --> 09:41.270
そして今､ 私たちは実際に右によって､ このような寸法の画像をアレイで得ることができますので､

09:41.270 --> 09:45.320
今度はそれをトーチセンサーに変換することができます｡

09:45.320 --> 09:50.750
そして､ これをうまくやるには､ ウイルスを保持する必要がないので､ また状態を更新することになるのです｡ 

09:50.930 --> 09:54.950
そこで､ トーチ・モジュールを使っているのです｡ 

09:54.950 --> 09:57.470
そして忘れてはならないのは､ 我々はすでにドゥームのためにそれをやったということだ｡ 

09:57.590 --> 10:08.300
アンダースコアのnumを括弧でくくったものを関数とし､ その中にトーチテンソルに変換したい数値を入力する必要がある｡

10:08.300 --> 10:09.950
そして､ それが国家である｡ 

10:09.950 --> 10:17.030
以前のバージョンのnumpy配列の状態は､ from them by関数でトーチテンソルを適用することによって､ なるようになります｡

10:17.030 --> 10:24.740
つまり､ 状態からテンソルを作成し､ あとはdone変数を初期化するだけだ｡ 

10:24.740 --> 10:29.900
done変数は一般的にエピソードが終わったか､ ゲームが終わったかを示す変数であることを思い出してください｡

10:29.900 --> 10:40.580
ここではこのdone変数を導入してtrueに初期化し､ ゲームが終了したときにこのdone変数がtrueになることを指定したいだけです｡

10:41.000 --> 10:45.650
だから､ AIが脱走するために無限にプレイすることがないように､ それは後々役に立つと思います｡ 

10:46.690 --> 10:47.230
わかりました｡ 

10:47.230 --> 10:55.150
これが､ この列車機能の基本的な始まりで､ いくつかの初期設定とやらなければならないことがありました｡

10:55.180 --> 11:00.370
ここで一番重要なのは､ 各トレーニングエージェントを同期させることでした｡ 

11:00.370 --> 11:04.870
それがa3cモデルの1/1の原則を適用しなければならないわけです｡ 

11:04.870 --> 11:09.660
そして､ 次のチュートリアルでは､ 共有モデルとの同期に進みます｡ 

11:09.670 --> 11:15.940
異なるモデルだけでなく､ すべてのエージェントが共有するモデルであるシェアードモデルがあることも忘れてはならない｡

11:15.940 --> 11:21.850
そして､ 各エージェントがこの共有モデルを取得して､ あるステップ数の小さな探索に進めるように､

11:21.850 --> 11:25.420
この共有モデルと同期させなければならないわけです｡

11:25.720 --> 11:27.940
というわけで､ 次のチュートリアルでは､ それをやってみましょう｡ 

11:27.940 --> 11:29.260
そしてそれまで､ お楽しみに｡ 

11:29.260 --> 11:29.770
I.
