WEBVTT

00:00.180 --> 00:02.220
こんにちは､ このチュートリアルにようこそ｡ 

00:02.250 --> 00:14.310
さて､ 4つの畳み込みとlshtmを行った後､ 符号化された状態ができました｡ これは､ これから作る俳優と評論家のための2つのニューラルネットワークの入力となります｡

00:14.490 --> 00:22.770
そして､ 彼らといえば､ あとは､ 俳優用と評論家用の2つの直線的な完全接続を作るだけです｡

00:22.980 --> 00:27.120
しかし､ その前に､ 可能なアクションの数を求める必要がある｡ 

00:27.120 --> 00:32.310
そして､ ここではオブジェクトの変数にならない新しい変数を呼び出すことにします｡ 

00:32.310 --> 00:38.790
ここではselfを使わず､ num outputsという変数を作って､ 可能なアクションの数を表し､

00:38.790 --> 00:44.100
アクションスペースからそれを取得できるようにします｡

00:44.310 --> 00:46.800
そこで､ 私たちは行動空間を確保します｡ 

00:47.600 --> 00:54.020
この入力は､ オブジェクトを作成するときの init 関数の入力になります｡ そして､ この可能なアクションの数を得るためにドット

00:54.020 --> 01:01.010
n を追加し､ アクターとクリティックが別々に同じ入力を受け取るようにします｡

01:01.010 --> 01:06.230
これが､ 畳み込みとLCMを使ったこのプロセス全体の出力です｡ 

01:06.230 --> 01:12.860
つまり､ 同じ入力（エンコードされた状態）を受けても､ 2つの異なる線形食物接続を持つので､ 最終的には2つのニューラルネットワーク､

01:12.860 --> 01:18.800
1つは俳優用､ もう1つはアクリル用となるわけです｡

01:18.800 --> 01:20.870
そこで､ この2つの神経回路網を別々に作ってみましょう｡ 

01:20.870 --> 01:27.020
しかし､ エンコードという大仕事はすでに済ませましたので､ あとは2つのオブジェクトを作成するだけです｡

01:27.020 --> 01:33.440
1つはアクター用のリニアなフルコネクションで､ もう1つは評論家用のリニアなフルコネクションです｡

01:33.440 --> 01:35.240
というわけで､ まさにその通りです｡ 

01:35.240 --> 01:42.080
これから2つのオブジェクトを作成します｡ 最初のオブジェクトは､ 評論家のリニアフード接続用で､

01:42.080 --> 01:46.040
評論家アンダースコア・リニアと呼ぶことにします｡

01:46.310 --> 01:50.210
そして､ この直線的な食のつながりを作るには､ まあ､ どうしたらいいかということですね｡ 

01:50.210 --> 01:56.090
RNモジュールと､ 入力する線形クラスが必要なだけです｡ 入力ニューロンは､

01:56.090 --> 02:04.940
畳み込みとLCMによるエンコーディングの出力で､ 256個のニューロンです｡

02:04.940 --> 02:20.810
入力は256で､ 出力は1つです｡ 評論家のためのニューラルネットワークの出力は､ 入力状態､ つまりここで作った入力エンコード状態に適用したV関数の値であることを思い出してください｡

02:20.930 --> 02:25.850
そこで､ 入力された状態をseと呼ぶと､ それがすべての出力となる｡ 

02:25.850 --> 02:33.620
評論家のニューラルネットワークの出力はsになりますから､ 一次元の値です｡

02:33.620 --> 02:36.020
それで､ ここに1つ入力しました｡ 

02:36.260 --> 02:46.340
そして､ VSEはアクターの間で共有されるものであり､ アクターはより適切な方法でアクションを行うために使用できる共通の情報を得ることができることを忘れないでください｡

02:47.180 --> 02:50.330
それは評論家のニューラルネットワークのためなんですね｡ 

