WEBVTT

00:00.240 --> 00:03.640
こんにちは､ そして自動運転車モジュールへようこそ｡ 

00:03.660 --> 00:10.200
このチュートリアルでは､ 人工知能を実装するための環境について説明します｡

00:10.200 --> 00:16.020
環境には､ もちろん､ 自動運転や障害物回避を訓練するための車と､

00:16.020 --> 00:20.820
車が移動するための道路とブロックを描画します｡

00:20.970 --> 00:28.680
そこで､ この人工知能を構築して､ このクルマを訓練し､ 制限を超えないように道路を走行させ､

00:28.680 --> 00:33.630
道路内に設置した障害物を回避させるようにするのです｡

00:33.900 --> 00:35.730
だから､ これはかなりエキサイティングな挑戦です｡ 

00:35.730 --> 00:37.920
そして実は､ 2つのファイルが別々に存在します｡ 

00:37.920 --> 00:40.560
ご覧の通り､ AIのpythonファイルがあります｡ 

00:40.590 --> 00:46.980
それが私たちの人工知能で､ 車を訓練するためにすべてのトレーニングを行い､ どのように自動運転するか､ 運転します｡

00:46.980 --> 00:51.840
そして､ この環境をすべて作るコードであるマップ､ そのpファイルがあります｡ 

00:51.840 --> 00:56.820
これがそのコードです｡ 実際には200行のコードですが､ もう少し増やしてください｡ 

00:56.820 --> 01:03.150
ですから､ このコードは一般的にAIとは関係なく､ あくまでマップを作るための環境を作るためのコードです｡

01:03.150 --> 01:08.340
そこで､ 1つ1つのセクションを説明していきますが､ 今回は人工知能に焦点を当てたいので､

01:08.340 --> 01:13.470
このコードを1行ずつゼロから実装するわけではありません｡

01:13.470 --> 01:17.040
それでも､ 何が起こっているのかを理解するために､ 一つひとつのセクションを見ていきましょう｡ 

01:17.130 --> 01:20.430
そこでまず､ 必要なライブラリをインポートします｡ 

01:20.430 --> 01:21.870
それはどんなコードに対してもです｡ 

01:21.870 --> 01:28.680
ある作業をより効率的に行うためにいくつかのライブラリが必要なので､ 次にすべてのアーカイブパッケージをインポートします｡ 

01:28.680 --> 01:33.000
だから､ これはすべてアーカイブに特化したものなので､ あまり重要ではありません｡ 

01:33.030 --> 01:39.030
KBを使って地図を作るので､ この地図を作ることができるように､ たくさんのクラスやオブジェクトをインポートして､

01:39.030 --> 01:41.580
地図にツールを追加しているのです｡

01:42.030 --> 01:44.250
よし､ それならこの線が重要だ｡ 

01:44.250 --> 01:56.160
この行はAIに関連していて､ 基本的にここで私たちの脳､ つまり車の脳をインポートします｡ これはこのduneクラスのオブジェクトになります｡

01:56.160 --> 02:00.300
そして､ デューンクラスは我々の人工知能そのものなのです｡ 

02:00.300 --> 02:04.410
次のチュートリアルでは､ クラスでVQを実装する様子をご覧いただけます｡ 

02:04.410 --> 02:09.390
そして､ ご推察の通り､ DCNはDeep Q Networksの略です｡ 

02:09.390 --> 02:18.210
そこで､ ディープQラーニングネットワークを実装し､ 準備ができたら､ AIからこの行でここにインポートする予定です｡

02:18.210 --> 02:21.240
そして､ AIはもちろん私たちのAI pythonファイルです｡ 

02:21.810 --> 02:22.230
いいかい？

02:22.230 --> 02:24.300
だから､ 早く実装したい｡ 

02:24.300 --> 02:32.730
これはかなりの旅になりそうですが､ AIのおかげでクルマが自分で運転できるようになるので､ とてもエキサイティングなことだとおわかりいただけると思います｡

02:33.090 --> 02:33.660
わかりました｡ 

02:33.660 --> 02:38.790
そして､ 次のセクションに進む前に､ このクルマをどのように調教していくかを説明しなければなりません｡ 

02:38.820 --> 02:47.850
今､ ニューラルネットワークの説明はしませんが､ 車が自分で運転したり､ 障害物を避けたりできるように訓練するための考え方を説明します｡

02:48.150 --> 02:55.530
では､ 現実の世界で､ 本物の自動車に壁や障害物を避ける訓練をさせようと思ったら､ どうすればいいでしょうか｡

02:55.560 --> 03:00.960
本物の壁や大きな障害物に車をぶつけるようなことは､ 絶対にしない｡ 

03:00.960 --> 03:02.640
そうなるとコストがかかる｡ 

