WEBVTT

00:00.210 --> 00:02.070
こんにちは､ このチュートリアルにようこそ｡ 

00:02.070 --> 00:05.910
今日のチュートリアルでは､ 共有モデルとの同期を行います｡ 

00:05.910 --> 00:13.950
これから行うのは､ もちろん関数はそのままで､ 1話の長さを初期化することです｡

00:13.950 --> 00:19.740
そこで､ エピソードの長さをエピソード､ アンダースコアの長さと呼ぶことにします｡ 

00:20.040 --> 00:20.910
これでよしとしよう｡ 

00:20.910 --> 00:23.700
そして､ それをゼロに初期化します｡ 

00:23.700 --> 00:27.150
しかし､ その場合､ このエピソードの長さはインクリメントされることになります｡ 

00:27.300 --> 00:30.360
そして､ インクリメントするといえば､ まさにその通りです｡ 

00:30.390 --> 00:37.560
そこで､ whileループを使い､ このトリックを使ってwhile trueと言うことにします｡ 

00:38.430 --> 00:43.680
カレンに､ これから起こること､ このループの中で起こることを繰り返させる｡ 

00:43.980 --> 00:49.950
で､ この井戸端会議のループの中で､ まずこのエピソードの長さの実装が行われるわけです｡

00:49.980 --> 00:53.640
そこでまず､ 1つずつインクリメントしていきます｡ 

00:53.640 --> 00:58.860
そのためには､ 単純にエピソードの長さと

00:59.720 --> 01:02.480
ここに足すと1になる｡ 

01:02.990 --> 01:06.330
そして､ 今度は共有モデルとの同期を行います｡ 

01:06.350 --> 01:15.280
つまり､ エージェントがあるステップ数でその小さな探索を行うために共有モデルを使用することを取得することになりました｡

01:15.290 --> 01:18.620
そして､ この共有されたモデルをどのように手に入れるのか？

01:18.650 --> 01:27.650
では､ モデルを dot で取得し､ load state dict

01:27.650 --> 01:34.140
メソッドを使用する必要があります｡

01:34.160 --> 01:41.780
そこで､ まず共有モデルを置き､ その共有モデルのパラメータを取得するために静的メソッドを適用する必要があります｡

01:41.780 --> 01:46.970
そして､ ここにある私たちのモデルが､ その小さな探検に共有モデルを得ることになるのです｡ 

01:48.430 --> 01:53.560
そして､ この共有モデルを手に入れたら､ 今度は2つのケースを区別しなければならない｡ 

01:53.590 --> 01:59.940
1つ目はif done､ つまりゲームが終了したらという意味です｡ 

01:59.950 --> 02:03.240
では､ ゲームが終了した場合､ その場合はどうなるのでしょうか？

02:03.280 --> 02:09.660
さて､ lshtmとモデルの隠された状態とセルの状態を再初期化する必要があります｡ 

02:09.670 --> 02:18.960
そこで今度は､ C Xをセルの状態､ h xを隠れた状態にして､ 両方を再初期化することにします｡

02:18.970 --> 02:22.900
そして､ ゼロだけでうまく再初期化する方法です｡ 

02:22.930 --> 02:31.600
lshtmの出力は1次元と256次元であるため､ 256個のゼロのベクトルが存在することに注意してください｡

02:31.600 --> 02:32.260
そうそう､ そうなんです｡ 

02:32.260 --> 02:36.070
ここでは､ torchライブラリを用いて初期化を行います｡ 

02:36.070 --> 02:38.890
次にゼロ関数｡ 

02:38.890 --> 02:46.270
256個のゼロからなるベクトルが欲しいので､ ここに2つの次元を入力します｡ 1つはベクトル､

02:46.270 --> 02:50.500
もう1つはゼロになる要素の数である256です｡

02:50.500 --> 02:51.520
そして､ そこに行く｡ 

02:51.520 --> 02:58.450
しかし､ その後､ いくつかのグラデーションが計算されるため､ それをトーチ変数に変換します｡ 

02:58.450 --> 03:01.390
そこで､ これをグラデーションで積分する必要があります｡ 

03:01.870 --> 03:02.380
わかりました｡ 

