こんにちは､ このPythonチュートリアルへようこそ｡
それでは､ この新しいコードセクションで､ エクスペリエンス・リプレイを実装します｡
そこで､ リプレイメモリーと呼ぶ新しいクラスを作り､ 直感の講義で見たのと同じように､
経験とリプレイを実装することにします｡
その前に､ 体験型リプレイとは何かについて､ 簡単におさらいしておこう｡
つまり､ この人工知能はすべてマルコフ決定過程をベースにしているんですね｡
そして､ マルコフ決定過程は､ 一連の事象を見ることで成り立っています｡
つまり､ イベントは､ 例えば､ ある状態S-TからTプラス1として次の状態に行くということです｡
しかし､ もしイベントがそのようなものだったら､ まあ､ 次の状態は現在の状態と非常に相関があるので､ まあ､ ネットワークはあまりうまく学習しないでしょう｡
つまり､ ディープラーニングのコースから来た人は､ 1回のタイムステップだけで時系列を学習したのと全く同じことです｡
というのも､ 私たちのモデルが長期的な相関関係を理解するために学習するには､ 1回のタイムステップでは不十分だったからです｡
ここも同じで､ だからこそエクスペリエンス・リプレイを導入しなければならないわけです｡
では､ その仕組みはどうなっているのでしょうか｡
まあ､ それはとても簡単なことです｡
現在の状態だけを考えるのではなく､ それは一度に一つの状態だけを考えるのです｡
T 過去にもっと検討するつもりなので､ まさに少ないTMSのためのような､ したがって私たちの一連のイベントはSDとSDプラス1にはならないでしょう｡
これは､ 例えば､ 過去の100州などになります｡
つまり､ T -100 として､ T -99 として､ C マイナス 1 まで､ そして s T です｡
つまり､ 100回未満の遷移を記憶と呼ばれるものに入れることで､ 短期記憶､
あるいは瞬間記憶とは対照的に､ 長期記憶を実現しているのです｡
そうすることで､ ディープラーニングのプロセス全体がよりうまく機能するようになるんです｡
そして､ 過去100件のイベントのメモリを作成したら､ サンプリング､ つまり､ これらの遷移をランダムに採取して､
次のアップデートを行うのです｡
それが､ ネクストアクションを選択することで､ 次の一手を打つことになります｡
そこで､ 今回体験リプレイ用に実装するリプレイメモリクラスでは､ 3つの関数を作ることにします｡
まず､ いつものようにinit機能｡
それはどのクラスでも同じです｡
そして､ このinit関数で､ 将来のクラスのインスタンス､ つまり､ このクラスから生成される将来のオブジェクトにアタッチされる変数を定義します｡
そして､ 非常に単純に､ これらの変数は､ 100のイベントへの100の遷移のメモリと､ あなたが容量を増やすことによって､
より長いメモリを試して歓迎される100の数字である容量になります｡
つまり､ これがファンクションの1つ目の機能です｡
そして､ もう2つの関数を作ります｡ 1つは､ メモリに100以上のトランジションが含まれることがないようにするためのプッシュ関数です｡
そして､ そのために､ 簡単なif条件を1つだけやって容量を使い､ 最終的にサンプル関数を作ることにします｡
そして､ それはもちろん､ 過去100回の変遷の記憶の中で､ いくつかの変遷をサンプリングすることでしょう｡
わかりました｡
では､ まずクラスの紹介をしましょう｡
そこで､ いつものようにクラスから始めて､ 名前をつけていきます｡
だから､ リプレイメモリーと呼んでいるんです｡
そして､ 括弧の中に､ object､ columnと入力し､ ここに入ります｡
まず､ 最初の関数であるinit関数から始めます｡
つまり､ 死から始まる前と全く同じなのです｡
そして､ その中のアンダースコアに､ またアンダースコアに､ そして変数に｡
もちろん､ 将来のクラスのインスタンス､ すなわち将来のオブジェクトに付随する変数であるselfがあります｡
そして､ 他の経験を試したり､ 他の記憶に置き換えたりできるように､ もうひとつの変数を用意します｡
それが「容量」です｡
ですから､ この容量は単純に100という数字になります｡ なぜなら､ 最後の100回のトランジションでエクスペリエンス・リプレイを作るからです｡
わかりました｡
そして､ コリンときたもんだ｡
この関数の中で､ リプレイ・メモリー・オブジェクトの変数を定義してみましょう｡
だから､ 最初の1枚はセルフドット容量になる｡
そして､ おそらくご理解いただけたと思いますが､ これは､ イベントの記憶に残したいトランジションの最大数である容量になります｡
そして､ これはリプレイメモリークラスのオブジェクトを作成するときに入力する引数と同じになるので､
それが容量となります｡
それがinit関数の引数です｡
だから容量｡
だからまた､ 混同しないように､ self capacityはオブジェクトとcapacityに付いている変数の名前です｡
リプレイメモリークラスのオブジェクトを作成する際に入力する引数を以下に示します｡
わかりました｡
そして､ 2つ目の変数があります｡
それはもちろん､ 思い出です｡
だからセルフドットメモリー｡
わかりました｡
それで､ このメモリー変数は何と等しくなるのでしょうか？
このメモリには､ 過去100件のイベントが含まれているはずです｡ したがって､ これは単純なリスト､ つまり､ 過去100件のイベント､
過去100件のトランジションを含むリストであるはずです｡
そして､ リストを初期化するために､ これ以上簡単なものはない｡
このように､ いくつかの括弧を追加するだけで､ ほら｡
メモリが初期化されました｡
だから当然､ 実験開始時､ 正確には探索開始時には､ メモリは空のリストとなる｡
そして､ 未来の状態に到達するたびに遷移を入れることになります｡
そういえば､ 次の関数はまさに「プッシュ関数」と呼んでいるものです｡
このメモリーリストにイベントを追加するプッシュ機能を作ることにする｡
そして､ このメモリーリストには常に100個のイベントが含まれ､ それ以上にはならないように､ 容量を使います｡
よし､ では次のチュートリアルでやってみよう｡
そしてそれまで､ お楽しみに｡
I.