WEBVTT

00:00.440 --> 00:02.280
こんにちは､ このチュートリアルにようこそ｡ 

00:02.300 --> 00:07.180
今度は､ 保険契約上の損失と価値損失を計算するフルループを作ります｡ 

00:07.190 --> 00:14.270
そして､ この2つの損失がわかれば､ オプティマイザーを使って確率的勾配降下法を適用し､ 損失を減らすことができるようになるのです｡

00:14.660 --> 00:14.960
わかりました｡ 

00:14.960 --> 00:15.780
そうそう､ そうなんです｡ 

00:15.800 --> 00:17.480
ここからスタートです｡ 

00:17.480 --> 00:23.240
ところで､ 前回のチュートリアルでは､ この部分を実装したのですが､ インデントを削除するのを忘れていました｡ 

00:23.240 --> 00:24.200
申し訳ございませんでした｡ 

00:24.200 --> 00:30.350
つまり､ ここのrから始まるのはforループの中ではなく､ 今は新しいforループを始めているのです｡ 

00:30.350 --> 00:35.810
では､ 4から始めます｡ これから行うのは､ 期限切れの間に行われた最後のステップから始めて､

00:35.810 --> 00:40.220
時間を逆行させるということです｡

00:40.220 --> 00:51.050
そのため､ ここでは逆レンジのLen Rewardsで4つのIを行っています｡ Rewardsはリストだからです｡ 

00:51.050 --> 01:03.970
そして､ 探索の各ステップは報酬に関連付けられているので､ 各ステップでLenの報酬がこのステップ数であるときに報酬を得ることができます｡

01:03.980 --> 01:04.970
そうそう､ そうなんです｡ 

01:04.970 --> 01:11.510
そして､ これから行うのは､ Rである累積報酬を更新することであり､ このように更新していきます｡

01:11.510 --> 01:13.790
実はこれ､ 『Doom』のときと同じなんです｡ 

01:13.940 --> 01:18.290
パラメータから得られるガンマと等しくなる｡ 

01:18.290 --> 01:31.220
私は､ ガンマ倍Rプラスステップの報酬は､ 我々はリストの報酬を取ることによって得ることができ､ インデックスハイを取ること最初のparamsを取る｡

01:31.250 --> 01:35.930
だからまず､ これが最後のステップの報酬になり､ 次に前のステップの報酬になり､

01:35.930 --> 01:43.250
といった具合に｡ そして､ 毎回､ ガンマを掛けて更新し､ このステップでこの報酬を追加しています｡

01:43.340 --> 01:47.000
そうすることで､ 最終的に手に入れることができるのだと､ 覚えておいてください｡ 

01:47.000 --> 01:48.860
というわけで､ コメントとして書かせていただきます｡ 

01:48.890 --> 01:56.510
我々は､ ループの終わりに等しくなる我々の累積報酬を取得します

01:56.510 --> 02:25.880
r ゼロ､ ステップゼロの報酬プラスガンマ倍r 1､ 最初のステップの報酬プラスガンマ二乗倍Rに第二ステップの報酬プラスそのプラスガンマでステップとマイナス1で得られた報酬の1乗（nはステップ数です）｡

02:25.880 --> 02:27.290
でも､ その時は気をつけてください｡ 

02:27.290 --> 02:32.210
最終的には､ ステップ数のべき乗でガンマを得ることになります｡ 

02:33.460 --> 02:39.640
最後の状態に適用される V 関数の値を 2 倍した値｡ 

02:39.970 --> 02:50.740
これは最後に得られるべきもので､ これを得ることができるのです｡

02:50.920 --> 02:56.050
そして､ その値を取得し､ その値と等しくなるように設定したのです｡ 

02:56.140 --> 03:03.310
つまり､ 今､ この2番目のループの始まりにいるのは､ このless状態の値に等しいということです｡

03:03.310 --> 03:10.150
しかし､ こうすることで､ 最終的に得られるのは､ 0＋ガンマr 1＋ガンマの2乗､

03:10.150 --> 03:16.570
または2＋ガンマのn乗-1乗､ ステップn-1＋ガンマのステップ数乗の報酬に､

