こんにちは､ このチュートリアルにようこそ｡
今回の特別チュートリアルは､ a3cアルゴリズムに迫るということで､ 超エキサイティングな内容になっています｡
これから実装するもの､ それは適格性トレースやソースと呼ばれるものですが､ 実は非同期の能動的批評､
エージェント､ アルゴリズムのアルゴリズムです｡ しかし､ まだエージェントは1つなのでA3
Cとは考えられません｡ それでも､ これから実装するものは実は次の論文から取ったもので､
それは深い強化学習に対する同期的手法としてこの論文であることが分かるでしょう｡
そして､ この講座の最終特典として実装する3つの重要なアルゴリズムが､ この論文に書かれています｡
でも､ 今言ったように､ 今実装するのは実はこのモデル､ 非同期とステップだから､
それに近づいているんです｡
Q学習について｡
それです｡
ということは､ ほぼそのあとの3つのキーですが､ エージェントが1人ということですね｡
そして､ これとステップQの学習で強力なのは､ 以前のような1ステップではなく､
エンドステップで累積報酬と累積目標を学習していくことです｡
そうすることで､ 学習のパフォーマンスが向上し､ AIがより強力になります｡
そこで､ 実際にこのアルゴリズムの疑似コードを作ってみました｡
それは､ このアルゴリズムです｡
では､ クリックしてみましょう｡
それが､ これから実装するアルゴリズムです｡
しかし､ エージェントが1人しかいない場合､ ここでは､ 現在の状態とプレイした行動のQ値に基づいて､ イプシロン貪欲政策に従って行動a
tを取るという違いがあることを覚えておいてください｡
しかし､ いずれの場合も､ ε-greedyのポリシーは導入していません｡
ソフトマックスを実装しましたが､ その他は同じです｡
ご覧のように､ エンドステップ､ 実際には10ステップで累積報酬を計算することになりますが､ 覚えておいてください｡
そして､ 段数は10に等しい｡
そして､ 今から実装するアルゴリズムに､ このコード行を実装することになります｡
これを手に入れ､ ほとんどがこれも実装することになります｡
現在の状態と現在のアクションのQ値の最大値を取得することがわかると思います｡
そして､ このシータがちょうどターゲットパラメータになります｡
では､ こうしましょう､ このアルゴリズムを攻略しましょう｡
こちらは非同期とステップの色分けということですが､ エージェントは1つしかないので､ 私たちとしては非同期と言う権利はありませんが､
それゆえNステップQの学習資格､ トレース､ あるいはソースと呼ぶことができます｡
よし､ じゃあやってみようか｡
かなり楽しくなりそうです｡
私たちは基本的に､ ここにある疑似コードに従えばいいのです｡
ご覧のように､ 必要なパラメータはガンマです｡ ガンマパラメータは減衰パラメータです｡
というわけで､ まずはこのガンマパラメータの変数を導入し､ 値を決めていくことにします｡
では､ こうしてみましょう｡
実はこれを実装するためのクラスは必要ないのです｡
この適格性追跡モデルのためにオブジェクトを作成する必要がないため､
単純に関数で実装できます｡
基本的にやりたいことは入力とターゲットを返すことなので､ 関数で十分です｡ 後でAIを学習させるときに､
予測とターゲットの間の距離を最小化する準備ができます｡
そして､ 予測を得るためには入力が必要です｡ なぜなら､ 出力信号を得るために､ 入力に対して脳を働かせるからです｡
それが私たちの予測になります｡
そして､ 予測とターゲットが決まったら､ 予測とターゲットの二乗距離を最小化するようにAIを学習させる準備が整います｡
だから､ これをやる意味があるんです｡
今すぐ
この関数は､ これらのターゲットでこれらの入力を返すことができるように実装されており､ 二乗距離予測マイナスターゲットを最小化するためのトレーニングの準備ができるようになっています｡
よし､ じゃあやってみようか｡
先程も言いましたが､ 機能を実装したいのです｡
まずはデフから｡
この機能､ ここでは読みやすいアンダースコアのトレースと呼ぶことにします｡
また､ ソースと呼ぶこともできます｡
呼び方やタイプカラーリングも自由ですが､ ここでは適格性トレースと呼ぶことにしましょう｡
この関数は､ バッチを引数として受け取ります｡
AIをバッチで学習させるので､ いくつかのインプットとターゲットを得ることになるからです｡
そして､ 入力とターゲットは､ いくつかのバッチの中に入ることになります｡
したがって､ この入力引数は､ いくつかの入力と､ それから計算するいくつかのターゲットを含むこのバッチである｡
そうそう､ そうなんです｡
それだけが､ 私たちに必要な主張です｡
では､ この関数の内部で､ 必要なことを定義してみましょう｡
そこで､ 論文の疑似コードで見たように､ ガンマパラメータが必要です｡
そこで､ ガンマパラメータを導入することから始めます｡ ガンマは等しいので､ すでに値を決めることができ､ 今回は4を選ぶことにします｡
99.
ガンマの値としては､ 古典的な良い値ですね｡
そして､ 心配ないのは､ これが我々のAIにとってお得なものであることを確認したことです｡
よし､ じゃあ次のステップだ｡
次は､ 入力の準備です｡
そして､ 私たちの目標は､ それこそ私たちが返したいものだからです｡
インプットとターゲットを返して､ トレーニングを準備したい｡
それで､ もう空リストで初期化すればいいんです｡
なぜなら､ バッチ内のこれらの入力では､ もちろん､ いくつかの入力をすべてリストにするつもりだからです｡
そのため､ ターゲットだけでなく､ 入力もリストとして初期化しているんだ｡
これでよしとしよう｡
そこで､ ターゲットで入力を初期化しました｡
そして最後には､ この適格性追跡機能が戻ってきます｡
その通りです｡
これらのインプットとターゲットは､ もちろん記入された｡
関数が返すものには､ いくつかの入力と､ それに関連するいくつかのターゲットがあります｡
わかりました｡
次のステップへ
次は､ forループの格納です｡
それはまさに､ 論文の疑似コード､ この一連のコードに従っているからです｡
そして､ ご覧のように､ このリピートコードの部分があり､ それを正確にフルループで繰り返すのです｡
そこで､ このコードでは､ 10回のステップの累積報酬を計算することにします｡
また､ どのように計算されているのでしょうか？
まあ､ 各ステップにおいて､ それは最後のステップではないのですが｡
この､ ステップ実行中にいる現在の状態のQ値の最大値を取得するんです｡
そして､ 10段階のうち最後のセットまで到達すれば､ まあ､ これはゼロに等しくなるわけです｡
つまり､ もう更新したくないのです｡
そして､ このforループは､ もう一つのforループになります｡
ここではリピートとは言いませんが､ それと同じです｡
これは､ アルゴリズムの2番目のforループになります｡
さて､ このように報酬を更新するには､ 減衰パラメータγを掛けて報酬を加算することになります｡
では､ こうしてみましょう｡
Pythonに戻り､ forループを開始しましょう｡
では､ 4つ､ そして反復変数には何が入るのでしょうか？
さて､ これが私たちの10ステップシリーズ､ 10の変遷のシリーズになります｡
そこで､ 10回の遷移の連続のようなものを表すこの変数を系列と呼ぶことにします｡
それで4シリーズ｡
それから､ どうでしょう？
さて､ 私たちのシリーズは､ 私たちのバッチ､ つまり､ AIを訓練するバッチに属します｡
そして､ series in batchは､ 入力バッチに含まれる10個のトランジションのすべてのシリーズを対象としています｡
さて......どうするかな｡
さて､ 累積報酬を得るためには､ 一連の遷移の最初の遷移の状態と､ 最後の遷移の状態が必要であることは､
疑似コードでおわかりでしょう｡
だから､ 今やらなければならないのは､ これらの入力状態を把握することです｡
そして､ この2つの入力状態をinputと呼ぶ変数に入れ､ この2つの入力状態､
シリーズの最初のものと最後のものを取得し､ 非生物的な配列に入れることになります｡
しかし､ 心配はご無用｡ この数字の配列に留まることはない｡
もちろん､ それを総量変数に変換します｡
しかし､ 最初のステップは､ これらを入力状態にすることで､ 最後の1つの配列に最初の1つを入れます｡
そして､ このnumpy配列のここに､ 最初の入力､ つまり系列の最初の遷移の入力状態を追加し､
それがseriesとなるわけです｡
そして､ 最初の遷移を取るために､ 系列のインデックス・ゼロを取るのです｡
それが最初の移行です｡
そして､ その属性であるstateを取ることでアクセスすることができる｡
これは､ 経験リプレイファイルの中で､ 各遷移に対して特別な構造を定義しているからです｡
その構造は､ 各遷移が､ 状態､ 行動､ 報酬で構成されています｡
しかし､ その後に行われる最後の要素｡
この特殊な構造は､ エクスペリエンス・リプレイにおけるトランジションの定義に由来しています｡
わかりました｡
これで､ 最初のトランジションの入力状態が得られたので､ 今度はシリーズの最後のトランジションの入力状態も得てみましょう｡
そして､ それを実行すること､ それは同じことです｡
これをコピーすればいいんです｡
これをベースに､ ゼロを直列の最後のインデックスで置き換えると､ 直列の最後の遷移の入力状態を得ることができる､
マイナス1直列､ マイナス1というトリックでアクセスできます｡
それでは､ この2つの要素を角括弧の中に入れてみましょう｡
それがアンパイヤ機能で期待されているからです｡
そして､ それをトーチテンソルとトーチ変数に変換するのですから､ 重要なことがあるのです｡
さて､ トーチテンソルは定義上､ 1つの単一型を含む特殊な配列であることを思い出してください｡
だから､ 無理やり一つの型を持たせる必要があるんです｡
そして､ いつものようにfloat型を選択します｡
そして､ ここにD型のequalsとP型のfloat32というパラメータを追加して､ これをトーチテンソルとトーチ変数に変換できるようにしました｡
では､ これをうまくやるために､ まず､ トーチセンサーに変換してみましょう｡
そして､ NumPyからtorchが使えることを忘れないでください｡
次に､ 2つの入力状態のすべての配列をこのトーチテンソルの中に入れ､ 関数によってそれらからトーチを得るようにします｡
完璧です｡
つまり､ この配列の入力状態をトーチセンサーに変換することになります｡
そして､ 今度はこのトーチテンソルを変数クラスを使ってトーチ変数に入れる｡
つまり､ inputは変数クラスのオブジェクトになります｡
そして実際､ あなたが理解したように､ この変数クラスはこれらすべてを引数として受け取り､ それがオブジェクトを作成するのです｡
よし､ これで大丈夫だろう｡
必要なのは2つの入力です｡
つまり､ 最初の遷移の入力状態と最後の遷移の入力状態です｡
そして今､ 私たちはインプットを得たわけですが､ さて､ 何が得られるのでしょうか？
目の脳の出力信号を得ることができる｡
それが予測です｡
しかし､ 私たちはそれを出力と呼ぶことにしています｡
それが出力信号であり､ 出力を得るためです｡
というのも､ 私たちはすでに畳み込みニューラルネットワークという脳を作り上げているからです｡
そして､ 脳スキャンを入力に適用すると､ 予測値が出力されるという単純なものです｡
そして今､ 私たちはすでに次のステップに進む準備ができています｡
そして次は､ この累積報酬の計算を開始する｡
では､ SE2のアルゴリズムと全く同じように､ ソースと呼ぶべきか､ ステップと呼ぶべきかを考えてみます｡
Q学習について｡
今回は､ 累積報酬の変数を紹介します｡
そして､ 紙面に戻ろう｡
今お見せしたように､ この累積報酬を得るためにしなければならないこと､ それは私たちのここなのです｡
さて､ 10ステップの実行の各ステップで､ この累積報酬にゼロを加えて更新する必要があります｡
シリーズの最後の日付に達したか､ Q値の最大値に達したか､ シリーズの最後の状態に達していなければ､ 最後のステップを除いたすべてのステップについて､
です｡
では､ これをシンプルに実装してみましょう｡
Pythonに戻ろう｡
つまり､ この累積報酬は､ 先ほど見たように､ 0に等しくなるわけです｡ 0.
もしや｡
最終日を迎え､ このコンディションをこのように乗りこなすことができるのです｡
インデックスから1を引いたシリーズが最後の送信であれば､ doneを追加します｡ doneは､
経験済みリプレイファイルを定義したこの遷移構造の属性だからです｡
これはオープンエアーの構造からきているもので､ オープンジムのウェブサイトを見ると､ 実はここにあるのですが､
私が用意したものです｡
つまり､ ゼロの平方根ですね｡
そして､ もし私たちがドキュメントに行き､ そしてもし私たちがそうなら､ それはチュートリアルです｡
ぜひ一度､ ご覧になってみてください｡
環境を走らせることもできますが､ たいていの場合､ 我々の観測､ つまり我々のトランジションは､
観測､ 報酬によって定義されていることがわかります｡
そして､ ここが終わった､ ここが終わったというのは､ まさに移行やステップが終わったということです｡
そして､ ここで行われたものをifの条件として使用します｡
したがって､ シリーズマイナス1ドット完了とは､ シリーズの最後の遷移が終われば､ 完了ということになる｡
そして､ この累積報酬は､ シリーズの最後の遷移が終わった場合は0になり､ そうでない場合は最後の遷移に到達していないことになるのです｡
さて､ 累積報酬は､ 先ほど言ったように､ Q値の最大値で更新されることになります｡
そして､ ここの出力が脳の出力なので､ それがニューラルネットワークの予測になるのです｡
そして､ ご存知の通り､ ニューラルネットワークの予測値は､ キューの予測値です｡
さて､ この出力にはQ値が含まれています｡
そして､ Q値の最大値を取る必要があるので､ まあ､ 構造体はインデックス1にQ値を含むので､
まずこのインデックスを追加し､ 次に､ この出力構造体のデータにアクセスするためのデータを追加する必要があります｡
トーチ変数という特殊な構造を持っているんですよね｡
これでQ値が求まり､ Q値の最大値を取りたい｡
そうすると､ 論文にあるように､ 非終端状態のQ値の最大値をTパーフェクトとして得ることができるのです｡
そして､ これから行うのは､ この10ステップのシリーズに対応する2番目のforループを作ることです｡
この方法で累積報酬を更新するつもりです｡ まず､ すでに持っている減衰パラメータのガンマを掛け､
それから報酬を加えます｡
では､ こうしてみましょう｡
実際には､ 疑似コードと全く同じことをするつもりです｡
お気づきのように､ 右から始まっているので､ 最初のステップから始まって､ 最後のステップまで行っているわけではありません｡
最後のステップから始めて､ 最初のステップまでtマイナス1してスタートする｡
それは､ 最終的に､ 累積報酬は､ Rゼロ＋ガンマr1＋ガンマの2乗､
または2＋ドット点＋ガンマの10乗に等しく､ ここで､ 1､ 2､ 10はシリーズの各終了ステップで得られる報酬です｡
では､ 2つ目のループを撮る前にちょっと休憩して､ 次のチュートリアルでお会いしましょう｡
それまではお楽しみに｡
I.