03:02.380 --> 03:09.460
そして､ そのすぐ下にある隠された状態も同じように初期化します｡ 

03:09.730 --> 03:10.570
これでよしとしよう｡ 

03:10.570 --> 03:13.060
つまり､ ゲームが出来上がった場合です｡ 

03:13.060 --> 03:20.740
そして､ もう一つのケースは､ ls lsでアクセスできる場合です｡ この場合はどうなるのでしょうか｡ 

03:20.740 --> 03:28.810
さて､ 古いセルの状態と隠された状態を維持するつもりなので､ 非常に簡単にこのようにタイプして古いものを維持することができます｡

03:28.840 --> 03:36.610
xイコール変数c×データ､ hiddenステートも同様と見てください｡ 

03:36.610 --> 03:44.470
ここでh xイコール変数h xをデータに追加すればいいのです｡ 

03:44.890 --> 03:45.490
わかりました｡ 

03:45.490 --> 03:46.000
良いことです｡ 

03:46.000 --> 03:46.420
完了しました｡ 

03:46.420 --> 03:53.890
これで､ ゲームが終わっても終わらなくても､ この2件は基本的に終わっているので､ LSから抜け出せますね｡

03:53.890 --> 04:00.250
しかし､ 私たちは野生のループの中にいます｡ なぜなら､ これからさらにいろいろなことをする予定だからです｡

04:00.250 --> 04:07.930
これから行うのは､ トレーニングの計算の中心となるいくつかの変数を初期化することです｡

04:07.930 --> 04:08.830
では､ こうしてみましょう｡ 

04:08.830 --> 04:13.600
批評家の出力である値を覚えておく必要があります｡ 

04:13.600 --> 04:18.610
これがV関数で､ このように空リストとして初期化するわけです｡ 

04:18.940 --> 04:22.450
そうすると､ 対数確率が必要になります｡ 

04:22.720 --> 04:27.040
そこで､ ログプロブ､ また､ 空リストとして初期化することにします｡ 

04:27.340 --> 04:33.160
そしてもちろん､ 空のリストとして初期化される報酬も必要です｡ 

04:33.370 --> 04:43.060
そして最後にエントロピーが必要になるのですが､ これは新しいもので､ まさに学習計算の核心となるものです｡

04:43.060 --> 04:44.800
だから､ リストも空っぽ｡ 

04:44.890 --> 04:49.240
さて､ この4つの変数を初期化したところで､ 新たにforループを開始します｡ 

04:49.240 --> 04:53.110
そして､ この新しいforループで､ これら4つの変数の値を更新します｡ 

04:53.110 --> 05:01.300
そして､ この新しいforループは探査ステップを完全にループすることになるので､ ループする変数は我々のステップとなります｡

05:01.300 --> 05:14.680
そのため､ 範囲内や内部のステップについては､ パラメータnum stepsがまさに探索のステップ数であるため､ 直接params dot num stepsを入力することができる｡

05:14.950 --> 05:19.090
では､ 探索の全ステップに対して､ 何をするのか？

05:19.120 --> 05:24.490
まあ､ モデルの予測値､ つまりモデルから返されるものを取得するわけです｡ 

05:24.490 --> 05:29.740
そして､ この予測を得るには､ モデルを取り出して入力に適用するだけでよいのです｡ 

05:29.740 --> 05:31.240
これが入力信号ですね｡ 

05:31.240 --> 05:36.850
モデルの中の脳を経由して､ アウトプットが得られるのですが､ そのアウトプットがいくつも出てくるのです｡ 

05:36.850 --> 05:42.400
評論家の出力であるV関数の値､ それから俳優の出力であるQ値のQ

05:42.400 --> 05:45.790
assayが得られますよね｡

05:45.970 --> 05:51.430
しかし､ 隠された状態とセルの状態のタプルも出力されることも忘れてはならない｡ 

05:51.430 --> 05:58.120
このモデルに戻ると､ v関数の値であるcriticの出力と､ Q値のQ

05:58.120 --> 06:05.620
assayであるactorの出力､ さらにlshtmの出力､ つまりこのdouble

06:05.620 --> 06:14.410
hexを返して､ hiddenステートとcellステートを見ることができます｡

