WEBVTT

00:00.270 --> 00:02.610
こんにちは､ このPythonチュートリアルへようこそ｡ 

00:02.820 --> 00:07.410
さて､ それではpush関数を作ってみましょう｡ この関数は2つの作業を行います｡ 

00:07.410 --> 00:12.570
まず､ 新しいトランジションまたは新しいイベントをメモリに追加します｡ 

00:12.660 --> 00:17.910
そして2つ目は､ メモリに常に100の遷移があるようにすることです｡ 

00:17.940 --> 00:24.970
前回のチュートリアルで100個のイベントの例を出したので100個と言っていますが､ 実際には100個よりはるかに多いイベントになります｡

00:24.990 --> 00:28.340
これはむしろ1万人､ 10万人くらいになるかもしれません｡ 

00:28.350 --> 00:29.220
見てみよう｡ 

00:29.220 --> 00:32.160
でも､ とにかくこの値が容量になります｡ 

00:32.700 --> 00:35.550
よし､ じゃあこのプッシュ機能を作ろう｡ 

00:35.550 --> 00:41.340
そこで､ いつものように､ まずdefで新しい関数を定義し､ この関数に名前をつけます｡ 

00:41.340 --> 00:46.320
そこで､ pushと呼び､ この関数は2つの引数を持つことになる｡ 

00:46.320 --> 00:50.990
まず､ いつものように､ 対象物を指す自己と次の自己｡ 

00:51.000 --> 00:52.500
それはどうなるのでしょうか？

00:52.680 --> 00:58.670
さて､ このプッシュ機能は､ メモリに新しいイベントを追加するために使用されることを覚えておいてください｡ 

00:58.680 --> 01:00.300
メモリはすでに持っています｡ 

01:00.300 --> 01:03.420
そこで､ 変数として今必要なのは､ イベントです｡ 

01:03.420 --> 01:12.150
これが引数､ 入力となり､ この入力をオブジェクトの変数であるメモリに追加します｡

01:13.060 --> 01:17.710
さて､ イベントですが､ 実際にはイベントと呼ぶか､ トランジションと呼ぶか､ どちらかです｡ 

01:17.710 --> 01:18.640
それは同じです｡ 

01:18.640 --> 01:23.770
そして､ 次のコードセクションで､ このイベントが具体的にどのようなもので､ どのような形をしているのかを見てみましょう｡ 

01:24.010 --> 01:30.930
実は､ 今だから言えますが､ このイベント､ メモリに追加するトランジションは全部で4つの要素で構成されています｡

01:30.940 --> 01:33.910
1つ目は､ ステートである最後のステートです｡ 

01:33.940 --> 01:37.210
2つ目は､ 州プラス1という新しい州です｡ 

01:37.240 --> 01:42.460
3つ目は､ 最後に表示されたアクションが80であることです｡ 

01:42.580 --> 01:46.750
そして､ 4つ目は最後の報酬､ 手に入れた最後の報酬です｡ 

01:46.750 --> 01:47.740
その通りです｡ 

01:48.010 --> 01:51.100
このイベントは､ まさにそういう形になるわけです｡ 

01:51.610 --> 01:52.300
わかりました｡ 

01:52.450 --> 01:57.430
イベントをメモリにオープンして､ メモリに容量があることを確認したいだけなので､

01:57.430 --> 02:00.760
イベントが必要なのはそれだけです｡

02:01.060 --> 02:01.480
わかりました｡ 

02:01.480 --> 02:03.610
では次に､ この関数の中に入ってみましょう｡ 

02:03.610 --> 02:07.390
そこで､ まず最初に新しいイベントをメモリに追記します｡ 

02:07.390 --> 02:10.660
そしてそれは､ append関数を使うのでとても簡単です｡ 

02:10.660 --> 02:12.070
だから､ それがダイレクトになる｡ 

02:12.070 --> 02:18.370
そして､ append関数を使うときは､ 何かを追加したいリストで始めなければならない｡ 

02:18.490 --> 02:20.770
そしてこのリストは､ もちろんメモリーです｡ 

02:20.770 --> 02:22.150
そこで､ まずはメモリから｡ 

02:22.150 --> 02:28.240
そして､ メモリはオブジェクトの変数なので､ ここではself dot memoryからスタートします｡ 

02:29.320 --> 02:30.130
これでよしとしよう｡ 

02:30.340 --> 02:35.710
つまり､ 自己メモリと､ ドットを追加して､ 最初の1つであるappend関数を追加しています｡ 

