WEBVTT

00:00.500 --> 00:02.810
こんにちは､ このPythonチュートリアルへようこそ｡ 

00:02.960 --> 00:11.230
では､ これから実装する次の機能では､ 人工知能の中にあるディープニューラルネットワークを学習させます｡

00:11.240 --> 00:16.700
基本的には､ 前方伝搬と後方伝搬の全プロセスを行うことで､ 出力を得て､

00:16.700 --> 00:20.630
ターゲットを得ることができるのです｡

00:20.630 --> 00:24.290
出力とターゲットを比較して､ 最後の誤差を計算することになる｡ 

00:24.290 --> 00:28.400
そして､ この最後のエラーをニューラルネットワークに逆伝播するのです｡ 

00:28.400 --> 00:34.700
そして､ 確率的勾配降下法を用いて､ 誤差を少なくするためにどれだけ貢献したかに応じて重みを更新していくのです｡

00:34.910 --> 00:36.290
だから､ これを全部やりましょう｡ 

00:36.290 --> 00:41.360
ディープラーニングコースから来られた方には､ 子供向けの内容になりますが､ それ以外の方には､ もう一度説明しますので､

00:41.360 --> 00:43.580
ご安心ください｡

00:43.880 --> 00:47.240
そこで､ この新しい関数をlearnと呼ぶことにします｡ 

00:47.390 --> 00:51.350
そしてこの学習関数は､ いくつかの引数を取ることになる｡ 

00:51.350 --> 00:57.260
もちろん､ 最初のselfは､ 異なるクラスのオブジェクトを参照することになります｡ 

00:57.260 --> 01:14.810
次に､ 現在の状態を表すバッチの状態､ 次の状態を表すバッチ､ 報酬を表すバッチ､ そして最後にアクションを表すバッチの状態を表すバッチとなります｡

01:15.350 --> 01:16.790
では､ なぜこれを撮るのか｡ 

01:16.790 --> 01:19.700
何のシリーズか認識されているのでしょうか？

01:19.700 --> 01:27.290
まあ､ それはもちろん､ ディープラーニングの根底にあるマルコフ決定過程の遷移なんですけどね｡

01:27.290 --> 01:30.350
そして､ なぜ皆､ 何かのバッチに取り込むのでしょうか？

01:30.350 --> 01:39.410
それは､ トップが現在の状態次の状態､ 現在の報酬､ 現在の行動という一連の流れによる遷移を考えていないからだと覚えておいてください｡

01:39.410 --> 01:43.940
ここではサンプル機能により､ いくつかのサンプルバッチを作成しました｡ 

01:43.940 --> 01:49.400
そして今､ 私たちのトランジションは､ 状態に関する最初のバッチ､ 次の日付に関する2番目のバッチ､ 報酬に関するバッチ､

01:49.400 --> 01:53.120
そして行動に関するバッチという形になっています｡

01:53.300 --> 01:58.880
これが今のトランジションの形です｡ 1次元に対して行ったこの連結のおかげで､

01:58.880 --> 02:03.620
すべて時間に対してうまく整合しています｡

02:03.980 --> 02:11.450
つまり､ 状態､ 次の状態､ 報酬､ アクションのそれぞれに1バッチずつ､ このバッチの遷移があるのです｡

02:11.450 --> 02:18.410
これは､ ディープニューラルネットワークが何かを学習できるように､ この経験値再生のトリックを使っているためです｡

02:18.410 --> 02:24.110
トランジション単体だけなら､ まあ､ 即席の学習にはなるでしょうから､ 覚えておいてください｡ 

02:24.110 --> 02:28.850
あるいは､ 非常に短い記憶学習が必要で､ そのためモデルが何も学習しない場合です｡ 

02:28.850 --> 02:39.320
そこで､ トランジションとなるこれらのバッチをメモリから取り出して､ 最終的には入力されたバッチの状態ごとに異なる出力を得ることになります｡

02:39.320 --> 02:45.470
そして､ 損失を計算するために両方が必要になるので､ バッチ状態とバッチネクスト状態についてこれを行います｡

02:45.470 --> 02:51.080
深層学習アルゴリズムの核となるバランス方程式をすぐに思い出すことができる｡ 

02:51.680 --> 02:56.930
では､ 関数に入り､ まずバッチの状態の出力を取得してみましょう｡ 

02:56.930 --> 02:59.600
そこで､ この最初の変数をoutputsと呼ぶことにする｡ 

03:00.480 --> 03:04.980
そして､ もちろんセルフモデルも取り上げます｡ 