02:50.330 --> 03:00.500
そして今度は､ アクターの新しいネットワークを作りましょう｡ そのため､ ここに self､ dot actor､ linear､ same を追加しています｡

03:00.500 --> 03:11.150
入力はすでにエンコードされているので､ あとは単純にリニアの完全な接続を追加するだけです｡

03:11.150 --> 03:17.390
このアクターのニューラルネットワークは､ 256のサイズを持つエンコードされた状態を取ることになる｡ 

03:17.390 --> 03:19.820
だから､ ここで256｡ 

03:19.820 --> 03:25.940
しかし､ その後､ 出力は異なってきます｡ もちろん､ 俳優のためのニューラルネットワークの出力は､

03:25.940 --> 03:33.560
Q値､ 入力状態のQ値､ ここでエンコードしたものとアクションプレートであることはご存知の通りです｡

03:33.560 --> 03:40.640
そこで､ もう一度､ この「SWが聞こえるかもしれない」という符号化された状態を「Action played」と呼ぶと､ このニューラルネットワークのactive

03:40.640 --> 03:44.150
linearの出力はQ assayになります｡

03:44.660 --> 03:49.910
そして､ それぞれのアクションに対して1つの値を持っているので､ したがって､ 出力はありません｡ 

03:49.940 --> 03:53.870
Q値なので､ ここでの出力はなしとなる｡ 

03:54.710 --> 03:59.090
出力がないのは､ 実際にはQ値の数だからです｡ 

03:59.690 --> 04:00.850
よし､ 完璧だ｡ 

04:00.860 --> 04:03.920
だから､ もしよかったら､ 私が代わりに書きますよ｡ 

04:03.920 --> 04:17.210
ここで評論家の出力は s であり､ s は符号化された状態であり､ 俳優の出力は Q である｡

04:17.960 --> 04:18.290
わかりました｡ 

04:18.290 --> 04:27.320
ですから､ この違いを理解することは非常に重要で､ 評論家用と俳優用の2つの神経ネットワークがあることを理解することです｡

04:28.200 --> 04:29.220
よし､ 完璧だ｡ 

04:29.220 --> 04:31.900
ということで､ この機能でほぼ終了です｡ 

04:31.920 --> 04:33.890
これで､ 一番大事なことは終わった｡ 

04:33.900 --> 04:40.710
残るは､ これら2つのニューラルネットワークのすべての重みとすべてのバイアスを初期化することだけです｡

04:40.710 --> 04:45.240
もちろん､ そのためには､ 先ほど作った2つの関数､ つまり正規化列の初期化とその中の重みを使うことになるのですが､ この2つの関数を使うことで､

04:45.240 --> 04:48.030
正規化列の初期化とその中の重みの初期化を行うことができます｡

04:48.270 --> 04:49.680
では､ 早速やってみましょう｡ 

04:49.680 --> 04:51.780
かなり簡単で､ かなり早くできそうです｡ 

04:51.930 --> 04:58.170
まず､ ランダムな重みを初期化するために､ オブジェクトにweights init関数を適用します｡

04:58.170 --> 05:06.120
そこで､ ここでは self を使ってオブジェクトを取得し､ そのオブジェクトに weights の init 関数を適用しています｡ 

05:06.300 --> 05:13.140
従って､ 内部では､ weights init関数を入力すればよいことになります｡ 

05:13.140 --> 05:15.690
これによって､ この関数がオブジェクトに適用されます｡ 

05:15.690 --> 05:21.720
そして､ このようにすることで､ 将来的にこれらの重みの最適な学習を得るために､ いくつかのランダムな重みを初期化しているに過ぎないのです｡

05:21.720 --> 05:27.420
そして今､ 私たちがしなければならないのは､ 俳優と批評家のための特別な正規化をすることです｡ 

05:27.420 --> 05:35.040
しかし､ 以前のチュートリアルで話したと思いますが､ クリティックのアクターに同じ分散を設定するのではないことを忘れないでください｡

