WEBVTT

00:00.180 --> 00:02.610
こんにちは､ このPythonチュートリアルへようこそ｡ 

00:02.820 --> 00:07.710
それでは､ この新しいコードセクションで､ エクスペリエンス・リプレイを実装します｡ 

00:07.710 --> 00:13.770
そこで､ リプレイメモリーと呼ぶ新しいクラスを作り､ 直感の講義で見たのと同じように､

00:13.770 --> 00:16.590
経験とリプレイを実装することにします｡

00:16.590 --> 00:21.330
その前に､ 体験型リプレイとは何かについて､ 簡単におさらいしておこう｡ 

00:21.330 --> 00:26.550
つまり､ この人工知能はすべてマルコフ決定過程をベースにしているんですね｡ 

00:26.550 --> 00:31.710
そして､ マルコフ決定過程は､ 一連の事象を見ることで成り立っています｡ 

00:31.710 --> 00:38.610
つまり､ イベントは､ 例えば､ ある状態S-TからTプラス1として次の状態に行くということです｡ 

00:38.850 --> 00:46.740
しかし､ もしイベントがそのようなものだったら､ まあ､ 次の状態は現在の状態と非常に相関があるので､ まあ､ ネットワークはあまりうまく学習しないでしょう｡

00:46.740 --> 00:54.750
つまり､ ディープラーニングのコースから来た人は､ 1回のタイムステップだけで時系列を学習したのと全く同じことです｡

00:54.780 --> 01:02.550
というのも､ 私たちのモデルが長期的な相関関係を理解するために学習するには､ 1回のタイムステップでは不十分だったからです｡

01:02.850 --> 01:06.960
ここも同じで､ だからこそエクスペリエンス・リプレイを導入しなければならないわけです｡ 

01:06.960 --> 01:08.160
では､ その仕組みはどうなっているのでしょうか｡ 

01:08.160 --> 01:09.180
まあ､ それはとても簡単なことです｡ 

01:09.180 --> 01:13.890
現在の状態だけを考えるのではなく､ それは一度に一つの状態だけを考えるのです｡ 

01:13.890 --> 01:23.610
T 過去にもっと検討するつもりなので､ まさに少ないTMSのためのような､ したがって私たちの一連のイベントはSDとSDプラス1にはならないでしょう｡

01:23.640 --> 01:27.240
これは､ 例えば､ 過去の100州などになります｡ 

01:27.240 --> 01:33.600
つまり､ T -100 として､ T -99 として､ C マイナス 1 まで､ そして s T です｡ 

01:33.750 --> 01:40.230
つまり､ 100回未満の遷移を記憶と呼ばれるものに入れることで､ 短期記憶､

01:40.230 --> 01:46.080
あるいは瞬間記憶とは対照的に､ 長期記憶を実現しているのです｡

01:46.080 --> 01:49.740
そうすることで､ ディープラーニングのプロセス全体がよりうまく機能するようになるんです｡ 

01:50.040 --> 01:57.240
そして､ 過去100件のイベントのメモリを作成したら､ サンプリング､ つまり､ これらの遷移をランダムに採取して､

01:57.240 --> 02:02.100
次のアップデートを行うのです｡

02:02.100 --> 02:05.580
それが､ ネクストアクションを選択することで､ 次の一手を打つことになります｡ 

02:05.910 --> 02:13.260
そこで､ 今回体験リプレイ用に実装するリプレイメモリクラスでは､ 3つの関数を作ることにします｡

02:13.260 --> 02:15.630
まず､ いつものようにinit機能｡ 

02:15.630 --> 02:17.250
それはどのクラスでも同じです｡ 

02:17.250 --> 02:27.060
そして､ このinit関数で､ 将来のクラスのインスタンス､ つまり､ このクラスから生成される将来のオブジェクトにアタッチされる変数を定義します｡

02:27.270 --> 02:33.150
そして､ 非常に単純に､ これらの変数は､ 100のイベントへの100の遷移のメモリと､ あなたが容量を増やすことによって､

02:33.150 --> 02:39.510
より長いメモリを試して歓迎される100の数字である容量になります｡

02:39.510 --> 02:42.060
つまり､ これがファンクションの1つ目の機能です｡ 

02:42.210 --> 02:51.000
そして､ もう2つの関数を作ります｡ 1つは､ メモリに100以上のトランジションが含まれることがないようにするためのプッシュ関数です｡

02:51.000 --> 02:58.590
そして､ そのために､ 簡単なif条件を1つだけやって容量を使い､ 最終的にサンプル関数を作ることにします｡

