こんにちは､ このPythonチュートリアルへようこそ｡
よし､ 新しい状態になった後､ メモリを更新すればいいんだな｡
そして､ 次のアップデートに対応しましょう｡
今のお話では､ 次のアップデートはどうなるのでしょうか｡
まあ､ 基本的には1回の移行で終了しています｡
遷移の最後の要素である新しい状態の日付を表示しました｡
だから､ 今､ また最初からやり直すようなものなんです｡
そして､ また最初からやり直すとき､ どんな感じかというと､ この新しい状態の環境に身を置くのです｡
そうすると､ 自然と今やるべきことは何か？
もちろん､ 新しい状態の観測をすでに得ているので､ アクションを再生することです｡
さて､ 次はアクションの再生です｡
したがって､ 今やるべきことは､ もちろん､ アクションの選択機能を使って､ アクションを再生することです｡
では､ やってみましょう｡
新しい変数アクションを作成し､ selectアクション機能でアクションを再生してみましょう｡
そこで､ selectアクションの関数が､ これから作成される別クラスのオブジェクトのメソッドであることを指定するために､ well first
selfをとっているのです｡
だから､ セルフドットセレクトアクション｡
さあ､ セルフドットセレクトアクションです｡
そして､ select action関数は状態を入力として受け取るので､ 当然ながら､
現在の入力状態がニューラルネットワークに入ったときの出力を返すことになるからだ｡
そこで､ ここに入力状態を入力する必要があります｡
そして､ その状態は､ ちょうど今いる環境で､ 入力状態が新しい状態になったところなので､
もちろん新しい状態なのですが､ 今いる時間で到達した状態は､ 新しい状態です｡
そこで､ セレクトアクション機能では､ 新しい状態を入力しています｡
わかりました｡
つまり､ このコードでは､ 新しいステートに到達した後に新しいアクションを再生するだけです｡
なるほど｡
そして今､ それを行動で再生すると､ まあ､ 報酬が得られるので､ 報酬と一緒にフィードバックが得られるわけです｡
ですから､ 100個以上の元素を記憶していれば､ まあ､ 勉強の時間でしょう｡
ですから､ 今やらなければならないことは､ 行動を選択した後に論理的にやってくること､ それはもちろんニーズを知ること､
正しい方法で物事を進めているかどうかを学び始めることなのです｡
そして今､ AIに過去100回のイベントでの行動を学習させるというアクションをしたところです｡
しかし､ この学習関数を適用する前に､ すでに100以上のイベントに到達していることを確認するために､ このif条件を作成する必要があります｡
なぜなら､ メモリのランダムなサンプルから学習しているためです｡
万個という巨大なメモリがあるじゃないですか｡
100個の要素のメモリから､ いくつかのランダムなサンプルを取っているのです｡
そして､ この100個のランダムな遷移のサンプルに含まれる情報から､ AIが学習しているのです｡
そこで､ このif条件を作って､ メモリ､ セルフドットメモリの要素数を確認した上で､
注意しましょう｡
ここにちょっとした仕掛けがあるんです｡
セルフドットメモリはリプレイメモリクラスのオブジェクトですが､ その後リプレイメモリクラスはメモリである属性を持ちます｡
だから､ 実はセルフメモリーを取る必要があるんです｡
そのメモリは､ 1つ目のメモリがリプレイメモリクラスのオブジェクトで､ 2つ目のメモリがここのセルフメモリという属性になります｡
ですから､ もしメモリ内の要素数が100より大きくなるようにしたいのであれば､ 色を付けてください｡
そして､ どうなるのでしょうか？
さて､ 学習はできるのですが､ 学習の前に､ この100個の遷移のランダムサンプルを取得する必要があります｡
そして､ これはサンプル関数で得ることができます｡
そして､ sample関数は異なるバッチを返すので､ 状態の設定時間tは20＋1である｡
アクションは時間tとその時間tの報酬です｡
さて､ ここで必要なのは､ 時間tにおける状態のバッチ､ 次の状態のバッチ､ 報酬のバッチ､
行動のバッチのような新しい変数を作ることである｡
そして､ ここで引数につけたのと同じ名前をつけて､ それをここに貼り付ければいいのです｡
そして､ これらの変数は､ まさにこれらの状態のバッチを返すので､ サンプル関数が返すものと同じになる｡
次のステート報酬とアクション｡
つまり､ 今必要なのは､ 最初にメモリ・オブジェクトを取得することです｡
そして､ このメモリオブジェクトから､ 入力として受け取るsampleメソッドを使用することになります｡
さて､ そこからAIに学習させたい遷移の数は100です｡
そのため､ メモリには100以上のトランジションを持たせるようにしました｡
つまり､ 100回の記憶の遷移から学習していくわけです｡
だから､ 学習効果が格段に上がるのです｡
そして今､ この学びを実現させようというわけです｡
さて､ learnメソッドは拡散クラスのメソッドなので､ まあ､ 将来別のクラスから生成されるオブジェクトからこのlearnメソッドにアクセスする必要があります｡
それゆえ､ 取るべきは自分自身なのです｡
そのため､ selfはそのオブジェクトをクラスに参照し､ このlearnメソッドとして､ 入力するlearnメソッドを学習します｡
もちろんここにいる連中は､ バッチ状態バッチ､ 次の日付､ バッチの報酬､ バッチのアクション｡
これがメモリからサンプリングされたバッチで､ トランジションが100個あるので､ 100個のバッチを取得することができます｡
そして､ この100の遷移から､ 100の状態､ 106の状態､ 100の報酬､ 100の行動をとります｡
では､ ここでそれを再生してみましょう｡
これからが学びの本番です｡
このようなランダムなバッチから発生するのです｡
完璧です｡
そして今必要なのは､ 新しい状態に到達してアクションを実行した後の､ 一番最後の更新です｡
さて､ アクションを再生することができましたが､ まだ自分自身であるアクション､ つまり最後のアクション変数を更新していないのです｡
だから､ これを忘れないようにしよう｡
今すぐやりましょう｡
我々は､ 最後のアクション自己ドット最後のアクションイコールと､ もちろんここで再生したばかりのアクションをselectアクション機能で更新します｡
わかりました｡
では､ 最後のアクションはそれから更新されるのですね｡
新国立も同じです｡
新しい状態に到達しましたが､ 最後の状態はもちろん20の状態の前なので､
まだ更新していません｡
しかし､ 今は時刻Tプラス1にTプラス1として新しい状態に到達しているので｡
さて､ 最後の状態はここでこの新しい状態になるため､ 同様に更新する必要があります｡
セルフドットの最後の状態は､ 私たちの新しい状態に等しい｡
これでよしとしよう｡
そして､ 今度は何を更新する必要があるのか｡
さて､ 残るはひとつだけ｡
それはもちろん､ ご褒美です｡
そして､ その報酬は､ まさに現実に得られる報酬なのです｡
これがこのアップデート関数の引数になり､ マップに接続すると､ 最後の報酬になるわけです｡
それが､ この到達した新しい状態でアクションを起こした直後に得られる報酬なのです｡
だから､ このままどこかのセントに行くと､ この最後の報酬が悪いマイナス1になってしまうのです｡
ゴールから遠ざかれば､ 少しでも良い報酬を得ることができる｡
マイナス0です｡ 2.
ゴールに近づけば､ ちょっといいご褒美のオープンワンがもらえます｡
また､ マップの一辺に近づきすぎると､ まあ､ それは悪い罰になるでしょう｡
各エッジでマイナス1ずつを得ることになる｡
だから､ それが最後の1枚になるんです｡
現実には､ 地図の上でそれがリアルに起こっているのです｡
そして､ これがアップデート関数の引数になる｡
最後のこの言葉､ まさにこれですね｡
そして､ これがupdate関数の引数なので､ この報酬に対応し､
したがって､ このinit関数で最初に初期化された最後の報酬変数が､ 私たちが得る新しい報酬になる自己である｡
現実にはそれが報酬であったり､ 同じように報酬が少なかったりするのです｡
わかりました｡
そこで､ 今度は最後のご褒美を更新しました｡
そして今､ 最後の報酬を手に入れたので､ さて､ 報酬ウィンドウを更新することができます｡
ここで､ クラスのオブジェクトの変数の一つとして初期化した報酬ウィンドウを覚えていますね｡
それは､ 過去100回の報酬の平均を取ることで､ このトレーニングがどのように進んでいるかを把握するためのウィンドウです｡
つまり､ 報酬の平均がどのように推移しているかを示すスライディングウィンドウのようなものです｡
それで､ ちょうど最後の報酬を得たところなので､ まあ､ 報酬ウィンドウを更新すればいいわけです｡
それで､ どうやってアップデートするのか｡
さて､ この最後の報酬をウィンドウに追加するだけでよいのです｡
したがって､ 私がやることは､ 報酬の窓を取ることです｡
その報酬の窓口を務める｡
これです｡
そして､ append関数を使ってみます｡
そして､ append関数の内部では､ 要素を入力する必要があります｡
リワードウィンドウにアペンドしたい｡
そしてそれはもちろん､ ご褒美でもあります｡
わかりました｡
完璧です｡
そして､ この報酬ウィンドウは固定サイズになるため､ ウィンドウが大きくなることはないんですね｡
時間と共にスライドする一定の大きさのウィンドウで､ 報酬の進化を見せることになるのです｡
そして､ この窓の大きさを決める必要があります｡
そして､ 単純にこのウィンドウで手にする報酬の手段の数です｡
それで､ 例えば､ 最後の100語の1000の手段を取得してみましょう｡
それで､ それを確認するために､ if then, Len, then we take our rewardを追加するのです｡
窓の様子｡
そして､ 報酬ウィンドウの要素数が1000より大きい場合､ この報酬ウィンドウの最初の要素を削除することを追加します｡
そして､ この報酬ウィンドウの最初の要素は､ インデックスが0です｡
わかりました｡
そして今度は､ この報酬ウィンドウが1000以上の要素を得ることがないようにするのです｡
それは､ 過去100回の報酬のうち1000回の手段です｡
それは完璧だ｡
これは､ 報酬の平均が増加しているかどうか､ したがって､ トレーニングがうまくいっているかどうかを確認するために､
一定の大きさのウィンドウとなる｡
そしてそれに応じて､ カードが私たちの思い通りになるなら
完璧です｡
そして今､ あなたの言う通り残された小さな小さな一歩を踏み出しました｡
どうなるんだろう？
さて､ このupdate関数は､ 報酬ウィンドウの遷移の異なる要素を更新するだけでなく､ この新しい状態に到達したときに再生されたアクションを返すことを覚えておいてください｡
そのため､ マップアクションイコールブレインドットアップデートの中に入っているのです｡
最後の言葉､ 最後の合図｡
そのため､ 何かを返すことになっており､ 返すことになっているものは､ もちろんアクションです｡
つまり､ ここで必要なのは､ 単純にアクションを返すことだけです｡
新しい状態に到達したときに表示されたアクション｡
そして､ それだけです｡
アップデート機能の準備が整いました｡
必要な更新をすべて行い､ 新しい状態になったときにアクションを返します｡
それは完璧だ｡
それが､ このプロセスの中で､ 最後の難しい行動だった｡
あとは子供向けでしょうか｡
報酬の平均値と報酬ウィンドウを返すスコア関数を作るだけです｡
そして､ アプリケーションを終了してまた戻るときに､ その都度､ 車の頭脳を保存しておくセーブ機能を作っておきます｡
もちろん､ 車に戻ったときに脳をロードできるようにしたいので､ アプリケーションに戻りましょう｡
さて､ 最終的にはsave関数でモデルを保存した後､ モデルをロードするload関数を作ることになります｡
というわけで､ 残すは3機能ですが､ シンプルになりそうです｡
そして､ この最初のモジュールの中で最もエキサイティングなセクションを紹介します｡
それがデモです｡
APIが動作するかどうか確認します｡
クルマが目標に到達しているかどうか､ そしてどのように改善できるかを見ていくことになる｡
そして､ やがて最初のAIを作ることになるのです｡
だから､ 早くデモを始めたいんです｡
まずはこの3つの機能を作ってみましょう｡
そしてそれまで､ お楽しみに｡
I.