WEBVTT

00:00.150 --> 00:02.310
こんにちは､ このチュートリアルにようこそ｡ 

00:02.340 --> 00:07.320
目の脳であるA3脳ができそうなので､ 超期待しています｡ 

00:07.350 --> 00:10.640
そして､ 頭脳について言えば､ 注目したいことがあります｡ 

00:10.650 --> 00:15.450
最初のモジュールで､ 完全に接続された層だけのシンプルな脳を作ったことを思い出してください｡ 

00:15.600 --> 00:21.900
Doom」の2つ目のモジュールでは､ 完全に連結した層だけでなく､ 目も作りました｡

00:21.900 --> 00:31.490
畳み込み層を追加したことで､ 目が映像を観察し､ 内部で起こっていることを理解できるようになったからです｡

00:31.500 --> 00:37.530
そして今､ 私たちはそれをさらに高いレベルで実現しようとしています｡ なぜなら､ 目を持ち､ 完全に層をつなぐだけでなく､

00:37.530 --> 00:41.220
記憶もできるような脳を作ろうとしているからです｡

00:41.220 --> 00:46.470
前回のチュートリアルで述べたように､ この大きな脳の中にニューラルネットワークの記録を追加し､

00:46.470 --> 00:56.730
脳に長い記憶を与えることで､ 入力画像の時間的関係や時間的特性を理解できるようになるからです｡

00:56.850 --> 00:57.840
そうそう､ そうなんです｡ 

00:57.840 --> 01:04.410
そして､ さらに強力な頭脳､ 今まさに実行しようとしているモデルは､ 本当に､ 本当に強力だと断言できます｡

01:04.710 --> 01:14.650
そして､ 目を作り､ 深層学習を行い､ 深層強化学習を行うことで､ 人間の脳の働きにどんどん近づいていくことがわかります｡

01:14.750 --> 01:19.350
私たちは､ まず脳の基本的な関係､ つまり直線的な食物のつながりから始めましたよね｡ 

01:19.350 --> 01:21.990
そして､ 目を付け､ メモリを付けました｡ 

01:22.020 --> 01:24.830
今後のモデルで何が追加されるかは誰にもわかりません｡ 

01:24.840 --> 01:31.350
2018年には､ さらに人間の脳に似せたものが追加されるかもしれませんよ｡

01:31.350 --> 01:38.100
しかし､ すでに完全につながった層､ 目､ 記憶を持つ私たちは､ 本当に優れた機能的な脳をすでに持っているのです｡

01:38.520 --> 01:39.600
では､ やってみましょう｡ 

01:39.600 --> 01:41.110
この脳を作ろう｡ 

01:41.130 --> 01:48.600
そこで例によって､ コンボリューションとLCMSでいろいろな特性が出るので､ そのためのクラスを作ることになりました｡

01:48.600 --> 01:54.930
そこで､ これらすべてを初期化するinit関数を作り､ すべての接続を作成します｡ そしてもちろん､

01:54.930 --> 02:02.160
最終的に出力を得るために､ 信号を脳内に伝播させるforward関数を用意します｡

02:02.370 --> 02:03.950
よし､ 準備はいいか？

02:03.960 --> 02:05.110
こうしよう｡ 

02:05.130 --> 02:11.310
そこで､ クラスですが､ アクター・クリティックと呼ぶ新しいクラスを導入しました｡ 

02:11.310 --> 02:13.650
なぜなら､ ここではもちろん頭脳の話をしているからです｡ 

02:13.650 --> 02:21.900
しかし､ 忘れてはならないのは､ 俳優と批評家を別々にしたアクティブ・クリティック主義に基づく「a3cモデル」を作っていることだ｡

02:21.900 --> 02:27.600
そこで､ 実際には俳優用に1つのリニアなフルコネクションを作り､ 評論家用に1つのリニアなフルコネクションを作ることになります｡

02:27.600 --> 02:28.860
どうやるかは､ 見てのお楽しみです｡ 