03:16.570 --> 03:20.700
この少ない状態の値をかけたものです｡

03:20.710 --> 03:25.840
それが､ この累積報酬の計算で理解すべき大きなポイントです｡ 

03:25.840 --> 03:32.740
そのため､ この値で初期化することから始めて､ 最終的な方程式を完璧なものにするために､

03:32.740 --> 03:37.270
この逆ループを行うことが重要なのです｡

03:37.270 --> 03:43.570
そして､ 累積報酬の正しい値がわかったので､ さて､ アドバンテージを計算します｡ 

03:43.600 --> 03:48.940
そして､ ここでのアドバンテージは､ あくまでも価値と比較してこの報酬を得られるかどうかということです｡ 

03:48.940 --> 04:01.390
そこで､ 新たに変数advantageを導入し､ したがって､ この累積報酬からステップIIで得られたV関数の値を引いたものとする｡

04:01.390 --> 04:07.570
つまり､ 誤差を除いた値､ つまり完全な値ということになります｡ 

04:07.570 --> 04:13.010
そして､ 累積報酬とアドバンテージがわかったところで､ 次にバリューロスを求めます｡ 

04:13.030 --> 04:20.830
これは今得られる最初のクラスなので､ バリューロス変数を取得し､ これは次のように更新されます｡

04:20.830 --> 04:35.320
ここまでの記憶では､ バリューロスは0に初期化されていたので､ もう一度バリューロスを取って0を足すことになります｡

04:35.320 --> 04:35.320
アドバンテージの平方根の5倍なので､ このように求めることができる｡ 

04:35.320 --> 04:39.190
アドバンテージ・ドットPOW2｡ 

04:39.220 --> 04:43.120
つまり､ アドバンテージの2乗､ 2の累乗でアドバンテージが決まるということですね｡ 

04:43.210 --> 04:52.390
そして､ それこそが､ 評論家が出力したV関数の値の予測によって発生する損失､ バリューロスなのである｡

04:52.870 --> 04:59.710
そして､ これが価値の損失であることは理にかなっている｡ なぜなら､ 状態ステートにおける行動Aの利点aは､

04:59.710 --> 05:04.600
Q値とV関数の値の差であることを思い出してほしい｡

05:04.600 --> 05:11.140
それで､ 最適なアクションをうまく演じると､ で定常状態になる｡ 

05:11.170 --> 05:17.530
として､ その状態でスターが行った最適なアクションのQ最適｡ 

05:18.330 --> 05:21.960
状態を保存する最適な値に等しい｡ 

05:21.960 --> 05:28.230
ですから､ アドバンテージがゼロに等しくないときは､ この2つの間に差が生じるので､ それで損失が測定されるというのは､

05:28.230 --> 05:32.700
極めて直感的な理解です｡

05:33.870 --> 05:37.200
だから､ バリューロスはダウンが1つ少ない計算となる｡ 

05:37.200 --> 05:38.850
残すところ､ あと1回となりました｡ 

05:38.850 --> 05:42.690
政策的損失であり､ まさに今､ それを計算することになるのです｡ 

05:42.690 --> 05:49.530
そして､ それを計算するためには､ 再び一般化された優位性推定を考える必要がある｡ なぜなら､ 政策損失を計算するためには､

05:49.530 --> 05:59.610
一般化された優位性推定が必要で､ 一般化された優位性推定を得るためには､ まず､ 状態値の時間差が必要だからである｡

05:59.610 --> 06:02.940
つまり､ ここでは複数のことを計算しなければならないのです｡ 

06:02.940 --> 06:05.640
そして､ この時間的な違いからスタートすることになります｡ 

06:05.640 --> 06:10.290
時間差を求めると､ 一般化された優位性推定が得られる｡ 

06:10.290 --> 06:14.700
そして､ 一般化された優位性の推定ができれば､ ポリシーロスを得ることができる｡ 

06:14.700 --> 06:15.390
わかりました｡ 

06:15.390 --> 06:18.510
では､ まず時間的な違いから説明しましょう｡ 

06:18.570 --> 06:31.620
tはステップIIの報酬にガンマ値を加えたもので､ これはパラメータリストのおかげで得ることができます｡ 