02:35.710 --> 02:44.290
そこで､ append関数の内部で､ メモリに追加したいものを入力します｡ それはもちろん､ イベントです｡

02:44.530 --> 02:45.640
だから､ ここでも｡ 

02:46.180 --> 02:53.890
そして､ 最後の状態､ 新しい状態､ 少ない区間､ 少ない報酬で構成される新しいイベントをメモリに追加することになります｡

02:54.400 --> 02:55.120
わかりました｡ 

02:55.120 --> 02:56.620
だから､ それがまず第一の完成形です｡ 

02:56.620 --> 03:03.760
そして､ 2つ目は､ メモリに常に容量要素が含まれるようにすることです｡ 

03:03.760 --> 03:07.300
そこで､ 定員が10万人になったとします｡ 

03:07.300 --> 03:12.520
100万要素になると学習が遅くなる可能性があるので､ おそらくこのくらいの容量になると思います｡

03:12.520 --> 03:14.920
では､ 10万としましょう｡ 

03:14.920 --> 03:22.600
これから､ メモリには常に10万トランジション､ 10万イベント､ そしてネバーモアが含まれるようにするのです｡

03:22.600 --> 03:28.750
だから､ 最初はもちろん1個､ 2個､ 3個と増えていきますが､ 10万個になったら､

03:28.750 --> 03:32.140
まあ必ず10万個になるわけです｡

03:32.140 --> 03:39.370
だから､ それを確認するためには､ この上限を超えたくないというF条件を作ればいいだけなんです｡

03:39.370 --> 03:47.860
そうすると､ ここで使うIDは､ 限界を超えると､ まあ､ メモリの最初の遷移､ 最初のイベントを削除することになるので､

03:47.860 --> 03:56.020
メモリの長さを取るためにLen関数を使うということです｡

03:56.020 --> 03:58.120
それが､ メモリ内の要素数です｡ 

03:58.240 --> 04:02.380
そこで､ ランド機能では､ 自己のドットメモリーを入力します｡ 

04:02.650 --> 04:03.790
それが記憶です｡ 

04:04.180 --> 04:12.430
ですから､ 自己のメモリの要素数が容量より大きい場合､ まあ､ その場合は､

04:12.430 --> 04:21.790
メモリが常に同じ容量の要素数になるように､ 最初の要素を削除することになります｡

04:21.790 --> 04:22.960
これほどシンプルなものはありません｡ 

04:22.960 --> 04:27.010
もう一つの関数､ del pythonのトリックを使うことにします｡ 

04:27.010 --> 04:39.310
そこで､ Del and thereforeは､ 最後のトランジションは追加するものであるため､ メモリ内で最も古いトランジションである最初のトランジションを削除したいと思います｡

04:39.310 --> 04:41.800
つまり､ 最初のトランジションは最も古いものなのです｡ 

04:42.130 --> 04:52.810
そこで､ ここでは､ 自己学習したメモリとブラケットを削除したいので､ メモリの最初の要素であるインデックス0を取ります｡

04:52.990 --> 04:54.670
だから､ セルフメモリゼロ｡ 

04:55.300 --> 04:55.690
今すぐ

04:55.690 --> 04:56.410
面白いですね｡ 

04:56.410 --> 05:00.710
未定義の名前容量があるという小さな警告が表示されるのですが｡ 

05:00.730 --> 05:03.760
それは､ ここでの容量が入力ではないからです｡ 

05:03.760 --> 05:07.320
それは､ オブジェクトに付けられた容量変数に違いない｡ 

05:07.330 --> 05:12.820
したがって､ ここでは自己の自己容量を追加する必要があり､ これで警告は消えました｡ 

05:13.060 --> 05:15.610
これでさらに自己の使い方が理解できたわけですね｡ 

05:15.610 --> 05:22.360
それは本当は､ 作成されるオブジェクトの容量を取るために参照することです｡ 

05:22.360 --> 05:25.120
これは､ リプレイメモリークラスのインスタンスです｡ 

05:26.060 --> 05:29.060
さて､ これでこのプッシュ機能は終了です｡ 

05:29.060 --> 05:38.590
次の関数はサンプル関数です｡ この関数は､ 最後の容量要素のメモリからランダムにサンプルを取得します｡

05:38.600 --> 05:41.840
そうすることで､ ディープラーニングのプロセスを大幅に改善することができるのです｡ 

05:42.320 --> 05:44.420
よし､ では次のチュートリアルでやってみよう｡ 

05:44.420 --> 05:45.710
そしてそれまで､ お楽しみに｡ 

05:45.710 --> 05:46.220
I.