03:05.190 --> 03:14.230
バッチ状態の入力状態のモデル出力を得たいので､ セルフティーチングモデルですね｡ 

03:14.250 --> 03:25.080
そして､ このモデルは実際に入力状態のバッチを期待しているので､ 今すぐモデルの入力にバッチの状態を入力することができます｡

03:25.110 --> 03:33.390
このように､ バッチ用の偽の次元を持つトーチテンソルを使って､ ネットワークに入る状態を初期化したわけです｡

03:33.780 --> 03:34.900
だから､ 完璧なんです｡ 

03:34.920 --> 03:40.550
これでモデルの出力が得られたわけですが､ ここでまた技術的なトリックが発生します｡ 

03:40.560 --> 03:47.730
もし､ 自己をモデル化するバッチ状態だけをうまくやれば､ すべての可能なアクションの出力が得られるでしょう､ ほら､

03:47.730 --> 03:49.140
ゼロ1と2です｡

03:49.260 --> 03:50.700
でも､ それは私たちが望んでいることではありません｡ 

03:50.730 --> 03:58.600
私たちが関心を持つのは､ 選択された行動､ つまりネットワークによってその都度プレイすることが決定された行動だけです｡

03:58.620 --> 04:03.060
そして､ 私たちが興味を持っているこれらのアクションを得るために､ アクションがうまく再生されるのです｡ 

04:03.060 --> 04:11.640
選択されたアクションだけが欲しいので､ 1つを入力するこのgather関数を使わなければならないのです｡ 

04:12.000 --> 04:24.390
そして､ これでバッチアクションを追加します｡ バッチアクションは､ バッチステートの入力状態ごとに再生する最適なアクションをその都度集めます｡

04:24.540 --> 04:31.650
私たちが欲しいのは､ プレイされるアクション､ 選ばれるアクションだけであり､ このギャザーワンやバッチアクションでこれを手に入れることができます｡

04:31.920 --> 04:33.150
でも､ その時は気をつけてください｡ 

04:33.180 --> 04:39.540
このバッチ状態には､ バッチに対応するこの偽の次元があり､ バッチアクションにはそれが戻ってこない､

04:39.540 --> 04:41.040
状態にはそれがある？

04:41.040 --> 04:46.230
というのも､ ここではエントリーを使用していますが､ アクションについてはスクイーズでは一切使用していないからです｡ 

04:46.230 --> 04:52.740
そこで､ バッチアクションがバッチステートと全く同じ次元になるように､ ここに追加する必要があります｡ 

04:52.890 --> 04:57.000
そこで､ スクイーズ・ゼロにドットを追加することにします｡ 

04:57.730 --> 04:58.780
ここです｡ 

04:58.900 --> 05:09.050
そして､ 実はこれはゼロではなく､ 1なのです｡ ゼロは国家の信仰の次元に対応し､ 1は行動のフェイクの次元に対応することになるからです｡

05:09.070 --> 05:16.000
そして最後に､ この偽バッチをスクイーズで殺す必要があるのです｡ 

05:16.300 --> 05:17.910
そして､ なぜそのようなことをする必要があるのでしょうか｡ 

05:17.920 --> 05:19.990
なぜなら､ 今はニューラルネットワークから外れているからです｡ 

05:19.990 --> 05:22.840
出力はしているが､ 一括では困る｡ 

05:22.840 --> 05:27.460
単純なテンソル､ 単純なベクトル､ 出力のベクトルで欲しいのです｡ 

05:27.610 --> 05:34.750
バッチは､ ちょうどニューラルネットワークで作業するときに､ ニューラルネットワークがセンサーのフォーマットをバッチにすることを想定しているからです｡

05:34.780 --> 05:41.290
しかし､ 今は出力があるので､ 次の深層学習のバランス式では､ バッチにする必要はないでしょう｡

05:41.290 --> 05:43.090
だから､ ここでバッチを殺しているんです｡ 

05:43.090 --> 05:47.920
偽物の次元を殺して､ 出力のシンプルな形を取り戻そうとしているのです｡ 

05:47.920 --> 05:50.710
だから､ ここにドット､ そしてスクイーズを加えているんです｡ 

05:51.320 --> 05:56.000
そして､ アクションのバッチに対応する偽の次元を殺したいので｡ 

05:56.000 --> 06:01.130
さて､ この偽次元にはインデックスが1つあるので､ ここに1つ追加します｡ 

06:01.370 --> 06:01.940
わかりました｡ 

06:01.940 --> 06:03.500
そして今､ こうしている｡ 

06:03.500 --> 06:05.810
私たちは､ OCというアウトプットを持っています｡ 

