FRITによるデータ駆動型制御器チューニング
この記事ではFRITの手続きと「なぜそれで上手く行くのか?」を軽く軽く説明します。
1.はじめに
人間、10年・20年も生きていれば何度も制御器のパラメータを調整する機会があると思います。(要出典)
自分もNHKロボコンで延々とPIDのパラメータチューニングをしていた記憶があります。
人力で調整するのって嫌じゃないですか? 私は嫌です。
この記事では自動でパラメータを調整する手法について説明します。
2.FRITとは?
FRIT(Fictitious Reference Iterative Tuning)とは,
実際のシステムへの入力と出力の1組の時系列データのみを用いて,
オフラインで制御器のパラメータ調整を行う手法.
閉ループ系を安定化する制御器のパラメータを一つ見つければ,
そのパラメータでの入出力データを用いて, 目標応答に近い応答をする制御器のパラメータを計算できる.
何度も制御対象に入力を加えてデータを回収したりする事無くパラメータを調整できる所が嬉しい.
閉ループ系での応答でパラメータ計算を行うので, 単体では不安定な制御対象にも適用できる.
非線形計画になる事と初期パラメータが必要な事が難点.
類似した手法としてVRFTが知られる.
問題設定
下のFig. 1のようなシステムを考える.
制御対象は線形時不変で動特性は未知, 制御器はとして、
を調整可能なパラメータとする.
このシステムの応答を目標応答 に近づける事を目的とする.
( : 目標応答伝達関数)
FRITの具体的な手続き
初期パラメータをとする.
1. 制御器によってFig. 1のシステムを制御した時の実際の入出力データを収集する
(入出力データをそれぞれと置く. )
(※ 参照信号 から出力 までの閉ループ伝達関数はと書けるので,
対象への入力 及び出力 についても をパラメータとした関数と見なせる.)
2. 評価関数を最小化するパラメータ を求める.
ただし疑似参照信号 を と定義する.
以上の手続きがFRITのアルゴリズムである.
なぜこれで上手く行くのか(概略)
に を近づける事で, と を近づける感じのイメージ.
まず疑似参照信号 については, より, 一般のについて
が成立.
① が成立する場合
なる については, が成立するので,
となる.
同じ信号 に対して同じ出力 を出力している事から,
システムの伝達特性も の帯域で同じ特性を持つと言える.
以上から, を実装して, 元の参照信号 を印加する事で となる.
② となる が存在しない場合
これは がで表せる の集合に含まれない場合に対応する.
(例えばPID制御器を用いると, その表現力ゆえにほとんどの場合には は上記の集合に含まれない. )
を用いて, と書き換えると,
これは初期データの下での と の相対的誤差の最小化と解釈できる.
また, Parsevalの定理を用いて変換すると, 離散時間フーリエ変換はとしたZ変換に対応する事から,
とできるので,
が大きくなる周波数帯域での と の相対的誤差の最小化と解釈できる.
この事から, パラメータの計算は初期データの周波数特性 に大きく影響を受ける事が言える.
3.おわりに
対になる手法としてVRFTが知られています. (こちらは開ループ系に適用. 二次計画で解ける.)
Parsevalの定理周りがあまり詳しくないので説明が怪しいかもです.
(前提が抜けてたり, 間違いがあったりしたら教えて下さい)
(追記)
2023年のキャチロボ(ロボット競技)で実戦投入し,
円筒座標系アームの制御用モーターの位置制御PIDゲインの調整に使用しました.
直感的な話ではありますが, 与えた目標応答に応じて良いパラメータが手軽に得られ,
(PIDなので)その後の調整も容易な非常に使い勝手の良い手法だと思います.
こちらの記事の実装が参考になります.
qiita.com
参考文献
www.jstage.jst.go.jp
(↑ここの説明を要約したものがこの記事に対応しています.)
MCMCの画像のノイズ除去への応用
adventar.org
この記事はKyoto Universuty Advent Calendar 2021の23日目の記事です.
元々は逆強化学習について記事を書こうと考えていたのですが,
時間が無かったので別の内容について雑な記事を書きました. 申し訳ございません.
授業か何かでやった内容が面白かったので記事にまとめました.
背景というか定義
概要しか書けていません. 申し訳無いです...
・離散時間マルコフ連鎖
定義 : 状態空間上の確率過程がと状態列に対して,
を満たす時,
を状態空間上の離散時間マルコフ連鎖と呼ぶ.
※ マルコフ性 : 次の状態が現在の状態にのみ依存する事
・推移確率行列
定義 : 行列をマルコフ連鎖の推移確率行列と呼ぶ.
要はに遷移する確率を要素とする行列の事.
推移確率行列については以下が成立する事が知られている.
1. の各行の和はとなる. ()
2. に対して, が成立
2つめはチャップマン=コルモゴロフ方程式と呼ばれる. これはマルコフ性から証明できる.
・既約(連結クラス)
定義 : 状態部分集合が既約とは, に対して, からに到達可能という事.
雑にまとめるとどの状態間も行き来できるという事.
・再帰的
定義 : を状態への初到達時刻と置く. が成立する時,
状態は再帰的であると言う. 任意の状態が再帰的な時, マルコフ連鎖は再帰的と言う.
※ 再帰的かつ< \infty]も成立する時, 状態は正再帰的であると言う.
※ 規約なマルコフ連鎖に置いては, 「ある状態が(正)再帰的全ての状態が(正)再帰的」が成立.
(互いの状態の到達可能性から示せる.)
・周期性
定義 : 状態に対して, の最大公約数を状態の周期と呼ぶ.
※ 周期がに等しい時, 非周期的であると言う.
※ 互いに到達可能な状態は周期が同じになる.
・定常分布
定義 : を満たす確率ベクトルの事.
※ 常に存在するとは限らない.
※ 規約かつ再帰的なマルコフ連鎖は定常分布を持つ.
※ 定常分布と極限分布は異なる(定常分布に到達するとは限らない)
・極限分布
定義 : 任意の初期分布に対して, が同じ確率ベクトルに収束する時,
を極限分布と呼ぶ. 推移確率行列がエルゴート的(規約かつ非周期的で再帰的な事)な時には極限分布と定常分布が一致する. ()
・詳細釣り合い
定義 : 推移確率行列に対して, なる方程式の事.
これが成立する時, が成立するので
はを満たす. (これは定常測度である事に注意)
これは, 詳細釣り合いを満たす様にマルコフ連鎖を構成してやれば目的の分布を定常分布に持つ様にできる事を意味している. MCMCはこれを利用している.
MCMC
求めたい分布を定常分布に持つマルコフ連鎖を用いて, 分布からのサンプルを生成する手法のこと.
十分に分布が収束するまでの期間(バーンイン)のサンプルデータは破棄する.
Metropolis-Hastings法
===================================
提案分布をとし, 近似したい分布の密度関数をとする. エルゴード性を仮定.
0. : 初期値
1.
2.
3. として, を移動先の点として受け入れるか確率的に決定する. -> 1に戻る.
===================================
詳細釣り合いの成立について,
1. の時, 自明
2. の時, と書ける.
なので,
が成立する.
以上より詳細釣り合いが示された. また, この時の分布はに従う.
Gibbs sampling
===================================
], ]と置く. エルゴード性を過程
1. 適当にを選択する. (ランダムとか順番とか)
2. として定める. --> 1.に戻る
(条件付き分布である. )
===================================
※ これはMH法の特殊なケースに対応.
これに対して,より,
選択確率が1のMH法に対応している事が言える.
※ 実際の応用では1のの選択は番号順にやる事が多いらしい.
MCMCを応用した画像のノイズ除去
膨張・収縮を使った方が実用的レベルでは速いと思います.
原理
ノイズが乗る前の画像(未知)を, ノイズが乗った後の画像(既知)をと置く.
尤度関数に従って画像を生成.
同時確率はとして定義する.
ただし, は正規化項, はの近傍. はハイパーパラメータ.
画像データの配列の要素はが入るので, この様に定義すると, 周囲の点と同じ値を持つほど確率が上がり,
持たないほど下がる様に同時確率を構成できる.
結果と実装
ギブスサンプリングを用いて尤度関数を近似する.
結果は以下の通り.
↑ノイズを載せた画像(よく見るアレ)
↑ノイズ除去後の画像
実装は以下.
import numpy as np from tqdm import tqdm import matplotlib.pyplot as plt def load_image(filename): tmp = plt.imread(filename) img_gray = 0.299*tmp[:,:,2] + 0.587*tmp[:,:,1] + 0.114*tmp[:,:,0] # grayscale img = np.where(img_gray>0.5, 1, -1) fixed_img = np.zeros([img.shape[0]+2, img.shape[1]+2]) fixed_img[1:-1, 1:-1] = img return fixed_img # V:ノイズ有りの画像, H:元の画像 # 点(i,j)でのP(H|V) := 1/Z exp(v[i,j]*h[i,j] + \sum_{k,l \in N(i,j)}h[i,j]h[k,l] ) ただしN(i,j)は(i,j)の近傍 # H[i,j]をh_ijと書く事にすると, P(h_ij=1 |V,H_N(i,j))が求まる. def denoise(noised_pict, total_step, burnin_step, alpha, beta): ans = np.random.choice([1, -1], size=noised_pict.shape) x_max, y_max = ans.shape[0], ans.shape[1] for _ in tqdm(range(burnin_step+total_step)): for i in range(1, x_max-1): for j in range(1, y_max-1): tmp = beta*np.sum([ans[i-1+l][j-1+m] for l in range(3) for m in range(3)]) + alpha*noised_pict[i][j] prob_h = np.exp(tmp)/(np.exp(tmp)+np.exp(-tmp)) # H[i,j]=1となる条件付き確率 ans[i][j] = 2*(np.random.random_sample() < prob_h) -1.0 return ans if __name__ == "__main__": file_name = "./img_noised.png" tmp = load_image(file_name) plt.imshow(tmp, cmap="gray") plt.show() ans = denoise(tmp, 1000, 100, 1.0, 0.5) plt.imshow(ans, cmap="gray") plt.show()
Soft Actor-Critic(SAC)でdonkeycarのシミュを走らせてみる
東大の松尾先生の研究室主催のセミナー(RLSP2021)の復習に書いた記事です.
1回生で参加し, 知識不足ではありましたがとても勉強になりました. ありがとうございました.
記号の定義
: 状態, 行動
: 遷移確率関数
: 方策
: 報酬関数
SACとは?
概要
エントロピー項を追加した目的関数を用いる手法.
状態空間, 行動空間が連続な場合にも適用可能.
※大抵は目的関数は
※エントロピー項の定義は
Criricは関数()を近似し, Actorは(関数のsoftmax方策)を近似する.
ActorはGaussian Policyを用い, 分布の平均値と分散を出力する事で行動の分布を生成する.
学習とそれぞれの損失関数
・Critic()の損失関数
Criticはエントロピー項を考慮した関数を近似する.
具体的にはベルマン作用素を用いて更新する.
※状態価値関数はと定義される
このベルマン作用素はエントロピーの最大化を含む様に修正されているが,
を報酬関数として用いると解釈すれば,
通常のベルマン期待作用素と同じ形になり, 同等の性質が言える.
(targetの方策に基づいた関数に収束. 方策の評価をすると解釈できる.)
以上から, Criticは損失関数として
を用いて学習する. (ベルマン作用素を適用した関数に最も近くなるように最小二乗法をかけてる)
※であり,
double networkとTarget Q-networkと呼ばれる手法を用いている.
(不確かな時は楽観的にというヒューリスティックと急激な変化を抑える意図がある)
全体の流れ
SACではExperience ReplayとTarget Q-Networkを用いる事に注意.
ActorとCriticの関係は以下の様になる.
全体の流れとしては,
1. 現在の方策から行動を生成し, をバッファに収集.
2. をバッファからサンプリング.
3. Q関数を損失関数を用いて, として更新
4. 方策を損失関数を用いて, として更新
5. 何回かQ関数と方策を更新したら,
target Q-functionもとして更新
実装
この実装では, envから得られる状態にVAEで前処理をした物を3frame分集めて1つのstateにした.
また, actionも3回連続で入力した.
(VAEはRLSP2021で同じチームだったikedaさん(Ryunosuke Ikeda (@ImR0305) | Twitter)が実装してくださいました. ありがとうございます.)
↑走行時の映像
※VAEはEncoderとDecoderを持っておいて入力をEncodeした物をDecodeした物と入力の誤差が小さく成る様にEncoder, Decoderを学習させる事で入力をEncodeする事で次元削減できるという手法.
↑criticのlossのグラフ
↑actorのlossのグラフ
↑報酬のグラフ
何かおかしいです...
(何が原因か分かる方がいらっしゃれば教えてください...!)
感想など
RLSP2021はとても楽しかったし勉強になった.
A2Cの理論と実装
この記事はKyoto University Advent Calendar 2020の記事の12/21日分として書かれた物です.
adventar.org
先日のd0ra1998先輩の記事には改めて京都の四季の美しさに気付かされました.
先輩方の面白い記事が並んでいる中でこんな駄文を投下するのは気が引けますが....
A2Cってなに?
A3Cよりあとに提案された,Advantage, Actor-Criticの2つを用いる手法です.(Aが2つなのでA2C.)
experience replayを用いないので, RNN を使えるといったメリットもあります.
学習の概要は,
一つのネットワークに対して複数のAgentを準備しておいて,
(それぞれのAgentに対して)行動選択 -> 新しいState, Reward を観測 -> (規定回数まで)行動選択に戻る
-> 蓄積した行動,State,Rewardを用いて学習
を繰り返すという流れです.
Agentが共通というのがA3Cとの違いです.(とても実装が楽)
それ以外の学習自体はA3Cと全く同じ.
どういう仕組み?
Actor-Criticとは?
行動選択を行うActor関数と評価を行うCritic関数の2つを用いて学習する手法です.
今回はモデルとしてニューラルネットワークを用いて,
Actorはを近似する様に,Criticはを近似する様に学習する様にします.
一般にはは別々に準備するのですが,
今回は画像を入力に用いるので,途中までは同じ層を用いて最後に分岐させるようにします.
損失関数の構造
を
の教師信号に用います.
これはforward viewに基づいた-step rewardを使用していて,
1つの報酬がそれより前の状態にも伝わるので,報酬に時系列的なずれのあるような環境で有効です.
(-stepのTD誤差と同じです.)
をActorの教師信号に用います.
はAdvantageと呼ばれていて,
方策勾配定理より,
とした時の方策勾配が,一般の関数について,
]となる事を利用しています.
このは,を近似していて,行動のその状態での相対的良さを意味しています.
を引く事で方策勾配の分散を抑えられて学習が安定するというメリットもあります.
後ろの項は,エントロピー項と呼ばれ,
と定義されます.
この項をに加える事で,局所最適解に学習初期段階で収束する事を防ぐ事が期待できます.
はハイパーパラメータで,この項の寄与の具合を調整します.
今回は共通のニューラルネットを用いて学習するので,
上記の項をまとめて,
を全体の損失関数として使用します.
結果
直近50回のスコア平均が310を安定して超える様になりました.
嵌った所
1.Advantage LossのAdvantage項に勾配を流さない
2.Value LossのAdvantage項の項に勾配を流さない
3.Adamで学習する時には,各LayerをHe normalで初期化すると良い
4.rewardのクリッピング
5.reset後の開始時にランダムな長さだけ,stateを動かした方が学習が偏らない
6.あちこちで実装をミスっていた
参考にした物
実装が綺麗で分かりやすい記事です. (本当にありがとうございました)
horomary.hatenablog.com
損失関数等がまとまってて見やすいです.
medium.com
A3Cの論文,それなりにお気持ちfullでスッキリします.
https://arxiv.org/pdf/1602.01783.pdf
お勉強につかったので.
www.kspub.co.jp
ポエム
ハイパーパラメータや細かい実装の工夫に学習が左右されるのが厄介ですね.
ここまで読んでくださってありがとうございました.
DDPGでPendulum-v0を解く
もし間違っている所やおかしいなと思う所があれば指摘してください
DDPGとは
概要
DDPGは,Actor-Criticの構造を取り,
学習には soft-target や Experiments Replay といった手法を用いる手法で,連続値での制御を行います.
では を学習し, では,を学習します,
soft-target は fixed-target に含まれる手法であり,
今回であれば 両方のネットワークにそれぞれ target ネットワークを準備しておきます.
詳しくは後で述べますが, Actor は確率的方策ではなく決定論的方策を学習していて,
行動方策には出力値にノイズを載せた物を使います.
この特徴から, off-policy な手法であると言えます.
※Experiments Replayは,行動方策と学習方策の一致する on-policy な Agentの学習には使えません.
(以前の履歴は以前の方策に基づいているので.)
今回の実装では,ノイズには平均 0 のガウシアンノイズを用いました.
決定論的な方策勾配定理
証明は面倒くさい長いのでこの記事では説明しません.
結果だけを述べると,
方策勾配は, として近似されます.
なので, の学習は, によって行われます.
( : 学習率)
詳細は下記の論文を見てください.
損失関数
の損失関数には
を用います.
の損失関数には,
を用います.
これを について微分してやれば,先程の方策勾配が求まる事に注意してください.
実装時には,
1.ネットワークには,勾配を流さない様にする
2.方策勾配の計算時に求まった勾配で を更新しない.
に気をつけてください.
soft-target
fixed-targetでは一定間隔で fixed-target と 本体のネットワークを完全に同期していましたが,
この手法では,
によって緩やかにネットワークを同期するようにします.
(同期は,ネットワークの更新と同じ位高頻度で行います.)
これによって学習が安定化されるそうです.
実装
Pendulum-v0の問題設定
状態は,の組で与えられ,
行動は,の連続値で与えます.
また,報酬は,で計算されます.
これまでの記事で扱った問題との最大の違いは行動を連続値で扱わなくてはならない事です.
結果
学習回数は200回程度です.
ベルマン作用素の基本と性質
間違っていたら教えてください
この記事上での定義
・作用素 : 関数から関数への写像
・
・ : 状態集合
・ : 行動の集合
・ : 状態で行動を取った時に手に入る報酬を与える関数.
・ : 状態で行動を取った時に,状態に遷移する確率を与える関数.
・ : 方策の事.状態で行動を取る確率を与える関数.
ベルマン方程式再び
定義だけ書きます.
ベルマン方程式 :
ベルマン最適方程式 :
ベルマン作用素とその性質
定義性質と証明 の順番に書きます.
2つのベルマン作用素
MDPに対してのお話である事に注意してください.
性質
1.単調性
がならば,
・と,
・が成立.
証明(上の式)
数学的帰納法を用いて成立を示す.
成立を示す式を①とする.
(1)の時,は明らかに成立するので,①の成立が示された.
(2)の時の成立を仮定し,の時の成立を示す.
より, の成立が言える.
ゆえに,である事を踏まえて,
より,
,
つまりが成立する.
以上より,でも成立.
以上から,数学的帰納法より,①の成立が示された.
下の式も全く同様に証明できる.
2.ベルマン作用素はバラせる.
関数に定数を加えた関数をと定義する.
任意のに対して,
・,
・が成立.
証明(上の式)
が成立する事に留意して,数学的帰納法を用いて示す.
成立を示したい式を①と置く.
(1)の時,
より,明らかに①は成立する.
(2)の時の成立を仮定して,でも成立する事を示す.
が成立するから,これの両辺にを適用して,
が成立する.
ゆえに,でも成立する.
以上より,数学的帰納法から,①の成立が示された.
下の式も全く同様に証明できる.
3.収束性
任意の有界の状態関数に対して,
(1)
(2)非定常な方策系列のベルマン期待作用素について,
に対して,が成立.
証明:
(1)関数はの有界関数なので,
なる定数が存在する.
よって,が成立.
この両辺にを回適用して,単調性より,
,さらに変形して,
が成立.
これに対して,とすれば,はさみうちの原理より,が成立.
以上から,示された.
(2)
より,
は有界なので,なるが存在するから,
が成立.
ゆえに,が成立.
また,は式の意味から,
は有界なので,なる定数が存在.
ゆえに,が成立.
以上の2つを合わせて,
が成立するから,とすれば,
はさみうちの原理より(2)の成立が示された.
4.一意性
(1)ベルマン最適方程式の解になる関数は,
を満たし,この様になるはのみである.
(2)定常な方策についてのベルマン期待方程式の解になる関数は,
を満たし,この様になるはのみである.
証明
(1)
かつを満たすの存在を仮定する.
この時,より,が成立.
これは仮定に矛盾する.ゆえに,示された.
(2):(1)と全く同じ様に示せる.
ちなみに,が定常方策でなければならないのは,
定常では無い時,同じ状態であっても時間ステップによってが異なるからである.
まとめ
・上に書いた5つの性質から,有界な関数にベルマン最適作用素やベルマン作用素を適用する事で,
がやに収束する事が分かる.
・これらの性質が考察の基礎になる.(例えば,近似ベルマン作用素が本当に収束するかを考える時とか)
参考文献
www.kspub.co.jp
↑とてもわかり易く説明されています.
MountainCar-v0をfixed target Q-networkを用いて解く
もし間違っている所やおかしいなと思う所があれば指摘してください
fixed target Q-networkについて
定義再び
報酬関数.
状態価値関数は
行動価値関数は
と表される.
上の定義から,
と変形できるので,
状態価値関数の更新にベルマン最適作用素を用いて
と更新する様にすると,が成立する.
定義から,
と更新できる.
どういう手法か
上のQ値の更新式,に対して,
少し工夫をする.
具体的に言うと,Q値を算出するのに用いるニューラルネットワークを2種類準備する.
そのうちの一方(train network)は更新が発生する度に更新をするのに対して,もう一方(target network)は基本的には更新しない.
ただし,target networkは一定周期(今回の実装では,1つのEpisodeが終了するタイミング)でtarget networkとtrain networkを同期させる.
train networkのQ値を,target networkのQ値をと表す様にすると,
の学習の教師信号には,を用いる.
この様にする事で, Q値が不安定になることを防げ, 学習が早くなる.
その他の工夫
Experience Replay
学習に用いるデータをランダムにシャッフルすることで,時系列順のステップに生じる強い相関を緩和する手法.
確率的勾配降下法と同じお気持ち.
実装
import gym import numpy as np from gym import wrappers # gymの画像保存 import tensorflow as tf from tensorflow import keras from collections import deque from collections import namedtuple from keras.models import Sequential from keras.layers import Dense from keras.optimizers import Adam import random train_repeat_times = 2000 Exp = namedtuple("Experience", ["s", "a", "r", "n_s", "d"]) # state, act ,reward , next state, done # observe, rew, done, info = self.env.step(action) class Agent: actions = [0, 1, 2] gamma = 0.99 eps = 1.0 eps_decay = 0.05 eps_min = 0.01 iteration_times = 201 # game is 201steps. buffer_get_size = 32 # bufferの大きさが32になったらtrain. exp = deque(maxlen=20000) env = gym.make("MountainCar-v0") state = env.reset() episode_times = 0 # 現在のepisode数 def __init__(self): self.train_network = self.create_network() # 毎回更新する.(fixed target Q-network) self.target_network = self.create_network() # 1episodeごとに更新する. print(self.target_network.inputs) self.target_network.set_weights(self.train_network.get_weights()) # self.env = wrappers.Monitor(self.env, "/home/emile/Videos/", video_callable=(lambda ep: ep % 50 == 0)) def create_network(self): hide_size = 16 random.seed(0) model = Sequential() print(self.env.observation_space) model.add(Dense(hide_size, activation='relu', input_shape=self.env.observation_space.shape)) model.add(Dense(hide_size*2, activation='relu')) model.add(Dense(self.env.action_space.n, activation='linear')) model.compile(loss='mse', optimizer=Adam(lr=0.001)) model.summary() return model def eps_change(self): self.eps = max(self.eps-self.eps_decay, self.eps_min) def get_best_action(self, state): return np.argmax(self.predict2(state)[0]) def predict2(self, states): # 評価値を算出. stat = np.vstack([[states]]) return self.train_network.predict(stat) def get_policy_action(self, state): # epsilon-greedy tmp = random.uniform(0.0, 1.0) if tmp > self.eps: return self.get_best_action(state) else: # random return np.random.randint(0, self.env.action_space.n) def update2(self): if len(self.exp) < self.buffer_get_size: return experiences = random.sample(self.exp, self.buffer_get_size) #self.exp.clear() <- ここを外したら上手く動き始めた... states = np.vstack([e.s for e in experiences]) state_n = np.vstack([e.n_s for e in experiences]) est = self.train_network.predict(states) fut = self.target_network.predict(state_n) # Q_{train}(s,a)更新用 for i, e in enumerate(experiences): rew = e.r if not e.d: rew += max(fut[i]) * self.gamma est[i][e.a] = rew self.train_network.fit(states, est, epochs=1, verbose=0) def play_step(self): action = self.get_policy_action(self.state) new_state, rew, done, info = self.env.step(action) # 新しい状態を取得 if new_state[0] >= 0.4: rew += 0.5 elif new_state[0] >= 0.5: rew += 10.0 e = Exp([self.state], action, rew, [new_state], done) self.exp.append(e) self.state = new_state return done, rew def play_episode(self, flag): self.state = self.env.reset() # envを初期化 ac_score = 0.0 for tim in range(self.iteration_times): if flag: # Trueなら映像を表示. self.env.render() done, reward = self.play_step() ac_score += reward self.update2() if done: break self.target_network.set_weights(self.train_network.get_weights()) # 両方のnetworkの同期. self.episode_times += 1 if tim < 198: print("Success!.") print("eps is {},episode_times is {},length is {}times, score is {}".format(self.eps, self.episode_times, tim, ac_score)) self.eps_change() def learn2(self): for i in range(train_repeat_times): flag = False if (i % 20) == 0: flag = True self.play_episode(flag) print("end.") player = Agent() player.learn2()
結果
結果には多少差があります