02:58.590 --> 03:04.740
そして､ それはもちろん､ 過去100回の変遷の記憶の中で､ いくつかの変遷をサンプリングすることでしょう｡ 

03:05.340 --> 03:05.670
わかりました｡ 

03:05.670 --> 03:08.340
では､ まずクラスの紹介をしましょう｡ 

03:08.340 --> 03:12.510
そこで､ いつものようにクラスから始めて､ 名前をつけていきます｡ 

03:12.510 --> 03:15.690
だから､ リプレイメモリーと呼んでいるんです｡ 

03:16.980 --> 03:23.340
そして､ 括弧の中に､ object､ columnと入力し､ ここに入ります｡ 

03:23.340 --> 03:26.730
まず､ 最初の関数であるinit関数から始めます｡ 

03:26.970 --> 03:30.600
つまり､ 死から始まる前と全く同じなのです｡ 

03:30.600 --> 03:36.480
そして､ その中のアンダースコアに､ またアンダースコアに､ そして変数に｡ 

03:36.480 --> 03:43.350
もちろん､ 将来のクラスのインスタンス､ すなわち将来のオブジェクトに付随する変数であるselfがあります｡

03:43.440 --> 03:49.170
そして､ 他の経験を試したり､ 他の記憶に置き換えたりできるように､ もうひとつの変数を用意します｡

03:49.170 --> 03:52.410
それが「容量」です｡

03:52.710 --> 04:00.180
ですから､ この容量は単純に100という数字になります｡ なぜなら､ 最後の100回のトランジションでエクスペリエンス・リプレイを作るからです｡

04:00.810 --> 04:01.230
わかりました｡ 

04:01.230 --> 04:03.810
そして､ コリンときたもんだ｡ 

04:03.810 --> 04:10.170
この関数の中で､ リプレイ・メモリー・オブジェクトの変数を定義してみましょう｡ 

04:10.170 --> 04:14.670
だから､ 最初の1枚はセルフドット容量になる｡ 

04:15.970 --> 04:24.580
そして､ おそらくご理解いただけたと思いますが､ これは､ イベントの記憶に残したいトランジションの最大数である容量になります｡

04:24.580 --> 04:31.630
そして､ これはリプレイメモリークラスのオブジェクトを作成するときに入力する引数と同じになるので､

04:31.630 --> 04:34.210
それが容量となります｡

04:34.300 --> 04:36.430
それがinit関数の引数です｡ 

04:36.430 --> 04:37.660
だから容量｡ 

04:37.960 --> 04:46.180
だからまた､ 混同しないように､ self capacityはオブジェクトとcapacityに付いている変数の名前です｡

04:46.180 --> 04:52.030
リプレイメモリークラスのオブジェクトを作成する際に入力する引数を以下に示します｡ 

04:52.710 --> 04:53.550
わかりました｡ 

04:53.550 --> 04:55.770
そして､ 2つ目の変数があります｡ 

04:55.860 --> 04:57.750
それはもちろん､ 思い出です｡ 

04:57.750 --> 05:00.240
だからセルフドットメモリー｡ 

05:01.630 --> 05:02.290
わかりました｡ 

05:02.620 --> 05:05.650
それで､ このメモリー変数は何と等しくなるのでしょうか？

05:05.770 --> 05:13.240
このメモリには､ 過去100件のイベントが含まれているはずです｡ したがって､ これは単純なリスト､ つまり､ 過去100件のイベント､

05:13.240 --> 05:18.880
過去100件のトランジションを含むリストであるはずです｡

05:19.210 --> 05:22.030
そして､ リストを初期化するために､ これ以上簡単なものはない｡ 

05:22.030 --> 05:25.900
このように､ いくつかの括弧を追加するだけで､ ほら｡ 

05:25.900 --> 05:27.610
メモリが初期化されました｡ 

05:27.610 --> 05:34.330
だから当然､ 実験開始時､ 正確には探索開始時には､ メモリは空のリストとなる｡

05:34.330 --> 05:38.320
そして､ 未来の状態に到達するたびに遷移を入れることになります｡ 

05:38.320 --> 05:44.590
そういえば､ 次の関数はまさに「プッシュ関数」と呼んでいるものです｡

05:44.590 --> 05:49.570
このメモリーリストにイベントを追加するプッシュ機能を作ることにする｡ 

05:49.570 --> 05:56.980
そして､ このメモリーリストには常に100個のイベントが含まれ､ それ以上にはならないように､ 容量を使います｡

05:57.340 --> 05:59.500
よし､ では次のチュートリアルでやってみよう｡ 

05:59.500 --> 06:00.820
そしてそれまで､ お楽しみに｡ 

06:00.820 --> 06:01.330
I.