06:05.810 --> 06:06.860
少し予告します｡ 

06:06.860 --> 06:07.670
何ですか？

06:07.700 --> 06:10.940
ローカル変数outputsは割り当てられるが､ 使用されることはない｡ 

06:10.940 --> 06:11.750
それでいいんです｡ 

06:11.750 --> 06:13.220
さっそく使わせていただきます｡ 

06:13.670 --> 06:15.410
これが私たちのアウトプットなんですね｡ 

06:15.410 --> 06:18.560
そして今､ 私たちは次を手に入れたいと考えています｡ 

06:19.360 --> 06:20.260
出力します｡ 

06:20.260 --> 06:23.560
では､ なぜ次の出力が必要なのか､ と思われるかもしれません｡ 

06:23.590 --> 06:28.840
さて､ これを理解するためには､ ここにある深層学習のアルゴリズムに戻る必要があります｡ 

06:28.840 --> 06:31.600
それは､ ロジックハンドブックの一部です｡ 

06:31.600 --> 06:33.730
それがディープラーニングの全体像なんですね｡ 

06:33.730 --> 06:38.470
最初にすべての値を初期化し､ その都度

06:38.470 --> 06:40.090
T そうですか､ そうですか｡ 

06:40.090 --> 06:42.190
ソフトマックスでアクションを選択します｡ 

06:42.190 --> 06:44.560
それが「セレクトアクション」機能です｡ 

06:44.590 --> 06:51.940
そして､ 遷移を追加して､ ご覧のように予測､ 目標､ 損失を計算します｡

06:51.940 --> 06:54.130
では､ なぜ次の出力も必要なのでしょうか？

06:54.130 --> 06:55.780
それは､ ターゲットがあるからです｡ 

06:55.990 --> 07:03.670
目標はγ倍､ 次の出力に報酬を加えたものに等しく､ その直後に目標を計算します｡

07:03.670 --> 07:07.360
しかし､ ターゲットの次の出力が必要なので､ まずこれを計算しよう｡ 

07:07.540 --> 07:10.780
つまり､ 次の出力を得るには､ とても簡単なことなのです｡ 

07:10.780 --> 07:18.790
次の出力は､ 次の日付のバッチを入力としたときのニューラルネットワークの結果になります｡

07:18.910 --> 07:26.830
つまり､ 非常に簡単に言えば､ ニューラルネットワークのモデルを作成し､ 今回のニューラルネットワークの入力は､

07:26.830 --> 07:30.640
次のバッチの日付になります｡

07:31.540 --> 07:32.940
バッチ次回の日付です｡ 

07:32.950 --> 07:39.580
しかし､ 今､ 思い出してほしいのは､ 深層学習アルゴリズムに戻ると､ まあ､ 次の出力は､

07:39.580 --> 07:45.430
すべての行動に関して､ 次の集合のキュー値の最大値であることがわかります｡

07:45.460 --> 07:49.920
つまり､ 今､ 次の出力を得るためには､ このQ値の最大値を得る必要があるのです｡ 

07:49.930 --> 08:07.510
というのも､ このバッチにはいくつかの状態があるからです｡

08:07.600 --> 08:15.100
そこで､ detach関数を使ってすべてのキューを切り離し､ これらのキューの値の最大値を取っているのです｡

08:15.100 --> 08:22.810
そして､ これらのQ値のうち､ アクションに関する最大値を取っているので､ まあ､ アクションに関するものであることを明記する必要があります｡

08:22.810 --> 08:29.320
そして､ アクションはインデックス1で表されるため､ ここでもインデックス1を置き､

08:29.650 --> 08:36.010
次の状態であるs tプラス1のQ値を取ることを指定しなければならないのです｡

08:36.010 --> 08:42.250
そして､ 次の状態はインデックスゼロで表される｡ インデックスゼロは状態に対応するからだ｡ 

08:42.250 --> 08:47.140
したがって､ ここではインデックスがゼロの括弧を追加する必要があります｡ 

08:47.590 --> 08:57.430
そうすれば､ インデックス0で表される次の状態のQ値の最大値を､ インデックス1で表されるすべての行動に従って得ることができる｡

08:58.000 --> 08:59.080
そして今､ 完璧になった｡ 

08:59.080 --> 09:01.400
次の出力を得ることができます｡ 

09:01.420 --> 09:02.770
これらは､ 新しい状態です｡ 

09:02.770 --> 09:04.120
そこで警告を受けたのです｡ 

09:04.120 --> 09:04.930
でも､ それでいいんです｡ 

