WEBVTT

00:00.270 --> 00:02.730
こんにちは､ このPythonチュートリアルへようこそ｡ 

00:03.000 --> 00:08.580
それでは､ このチュートリアルでは､ その都度正しいアクションを選択する関数を作っていきます｡

00:08.580 --> 00:14.430
ですから､ 基本的には､ ゴールに向かって左回り､ 直進､ 右回り､ それぞれのタイミングで正しい動きをさせ､

00:14.430 --> 00:20.520
障害物を避けて降下する部分を実装していきます｡

00:20.730 --> 00:22.200
では､ 今すぐやってみましょう｡ 

00:22.200 --> 00:30.360
いつものようにdefで関数を定義して､ 関数に名前をつけて､ selectと呼ぶことにします｡

00:31.170 --> 00:31.830
アクション

00:32.370 --> 00:37.320
そして､ いくつかの括弧とこの選択アクション関数は2つの引数を取ることになります｡ 

00:37.320 --> 00:41.130
最初のものは､ オブジェクトを参照するために通常通り自己である｡ 

00:41.130 --> 00:46.020
そして､ 2つ目の議論ですが､ あなたによるとどちらになるのでしょうか？

00:46.170 --> 00:47.580
さて､ それは何でしょう？

00:47.610 --> 00:53.520
考えてみれば､ 私たちが選択する行動は､ ニューラルネットワークの出力からきています｡ ニューラルネットワークの出力は､

00:53.520 --> 00:59.340
3つの可能な行動それぞれに対するキューの値ですから､ 私たちが演じる行動､ ニューラルネットワークの出力となる行動は､

00:59.340 --> 01:05.550
入力状態に依存しているのです｡

01:05.550 --> 01:11.340
そして､ この入力状態は､ まさにselect action関数に必要な第2引数である｡ 

01:11.670 --> 01:16.260
文字通り､ ニューラルネットワークの出力を取り出すからです｡ 

01:16.260 --> 01:22.140
そしてもちろん､ ニューラルネットワークの出力は､ ニューラルネットワークの入力に直接依存する｡ 

01:22.140 --> 01:23.970
だから､ それが私たちの主張になるのです｡ 

01:23.970 --> 01:26.430
そして今､ 私たちはそれにどんな名前でもつけることができます｡ 

01:26.430 --> 01:33.870
実際には､ ニューラルネットワークの入力は､ ベクトル5次元､ 3つの信号の向きとマイナスの向きで符号化された入力状態であるため､

01:33.870 --> 01:39.810
状態と呼ぶことにします｡

01:39.810 --> 01:41.940
それで､ 今は楽になった｡ 

01:41.940 --> 01:49.320
入力された状態を､ すぐ上で構築したニューラルネットワークに､ このネットワーククラスで送り込みます｡

01:49.320 --> 01:55.950
そして､ 3つの可能な行動のそれぞれのキュー値である出力を得ることになります｡

01:55.950 --> 02:02.640
そして､ このチュートリアルで説明するソフトマックスの手法で､ 最後のアクションを再生させるのです｡

02:03.030 --> 02:04.290
では､ こうしてみましょう｡ 

02:04.290 --> 02:07.740
関数に入り､ これをすべて実装してみましょう｡ 

02:08.220 --> 02:13.020
そこで､ まず始めに､ 今お話したような詰めについてです｡ 

02:13.020 --> 02:24.480
マックス ソフトマックスの考え方は､ その都度､ 最適なアクションを考えながら､ 同時にさまざまなアクションを探っていくということです｡

02:24.720 --> 02:25.890
そして､ どうすればいいのか？

02:25.890 --> 02:30.990
他のアクションを模索しながらも､ どうすれば最適なアクションをプレイできるのか｡ 

02:30.990 --> 02:41.880
さて､ このソフトマックスの考え方は､ Q値Q状態行動のそれぞれについて確率の分布を生成することからなるものである｡

02:41.880 --> 02:44.970
1つのアクションに対して1つのQ値を用意していますね｡ 

02:44.970 --> 02:46.590
左へ行く､ まっすぐ行く､ 右へ行く｡ 