05:35.160 --> 05:40.350
役者は小さな標準偏差､ 小さな分散を得ることができ､ 批評家は大きなものを得ることができるのです｡ 

05:40.680 --> 05:41.730
そして､ なぜこのようなことをするのか｡ 

05:41.730 --> 05:49.260
俳優の重みの標準偏差を小さくして､ 評論家の重みの標準偏差を大きくする目的は何でしょうか？

05:49.260 --> 05:53.640
そうすれば､ 取引の探査と開拓を管理することができます｡ 

05:53.640 --> 05:55.740
それこそが､ これを行う目的なのです｡ 

05:55.740 --> 06:04.110
俳優には小さな分散を､ 批評家には大きな分散を与えることで､ 探査と搾取をうまく管理することができます｡

06:04.410 --> 06:05.550
では､ こうしてみましょう｡ 

06:05.580 --> 06:09.960
まず､ アクターの面倒を見ようということで､ selfかobjectを取ります｡ 

06:09.960 --> 06:14.730
次に､ アクターのニューラルネットワークを､ アクターリニアとして取り出します｡ 

06:14.880 --> 06:21.300
そして､ このアクターのニューラルネットワークの重みにアクセスすることになりますが､ 重みのデータにアクセスすることを忘れないでください｡

06:21.300 --> 06:22.860
そのデータを追加する必要があります｡ 

06:23.250 --> 06:24.060
わかりました｡ 

06:24.060 --> 06:30.390
これで重みが得られたので､ 今度は関数normalized columns initializeを使ってみましょう｡ 

06:31.200 --> 06:33.870
だから､ ここはそれを踏まえてコピーしています｡ 

06:34.080 --> 06:38.760
そして､ これらの重みが持つべき標準偏差を引数として入力します｡ 

06:38.970 --> 06:41.940
しかし､ その前に､ この関数は2つの引数を取ることを覚えておいてください｡ 

06:41.940 --> 06:44.970
まず､ 初期化したい重みがあります｡ 

06:44.970 --> 06:49.650
ですから､ 単純にそれをもう一度取り出して､ ここに貼り付ければいいのです｡ 

06:49.650 --> 06:54.390
そして､ 2つ目の引数は､ この重みが持つべき標準偏差である｡ 

06:54.390 --> 07:02.730
ですから､ 先ほど言ったように､ 俳優の標準偏差を小さくしたいのですが､ 小さいと0になりますね｡  01完璧です｡

07:02.730 --> 07:05.640
つまり､ 俳優のニューラルネットワークの重みの分です｡ 

07:05.640 --> 07:09.450
では､ 役者のニューラルネットワークのバイアスに気をつけよう｡ 

07:09.600 --> 07:11.970
したがって､ ここでもほぼ同じことをすることになります｡ 

07:11.970 --> 07:20.070
これを下記でコピーし､ 重みを偏りに置き換えて偏りを評価することにします｡ 

07:20.070 --> 07:30.930
そして､ データの後に､ 単純にそのフィルを追加し､ 入力ゼロの中に記憶させるつもりです｡ なぜなら､ すべてのバイアスをゼロで初期化したいからです｡

07:31.260 --> 07:41.340
というのも､ バイアスはすでにweights init関数内でこのfill関数によってゼロに初期化されていることを思い出してください｡

07:41.340 --> 07:49.440
つまり､ バイアスが実際にゼロに初期化されていることを確認するために行っているのですが､ ここではすでに行われていると思います｡

07:49.440 --> 07:52.530
でもとにかく､ これで100％間違いない｡ 

07:52.860 --> 07:53.280
わかりました｡ 

07:53.280 --> 07:55.920
そして今度は､ 評論家に対して同じことをするのです｡ 

07:55.920 --> 07:58.980
では､ 効率よく､ この2行をコピーしてみましょう｡ 

08:00.030 --> 08:02.430
こことここに貼り付けましょう｡ 

08:02.430 --> 08:06.540
俳優を批評家に置き換えるだけです｡ 