09:04.930 --> 09:07.690
今すぐ使って､ ターゲットを計算します｡ 

09:08.170 --> 09:12.160
そして､ ターゲットといえば､ この学習機能の次のステップです｡ 

09:12.310 --> 09:13.060
そうそう､ そうなんです｡ 

09:13.090 --> 09:15.400
ターゲットは等しい｡ 

09:15.430 --> 09:18.140
さて､ AIハンドブックに話を戻しましょう｡ 

09:18.160 --> 09:22.090
ターゲットは報酬にガンマ回数を加えたものである｡ 

09:22.090 --> 09:27.160
次の出力は､ 行動に従って次の日付のQ値の最大値となる｡ 

09:27.430 --> 09:28.030
そうそう､ そうなんです｡ 

09:28.030 --> 09:29.080
それを計算してみましょう｡ 

09:29.080 --> 09:36.730
つまり､ self, that gammaとself, that gammaは等しく､ ここで初期化され､ 導入されるのです｡ 

09:36.730 --> 09:46.960
これはGQとオブジェクトの変数で､ 先ほど言ったようにガンマに次の出力を掛け､ さらにバッチ報酬を加えたもので､

09:47.110 --> 09:53.170
ここではバッチを扱っているのでプラスバッチです｡

09:54.570 --> 09:55.290
ご褒美

09:55.620 --> 09:59.190
そして､ それがメモリの1サンプルでターゲットになります｡ 

09:59.580 --> 10:03.360
ガンマに次の出力を掛け合わせたものを報酬とする｡ 

10:03.720 --> 10:04.980
よし､ 完璧だ｡ 

10:04.980 --> 10:06.890
さて､ これでアウトプットができました｡ 

10:06.900 --> 10:08.670
また､ 目標もあります｡ 

10:08.670 --> 10:14.240
したがって､ 予測誤差を表す損失､ ロスを計算することができる｡ 

10:14.250 --> 10:15.690
だから､ これは負けとしよう｡ 

10:15.720 --> 10:30.290
TD損失 TDはもちろんCU学習の核となる時間差の損失で､ このTD損失はQ学習を大幅に改善するHuber損失と等しくなる予定である｡

10:30.300 --> 10:34.350
それが､ 私たちが人工知能に選ぶ最後の機能です｡ 

10:34.560 --> 10:39.000
ディープラーニングのコースから来た人には､ ディープラーニングを導入するなら､

10:39.000 --> 10:40.620
本当におすすめのロスです｡

10:40.620 --> 10:43.260
それで､ このフーバー・ロスをどうするのか？

10:43.260 --> 10:49.110
さて､ 今回もFで表される機能モジュールから関数を取り出してみます｡ 

10:49.710 --> 10:57.660
したがって､ ここで私は私たちの機能モジュールFドットを使用するつもりですと､ 関数スムーズlのおかげで得ることができるようにハッブルは､

10:57.660 --> 11:07.710
その1を失うので､ エンターキーを押すと､ それは本当に私が深層学習にお勧めします最高の失われた関数です｡

11:07.740 --> 11:10.650
本当にQの学習が向上するのですが､ これは機能なんです｡ 

11:10.650 --> 11:19.200
だから､ 括弧をいくつか追加して､ あとは予測値とターゲットを入力するためのシンプルな引数だけです｡

11:19.200 --> 11:24.000
つまり､ 予測はもちろん､ ニューラルネットワークの出力ですから､ 私たちの出力です｡ 

11:24.000 --> 11:27.480
ニューラルネットワークの出力は､ ニューラルネットワークが予測したものなんですよね｡ 

11:27.480 --> 11:28.950
というのが予測です｡ 

11:28.950 --> 11:31.860
つまり､ ここでの第一の論点は､ 出力です｡ 

11:32.250 --> 11:35.730
そして第2引数は､ もちろんターゲットです｡ 

11:35.910 --> 11:43.530
我々が得ようとしているもの､ それはすでに完璧に計算され､ 我々は直接ターゲット完璧を入力することができ､

11:43.530 --> 11:45.180
今損失を持っています｡

11:45.210 --> 11:47.520
ただ､ ここで少し忘れていたことがあります｡ 

11:48.060 --> 11:48.690
これでよしとしよう｡ 

11:48.690 --> 11:50.340
これで､ 警告が消えるはずです｡ 

11:50.670 --> 11:52.020
はい､ 完璧です｡ 

11:52.020 --> 12:00.270
そして､ 最後のエラーが出たので､ このエラーをネットワークに逆伝播して､ 確率的勾配降下法で重みを更新することができるのです｡