03:02.640 --> 03:12.540
それよりも､ 壁や障害物にぶつかったときではなく､ 砂の上に乗ったときに罰を与えるほうが､ より知的な発想になるのではないでしょうか｡

03:12.540 --> 03:14.040
つまり､ フィールドを持っているようなものですね｡ 

03:14.040 --> 03:19.620
このフィールドには､ 車が滞在しなければならない道路があり､ その道路はいくつかの砂で区切られています｡ 

03:19.620 --> 03:25.410
そして､ 車が砂の上に行くたびに､ 障害物の上に行くようなもので､ 車が砂の中に入ってしまえば､

03:25.440 --> 03:30.330
スピードが落ちてしまうので､ 必ずペナルティを科すことにしています｡

03:30.330 --> 03:31.590
その分､ 罰が当たります｡ 

03:31.590 --> 03:35.070
そして､ それが人工知能のひとつの本質的なポイントです｡ 

03:35.070 --> 03:39.690
砂地に入って速度が落ちるたびに､ 悪い報酬が発生する｡ 

03:40.050 --> 03:40.590
わかりました｡ 

03:40.590 --> 03:47.610
そこで､ ここでは､ 地図上に砂を描くときに､ メモリ上の最後の点の座標であるlast

03:47.610 --> 03:50.190
Xとlast Yを紹介します｡

03:50.550 --> 03:51.030
わかりました｡ 

03:51.030 --> 03:57.750
そして､ 脳と呼ばれる人工知能ができ､ その中には神経ネットワークが含まれています｡ 

03:57.750 --> 04:03.690
これは車の脳であり､ 神経回路網を含んでいるからです｡

04:04.170 --> 04:04.620
わかりました｡ 

04:04.620 --> 04:10.080
このコードでは､ ご覧のように dune クラスのオブジェクトを作成しています｡ 

04:10.080 --> 04:14.280
クラスとオブジェクトが何であるかを思い出しますが､ 脳はオブジェクトです｡ 

04:14.280 --> 04:19.470
DCNは､ クラスと5つの3と0です｡  9はクラスの入力です｡ 

04:19.470 --> 04:20.790
だから､ とてもシンプルなんです｡ 

04:20.790 --> 04:26.700
5は､ 5次元のベクトルを符号化した状態に相当する｡ 

04:26.700 --> 04:31.500
彼らが完璧に描写していること､ 環境で何が起こっているかを地図上で確認します｡ 

04:31.500 --> 04:34.980
そうすると､ 3がアクションの数になります｡ 

04:34.980 --> 04:43.710
左へ行く､ 直進する､ 右へ行く､ 0の3つのアクションが考えられます｡  9は深層学習アルゴリズムにおけるガンマパラメータである｡

04:44.070 --> 04:44.430
わかりました｡ 

04:44.430 --> 04:46.770
そして､ アクション2回転です｡ 

04:46.770 --> 04:52.920
つまり､ アクション2の回転は､ 0､ 20､ -20の3つの要素からなるベクトルです｡ 

04:53.010 --> 04:59.940
というのも､ アクションは3つの数字0.1でエンコードされているからです｡ 

05:00.060 --> 05:04.650
2であり､ このアクション2回転ベクトルのインデックスに相当する｡ 

05:04.650 --> 05:13.680
ですから､ 例えば時刻Tで選択されているアクションがゼロであれば､ まあゼロはこのアクションの回転ベクトルに対するインデックスに相当し､

05:13.680 --> 05:21.210
インデックスゼロの値はゼロですから､ 直進することになります｡

05:21.240 --> 05:32.550
そして､ 選択されたアクションが1であれば､ このアクションのインデックスが回転ベクトルに対応し､ インデックス1を持つこのベクトルの値は20となる｡

05:32.550 --> 05:38.760
つまり20は20度の回転に相当し､ コアは右に20度進むということです｡ 

05:39.030 --> 05:45.780
そして､ 選択されたアクションが2であれば､ 2はインデックスに対応し､ このアクションの2が回転ベクトルに対応します｡

05:45.780 --> 05:52.260
したがって､ コアは-20度の回転を行い､ したがって左に進みます｡

05:52.350 --> 06:00.000
それでは､ 各状態で最後の報酬を得ることになるので､ 最後の報酬変数を導入します｡

06:00.000 --> 06:04.920
だから､ カードが何かの砂に入らなければ､ その報酬はプラスになると覚えておいてください｡ 

06:04.920 --> 06:09.390
そして､ そのカードがある意味上に行くと､ まあ､ 悪い報酬を得ることになるのです｡ 

06:09.390 --> 06:14.580
そして､ 各時刻でこの変数には､ その都度得られる報酬が格納されます｡ 