02:28.860 --> 02:30.600
それは､ 実はとてもシンプルなことなのです｡ 

02:30.600 --> 02:40.650
俳優評論家とこの俳優評論家クラスは､ endnoteモジュールを継承して､ すべてのPyTorchツールを使えるようにするわけです｡

02:40.650 --> 02:44.010
そこで､ nodeモジュールを継承するために､ こうしてみましょう｡ 

02:44.010 --> 02:49.080
では､ まずトーチライブラリ､ そしてそれを手に入れる必要があります｡ 

02:49.080 --> 02:49.830
そして､ その後に｡ 

02:49.830 --> 02:51.900
そして､ あれとモジュール｡ 

02:52.980 --> 02:53.640
わかりました｡ 

02:53.940 --> 02:55.560
そうすれば､ 私たちはそれを受け継ぐことができるのです｡ 

02:56.870 --> 02:57.200
わかりました｡ 

02:57.200 --> 03:01.430
さて､ 最初の関数はもちろんinit関数です｡ 

03:01.430 --> 03:09.800
このinit関数は､ オブジェクトのself､ 入力画像の寸法を表すinput

03:09.800 --> 03:17.060
shape､ そしてすべてのアクションを含むaction

03:17.060 --> 03:25.640
spaceを引数として受け取ります｡

03:25.880 --> 03:33.740
また､ このアクションスペースから､ アクションの数､ つまり､ 実際にすぐに得られる可能性のあるアクションの数を得ることができますね｡

03:33.740 --> 03:35.690
だからこそ､ 私たちも必要なのです｡ 

03:36.140 --> 03:39.320
だから､ それは主張のため､ それだけでいいんです｡ 

03:39.320 --> 03:45.230
そして､ この関数の中に入って､ 私たちの脳にふさわしい変数をすべて作りましょう｡ 

03:45.590 --> 03:54.740
しかし､ その前に､ 入力モジュールのすべてのツールを使えるようにするために､ 何らかの方法で継承を有効にしなければならないことを思い出してください｡

03:54.740 --> 04:01.100
このようにスーパー関数を使って､ その中でアクターを入力するのです｡ 

04:01.770 --> 04:07.470
私たちのクラスである批評家､ そしてオブジェクトのための自己を考え出す｡ 

04:07.980 --> 04:09.850
よし､ じゃあ､ ドット｡ 

04:09.960 --> 04:12.900
そして､ またまたinitの登場です｡ 

04:13.940 --> 04:14.710
機能です｡ 

04:14.720 --> 04:15.420
これでよしとしよう｡ 

04:15.440 --> 04:19.880
これで､ トーチから脳を作るために必要な道具がすべて揃ったことになります｡ 

04:20.210 --> 04:21.920
よし､ それなら

04:21.920 --> 04:24.590
さて､ そろそろ目玉を作ろうか｡ 

04:24.620 --> 04:26.170
それが凸凹です｡ 

04:26.180 --> 04:34.040
というのも､ Doomではすでに詳しく説明しましたが､ The Eye for Doomには目があったのを覚えておいてください｡

04:34.040 --> 04:35.300
だから､ まったく同じなんです｡ 

04:35.300 --> 04:45.130
これからいくつかの畳み込みを行いますが､ サイズ3×3､ ストライド2､ パディング1の32個の特徴検出器を用いた非常にシンプルなアーキテクチャを使用します｡

04:45.140 --> 04:50.840
かなり古典的なアーキテクチャですが､ ブレイクアウトゲームで何が起こっているのかを目で見て理解するためには､

04:50.840 --> 04:53.510
実はこれで十分なのでしょう｡

04:54.290 --> 04:54.620
わかりました｡ 

04:54.620 --> 04:56.540
では､ その畳み掛けを作ろう｡ 

04:56.540 --> 05:01.610
そこで､ 畳み込みはオブジェクトの変数になるので､ selfから始めることにする｡ 