12:00.270 --> 12:03.150
そして､ それこそが､ 次のステップで行うべきことなのです｡ 

12:03.240 --> 12:09.600
さて､ 次はご想像のとおり､ オプティマイザーを使ってみましょう｡ 

12:10.050 --> 12:17.190
アトム・オプティマイザーはアトムクラスのオブジェクトで､ すでにモデルのパラメータがフィットしており､

12:17.190 --> 12:27.570
学習率も0を選択しています｡

12:27.570 --> 12:27.570
1％です｡ 

12:27.570 --> 12:36.960
これでオプティマイザーの準備は整いましたが､ あとは最後のエラーに対して確率的勾配降下とデータの重みを適用する必要があります｡

12:36.960 --> 12:43.980
そのため､ PyTorchを扱う際には､ まずループの反復ごとに初期化をし直す必要があります｡

12:43.980 --> 12:54.780
確率的勾配降下のループの中で､ ある反復から別の反復へと､ ループの持続時間ごとに最適化器を再初期化しなければなりません｡

12:54.930 --> 12:59.700
さて､ 今回はゼログリッドである次の方法を使います｡ 

12:59.730 --> 13:05.010
さて､ ゼログリッドは､ ループの各反復でオプティマイザーを再初期化します｡ 

13:05.010 --> 13:06.990
それから､ 忘れてはいけないのが､ 「括弧」です｡ 

13:07.380 --> 13:08.040
完璧です｡ 

13:08.040 --> 13:14.700
そして､ 再初期化されたことで､ オプティマイザで逆伝播を行うことができるようになりました｡ 

13:15.000 --> 13:16.290
そして､ どうすればいいのか？

13:16.290 --> 13:23.100
さて､ TDロスを受け取って､ それをネットワークに逆伝播するのですが､ ネットワークに逆伝播するためには､

13:23.100 --> 13:27.720
バックワード関数を使用する必要があります｡

13:27.960 --> 13:36.510
そして､ このバックワード関数の内部では､ アンダースコア変数を入力し､ 保持し､ それをtrueに等しく設定することをお勧めします｡

13:37.080 --> 13:40.950
そうすることで､ バックプロパゲーションが改善されるので､ おすすめです｡ 

13:40.980 --> 13:48.900
return variables equals trueの使い方は､ メモリを解放するためで､ 何度も損失を出すのでメモリを解放する必要があります｡

13:48.900 --> 13:52.650
そうすれば､ トレーニングのパフォーマンスも確実に向上するわけです｡ 

13:52.650 --> 13:58.890
そして最後に､ この学習関数の最後のステップは､ バックプロパゲーションに従って､ つまり､ 重みがどれだけ誤差に寄与したかに応じて､

13:58.890 --> 14:02.550
重みを更新することである｡

14:02.550 --> 14:11.160
そのために､ 初期化されたオプティマイザーを再度､ 初期化し､ ステップ関数を使用します｡

14:11.160 --> 14:19.110
ステップ関数を使用することによって､ このコードの行で簡単に重みを更新します｡

14:19.260 --> 14:21.630
それが､ 重さを更新するこの一行のコードです｡ 

14:21.660 --> 14:29.940
このコードの行は､ エラーをニューラルネットワークに逆伝播し､ このコードの行は､ オプティマイザーを使って重みを更新しています｡

14:30.210 --> 14:31.290
そして､ そこに行く｡ 

14:31.290 --> 14:33.990
学習型ニューラルネットワークがあります｡ 

14:35.030 --> 14:35.360
わかりました｡ 

14:35.360 --> 14:36.650
だから､ おめでとうございます｡ 

14:36.650 --> 14:42.200
今回のディープラーニングモデルの中で､ 最も技術的に難しい部分だったのではないでしょうか｡ 

14:42.200 --> 14:47.750
PyTorchは時にトリッキーですが､ 最終的には非常に機能的なニューラルネットワーク､

14:47.750 --> 14:55.850
つまりディープラーニングモデル､ そして最終的には素晴らしい人工知能を手に入れることができることをお約束します｡

14:56.360 --> 15:06.950
AIが新しい状態を発見したときに更新する更新関数です｡

15:06.950 --> 15:14.960
つまり､ 新しい状態を発見し､ 先ほど行った行動とこの新しい状態に応じた報酬を受け取ることができるのです｡

15:14.960 --> 15:19.460
そこで､ update関数でこれを処理することにします｡ これは次のチュートリアルで行います｡ 

15:19.460 --> 15:20.810
それまではお楽しみに｡ 

15:20.810 --> 15:21.290
I.