06:31.620 --> 06:45.900
そこで､ そのガンマにステップIIの値をプラス1した値をパラメータとして､ そのデータをプラスしてアクセスするのです｡

06:46.740 --> 06:49.380
そして､ 同じようにそのデータを追加します｡ 

06:50.150 --> 06:50.480
わかりました｡ 

06:50.480 --> 06:53.880
それが､ 状態値の時間差の式なんですね｡ 

06:53.900 --> 06:58.310
そして､ 一般化された優位性推定にアップデートすることができるようになりました｡ 

06:58.310 --> 07:10.760
また､ ガスにガンマパラメータを乗じ､ そのガンマパラメータにセルをかけて､ パラメータと一緒にアクセスすることで､ どのように更新されるのですか？

07:10.760 --> 07:18.320
そこで､ Params Cellを取り出し､ この状態値の時間差を加算する｡ 

07:18.320 --> 07:19.670
だから､ 気をつけよう｡ 

07:19.670 --> 07:26.930
ループの中で､ 毎回､ ガスにガンマとタウを掛け､ 時間差を加えています｡ 

07:26.930 --> 07:33.800
ですから､ このループの最後には､ まあ､ この一般化された利点の推定は､

07:33.950 --> 07:41.630
ガンマ時間のすべてのステップで太陽と等しくなることを理解することが重要です｡

07:41.630 --> 07:44.810
AI時代のパワーでタウを｡ 

07:44.990 --> 07:47.390
での時間差は､ ステップバイステップ｡ 

07:48.110 --> 07:48.440
わかりました｡ 

07:48.440 --> 07:50.300
だから､ そのことが大切なんです｡ 

07:50.390 --> 07:58.810
そして､ 一般化された優位性､ 推定､ 時間差の3つが揃ったので､ いよいよ政策的損失を計算することができる｡

07:58.820 --> 07:59.990
では､ こうしてみましょう｡ 

08:00.020 --> 08:10.070
古いポリシーロスを取って､ ステップIIで得られた対数確率を引き､ この一般化された優位性推定値を変数に掛けて､

08:10.070 --> 08:23.870
勾配を計算するので､ 以下の方法で更新します｡

08:23.870 --> 08:26.930
だから､ ダイナミックグラフのグラデーションにくっつける必要がある｡ 

08:26.930 --> 08:36.470
そして､ マイナス0を足す｡  forループのStep IIで得られるエントロピーを01倍したもの｡ 

08:37.040 --> 08:39.200
そしてまた､ 今､ 注意すること｡ 

08:39.290 --> 08:48.140
これはforループの内部での計算であり､ forループの最後に得られるのはポリシーロスということになる｡

08:50.100 --> 08:54.180
ステップの総和を引いた値に等しい｡ 

08:55.060 --> 09:06.130
ステップIIでの政策の積分対数×一般化優位性推定値にこの0を加えたもの｡

09:06.130 --> 09:06.130
01.

09:07.010 --> 09:09.890
ステップのエントロピーが高いときがある｡ 

09:09.920 --> 09:10.640
そうそう､ そうなんです｡ 

09:10.640 --> 09:12.890
そして今､ ステップではどのような方針をとっているのでしょうか｡ 

09:12.890 --> 09:18.200
それは､ アクションのソフトマックス確率とステップのエントロピーですね｡ 

09:18.200 --> 09:22.760
I まあ､ さっき計算したものとか､ 追記したものとか､ そういうことですね｡ 

09:22.760 --> 09:24.050
だから､ すでに持っているのです｡ 

09:24.050 --> 09:29.420
しかし､ ここにあるパイは､ アクションのソフトマックス確率です｡ 

09:29.960 --> 09:31.990
そして､ なぜここにマイナスをつけるのか｡ 

09:32.000 --> 09:36.980
それは､ 確率の対数とエントロピーが負の値であるためです｡ 

09:36.980 --> 09:44.180
そして､ その絶対値を最小化したいので､ この最後を距離ではなく対数尤度としてとらえる必要があります｡

09:44.180 --> 09:51.230
アドバンテージを最大化するアクションを､ 最大限の確率で行いたいということですね｡ 

09:51.260 --> 09:52.940
というのが､ 全体のイメージです｡ 