05:01.610 --> 05:06.680
そこで､ 自己のconfをconfと呼び､ 4つのコンボリューションがあることになります｡ 

05:06.680 --> 05:15.260
GNモジュールのドット､ そしてconf

05:15.290 --> 05:20.630
twoのdクラスです｡

05:21.350 --> 05:25.790
そして､ 内部ではまず､ 画像の入力形状を入力します｡ 

05:25.790 --> 05:32.450
ということで､ まさにこれをコピーして､ 最初の入力として入力します｡ 

05:32.810 --> 05:38.450
そして､ 第2引数は特徴検出器の数､ あるいはカーネルの数である｡ 

05:38.450 --> 05:42.590
そこで､ 先ほどの32を､ クラシックな選択で｡ 

05:42.590 --> 05:45.020
次に､ カーネルのサイズを選択する必要があります｡ 

05:45.020 --> 05:49.970
これは､ 入力画像の上をスライドするセルの数である｡ 

05:49.970 --> 05:52.700
そして､ 3つ､ 4つ､ 5つのどれかを取ることができることを忘れないでください｡ 

05:52.700 --> 05:54.050
それが一般的な選択です｡ 

05:54.050 --> 05:55.730
そして､ ここでは3つを選びます｡ 

05:56.590 --> 06:01.930
そして､ ストライドを2つ選びますし｡ 

06:02.640 --> 06:04.740
1の水増し｡ 

06:05.010 --> 06:05.790
これでよしとしよう｡ 

06:05.970 --> 06:16.110
つまり､ 入力画像から32枚の畳み込み画像で構成される最初の畳み込み層までの畳み込みの場合です｡

06:16.110 --> 06:18.780
さて､ これで2回目の畳み込みの準備が整いました｡ 

06:18.780 --> 06:21.390
だから､ 実はほとんど同じになるんです｡ 

06:21.390 --> 06:29.430
そこで､ この行をコピーして下に貼り付けているのですが､ ほとんど何も変わらない状態で4つのコンボリューションができるので､

06:29.430 --> 06:34.140
もう一度下に貼り付けて､ 最後にもう一度貼り付けてください｡

06:34.440 --> 06:42.480
つまり､ ここですでに､ 1×カウントを1×3に変換し､ 1×4を確信することができるのです｡ 

06:42.510 --> 06:44.880
これが4つの凸部になります｡ 

06:44.880 --> 06:49.320
もちろん､ ここでいくつか変更する必要がありますが､ それぞれの文字列は2､ パディングは1のままなので､

06:49.320 --> 06:51.780
それほど大きな変更はありません｡

06:52.200 --> 06:54.930
いずれも32フィーチャーディテクターを搭載する予定です｡ 

06:54.930 --> 06:58.530
つまり､ 32枚の畳み込み画像が出力されます｡ 

06:58.530 --> 07:04.020
しかし､ ここで､ これは畳み込みの左側部分に相当することを思い出してください｡ 

07:04.020 --> 07:08.520
つまり､ 前の畳み込みの右側の部分にあったものと､ 実は対応しているのです｡ 

07:08.520 --> 07:10.200
ドミノ倒しみたいなものだと覚えておいてください｡ 

07:10.200 --> 07:11.280
だから､ 本当に簡単なんです｡ 

07:11.280 --> 07:16.080
そのため､ ここでは32とここも入力しなければなりません｡ 

07:17.070 --> 07:21.870
非常に簡単に32と32を見ることができます｡ 

07:22.170 --> 07:22.500
わかりました｡ 

07:22.500 --> 07:28.680
まとめると､ まず入力画像は､ 入力次元数が数である｡ 

07:29.190 --> 07:35.520
最初の畳み込みで､ 32枚の畳み込み画像が得られ､ それぞれが特定の特徴を検出する｡ 

07:35.550 --> 07:43.170
そして､ この32枚の畳み込み画像から2回目の畳み込みを行い､ 新たに32枚の畳み込み画像を得ます｡ 