06:14.680 --> 06:16.810
だから､ その点には気をつけなければなりません｡ 

06:16.810 --> 06:24.280
これは以前とは全く異なるので､ 今度は入力である状態にモデルを適用することにします｡

06:24.280 --> 06:30.610
しかし､ 今は拷問に関連することがいくつかありますが､ それはもちろん私たちがやっていることに力を与えてくれるものです｡

06:31.030 --> 06:34.210
まずは絞ることです｡ 

06:35.590 --> 06:40.600
インデックスがゼロでなければならないこの偽の次元を追加する状態｡ 

06:40.840 --> 06:47.020
それは､ モデルは入力の一括しか受け付けず､ ベクトルやテンソル単体での入力は受け付けないからだ｡

06:47.050 --> 06:49.420
だから､ それはまず絞りをやらなければならない｡ 

06:49.420 --> 06:55.290
しかし､ それでは入力された状態をトーチ変数に変換するのに必要なのはそれだけではありません｡ 

06:55.300 --> 06:58.450
だから､ ここに変数を追加しているのです｡ 

06:58.960 --> 07:01.720
これで､ 状態､ 入力状態はOKですね｡ 

07:01.720 --> 07:06.790
しかし､ 4つの関数の入力は､ 実は入力画像であることを忘れないでください｡ 

07:06.830 --> 07:13.180
先ほどは､ Hidden StateとCell Stateのステープルの話をしましたが､ Hidden StateとCell Stateのステープルの話もあります｡ 

07:13.510 --> 07:22.030
したがって､ この入力の2番目の部分には､ H､ x､ c xのカップルを追加する必要があります｡ 

07:23.090 --> 07:23.570
わかりました｡ 

07:23.570 --> 07:26.810
そして､ 行く先の括弧を取り上げることです｡ 

07:26.810 --> 07:28.300
私たちは､ 2つのインプットを用意しました｡ 

07:28.310 --> 07:30.140
1つ目は､ 入力状態です｡ 

07:30.140 --> 07:40.160
つまり､ 入力画像はすべてトーチ変数に変換され､ この曖昧な次元のバッチと､ 隠れ状態とセル状態のタプルを加えるために絞り込まれます｡

07:40.160 --> 07:41.510
だから､ もう大丈夫なんです｡ 

07:41.510 --> 07:43.670
予想がつくようになりました｡ 

07:43.820 --> 07:49.820
そして､ この戻り値から､ さて､ 我々の3つの予測､ 評論家の出力､ アクターの出力､

07:49.820 --> 07:54.350
そしてLCMによる隠れ状態とセルの状態のタプルを得ます｡

07:54.350 --> 07:59.720
さて､ これから3つの新しい変数を導入し､ この3つの出力とします｡ 

07:59.720 --> 08:00.380
そうそう､ そうなんです｡ 

08:00.380 --> 08:05.330
最初の出力はV関数の値で､ これは評論家の出力である｡ 

08:05.330 --> 08:07.490
だから､ バリューと呼ぶことにします｡ 

08:08.330 --> 08:08.900
そうそう､ そうなんです｡ 

08:08.900 --> 08:10.130
これが最初の出力です｡ 

08:10.130 --> 08:16.790
それから､ 2番目の出力は､ アクターの出力になりますが､ これはQ値Qアッセイです｡ 

08:16.910 --> 08:23.720
しかし､ Q値はアクションに関連づけられるので､ アクション値と呼ぶこともできる｡ 

08:24.630 --> 08:25.440
わかりました｡ 

08:25.440 --> 08:28.700
そして､ モデルから返される最終出力｡ 

08:28.710 --> 08:33.000
それが､ hidden state､ h x､ cell stateのトップです｡ 

08:33.030 --> 08:34.920
Xを見て､ そこに行く｡ 

08:34.920 --> 08:38.970
モデルから返される3つの出力があります｡ 

08:39.000 --> 08:39.930
完璧です｡ 

08:39.930 --> 08:45.420
だから､ 予測ができたからには､ ソフトマックスを使って正しいアクションを演じる必要があるのです｡ 

08:45.420 --> 08:48.390
そして今､ それは以前とまったく同じになるわけです｡ 