09:52.940 --> 09:57.950
アドバンテージを最大化するアクションをプレイする確率を最大化したいのです｡ 

09:57.980 --> 10:05.630
そして､ この係数0であるエントロピー係数は何のためにあるのかと思われる方のために｡

10:05.630 --> 10:05.630
01はこちら？

10:05.660 --> 10:13.370
まあ､ その目的は､ 確率が1である1つの行動を除いて､ すべての行動が0である確率分布を持つという罠に､

10:13.370 --> 10:19.280
すぐに陥るのを防ぐためなのですが｡

10:19.280 --> 10:22.310
そうなれば､ エントロピーを最小にすることができますね｡ 

10:22.310 --> 10:29.990
だから､ この小さな係数0を加えているわけです｡  01ここで､ 勾配降下でエントロピーを増加させることになる｡

10:30.910 --> 10:31.320
なるほど｡ 

10:31.420 --> 10:35.220
だから今､ 一番難しい部分が終わったというのは良いニュースです｡ 

10:35.230 --> 10:44.560
2つの損失があるわけですから､ あとは確率的勾配降下法を使って､ この2つの損失を減らすだけです（やり方はすでに知っています）｡

10:44.950 --> 10:53.110
これから行うのは､ このループから抜け出して､ 別に作ったオプティマイザを使うことです｡

10:53.290 --> 10:58.420
それから､ 最初にすべてのグラデーション・パラメータをゼロに初期化することを思い出してください｡ 

10:58.420 --> 11:04.210
そして､ そのために､ ドットを追加し､ ゼロアンダースコアのグリッドメソッドを追加します｡ 

11:04.690 --> 11:06.790
よし､ それならこれで終わりです｡ 

11:06.790 --> 11:15.490
今度は逆伝播を行うのですが､ ポリシーの損失が小さいので､ 失われた値よりも2倍の重要度を与えることにします｡

11:15.730 --> 11:25.630
そこで､ これを行うために､ 括弧内の方針､ アンダースコア・ロスプラス0を入れることにします｡  5価値損失｡ 

11:26.620 --> 11:30.160
だから4． 5倍の値崩れ｡ 

11:30.430 --> 11:38.260
そして､ ここにドットを追加し､ バックワード法を適用して逆伝播を行いました｡ 

11:38.260 --> 11:46.870
そして､ このトリックのおかげで､ 保険金の損失と価値の損失の半分を加えることで､ 損失した価値よりも少ない保険金を2倍重要視しているのです｡

11:47.680 --> 11:53.560
次に､ もう一つの仕掛けとして､ 勾配が極端に大きな値をとらないようにすることで､

11:53.560 --> 11:56.770
アルゴリズムを生成していきます｡

11:56.770 --> 12:07.210
そのためには､ まずtorchライブラリを取得し､ 次にtorchライブラリのinnerモジュール､ そしてutilsのサブモジュールを取得するのがコツです｡

12:07.210 --> 12:14.080
そして､ 関数clip､ アンダースコアのgradをスコアノルムに使用し､

12:14.080 --> 12:20.740
モデルパラメータを2番目の入力として40を入力します｡

12:20.980 --> 12:27.850
そしてこのトリックは､ 基本的に勾配が極端に大きな値を取ってアルゴリズムを生成することがないようにするものです｡

12:28.000 --> 12:31.480
そして､ この40年とはいったい何だろうと思われる方のために｡ 

12:31.570 --> 12:38.410
つまり､ この値を使って､ グラデーションのノルムが0から40の間になるようにしているのです｡

12:38.410 --> 12:42.220
したがって､ そうやってグラデーションが大きな値を取りすぎるのを防いでいるのです｡ 

12:43.660 --> 12:44.980
これでほぼ完成ですね｡ 

12:44.980 --> 12:52.750
ファイルの冒頭で､ エージェントと共有モデルが同じ勾配を共有することを確認し､ ここでこの関数を適用できるようにするために､

12:52.750 --> 13:00.610
この共有関数の確保を行ったことを思い出してください｡

13:01.030 --> 13:14.290
そして､ モデルと共有モデルが同じグラデーションを共有するように､ 共有グラッツを確実に追加していくわけです｡