07:43.170 --> 07:46.290
そして､ この32枚の新しいコンボリューション画像から同じものを選びます｡ 

07:46.290 --> 07:50.880
3回目の畳み込みを行い､ 再び32枚の新しい畳み込み画像を得る｡ 

07:50.880 --> 07:57.060
そして､ 最終的にこの32枚の畳み込み画像から､ 4回目の畳み込みをかけ､ 写真を得るのです｡ 

07:57.300 --> 07:57.780
わかりました｡ 

07:57.780 --> 08:01.440
そして､ これで十分か､ 監督をします｡ 

08:01.440 --> 08:02.970
ボールをよく検知してくれます｡ 

08:03.510 --> 08:03.870
わかりました｡ 

08:03.870 --> 08:05.580
というわけで､ コンボリューションはこれでおしまい｡ 

08:05.580 --> 08:07.130
では､ 目については以上です｡ 

08:07.140 --> 08:09.440
そして､ 今度はメモリを大切にしましょう｡ 

08:09.450 --> 08:14.220
この脳の新機能は､ 以前はチューンで実装していたのですが､ 今回はそれとは別に実装しています｡ 

08:14.490 --> 08:20.220
監視だけでなく､ 超記憶､ 長期記憶も持っています｡ STM長期短期記憶を実装する予定ですが､

08:20.220 --> 08:26.010
これは通常のニューラルネットワークで､ モデルに長期記憶を与えて､

08:26.010 --> 08:33.810
過去からの長い時間的関係を学習できるようにするものです｡

08:34.230 --> 08:37.560
だから同じように､ 新しい変数を作るんだ｡ 

08:37.560 --> 08:43.440
この新しい変数は､ 脳の中のLshtmネットワークに対応するため､

08:43.440 --> 08:46.950
単にlshtmと呼ぶことにします｡

08:47.040 --> 08:48.360
So Lshtm.

08:48.690 --> 08:56.220
さて､ STMのコードを書く前に､ このlshtmの部分が何をするのかを理解しておこう｡

08:56.220 --> 09:03.900
このように理解すると､ lshtmは入力画像の時間的特性を学習するために使われていることがわかります｡

09:03.900 --> 09:09.330
つまり､ 例えばボールがレンガにぶつかった場合､ その跳ね返りをlshtmが符号化することになります｡ 

09:09.540 --> 09:11.250
だから､ それをまず理解することです｡ 

09:11.250 --> 09:14.790
ゲームの中で起こっていることを暗号化するようなものです｡ 

09:14.790 --> 09:22.560
次に､ LSHTM を実装する際に理解すべき重要なことは､ 時間依存性の順序を選択することである｡

09:22.680 --> 09:32.700
ここで､ ニューラルネットワークに4枚の画像のシーケンスを与えるので､ すでに順序の時間的依存性を学習できることになります｡

09:32.700 --> 09:39.720
それは､ 90プラス1で起こることが､ 時間で起こることに依存する､ いくつかの時間的依存関係です｡

09:39.720 --> 09:42.960
T Tマイナス1､ Tマイナス2､ Tマイナス3｡ 

09:42.960 --> 09:45.420
だから､ それは絶対にできるんです｡ 

09:45.420 --> 09:53.850
しかし､ 良いニュースは､ lshtmを使うので､ さらに複雑な時間的関係を学習することができることです｡

09:54.270 --> 10:00.690
つまり､ 例えば､ 時刻t＋1に何が起こるかが､ 時刻に何が起こるかに依存するような時間的特性を学習することができるのである｡

10:00.690 --> 10:05.520
T tマイナス1､ tマイナス2､ tマイナス3からt､ マイナスnまで｡ 

10:05.700 --> 10:10.380
そして､ それはlshtmの長い部分､ 長短の記憶です｡ 

10:10.380 --> 10:14.610
このLshtmのチームでは､ 非常に複雑な時間的関係を学ぶことができます｡ 