08:07.050 --> 08:08.850
ここも今も同じです｡ 

08:08.850 --> 08:12.300
変更するのは､ あくまでも標準偏差だけです｡ 

08:12.300 --> 08:15.690
評論家が持つ新しいネットワークの重みが欲しい｡ 

08:15.690 --> 08:23.430
そして､ 覚えているように､ 今回は大きな標準偏差が欲しいので､ 代わりに. 01､ 1つ入力します｡

08:23.580 --> 08:24.360
そうそう､ そうなんです｡ 

08:24.360 --> 08:33.120
俳優の新しいネットワークの重みの標準偏差が小さく､ 評論家の神経ネットワークの重みの標準偏差が大きいことがわかる｡

08:33.150 --> 08:37.320
もちろん､ ここでアクターをクリエイティングと言い換えることも忘れてはならない｡ 

08:37.830 --> 08:38.190
わかりました｡ 

08:38.190 --> 08:39.030
そして今､ 私たちは元気です｡ 

08:39.630 --> 08:40.320
かっこいい｡ 

08:40.320 --> 08:42.330
ということで､ 残るは2つ｡ 

08:42.330 --> 08:45.750
まず､ STMのバイアスも初期化する｡ 

08:45.750 --> 08:50.610
そして､ これを行うには､ LCMは我々のオブジェクトに属しているので､ 我々のオブジェクトの自己を取ります｡ 

08:50.610 --> 08:57.930
そして､ STM､ DOTの順に､ STMにある2種類のバイアスを取るのです｡

08:57.930 --> 09:04.430
これはバイアスのアンダースコア i h で､ もうひとつはバイアスのアンダースコア h h です｡ 

09:04.440 --> 09:09.810
つまり､ LCMには2種類のバイアスがあり､ 同じように0に初期化されることになります｡ 

09:09.810 --> 09:19.620
そこで､ まずデータにアクセスし､ アンダースコアの充填関数を使って､ この偏りをすべてゼロで埋めてしまう｡

09:19.620 --> 09:21.180
ゼロで初期化する｡ 

09:21.780 --> 09:22.200
わかりました｡ 

09:22.200 --> 09:27.150
そして､ 2つ目のバイアスのグループについては､ ここに追加します｡ 

09:27.700 --> 09:30.880
i h を h h に置き換えたのと同じビットです｡ 

09:31.390 --> 09:35.770
LSBチームのバイアスをゼロで初期化しています｡ 

09:36.190 --> 09:43.000
そして､ 最後にNATモジュールから継承されたメソッド､ つまりtrainメソッドを使用することになります｡

09:43.000 --> 09:47.290
そして基本的にそれは､ モジュールをトレインモードにするメソッドに過ぎないのです｡ 

09:47.290 --> 09:48.670
では､ その使い道は？

09:48.670 --> 09:55.390
まあ､ 用途としては､ ドロップアウトやバッチ正規化などがあれば､ それを有効にすることができることです｡ 

09:55.390 --> 10:03.010
これを使うには､ self dot trainを追加するだけで､ モジュールを完璧に列車モードにすることができます｡ 

10:03.010 --> 10:05.440
というわけで､ init関数は終了です｡ 

10:05.440 --> 10:10.960
畳み込み､ Lshtm､ 評論家と俳優のための2つの独立したニューラルネットワークがあり､

10:10.960 --> 10:15.340
すべての重みとバイアスは適切に初期化されています｡

10:15.340 --> 10:16.630
だから､ それでいいんです｡ 

10:16.630 --> 10:21.490
次のステップでは､ 入力された画像をもとに､ 脳全体に信号を伝播させ､

10:21.490 --> 10:28.450
出力を得るための前進関数を作成します｡

10:28.780 --> 10:30.670
では､ 次のチュートリアルでそれをやってみましょう｡ 

10:30.670 --> 10:32.410
そしてそれまで､ iを楽しんでください｡ 