06:14.580 --> 06:21.570
T そして､ このコースを初期化します｡ これは報酬を含むベクトルで､ すべてではありませんが､ 時間に対する報酬の平均スコアの曲線を作ることができるように､

06:21.570 --> 06:28.920
報酬をスライディングウィンドウに配置します｡

06:29.250 --> 06:35.940
では､ このコードセクションで､ マップを初期化します｡ 例えば､ cen変数を初期化します｡

06:35.940 --> 06:37.050
だから､ それが大事なんです｡ 

06:37.050 --> 06:42.870
この変数は実際には配列になり､ その中のセルがマップのピクセルになります｡ 

06:42.990 --> 06:52.050
そして､ それぞれのセルには､ センスがあれば1を､ センスがなければ0を入れ､ 最初は何も描かないことにします｡

06:52.050 --> 06:57.660
そのため､ センスは全くなく､ したがって送信配列のすべてのセルが0になります｡ 

06:57.660 --> 06:59.220
だから､ どこにでもゼロがあることになる｡ 

06:59.220 --> 07:09.840
そして､ 砂を描くと同時に､ センスを描いたセルには1が入り､ 配列はここにあるすべてのゼロで初期化されます｡

07:10.110 --> 07:13.290
そして､ この大切なもの､ それが「目標」です｡ 

07:13.290 --> 07:17.430
つまりゴールとは､ 地図上で車を訓練して到達させる地点のことです｡ 

07:17.430 --> 07:19.410
だから､ 目的地みたいなものなんです｡ 

07:19.650 --> 07:21.360
では､ この目標はどうなるのでしょうか？

07:21.360 --> 07:24.840
さて､ これがマップの左上になります｡ 

07:24.840 --> 07:28.320
そこで､ マップの左上に行くように車を調教します｡ 

07:28.320 --> 07:34.230
そして､ 地図の左上隅に到達したら､ 次は地図の右下隅に行くように訓練します｡

07:34.230 --> 07:36.450
そこで､ 次のようなシナリオが考えられる｡ 

07:36.450 --> 07:44.280
地図の左上には都市の空港､ 右下には都市の繁華街が描かれています｡

07:44.280 --> 07:50.040
そして､ 空港とダウンタウンを往復するために､ TaxiやUberに頼ることになるのです｡ 

07:50.040 --> 07:55.530
もちろん､ このタクシーが空港からダウンタウンまで行けるかどうか､ もっともっと難しい道路を描いたり､

07:55.530 --> 08:02.700
路上に障害物を置いたりして､ テストを難しくしていきます｡

08:02.700 --> 08:04.050
だから､ これは楽しくて仕方がない｡ 

08:04.050 --> 08:08.940
そのため､ ここでは最初のゴールの座標を設定しています｡ 

08:08.940 --> 08:12.480
それが､ 画面左上にある空港です｡ 

08:12.690 --> 08:16.140
だから､ 地図はこのように正方形のようになります｡ 

08:16.620 --> 08:21.780
そして､ 原点の座標､ つまりゼロゼロはここにあります｡ 

08:22.080 --> 08:25.110
そして､ もっと大きいのが､ この距離です｡ 

08:25.110 --> 08:32.010
そのため､ 座標が20と大きく､ -20はちょうどここ､ 地図の左上隅になります｡

08:32.570 --> 08:35.510
そして､ なぜゼロではなく､ 20を選んだのか｡ 

08:35.540 --> 08:40.180
まあ､ それは車を鍛えたいからであって､ 壁に突進したいわけではないのですが｡ 

08:40.190 --> 08:42.530
壁を避ける訓練もしたいんですよね｡ 

08:42.530 --> 08:46.530
したがって､ クルマが壁に触れてはいけないから､ ゴールはゼロであってはならないのです｡ 

08:46.550 --> 08:47.960
ゴールに触れたい｡ 

08:47.960 --> 08:49.370
だから､ ここに置くしかないんです｡ 

08:50.000 --> 08:55.160
そして､ 最後のdistance変数を導入します｡ これは､ 車からゴールまでの現在の距離を示すもので､

08:55.160 --> 08:58.190
0に初期化します｡

08:58.890 --> 08:59.400
わかりました｡ 

08:59.400 --> 09:02.160
そして､ いよいよ車とゲームを作る時が来た｡ 

09:02.160 --> 09:06.540
そこで､ 車用のクラスとゲーム用のクラスの2つを作ることにします｡ 

09:06.540 --> 09:10.800
そして､ これらの授業の内部では､ すでに目とのつながりができていることでしょう｡ 

09:10.890 --> 09:13.020
そこで､ 次のチュートリアルでそれを行うことにします｡ 

09:13.020 --> 09:14.490
そしてそれまで､ お楽しみに｡ 

09:14.490 --> 09:14.940
I.