10:15.360 --> 10:17.580
よし､ ではリストを追加しよう｡ 

10:17.970 --> 10:31.290
このため､ RNモジュールを使用し､ Class Lshtmセルを追加して､ 新しいネットワークのLshtm部分を表すこのLshtmオブジェクトを作成します｡

10:31.290 --> 10:39.480
今､ 重要なのは､ C､ R､ n､ つまり畳み込みニューラルネットワークを作っているということです｡

10:39.480 --> 10:42.780
そして､ アーデンの部分はCNNの部分の後に来る｡ 

10:42.780 --> 10:51.150
したがって､ 今､ このLshtmセルに入力する必要があるのは､ まず､ 畳み込み後の出力の大きさである｡

10:51.150 --> 10:55.980
つまり､ 3×3の32倍です｡ 

10:55.980 --> 11:02.610
つまり､ この32×3×3は､ 実はここで4回の畳み込みを行った後の出力なのです｡ 

11:02.610 --> 11:07.500
しかし､ それがRとLshtmネットワークの入力になる｡ 

11:07.590 --> 11:13.620
さて､ 4つの畳み込みの出力が32倍､ 3×3のサイズになるのはなぜでしょう？

11:13.620 --> 11:15.900
まあ､ そんなに直接的なものではありませんので､ ご安心ください｡ 

11:15.900 --> 11:17.790
実は単純な計算式ではないんです｡ 

11:17.790 --> 11:26.460
しかし､ プールして畳み込んだ画像を平坦化した後に､ この出力ニューロンの数を計算する式がある｡

11:26.460 --> 11:31.920
でも､ この大きな式の条件を集めると､ まあ､ 32倍､ 3倍3倍になるんです｡ 

11:31.950 --> 11:36.000
もっとやりたいことがたくさんあるので､ あまり時間をかけたくなかったんです｡ 

11:36.000 --> 11:39.330
それに､ この数字を計算するための関数もすでに作ってある｡ 

11:39.330 --> 11:42.360
このカウントをしたのは､ ズームのためだったことを忘れないでください｡ 

11:42.360 --> 11:46.710
神経細胞は機能するので､ 納得できないなら再利用すればいい｡ 

11:46.710 --> 11:53.250
でもそれは､ この大きな数式計算の条件を集めて､ 出力の数を出しただけなんです｡

11:53.250 --> 11:55.530
ということで､ 第1論になります｡ 

11:55.530 --> 12:00.930
そして､ 第2引数はlshtmの出力ニューロンの数で､

12:00.930 --> 12:03.570
256にします｡

12:04.510 --> 12:04.890
なるほど｡ 

12:05.050 --> 12:06.920
それで､ 今はどうなっているのでしょうか？

12:06.940 --> 12:15.640
つまり､ 今はゲームの各イベントを符号化したベクトル､ 言い換えれば､ 符号化された状態があるわけです｡

12:15.640 --> 12:27.070
これで､ 俳優と批評家を分離することができます｡ つまり､ 俳優用と批評家用の2つのニューラルネットワークを作るのです｡

12:27.070 --> 12:33.760
しかし､ この2つの神経回路網には､ 画像の符号化と時間的な関係が同じように存在することになります｡

12:33.760 --> 12:37.660
つまり､ この2つのニューラルネットワークに共通して行っている部分です｡ 

12:37.660 --> 12:41.260
これは､ 2つのニューラルネットワークで同じ始まりになる｡ 

12:41.260 --> 12:46.120
しかし､ これからは俳優と批評家の状況が変わります｡ 俳優には1つの直線的で完全な接続を､

12:46.120 --> 12:51.820
批評家には別の直線的で完全な接続を作ることになるからです｡

12:52.000 --> 12:56.160
では､ ちょっと休憩して､ 次のチュートリアルでやってみましょう｡ 

12:56.170 --> 12:57.400
それまではお楽しみに｡ 

12:57.400 --> 12:57.880
I.
