こんにちは､ このチュートリアルにようこそ｡
さて､ それではエントロピーを計算し､ エントロピーリストに追加しました｡
そして､ これから行うのは､ 集合maxの確率分布にしたがって､ ランダムに行動を抽選することである｡
では､ こうしてみましょう｡
それが次のステップです｡
私たちはまだここのステップで走っているので､ ループの中にいるのです｡
というわけで､ アクションの遊び方はお分かりいただけたと思います｡
まず､ actionという行動を表す変数を導入し､ 確率の分布を取り､
この確率の分布から多正規関数を使ってランダムに抽選を行うことにします｡
そして､ そのデータを追加していくのです｡
そこで重要なのは､ アクションが実際には1つの値しか持たないテンソルになることです｡
しかし､ これを単純な値として捉えてはいけない｡
これは､ アクションのこの値を含む次元のテンソルとして､ 1つずつ見る必要があります｡
そしてそれは､ 絞り込まれていないからです｡
今度は､ 同じforループで､ 先ほど再生されたアクションに関連するログ確率を取得します｡
そして､ ここで計算した以前の対数問題を用いて､ 対数確率を更新しています｡
そして､ このアクションに関連するログ確率を取得したいので､ 表示されたアクションと1を入力するgatherメソッドを使用するつもりです｡
第2引数として､ アクションを入力しますが､ これはゲッター関数が要求する変数でなければならず､
ギャザー関数はテンソル整数でインデックスを作成するだけです｡
わかりました｡
これで､ 表示されたアクションに関連するログプロップが取得できたわけです｡
そして､ 次のステップは､ ここで得たものをリストに追加することです｡
だから､ その価値を手に入れたのです｡
それが､ このモデルの出力として出てきたのです｡
それから､ 丸太の支柱も手に入れました｡
そこで､ ログプロップリストにログプロップを追加することにします｡
すでにエントロピーを付加しています｡
だから､ 私たちはいいし､ 報酬も､ 後から手に入れることができるのです｡
そこで､ これから値とログプロップスを値リストとログプロップスリストに追加します｡
こうしよう｡
私たちは､ 価値観のリストを取っています｡
append関数を使って､ モデルから返されたばかりの値を追加しているのです｡
完璧です｡
それから､ ログプロブも同じです｡
新しいログプロブを入手しましたので､ ログプロブリストに追加します｡
そして､ このappend関数では､ ここで計算されたlog propを入力しています｡
わかりました｡
そのため､ 私たちのリストは十分に更新されています｡
さて､ これから行うのはアクションの再生です｡ 実はここで､ この確率分布からランダムに抽選して､
アクションを選択しました｡
しかし､ 実はまだ再生していないのです｡ これから再生することで､ 新しい状態に到達し､ その結果､ 新しい伝送を得ることができ､
再生することができるようになるのです｡
私たちは､ 環境の中でアクションを演じるので､ 環境を取ることになります｡
そして､ ステップメソッドを使い､ 内部では選択されたアクションを指定して再生しています｡
そのために､ ステップ関数が期待するアクションを起こし､ そのnumpyを追加します｡
しかし､ これが返ってくる｡
なぜなら､ 新しい状態に到達することで､ 新しい報酬が得られ､ さらに､ ゲームが終了したかどうかを知るための新しい値であるdoneが得られるからです｡
わかりました｡
これで､ アクションを実行すると､ 新しい状態になり､ 新しい報酬が得られるわけです｡
そして､ ゲームとして完成しているかどうかもわかる｡
そして､ ゲームが終わるといえば､ まあ､ エージェントが何かの状態で立ち往生しないようにするためのものをここに追加します｡
そして､ そのためには､ 次のようにdarn変数を更新することになります｡
まあ､ 終わったに等しいか､ ゲームのエピソードがあまり長く続かないようにという条件をつけることになりますね｡
そして､ メイン関数の中で､ エピソードの長さの最大値を10,000とするパラメータがあることがわかると思います｡
そして､ 1つのエピソードが1万個以上続くようなことは避けたいと考えています｡
そこで､ ここにエピソードの長さを追加し､ Maxより大きいという条件を書き込むことにします｡
エピソードの長さ
これでよしとしよう｡
そして､ 実は最大エピソードの長さは､ 私たちのパラメータから取得しているのです｡
そのため､ ここにparams dot params dot max episode lengthを追加しています｡
つまりこれは､ ゲームが終了するか､ エピソードの長さが設定された最大長（1万に等しくなる）より大きくなれば､
まあゲームは終了して､ 新しいゲームを始めるということです｡
だから､ それはあくまで予防線なんです｡
そして､ 予防策といえば､ もうひとつの予防策を追加することです｡
マイナス1とプラス1の間で報酬を締め付けることです｡
ここではすでに報酬を得たが､ 報酬がマイナス1からプラス1の間であることを確認したい｡
そして､ そのためには､ 単純に､ 最大値をとって､ 報酬のメンをとるということをやって報酬を更新すればよいのです｡
そして､ 1つ｡
そして､ ここでは報酬の最小値と1の最大値とマイナス1をとる｡
そしてそれは､ 報酬がマイナス1からプラス1の間にあることを確認することです｡
わかりました｡
そこで､ もうひとつの注意点｡
そして､ あとはゲームが終了しているかどうかを確認したいのですが､ その場合は環境を再起動します｡
そして､ なぜ今それを確認する必要があるのでしょうか？
それは､ 新しい状態になったばかりだからです｡
新しいトランスミッションを通過したところです｡
そこで､ ゲームが終了していない間に､ この新しい送信を通過した後､ 確認する必要があります｡
ですから､ もしまた行われたら､ その場合はエピソードの長さをゼロにして環境を再起動し､
さらに状態も初期化して再初期化することになります｡
環境を整えて､ リセット機能を使うんです｡
オチ｡
今､ 私たちはこの状態から脱することができます｡
それは､ ただの確認作業でした｡
そして､ これから行うことは､ 新しい状態に達したので､
まあ､ この新しい状態は､ 今､ そして､ レイによってです｡
そして今､ 私たちがしなければならないのは､ 新しい状態をトーチテンソルに変換することです｡
そこで､ 状態を更新するために､ torchライブラリと､ もちろんfrom numpy関数を使って､
このnumpy配列､ 入力画像の状態をtorchテンソルに変換することにします｡
完璧です｡
そして､ このforループから抜け出す前にしなければならない最後のこと､ それは､ ステップのループです｡
もちろん､ 報酬を報酬リストに追加するためです｡
それが､ 最後にアップデートすることです｡
ここでは､ 報酬を除くすべてのリストを更新しました｡
だから､ 今すぐそれをやるんだ｡
報酬を受け取り､ append関数を使って直前に受け取った報酬を追加します｡
完璧です｡
そして､ ループを抜ける直前に､ それを確認するための最後のチェックを行うだけです｡
それができているのなら､ 探査を止めたい｡
つまり､ 探索が終了したら､ 探索を中止して､ 直接､ 次のステップ､
共有モデルの更新に移るということです｡
そして､ これでこのforループは終了です｡
さて､ エージェントは探索を終えたので､ 共有モデルを更新することになりますが､ 次のチュートリアルでその処理を行います｡
それまではお楽しみに｡
I.