13:14.500 --> 13:14.830
わかりました｡ 

13:14.830 --> 13:16.450
だから､ それはあくまで予防線なんです｡ 

13:16.450 --> 13:21.310
それが全く必要ないとは言い切れませんが､ 少なくともここで問題が起こることはないでしょう｡ 

13:22.440 --> 13:32.040
そして最後の行ですが､ もちろん､ 損失を減らすために最適化のステップを実行するのですが､ その方法はご存知の通りです｡

13:32.070 --> 13:40.310
もちろん､ オプティマイザーを使って､ そのステップを括弧で囲んで追加すれば､ それで完了です｡ 

13:40.320 --> 13:43.210
脳のトレーニングはもう終わりです｡ 

13:43.260 --> 13:44.670
だから､ おめでとうございます｡ 

13:44.670 --> 13:46.820
無理がなかったでしょうか｡ 

13:46.830 --> 13:49.410
すべてのコメントと一緒にコードを提供しますので､ ご安心ください｡ 

13:49.410 --> 13:53.190
だから､ 細かいところを見逃したら､ コメントを見てもらえばいいんです｡ 

13:53.190 --> 13:55.860
また､ 何も理解できていなくても気にしないでください｡ 

13:55.860 --> 13:57.180
これは非常に高度なことです｡ 

13:57.180 --> 14:00.600
でも安心してください､ これが最強でもあるんです｡ 

14:00.600 --> 14:03.930
PyTorchの作者から作られたものであることを忘れないでください｡ 

14:03.930 --> 14:07.800
だから､ 私たちはここで最高の､ 最先端のものを使って仕事をしているのです｡ 

14:07.800 --> 14:15.840
だから､ 一回目で全部分からなくても全然構わないんですが､ 何回も取り組むことで必ずだんだん慣れてくるんです｡

14:16.260 --> 14:18.960
これでトレーニングは終了ですね｡ 

14:18.960 --> 14:22.770
だから､ 基本的に一番大事なものは全部作りました｡ 

14:22.770 --> 14:28.080
私たちは､ 畳み込み､ Lshtm､ 完全連結層などのニューラルネットワークのアーキテクチャを構築することで､

14:28.080 --> 14:30.360
脳を作りましたよね｡

14:30.360 --> 14:34.290
この電車のコードをここにすることで､ この脳を鍛えているのです｡ 

14:34.290 --> 14:37.080
つまり､ 基本的にアルゴリズムの心臓部はできているのです｡ 

14:37.080 --> 14:39.510
a3cを作ったんですね､ おめでとうございます｡ 

14:39.510 --> 14:43.830
さて､ これからが本番ですが､ それは楽しみなところです｡ 

14:43.830 --> 14:53.970
人が失敗するこのテストを作って､ エージェントをテストし､ AIがブレイクアウトをプレイしている動画を提供する必要がありますね｡

14:53.970 --> 14:55.980
だから､ これはとても楽しいことだと思います｡ 

14:56.010 --> 15:02.700
このテストのすべての行をPIファイルにコーディングすることはしません｡ なぜなら､ 先ほど言ったように､ 最も重要なことを行ったからです｡

15:02.700 --> 15:06.870
a3cと関連付けますが､ もちろんコードの説明もします｡ 

15:06.870 --> 15:11.670
そして最終的には､ このmain da piファイルでコードを実行することになります｡ 

15:11.670 --> 15:15.840
そして､ このコードを実行した瞬間から､ すべてのコードが生成されることになる｡ 

15:15.840 --> 15:23.790
だから､ 頭脳が作られ､ 訓練が行われ､ AIがブレイクアウトの新しいゲームを行い､ 私たちはすべてのビデオを手に入れることができるのです｡

15:23.790 --> 15:26.370
だから､ 最終的には早く観たいんです｡ 

15:26.370 --> 15:29.720
AIがボールをキャッチできるほど賢いかどうか､ これから見ていきたいと思います｡ 

15:29.730 --> 15:39.000
では､ 次のチュートリアルで､ このPIのテストができるように､ 新しいゲームでAIをテストして､ それまでAIを楽しんでくださいということです｡
