こんにちは､ このPythonチュートリアルへようこそ｡
では､ こうしてみましょう｡
このforループを､ 右から始まって左へ行くように作ってみましょう｡
そして､ そのために4つを追加します｡
今回は､ 最後のステップから一連の遷移の最初のステップに行くので､
反復変数が私たちのステップになるわけです｡
そして､ 今度は右から左へ行くコツは､ 4つのステップイン､ リバース､ リバーサルを使うことです｡
そして､ あとはシーケンスを入力するだけです｡
そして､ この一連の流れは､ もちろん､ 私たちのシリーズになります｡
そこで､ 私たちのシリーズをインプットしました｡
しかし､ 論文にあるように､ Tマイナス1からTスタートまで行っているのです｡
だから､ 最後の最後のステップから行かないんです｡
それが終局状態ですが､ その前の状態､ つまりtマイナス1です｡
しかし､ それを始めるための2つが最初の一歩です｡
そして､ 最後の状態ではなく､ その前の状態にするためには､ 括弧で囲んで､ 列のマイナス1を追加する必要があります｡
機械やディープラーニングの講座について行った方はご存知だと思いますが､
この仕掛け､ コリン､ マイナス1というのは､ 最後の要素の前の要素までは行くが､ 最後の要素までは行かないということです｡
したがって､ 私たちが望む配列を得ることができるのです｡
最後の要素の前の要素から最初の要素に行くというのがありますが､ それを逆にして､ 右から左に行くということをやっているということです｡
わかりました｡
そこで､ フルループに入る準備が整いました｡
そして､ このforループの中で､ どこをどうするのか？
まあ､ 論文通りにやるんですけどね｡
累積報酬にガンマを掛けて更新し､ forループのステップにある現在のステップで得られた報酬を加算することになるのです｡
よし､ じゃあPythonに戻ってやってみようか｡
それで､ まず次のようにして累積報酬を更新したい｡
掛け合わせること｡
さようなら､ ジェマ｡
これでよしとしよう｡
ここではゲルマを掛けています｡
という報酬を加えたい｡
このように特殊な構造でアクセスすることができるステップ｡
報酬は､ ステップオブジェクトの属性であることを忘れないでください｡
そして､ ここではもちろんプラスアルファを加えるわけです｡
わかりました｡
つまり､ 累積報酬は､ 今いるステップの報酬､ ループに､ 更新前の累積報酬であるガンマタイムズを加えたものに等しいのです｡
完璧です｡
だから､ 今は大丈夫だと思っています｡
アルゴリズムを徹底的に追及しています｡
そして､ 次のステップへ｡
まあ､ これからはかなり楽になりますよ｡
最初のforループに戻ります｡ このforループは､ アルゴリズムに従ってこのように更新することで､
右から左へ行く累積報酬を計算するだけだからです｡
さて､ 覚えているように､ このようなことをする目的は､ 入力とターゲットを準備し､ トレーニングのために両者の二乗差を最小にすることです｡
ですから､ 今､ 私たちがしなければならないことは､ このインプットとターゲットを準備することだけです｡
では､ まずこれをやってみましょう｡
必要なのは､ シリーズの最初の状態を入力リストに追加することです｡
今までは､ この入力の状態がこの入力変数に入っているが､ それは出力を計算するためだけであった｡
そこで､ この最初のステップの入力状態を別途取得し､ それこそ入力リストに追加する必要があるからです｡
だから､ これは別にしよう｡
よって､ ステートと呼ぶことにします｡
というように､ ここと全く同じです｡
この方法は､ 最初の遷移を含む系列の最初のインデックスを取り､ その状態を加算して､
この最初の遷移の状態を得ることができる｡
それなら､ 同じものが必要なんですね｡
この最初の遷移の入力状態に関連するターゲットを別途取得することになる｡
そして､ ここで新しい変数targetを導入し､ 最初のステップのQ値に等しくなるようにします｡
そして､ Q値はニューラルネットワークが返すものなので､ 出力に含まれる｡
そして､ outputは遷移の最初の要素を含むこの入力に関連する出力なので､ まあ､ ここでoutputを取ってインデックスを0にすれば､
この最初の状態のQ値を得ることができます｡
そして､ 最初の遷移の入力状態のQ値を単純に取得するドットデータを追加します｡
そして､ それがまさに目標とするQ値なのです｡
だから､ それを受けているわけです｡
次に､ このターゲット変数を､ シリーズの最初のステップで選択されたアクションに対してのみ､
更新するつもりです｡
そして､ この系列の最初のステップにアクセスするために､ まあ､ 最初の系列のゼロを取る必要がありますこれは､
まさに系列の最初のステップです シリーズゼロ｡
そして､ このシリーズの最初のステップに対応するアクションにアクセスすることです｡
さて､ ここで補足が必要です｡
ドットアクション
繰り返しになりますが､ これはこの属性構造を使っているのです｡
アクションは､ シリーズの最初のステップの属性です｡
なぜなら､ シリーズの各遷移は､ 状態アクション､ 報酬､ 行われたのでアクションここで､
次の構造を持っているシリーズの最初の遷移です｡
ここのactionという属性は､ 単純にこの最初のデートのアクションを取得するという意味です｡
そして､ 最初のステップのその具体的な行動の目標が､ まさに累積報酬によって更新される必要があるわけです｡
つまり､ ここでは基本的に､ シリーズの最初のステップで行われたアクションに関連するターゲットは､
先ほど計算したこの累積報酬であると書くことにします｡
わかりました｡
そして､ この最初の入力状態をここに､ この最初のターゲットをここに追加することで､ ようやく入力を更新する準備が整ったのです｡
最初のステップでは､ シリーズの最初のステップを更新するだけでよいのです｡ なぜなら､ 10ステップで目を訓練するので､
入力は10ステップのうちの最初のステップになるからです｡
また､ この最初のステップで目標を得ますが､ その後の10ステップでは入力や目標を得る必要はありません｡
基本的に学習は10ステップ後に行われるからです｡
だから今は､ シリーズの最初のステップの状態とターゲットしか出ていないわけです｡
だから､ それを理解することが大切なんです｡
ですから､ それを理解した上で､ インプットリストとターゲットリストにインプットしなければならないのです｡
では､ まずこれをやってみましょう｡
入力に状態を追記しよう｡
そこで､ 入力リストを取り出し､ append関数を使って､ シリーズの最初のステップの入力状態を記憶しているstateを追加します｡
そして､ 最初のステップのターゲットをターゲットのリストに追加することになります｡
そのために､ ターゲットのリストを取り､ 同じようにappend関数を使って最初のターゲットを追加しています｡
これでよしとしよう｡
もう少しで完成です｡
そして今､ 最後のものを返す必要があるのですが､ それはもちろん､ 必要なものです｡
それは､ チュートリアルの冒頭で述べたとおりです｡
現在更新されているインプットとターゲット｡
だから､ ここにリターンを追加する｡
では､ まずインプットをします｡
でも､ それなら同じことです｡
まずnumpyの配列に変換して､ D型イコールで1つの型になるように型変換をして､
float 30を同じにするPが必要です｡
そしてこれをtorchテンソルに変換します｡ もちろんPyTorchを使っているので､ これは完全に必須です｡
それで､ NumPyのトーチを使っているんです｡
もう一度機能を
そして､ それが私たちのインプットとなるのです｡
完璧です｡
そして今度は､ ターゲットに対して同じことをやってみましょう｡
今度は､ この仕掛けを使うと早いですよ｡
ターゲットを重ねていくんです｡
なぜなら､ ターゲットを積み重ねるためにtorchのstack関数を使うからです｡
わかりました｡
そして､ このコードの行は基本的に､ この適格なトレースソースアルゴリズムによって更新された入力とターゲットを返すのです｡
さて､ これで最終的な学習を行う準備が整いました｡
だから､ AIを賢くしよう｡
次のチュートリアルでスマートになります｡
というわけで､ それまでiをお楽しみください｡