02:46.590 --> 02:49.470
しかし､ このQ値も入力状態に依存する｡ 

02:49.470 --> 02:52.650
まさにQファンクションを見て､ 直感的にレクチャーを受けたわけですね｡ 

02:52.650 --> 02:55.980
このQ関数は､ 状態とアクションの関数である｡ 

02:56.010 --> 03:02.460
つまり､ ここには1つの入力状態､ つまりここの状態があり､ 3つの可能なアクションがあるので､ 3つあることになります｡

03:02.460 --> 03:03.270
Q 価値観について｡ 

03:03.270 --> 03:04.470
Q ステートアクション1｡ 

03:04.470 --> 03:07.230
Qステートアクション2､ Qステートアクション3｡ 

03:07.230 --> 03:13.710
そして､ この3つのQ値に関する確率の分布を生成することになります｡ 

03:13.710 --> 03:22.590
つまり､ 1つ目のQ値に対する確率､ 2つ目のQ値に対する確率､ 3つ目のQ値に対する確率を1つずつ用意することになる｡

03:22.590 --> 03:25.230
そして､ これら3つの確率はすべて合計すると1になる｡ 

03:25.440 --> 03:33.420
そして､ これをすべてソフトマックスで行うわけですが､ ソフトマックスは､ 最も高いQ値に大きな確率を帰属させます｡

03:33.570 --> 03:41.220
だから､ 自己最大値の代わりに､ 単純な最大値､ つまり､ Q値の最大値を直接取るという方法があるんだ｡

03:41.220 --> 03:44.640
しかし､ その場合､ 他のアクションを探っているわけではありません｡ 

03:44.850 --> 03:51.690
この確率のおかげで､ すぐにわかる温度パラメータを使って､ どこかを探検することができるのです｡

03:51.990 --> 03:55.740
この温度パラメーターを設定することで､ まだ探索することができます｡ 

03:55.770 --> 04:03.060
ですから､ 一般にディープラーニングでは､ 単純なarg maxではなく､ soft maxを使うことを強くお勧めします｡

04:03.240 --> 04:05.130
よし､ じゃあソフトマックスを実装しよう｡ 

04:05.130 --> 04:10.980
したがって､ あなたが理解したように､ Soft Maxは3つの可能な行動に対する3つのQ値のそれぞれの確率を返すので､

04:10.980 --> 04:20.160
さて､ 最初に作成する変数は､ もちろん､ これらの確率を参照するprobsとします｡

04:20.160 --> 04:22.080
だから､ 小道具はイコール｡ 

04:22.080 --> 04:24.660
そして､ 今度はソフトマックス関数を使います｡ 

04:24.810 --> 04:27.930
そして､ あなたによると､ どこから取るつもりなのでしょうか？

04:28.050 --> 04:29.490
まあ､ 当然ですね｡ 

04:29.490 --> 04:39.630
トーチドットやドットファンクショナルサブモジュールをインポートしたのは､ ニューラルネットワークを実装するためのアクションがほとんど含まれているモジュールだと記憶しています｡

04:39.630 --> 04:40.830
ショートカットにしたのです｡ 

04:40.830 --> 04:46.920
F そして､ この機能的なサブモジュールから､ まさに自己最大関数を取り出そうとしているわけです｡ 

04:47.070 --> 04:56.010
しかし､ fというショートカットをつけたので､ ここではFを表す関数から始め､ そこからソフトマックス関数を取り出すことにします｡

04:56.010 --> 04:56.730
これです｡ 

04:56.730 --> 04:57.990
それが最初の1枚です｡ 

04:57.990 --> 04:59.250
と括弧書き｡ 

04:59.580 --> 05:00.030
わかりました｡ 

05:00.030 --> 05:03.840
さて､ このself max関数には何を入力すればいいのでしょうか？

05:03.840 --> 05:09.900
もちろん､ それは確率分布を作りたい対象である｡ 

05:09.900 --> 05:11.400
そして､ その実体は何なのか？

05:11.400 --> 05:13.590
まあ､ これらはもちろんQ値なんですけどね｡ 