08:48.420 --> 08:53.730
次のステップは､ 確率を求めることで､ これをprobと呼ぶことができるようになります｡ 

08:54.700 --> 09:01.450
そこで､ ショートカットを持つ機能モジュールから取り出したソフトマックス法を使うのです｡ 

09:01.450 --> 09:09.970
F F dot soft maxで､ これから入力する入力の確率分布を生成するもので､

09:09.970 --> 09:14.050
もちろんアクションの値です｡

09:14.050 --> 09:18.880
それがQ値であり､ モデル内のアクターの出力である｡ 

09:19.030 --> 09:19.270
なるほど｡ 

09:19.390 --> 09:24.820
ここで確率が出ましたが､ お気づきのように､ エントロピーを扱うことになります｡

09:24.820 --> 09:32.770
エントロピーを求めるには､ 確率だけでなく､ 対数確率も必要です｡ なぜなら､ エントロピーは積の和だからです｡

09:32.770 --> 09:37.120
ログプロブ×プロブ これらすべてをマイナス1倍したもの｡ 

09:37.120 --> 09:46.210
また､ ログソフトMAXから生成されるログプローブを取得する必要があります｡ 

09:46.210 --> 09:54.250
だから､ 確率の分布をとるのではなく､ 対数確率の分布をとり､ それをlogで行うということです｡

09:55.060 --> 09:59.200
詰め込まれた首､ 最大のロックは同じに機能します｡ 

09:59.200 --> 10:01.330
キュー値に適用しています｡ 

10:02.280 --> 10:04.170
これを私たちはアクションバリューと呼んでいます｡ 

10:04.320 --> 10:04.710
わかりました｡ 

10:04.710 --> 10:11.190
これでプローブとプローブが揃ったので､ エントロピーとエントロピーを求める準備が整ったわけです｡ 

10:12.030 --> 10:13.590
そのための計算式は？

10:13.620 --> 10:22.380
さて､ 先ほど申し上げたように､ 対数支柱をとり､ プローブをかけ､ そして､ このすべての合計をとることになります｡

10:22.860 --> 10:26.010
そのためには､ ここでその和を足せばいいのです｡ 

10:26.830 --> 10:27.520
ひとつ｡ 

10:27.640 --> 10:29.830
この仕掛けは､ 実は今､ 何度も使っています｡ 

10:29.980 --> 10:33.400
そして､ 先ほども言ったように､ これらすべてにマイナス1を掛けるのです｡ 

10:33.490 --> 10:39.670
つまり､ 積分対数probの和をprob perfectにしたマイナスです｡ 

10:39.670 --> 10:44.770
そして､ 先ほど計算されたこのエントロピーを､ エントロピーリストに格納することにします｡ 

10:45.340 --> 10:46.060
なぜなら､ そこに行くからです｡ 

10:46.060 --> 10:48.400
最後にエントロピーの計算をします｡ 

10:48.400 --> 10:51.370
それで､ エントロピー・リストに格納する必要があるのです｡ 

10:51.460 --> 10:57.250
そして､ これを行うには､ これ以上単純なものはありません｡ もちろん､ entropyはリストなので､ append関数を使用することになります｡

10:57.250 --> 11:05.590
そこで､ エントロピーリストとドット､ そしてappend関数を使って､ 先ほど計算されたエントロピーを追加しています｡

11:06.420 --> 11:06.780
わかりました｡ 

11:06.780 --> 11:08.300
それでは､ ここで一旦､ 休憩とさせていただきます｡ 

11:08.310 --> 11:10.020
ステップバイステップでやっていきます｡ 

11:10.020 --> 11:16.730
次のチュートリアルでは､ この生成された確率分布の中からランダムに抽選して､ アクションをプレイします｡

11:16.740 --> 11:22.260
そして､ 我々はアクションを再生した後､ 我々は状態の値を取得し､ 我々は最終的に我々の新しい伝送状態の報酬を格納し､

11:22.260 --> 11:25.230
そう行われます｡

11:25.230 --> 11:29.340
これは新しい大きなステップになるので､ 次のチュートリアルで完成させます｡ 

11:29.340 --> 11:30.590
それまではお楽しみに｡ 

11:30.600 --> 11:31.140
I.