05:13.590 --> 05:16.710
そこで今度は､ Q値をどのように求めるかです｡ 

05:16.710 --> 05:20.970
まあ､ 当然ですが､ Q値はニューラルネットワークの出力ですからね｡ 

05:20.970 --> 05:24.420
そして､ このニューラルネットワークの出力を得るために､ さて､ どうするか｡ 

05:24.420 --> 05:26.880
ニューラルネットワークを

05:26.880 --> 05:30.420
でも実は､ すでに持っているんです､ それが｡ 

05:30.910 --> 05:38.230
init関数で初期化したself dot modelは､ networkクラスのオブジェクトなので､

05:38.230 --> 05:41.350
ニューラルネットワークに他なりません｡

05:41.350 --> 05:42.600
それで完璧なんです｡ 

05:42.610 --> 05:52.870
ここで作ったモデルをself maxで入力状態に適用すれば､ 引数として求めている出力が返ってくるのです｡

05:52.900 --> 05:54.280
それがQ値です｡ 

05:54.280 --> 06:00.730
それで､ なぜここでモデルを取ってinit関数に導入しなければならなかったのか､ 直感的に理解できるようになったかもしれません｡

06:00.730 --> 06:06.550
オブジェクト指向プログラミングを始めた方にとっては､ これらすべてが自然なことだとおわかりいただけると思います｡

06:06.940 --> 06:08.680
じゃあ､ セルフMAXで｡ 

06:08.680 --> 06:16.660
ここで作成したオブジェクトのモデルでなければならないので､ モデル self dot model を取ります｡ 

06:16.990 --> 06:23.860
しかし､ 次にニューラルネットワークモデルの出力を得る必要があります｡ そのため､

06:23.860 --> 06:30.340
ここにいくつかの括弧を追加して､ stateという入力状態を入力します｡

06:30.340 --> 06:37.690
つまり､ 最初にやりたいことは状態の入力なのですが､ ここで何かに気をつけなければならないのです｡ 

06:37.690 --> 06:43.930
今は単純な状態のように見えるが､ 実はこの状態はトーチテンソルになることを覚えておいてほしい｡

06:43.930 --> 06:51.040
なぜなら､ 後でこのself less stateを使ってselectアクション関数の引数に入れるからで､ ここにある状態の引数は､

06:51.040 --> 06:57.280
実は後でこのself､ that less stateになるのだ｡

06:57.430 --> 07:02.590
そして､ これはトーチテンソルなので､ まあモデルが受け入れてくれるからいいんですけどね｡ 

07:02.590 --> 07:04.720
しかし､ 今はアルゴリズムを改良することができます｡ 

07:04.870 --> 07:08.290
つまり､ ご理解いただいたように､ Stateはトーチテンソルなのです｡ 

07:08.290 --> 07:15.250
また､ 先ほども言ったように､ ほとんどのセンサーはグラデーションを含む変数にラップされています｡ 

07:15.430 --> 07:22.540
では､ まずテンソルである入力状態をtorch変数にラップしてみましょう｡ 

07:22.570 --> 07:27.910
しかし､ これは入力状態なので､ まあ､ 多少の差別化はできないでしょう｡ 

07:27.910 --> 07:33.610
この状態の変数の勾配は計算には使わない｡ 

07:33.610 --> 07:42.700
したがって､ これから行うのは､ このトーチテンソルの状態をトーチ変数に変換することである｡ 

07:44.670 --> 07:45.480
そうそう｡ 

07:45.600 --> 07:52.320
しかし､ その後､ PNモジュールのすべての計算のグラフの勾配はいらないと指定すること｡

07:52.320 --> 07:57.660
さて､ 私たちはここに､ 揮発性の等しい真を追加します｡ 

07:57.930 --> 08:03.120
これで､ トーチテンソルがトーチ変数になったわけです｡ 

08:03.210 --> 08:10.500
しかし､ このvolatile equals trueパラメータのおかげで､ まあ､ この入力状態に関連する勾配を､

08:10.500 --> 08:16.380
モジュールのすべての計算のグラフに含めることはないでしょう｡

08:16.650 --> 08:18.390
これも技術的なトリックなんですね｡ 

08:18.390 --> 08:22.920
これにより､ メモリを節約することができ､ したがって､ これはパフォーマンスを向上させることができます｡ 

08:22.920 --> 08:27.690
そこで､ ぜひやっていただきたいのが､ これからもっと楽しいことを追加していくことです｡ 

08:27.690 --> 08:30.600
先ほどのこの温度パラメーターについてです｡ 

08:30.600 --> 08:39.960
つまり､ この温度パラメータは､ ニューラルネットワークがどのような行動を取るべきかを確信する方法を調節するためのパラメータなのです｡

08:39.960 --> 08:49.500
つまり､ この温度パラメータは正の数になり､ ゼロに近いほど､ ニューラルネットワークがアクションをするときの確信度が低くなる｡

08:49.500 --> 08:56.400
そして､ この温度パラメータが高いほど､ ニューラルネットワークが決定するアクションの確度が高くなる｡

08:56.670 --> 09:05.100
そして､ このパラメータを追加するために､ キュー値であるアウトプットにこの温度パラメータを掛け合わせることにしています｡

09:05.250 --> 09:13.230
そこで､ 例えば7から始めて､ ここに小さなコメントTイコール7を指定することにしましょう｡ 

09:13.350 --> 09:17.010
つまり､ 温度パラメータを7に設定しているわけです｡ 

09:17.010 --> 09:22.320
他にもいろいろ試してみたいのですが､ まずは小さいものから見ていただきたいのです｡

09:22.320 --> 09:25.680
私たちのクルマは､ まだ何かの昆虫のような挙動をする｡ 

09:25.680 --> 09:30.180
しかし､ その後､ この温度パラメータを増やすことで､ 我々のコードはより車のように見えるようになります｡ 

09:30.180 --> 09:33.990
それに､ セルの運転がもっと､ もっとよくなりますよ｡ 

09:34.200 --> 09:41.670
つまり､ この温度パラメータが高ければ高いほど､ Q値の当選確率が高くなるわけですから､ 理にかなっていると思います｡

09:42.000 --> 09:49.410
というのも､ 例えばQ値のソフトマックスがあったとして､ 簡単な数字を挙げてみましょう｡ 

09:49.410 --> 09:51.660
1､ 2､ 3

09:52.020 --> 10:00.930
1～3の詰め合わせ最大値が､ 例えば0になる場合｡  04､ お点前11､ 0｡  85.

10:01.020 --> 10:07.260
そして､ より高い温度をとって温度を上げることで､ 今､ 温度は1に等しくなります｡

10:07.350 --> 10:10.320
例えば2などの高い温度を取ることで､ より効果的です｡ 

10:10.350 --> 10:11.910
だからソフトMAX｡ 

10:13.020 --> 10:15.810
これをコピーして､ 掛け算してみましょう｡ 

10:15.810 --> 10:23.940
例えば､ Macの詰め物が2つでも3つでもQ値は同じですが､ この温度パラメータを3倍しています｡

10:24.060 --> 10:30.900
まあ､ 最初のQ値については､ これは非常に低い確率でしたから､ ゼロのようなものが得られるでしょう｡ 

10:30.930 --> 10:39.180
つまり､ ゼロ付近の確率で､ 2番目の確率は非常に小さいということです｡

10:39.180 --> 10:48.810
そこで､ 例えば0とします｡  02 しかし､ 3つ目の確率は最も大きく､ かなり高いものでしたから､ 温度を上げることで､

10:48.810 --> 10:54.420
この確率はさらに大きくなります｡ なぜなら､ 私たちがしなければならない行動に対応する正しいQ値であると､

10:54.420 --> 11:00.600
さらに確信が持てるようになるからです｡

11:00.600 --> 11:05.340
したがって､ これはああいうポイント98みたいなものになるわけです｡ 

11:05.760 --> 11:19.530
さて､ この温度パラメータを上げると､ 3番目のアクションがプレイすべきアクションであることがより確かなものになります｡

11:19.560 --> 11:22.470
この温度パラメーターはそういうことなんですね｡ 

11:22.470 --> 11:26.880
どのアクションを決めるべきかという確信のことです｡ 

11:27.180 --> 11:27.510
わかりました｡ 

11:27.510 --> 11:29.340
というわけで､ このコメントは削除させていただきます｡ 

11:29.340 --> 11:30.720
これは､ あくまでも説明のためです｡ 

11:30.990 --> 11:33.150
そして､ いよいよアクションです｡ 

11:33.240 --> 11:35.310
では､ どうすればいいのか？

11:35.310 --> 11:41.310
さて､ ソフトマックス法の原理は､ Q値のそれぞれについて確率分布を生成するだけでなく､

11:41.310 --> 11:46.080
このソフトマックス法の第二段階でもあります｡

11:46.170 --> 11:51.630
この分布からランダムに抽選を行い､ 最終的なアクションを得る｡ 

11:51.780 --> 12:01.050
そしてもちろん､ 分布がそうである以上､ 最も確率の高いQ値に対応するアクションを高い確率で得ることができるだろう｡

12:01.500 --> 12:02.400
そうそう､ そうなんです｡ 

12:02.400 --> 12:03.930
アクションを起こそう

12:03.930 --> 12:07.860
そこで､ actionと呼ぶ新しい変数を導入することにします｡ 

12:08.610 --> 12:17.160
そしてこのアクションは､ 先ほどこの行で作った確率分布の中からランダムに抽選されることになります｡

12:17.250 --> 12:19.980
それで､ どうやったらそんなランダムな抽選ができるのか？

12:19.980 --> 12:24.270
さて､ それぞれのQ値の小道具の確率をとってみます｡ 

12:24.270 --> 12:35.940
propsとdotを取り､ multi nominal関数を使って､ この分布propsからランダムに抽選を行います｡

12:35.940 --> 12:36.840
というわけで､ 以上です｡ 

12:36.840 --> 12:38.310
それが､ アクションにつながるのです｡ 

12:38.310 --> 12:39.210
完璧です｡ 

12:39.210 --> 12:44.580
そして今度はもちろん､ ここにちょっとした仕掛けがあることをアクションで返していくわけです｡ 

12:44.580 --> 12:51.300
さて､ この小道具は､ 多年生が偽のバッチでpytorch変数を返すという事実です｡ この偽の次元はバッチに対応し､

12:51.300 --> 13:00.390
したがって､ 我々が望む正しい結果､ すなわち､ ゼロ1または2のアクションを得るために知っています｡

13:00.630 --> 13:08.490
ここにデータを追加し､ いくつかの括弧を追加するだけで､ 私たちが探しているアクションゼロ1または2は､

13:08.490 --> 13:12.840
インデックス､ ゼロとゼロに含まれています｡

13:13.410 --> 13:13.920
わかりました｡ 

13:13.920 --> 13:14.640
そして､ そこに行く｡ 

13:14.640 --> 13:16.590
さて､ いよいよアクションです｡ 

13:16.740 --> 13:22.200
このセレクトアクション機能により､ AIはその都度､ どのアクションをプレイすべきかを知ることができるようになりました｡ 

13:22.560 --> 13:23.370
すごい｡ 

13:23.370 --> 13:27.300
では､ 次の関数､ 学習関数に進みましょう｡ 

13:27.300 --> 13:35.670
そこで､ 確率的勾配降下法を用いて､ 前方伝搬､ 後方伝搬と､ ニューラルネットワーク全体を学習させるのです｡

13:35.670 --> 13:43.170
まあ､ 基本的には人工知能の心臓部であるディープラーニングモデルの学習を丸ごと実装することになります｡

13:43.170 --> 13:44.610
だから､ 早くやりたいんです｡ 

13:44.610 --> 13:49.260
これはエキサイティングなチュートリアルになりそうなので､ また次のチュートリアルでお会いしましょう｡ 

13:49.260 --> 13:50.520
それまではお楽しみに｡ 

13:50.520 --> 13:51.000
I.
