卒業論文
Actor の適正度の履歴を用いた
Actor-Critic アルゴリズムの検証
高知大学 理学部 数理情報科学科
本田研究室
B033G007S 市原 貴英
2007 年 2 月 8 日
要旨 強化学習は機械学習の1種である。教師つき学習とは異なり、状態入力に対する正しい
行動出力を明示的に示す教師が存在しない。そのかわりに報酬という情報を手がかりに学
習する。利点としては複雑な問題に対して比較的簡単に適用できる、人間が導き出した解
より優れた解を導き出す可能性がある、機械制御にも有効、といったものがある。問題点
としては学習によって得られた解が最適とは限らないということがあげられる。 本研究の目的はActor-CriticアルゴリズムにおけるActorの適正度の履歴の有効性を再検
討することと、初期値に対する頑堅性を調べることである。さらにはロボットなどの機械
制御への応用性を議論する。 Actor-Critic 法は TD 学習の1種で、その特徴は Actor と Critic という2つの部分を持っ
ていることである。さらに TD 誤差と呼ばれる評価値を導入し、確率的政策を更新していく
という特徴がある。 アルゴリズムの検証には線形2次形式制御問題を取り扱った。その結果 Critic が無い場
合は、真の解に近づいていくが、解の求まりかたが不安定であり、一方適正度の履歴の効
果をいれていない Critic がある場合は真の解に近づくごとに解のふれ幅が小さく安定して
解が求まった。ただし、最終的に求められた解は理論値より少し離れるという結果が出た。
また適正度の履歴を導入すると最終的に求められた解はより理論値に近づき、かつその収
束も早いことが確認できた。さらに少ない分割数でも十分な精度の解が求まった。少ない
分割数でも同じ結果が出せるというのは Actor-Critic の有効性を示しているといえ、このこ
とは機械制御の問題に対して有効であると考えられる。また、初期値に対する頑堅性では、
適正度の履歴を入れたほうが頑堅性が弱いことが観測できた。
2
1.はじめに・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・4 2.エージェントの学習方法
2.1 強化学習・・・・・・・・・・・・・・・・・・・・・・・・・・・・・5 2.1.1 強化学習の枠組み・・・・・・・・・・・・・・・・・・・・・6 2.1.2 目標と報酬・・・・・・・・・・・・・・・・・・・・・・・・7 2.1.3 収益・・・・・・・・・・・・・・・・・・・・・・・・・・・7 2.1.4 方策・・・・・・・・・・・・・・・・・・・・・・・・・・・7
2.2 TD 学習法 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・8 2.3 適正度の履歴・・・・・・・・・・・・・・・・・・・・・・・・・・・9 2.4 Actor-Critic 手法による学習・・・・・・・・・・・・・・・・・・・・10 2.5 適正度の履歴を用いた Actor-Critic 手法の改良・・・・・・・・・・・・12 2.6 ロボット制御への応用事例 ・・・・・・・・・・・・・・・・・・・・13
3.実験 3.1 問題設定 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・14 3.2 アルゴリズム ・・・・・・・・・・・・・・・・・・・・・・・・・・16 3.3 実験条件(Critic の有無、適正度の履歴の効果、分割の効果)・・・・・16 3.4 Java による動作検証シミュレータ・・・・・・・・・・・・・・・・・17 3.5 実験結果 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・18 3.6 議論(ロボット制御への応用におけるメリット、デメリット)・・・・・21
4.まとめ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・22 謝辞 参考文献 付録: プログラムリスト 1.Actor-Critic 法による線形2次形式制御問題のプログラム・・・・・・・・・25 2.繰り返し実験用の c-shell スクリプト・・・・・・・・・・・・・・・・・・31 3.Java による線形2次形式制御問題の学習結果可視化プログラム・・・・・・32
3
1.はじめに 強化学習の分野はさまざまな方向へ発展し続けながら今日まで発展し続けている。現在
では機械学習、人工知能、ニューラルネットワークの領域でもっとも活発な研究分野とし
て地位を得るようになってきた。いまでは TD 学習や動的計画法など核となる考え方がある。 TD 学習の考え方の中に Actor-Critic 法というものがある。木村、小林[3]は Actor の方
策の修正率である適正度に履歴を導入することによって、解の収束速度、制度の改善を行
う手法を提案している。Actor-Critic 法によってより優れた解が得られると考えられるので、
本研究では TD 学習の1種の Actor-Critic 法について、Actor の適正度の履歴を用いた
Actor-Critic アルゴリズムの検証を行った。 第2章では、エージェントの学習方法について述べる。第3章では、本研究で扱う学習
問題の問題設定とアルゴリズムの説明をし、各実験の結果と考察をする。最後に第4章で
研究のまとめについて述べる。
4
2.エージェントの学習方法 2.1強化学習 強化学習は、相互作用から学習して目標を達成する問題の枠組みそのものである。学習
と意思決定を行うものはエージェントとよばれる。このエージェント外部からすべて構成
され、エージェントが相互作用を行う対象は「環境」と呼ばれる。両者は継続的に相互作
用を行い、エージェントは行動を選択し、環境はその行動に応答しエージェントに新しい
状況を提示する。環境は情報の発生源であり、この報酬はエージェントが時間の経過の中
で最大化しようとする特別な数値である。 各時間ステップにおいて状態から可能な行動を選択する確立の写像がエージェントに実
装されている。この写像はエージェントの方策と呼ばれ、 tπ で表す。
5
2.1.1 強化学習の枠組み 強化学習とは環境との相互作用を通して、適切な行動戦略を獲得する機械学習の手法で
ある。 強化学習の枠組みは図2.1のようになる。強化学習にはエージェントと呼ばれる学習
主体と環境と呼ばれる制御対象がある。エージェントは方策π を持っており、この方策に
よって行動を決定する。エージェントは環境から状態 を観測し、方策ts π にしたがって行
動 をとる。そして環境から報酬ta tr を受け取りその良し悪しにしたがって方策π を更新し
ていく。以上を1ステップとして繰り返す。 強化学習の利点としては複雑な問題に対して比較的簡単に適用できる、人間が導き出し
た解より優れた解を導き出す可能性がある、機械制御にも有効、といった点がある。 問題点としては学習によって得られた解が最適とは限らないということがあげられる。 代表的なアルゴリズムとしては、動的計画法、モンテカルロ法、TD 学習などがある。今
回私が使用したのは TD 学習の1種の Actor-Critic 法である。
図2.1 強化学習の枠組み
行動 ta
環境・・・制御対象
状態 ts
エージェント・・・学習主体
方策 ( ),asπ
報酬 tr
6
2.1.2 目標と報酬 強化学習においてエージェントの目標は、環境から得られる報酬の総和(収益)を最大化
することである。これは直接的な報酬を最大化する事ではなく、最終的な累計報酬を最大
化することを意味している。強化学習の実環境では、時間の経過とともに環境が変化する
ため割引報酬による評価を収益として用いる。割引率はγ ( 10 <≤ γ )と表す。
2.1.3 収益 実際にはどのように収益を最大化するのかを示す。
時間ステップ の後に受け取った報酬の系列をt Tttt rrrr +⋅⋅⋅++++ 321 ,,tR
とする。一般的に期
待収益を最大化しようとするので、このときの収益 は報酬の合計を意味しており、 TrrrrR tttt + + + + (2.1)
となる。ここでT は最大ステップ数である。 式(2.1)の収益報酬は連続タスクにおいては問題が起こる。というのは、最終時間
ステップが ∞=T で、収益が無限の値をとなりうるからである。ここでこの問題を解決す
るために、割引の概念を用いる。この方法ではエージェントは将来にわたり受け取る減衰
収益の合計が最大化されるような行動を選択しようとする。特に期待される割引収益
= ++ ・・・21
∑∞
=+++ =+++=
02
21
kkt
ktttt rrrrR γγγ ・・・ (2.2)
を最大化するように を選択する。ここで、ta γ は割引率と呼ばれるパラメータで 10 << γ で
ある。割引率は将来の報酬が現在においてどれだけの価値があるかを決定する。 2.1.4 方策 得られた報酬によって方策を改善することでエージェントは学習していく。 方策に対して価値関数を計算することで、さらに良い方策を見出す手がかりが得られる。
7
2.2 TD 学習法 TD 法は経験を用いて予測問題を解決し、方策π にしたがって経験をいくつか得ることで
の推定値V を更新する。つまり時刻 で訪問した非終端状態を として、その後によっ
て起きる出来事により の推定値を更新する。
πV t tstsV )(
もっとも単純な TD 法は TD(0)と呼ばれ、以下のようになる。 )]()([)()( 11 ttttt sVsVrsVsV −++← ++ γα (2.3) なお TD 法では )( 11 ++ + tt sVr γ を目標値として近づけるような学習を行う。アルゴリズムは
図2.1のようになる。 (1) を任意に初期化、)(sV π を評価対象の方策に初期化 (2)各エピソードに対し繰り返し: (a).状態 を初期化 s (b).エピソードの各ステップに対し繰り返し: (ⅰ) 状態 に対して与えられる行動 ←a s 行動 a をとり、報酬 r と次の状態 s′を観測
)]()([)()( 11 ttttt sVsVrsVsV −++← ++ γα ss ′← ( を新しいs s′として更新)
(ⅱ) が終端状態なら繰り返し終了 s
図2.2 TD(0)学習のアルゴリズム
8
2.3 適正度の履歴 適正度の履歴は強化学習の基本的なメカニズムの1つである。 適正度は、
(2.4) のようになり、 と表される。 )(twi
ここでは勾配降下法に従ってπ を増加させる。なお簡単のためにπ の変わりに πln を使
う。π に正規分布を使用することを想定すると、π でも πln でも大小関係はかわらず、扱
いやすい。(2.4)式は ),( as ,Wπ を で微分し傾きをもとめ、その傾き分パラメータ
を修正してやることによって最大点を探索する。 iw w
時刻 における状態 s の適正度の履歴 を e と表す。各ステップにおいて、この適正
度の履歴は状態に対して
t )(twi )(tγ だけ減衰する。ここでγ は 10 << γ である。適正度の履歴は、
)1()()( −+= tDtetD iii β (2.5) の式で表される。 適正度の履歴を用いた Actor-Critic の場合は、過去の記憶を持つ履歴つき適正度 を使
っている。
iDβ は適正度の履歴と呼ばれ、β が大きいほど強い過去の記憶を持つことになる。
このことによって現時点の行動だけでなく近い過去にとった行動にも学習を反映させるこ
とができる。
図2.3 πln による最大点の探索
tww
twΔα twΔ−α
),,( Wasπ
error-TD
正 負
最大点
))(,,(ln)(
)( tWsatw
tw tt
i
i π∂∂
=
9
2.4 Actor-Critic 手法による学習 図2.4に基づいて、一般的な Actor-Critic アルゴリズムの枠組みを説明する。 エージェントは確率的政策πにしたがって行動決定をする Actor と、行動 の良し悪し
を判断し確率的政策
taπ を更新する Critic の2つに分かれる。
π は行動 に対してその選択確立を確立密度分布関数で表したものである(図2.5)。
ここでの は方策関数を決めるパラメータである。 ta
wまず Actor が環境から状態 を観測し、確率的政策ts π にしたがって行動 をとる。そし
て Critic は報酬
tatr と新しい状態 を観測する。そしてその行動の良し悪しを評価する。そ
の行動が好ましい行動ならばその確率的政策を増加し、好ましくない行動ならば減少させ
るように更新していく。これを1ステップとして繰り返す。
ts
図2.4 一般的な Actor-Critic アルゴリズムの枠組み
図2.5 行動 の選択確率 ta
ta a
),,( Wasπ
エージェント
Actor
確率的政策π
V(s) Critic
)(1)(st tt sVVr −++γ error-TD
状態 報酬 tr 行動 tats
環境
10
一般的な Actor-Critic アルゴリズムは図2.4のようになる。 更新は現在の に学習率w α で減衰した wΔ を足し合わせたものを新しい とする。 w
(2.6) )()()1( tWtWtW ←+ + Δαするとこのように表せる。 ここで TDerror と呼ばれる評価値を導入する。TDerror とは、
)(1)(serror-TD t tt sVVr= +γ + − (2.7) このように定義され、新しい価値関数から現在の価値関数を引いたものである。すなわち
TDerror が正ならその行動の選択確率を増加し、TDerror が負ならその行動の選択確立を
減少させるようにπを変化させればよいことになる。 更新量に TDerror をかけてやることで、正の場合π を増大させ、負の場合π を減少させ
ることができるようになる。よって更新式はこのようになる。 )t (2.8) ()()( DerrorTDtw ii −=Δ
(1) を任意に初期化、)(sV π を評価対象の方策に初期化 (2)各エピソードに対し繰り返し: (a).状態 を初期化 s (b).エピソードの各ステップに対し繰り返し: (ⅰ) s に対してπ で与えられる行動 をとり報酬a r と次状態 を観測 s′ )1()( +← tete ii
すべての について s
ss ′← ( を新しいs s′として更新) (ⅱ) が終端状態なら繰り返しえ終了 s
)()()( teerrorTDtw iiΔ = −
W )()()1( tWtWt + ← + Δα
図2.6 適正度の履歴を用いたアルゴリズム
11
2.5 適正度の履歴を用いた Actor-Critic 手法の改良 図2.7は適正度の履歴を用いた Actor-Critic のアルゴリズムである。 適正度の履歴を用いた Actor-Critic の場合は、
(2.9) )1()()( −+= tDtetD iii βのような式で過去の記憶を持つ履歴つき適正度 を使っている。iD β は適正度の履歴と呼
ばれ、 β が大きいほど強い過去の記憶を持つことになる。このことによって現時点の行動
だけでなく近い過去にとった行動にも学習を反映させることができる。 (1) を任意に初期化、)(sV π を評価対象の方策に初期化 (2)各エピソードに対し繰り返し: (a).状態 を初期化 s (b).エピソードの各ステップに対し繰り返し: (ⅰ) s に対してπ で与えられる行動 をとり報酬a r と次状態 を観測 s′ )1()( +← tete ii
すべての について s
ss ′← ( を新しいs s′として更新) (ⅱ) が終端状態なら繰り返しえ終了 s
)()()( teerrorTDtw ii −=Δ
)1()()( += tDtetD iii β −
)()()1( tWtWtW Δ+←+ α
図2.7 Actor に適正度の履歴を用いた Actor-Critic アルゴリズム
12
2.6 ロボット制御への応用事例 Actor-Critic のロボット制御への応用事例としては、倒立振子制御や倒立振子および梁上
を転がるボールの制御、倒立振子の振り上げ制御などがある。
13
3.実験 3.1 問題設定
アルゴリズムの検証には線形2次形式制御問題を取り扱う。問題設定のイメージとして
は1次元の軸上をロボットが移動し、このとき noise によってロボットの位置がふらつくも
のとする(図3.1)。目的はロボットが原点からなるべく離れないように行動させること
である。 状態の更新式は
noiseaxx ttt ++=+ 1 (3.1) のように与えられる。 tx はロボットの位置で、 tx の範囲は-4< x <4 とする。 は移動量、
は時刻を表している。なお noise は平均 0、標準偏差 0.5 の正規分布をもつとする。強化
学習においてはロボットがエージェントで、
tat
tx が状態、 が行動とすればよい。ロボット
が原点から離れないようにするためには、報酬は ta
22ttt axr −−= (3.2)
のように設定できる。 また Critic のために状態空間 だけは離散化してやる必要がある。ここで連続状態で
与えられている
)(sVtx を離散化した状態 に割り当てる。たとえば分割数を3として離散化し
た場合、図3.1のように分割される。この分割数で解の精度が変わると予測できるので
この実験では分割数を変えて変化を見る。
ts
noise
ta
tx
図3.1 分割数3の場合 この問題においては最適解が理論的に得られていて、
(3.3) このように表せる。
-4 4
原点
1s 2s 3s
tt xka 1=
14
アクションは状態の定数倍で与えればよい。定数パラメータ をゲインと呼びその値は割
引率
1kγ を与えるとこのようになる。
(3.4) この最適解を参考にして方策関数はこのように決める。
(3.5)
142121
21
++++−=
γγk
),(),,( NWasπ = σμすなわち ),,( Wasπ は平均 μ 、標準偏差σ の正規分布とする。そうすることによって、
μ=a のアクションがもっともとられやすくなり、かつσ によって選ばれやすさを調節で
きるようになる。ここでμ は最適解と同じ形式にする。 w 1 xμ = (3.6) t
またσ はこのようにおくものとする。
)exp(11
2w−+=σ
(3.7) これによって と を学習していけばよいことになる。よって以後の実験ではゲイン
パラメータ と のみを比較していく。
1w1w
2w1k
15
3.2 アルゴリズム 検証には2.5の適正度の履歴を用いた Actor-Critic 手法の改良で説明したアルゴリズム
を使用した。なおこのアルゴリズムで 0=β とすれば、適正度に履歴がない時と同じアルゴ
リズムになる。
3.3 実験条件(Critic の有無、適正度の履歴の効果、分割の効果)
表3.1 実験条件 最大ステップ数 5000
割引率γ 0.9 Critic あり なし
適正度の履歴の割引率 β 0.0 0.9 初期値 -0.35±0.15 -0.3±0.15
実験条件としては学習の最大ステップ数 5000 とし、割引率γ は一定で 0.9 とした。Critic
の有無の効果と、適正度の履歴を見るために履歴無しの場合β =0.0 と強い履歴がある場合
β =0.9 を実験した。このとき、ゲインパラメータ 5884.01 −=k である。適正度の履歴に対
する頑堅性の検証に対しては、-0.35±0.15 の範囲でランダムな初期値を与えた場合と理論
値より少し遠い-0.3±0.15 でランダムな初期値を与えた場合を実験した。すべてのケースに
ついて 20 試行のゲインパラーメータ の平均値、標準偏差から解の精度を議論した。 1w
16
3.4 Java による動作検証シミュレータ 実際に Java による動作検証シミュレータを行ってみた。
ゲインパラメータ 0、すなわちエージェントが noise に対して全く行動をとらない場合は
大きな幅でふらついた。 ゲインパラメータ-0.15 の場合エージェントの振る舞いは、中央に戻ろうとする動きは見
えるが、それらの幅は大きいという実験結果になった。 最も良い学習をした場合ゲインパラメータ-0.58 の場合、エージェントは中央付近に留ま
り、ふれ幅も小さく、学習に成功しているのがみられた。 実装した画面の例は以下の図3.2の通りである。プログラムリスト3に学習したゲイ
ンパラメータを入力。青い線は移動領域、赤い箱がエージェントである。GO/STOP を押す
と動きはじめる。
図3.2 実装した画像例
17
3.5 実験結果 図3.2の縦軸はゲインパラメータ 、横軸はステップ数、赤い線は理論値を表してい
る。青い線は学習によって得られたゲインパラメータの数値を表している。エラーバーは
20 試行の平均値を表している。
1w
Critic が無い場合は、(図3.3 左)のように真の解に近づいていくがエラーバーの大
きさからわかるように解の求まりかたが不安定である。 一方 Critic がある場合で(図3.3 右、適正度の履歴の効果はまだいれていない)で
はグラフからわかるように真の解に近づいていくことは同じだが、解のふれはばが小さく
安定して解が求まっている。ただし、最終的にもとまった解は理論値より少し離れている
のがわかる。
Criticあり Criticなし
図3.3 Critic の効果。初期値-0.35±0.15、 9.0=γ 。
β=0.0
-0.7
-0.6
-0.5
-0.4
-0.3
-0.2
-0.1
0.0
0 1000 2000 3000 4000 5000
ステップ数
w1
β=0.0
-0.7
-0.6
-0.5
-0.4
-0.3
-0.2
-0.1
0.0
0 1000 2000 3000 4000 5000
ステップ数
w1
18
図3.4のグラフは適正度の履歴の効果を見たものである。ただし、価値関数の分割数
は3及び10であるであ。 分割数3の場合、(図3.4(a)(b))履歴を導入すると最終的にもとまる解が理論値に
近づき、かつその収束も早いことがわかった。標準偏差を見ると、若干解のばらつきが多
いことが見てとれる。 一方右側は、分割数10のときの結果(図3.4(c)(d))では基本的なふるまいは、
結果は3のときと同じようなものになった。たかだか分割数3でも10の時と同じ結果が
出せるというのは Actor-Critic の有効性を示しているといえる。この性質はあとで述べるよ
うに機械制御にも有効であると考えられる。なお論文[3]ではこの場合(分割3、適正度無
し)はほとんど解が理論値に収束しなかったが、私の実験では収束した。これは初期値と
して与えた乱数の性質によるのかもしれない。
図3.4 適正度の履歴の効果。初期値-0.35±0.15、 9.0=γ 。
β=0.0 分割数3
-0.7
-0.6
-0.5
-0.4
-0.3
-0.2
-0.1
0.0
0 1000 2000 3000 4000 5000
ステップ数
w1
β=0.0 分割数10
-0.7
-0.6
-0.5
-0.4
-0.3
-0.2
-0.1
0.0
0 1000 2000 3000 4000 5000ステップ数
w1
履歴なし 履歴なし
最適値
β=0,9 分割数3
-0.7-0.6-0.5-0.4-0.3-0.2-0.10.0
0 1000 2000 3000 4000 5000ステップ数
w1
β=0.9 分割数10
-0.7
-0.6
-0.5
-0.4
-0.3
-0.2
-0.1
0.0
0 1000 2000 3000 4000 5000ステップ数
w1
履歴あり履歴あり
(a) (c)
(b) (d)
19
図3.5は初期値を最適値から遠ざけて-0.3±0.15 で実験してみた実験結果である。 結果は似たようなものになったが、履歴がある場合には 20 試行に1回程度発散してしま
った。よって初期値に対して、頑堅性という点では履歴を入れたほうが弱くなるようであ
った。この点に関しては今後検討が必要かも知れない。
図3.5 初期値に対する頑堅性。初期値-0.3±0.15、 9.0=γ 。
β=0.0 分割数3
-0.7
-0.6
-0.5
-0.4
-0.3
-0.2
-0.1
0.0
0 1000 2000 3000 4000 5000スッテプ数
w1
β=0.0 分割数10
-0.7-0.6-0.5-0.4-0.3-0.2-0.10.0
0 1000 2000 3000 4000 5000ステップ数
w1
履歴なし 履歴なし
β=0.9 分割数3 発散数 1/20
-0.7
-0.6
-0.5
-0.4
-0.3
-0.2
-0.1
0.0
0 1000 2000 3000 4000 5000ステップ数
w1
β=0.9 分割数3 発散数 1/20
-0.7
-0.6
-0.5
-0.4
-0.3
-0.2
-0.1
0.0
0 1000 2000 3000 4000 5000ステップ数
w1
履歴あり 履歴あり
20
3.6 議論(ロボット制御への応用におけるメリット、デメリット) 倒立振子制御や倒立振子の振り上げ制御のような機械制御の問題では入力、出力ともに
きめ細かい値を扱いたいことが多い。本手法では Critic にだけ粗い状態空間の離散をして
やれば十分な精度の解が求まった。このことから機械制御の問題に対して有効であると考
えられる。 本研究では、初期値に対する頑堅性という点では、よい結果が現れなかった。したがっ
てこの点に関しては機械制御への応用性としてよいとは言い切れない。
21
4.まとめ 線形2次形式制御問題に Actor-Critic 問題を適用し以下のように確認した。 Critic がある場合とない場合では、Critic があるほうが解のふれはばが小さく安定して解
が求まった。ただし、最終的にもとまった解は理論値より少し離れている。このことから
Critic は安定した解を求めるのに大きな効果があったということがいえる。実際には解のば
らつきが標準偏差で約4分の1に減少した。このことより Critic の有効性を確認できた。 Actor の適正度の履歴を導入すると最終的にもとまる解が理論値に近づき、解の収束を早
め、その制度をたかめる効果があることがわかった。ただし適正度の履歴があるほうが初
期値に対する頑堅性が弱いことが観測できた。このことは今後検討が必要かもしれない。 V(s)に関して、分割数10のときの結果では基本的なふるまいは分割数3のときの結果と
同じようなものになり、少ない分割数でも最適値に近づき十分な制度の解が求まった。こ
のことから Actor-Critic 手法の有効性を確認できた。 結論として、本研究で検証した Actor-Critic 手法は解の制度を高め、価値関数の分割数も
少なくてよいという点から機械学習においても有効であると考えられる。 今後の課題としては、今回の実験で初期値に対する頑堅性についてよい結果が出なかっ
たので見直していく必要があると思われる。
22
謝辞 本研究に際して、本田理恵助教授には、多大なご指導をいただきまことにありがとうござ
いました。感謝の意を表し心からお礼を申し上げます。さらには同研究室の皆様にもさま
ざまな意見をいただきお世話になりました。
23
参考文献 [1]強化学習 三上貞芳、皆川雅章 共訳 森山出版(2000) [2]強化学習システムの設計指針 木村 元、宮崎 和光、小林 重信:設計と制御:展望
第 38 巻 第 10 号 pp1~6(1999) [3]Actor に適正度の履歴を用いた Actor-Critic アルゴリズム-不完全な Value-Functionのもとで- 木村 元、小林 重信:人工知能学会雑誌 第 15 巻 2 号(2000)
24
付録 プログラムリスト 1、Actor-Critic 法による線形2次形式制御問題のプログラム #include<stdio.h>
#include<stdlib.h>
#include<math.h>
#undef RAND_MAX
#define RAND_MAX 2147483647 /* 2^(31)-1 */
#define IMM 30 //状態空間の分割最大数
float nextNormalRand(float mu,float s);
float mean(int dnum,float a[]);
float hensa(int dnum,float a[]);
int getState(float x,float xmin,float xmax,int im);
main(int argc, char *argv[]){
float r1,r2,r;
float rw; //直接報酬
int i,j;
float v[IMM]; //価値観数 float vn[IMM];
int s,snext; //現在の状態、次の状態
int maxstep=5000; //最大ステップ数
int step; //ステップ数
float TDerror; //TD-error
float e1,e2,d1,d2,dw1,dw2; //適性度e1,e2 適正度の履歴d1,d2 政策パラメータdw1,dw2
int IM; //状態空間の分割数
float gan; //割引率γ
float beta; //適正度の履歴の割引率
int criticID; //criticの使用
float alphap=0.001; //actorの学習率
25
float alpha=0.2; //TD(0)の学習率
//noiseの正規分布のパラメータ//
float sg=0.5; //σ(シグマ)
float mu=0; //μ(ミュー)
//aの正規分布(政策関数π)のパラメータ//
float asg=2; //aのσ
float amu=0; //aのμ
float w1; //μとσを決定するパラメータ(初期値)
float w2=0; //μとσを決定するパラメータ(初期値)
float noise;
float a;
float ap;
float x,xp; //現在の状態、1つ前の状態
if (argc!=5) {
printf("usage: %s gamma gridNumber beta criticUSE(1:criticを使う
0:criticを使わない)¥n", argv[0]);
exit(0);
}
gan=atof(argv[1]);
beta=atof(argv[3]);
IM=atoi(argv[2]);
criticID=atoi(argv[4]);
printf("gamma=%f beta=%f gridNumber=%d¥n", gan,beta,IM);
x=(((float)random()/RAND_MAX)*8.0)-4.0;;
srandom(time(NULL)%RAND_MAX);
w1=(((float)random()/RAND_MAX)*0.3)-0.45;
26
printf(" step xp noise ap a x rw amu asg e1 e2 d1 d2 w1 w2 TD-error s snext¥n");
/*Vの初期化*/
for(i=0;i<IM;++i){
v[i]=0;
vn[i]=0;
}
d1=0;
d2=0;
/*時間ステップに関するループ*/
for(step=0;step<maxstep;++step){
/*現在の状態を観測*/
s=getState(x,-4,4,IM);
/*行動を選択*/
amu=w1*x;
asg=1/(1+exp(-w2));
a=nextNormalRand(amu,asg);
/*行動をとる*/
noise=nextNormalRand(mu,sg); //noise
ap=a;
if(x+noise+a>4) a=4-(x+noise);
if(x+noise+a<-4) a=-4-(x+noise);
xp=x;
x=x+a+noise;
/*Critic*/
/*報酬の計算*/
rw=-pow(x,2)-pow(a,2);
27
/*次の状態を観測*/
snext=getState(x,-4,4,IM);
/*TD-error*/
TDerror=(rw+gan*vn[snext])-vn[s];
/*actor*/
/*政策のパラメータの更新*/
e1=(a-amu)*xp;
e2=(pow((a-amu),2)-pow(asg,2))*(1-asg);
d1=e1+beta*d1;
d2=e2+beta*d2;
dw1=TDerror*d1;
dw2=TDerror*d2;
w1=w1+alphap*dw1;
w2=w2+alphap*dw2;
for(i=0;i<IM;++i){
v[i]=vn[i];
}
if(criticID==1) vn[s]=v[s]+alpha*TDerror;
if(step%100==0){
printf(" %5d %11.4e %11.4e %11.4e %11.4e %11.4e %11.4e %11.4e %11.
4e %11.4e %11.4e %11.4e %11.4e %11.4e %11.4e %11.4e %d %d¥n",step,xp,n
oise,ap,a,x,rw,amu,asg,e1,e2,d1,d2,w1,w2,TDerror,s,snext);
}
}
}
28
float nextNormalRand(float mu,float sg){ /*次の正規分布を持つ乱
数を取り出す*/
float r1,r2,r;
r1=(float)random()/RAND_MAX;
r2=(float)random()/RAND_MAX;
r=(sqrt(-2*log(r1))*sin(2*M_PI*r2))*sg+mu;
return r;
}
float mean(int dnum,float a[]){
float asum=0;
int j;
float heikin;
for(j=0;j<dnum;++j){
asum=asum+a[j];
}
heikin=asum/dnum;
return heikin;
}
float hensa(int dnum,float a[]){
float asum=0;
int j;
float heikin=mean(dnum,a);
for(j=0;j<dnum;++j){
asum=asum+pow((a[j]-heikin),2);
}
return sqrt(asum/dnum);
}
int getState(float x,float xmin,float xmax,int im){
int s;
float dx;
dx=(xmax-xmin)/im;
29
s=(int)((x-xmin)/dx);
return s;
}
30
2、繰り返し実験用の c-shell スクリプト #!/bin/csh # 繰り返し実行する set GAMMA=0.9 set BETA=0.9 set GRIDNUM=3 set CRITICID=0 set DIRNAME0="rand" set DIRNAME=`echo $DIRNAME0"_g"$GAMMA"_b"$BETA"_d"$GRIDNUM"_ac"$CRITICID` echo $DIRNAME set i = 1 echo $i mkdir $DIRNAME rm $DIRNAME/all.d touch $DIRNAME/all.d while ($i <= 100) #echo " $i" echo ./act $GAMMA $GRIDNUM $BETA $CRITICID > $DIRNAME/$DIRNAME.$i.d ./act $GAMMA $GRIDNUM $BETA $CRITICID > $DIRNAME/$DIRNAME.$i.d echo " $DIRNAME/$DIRNAME.$i.d created" if ($i == 1) then awk 'NR!=1{print $1, $14}' $DIRNAME/$DIRNAME.$i.d > p1.d else awk 'NR!=1{print $14}' $DIRNAME/$DIRNAME.$i.d > p1.d endif paste $DIRNAME/all.d p1.d > tmp.d cp tmp.d $DIRNAME/all.d sleep 1 @ i ++ end echo $DIRNAME/all.d created echo "done!"
31
3、Java による線形2次形式制御問題の学習結果可視化プログラム import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Sim extends JFrame implements ActionListener,Runnable {
MyCanvas c1;
JButton b1,b2,b3;
Thread t1;
double x;
double w1=0; //学習したゲインパラメータ
double w2=-4.8617e-01;
double mu=0,sg=0.5;
int t;
boolean KissOfDeath;
public Sim() {
super();
setTitle("Simulator");
setSize(500,300);
setLayout(null);
x= 0;
KissOfDeath = false;
c1 = new MyCanvas();
c1.setBounds(50,50,400,200);
this.add(c1);
b1 = new JButton("GO/STOP");
b1.setBounds(25,260,100,25);
b1.addActionListener(this);
this.add(b1);
b2 = new JButton("change");
b2.setBounds(150,260,100,25);
32
b2.addActionListener(this);
this.add(b2);
b3 = new JButton("reset");
b3.setBounds(275,260,100,25);
b3.addActionListener(this);
this.add(b3);
t=0;
}
public static void main (String args []) {
JFrame ww = new Sim();
ww.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
ww.setSize( 1000, 800 );
ww.setVisible( true );
}
public void actionPerformed(ActionEvent ev) {
if (ev.getSource() == b1) {
KissOfDeath = ! KissOfDeath;
if (KissOfDeath){
t1 = new Thread(this);
t1.start();
}
}
if (ev.getSource() == b3) {
t=0;
x = 0;
c1.repaint();
}
}
public void run(){
try {
33
while(KissOfDeath&&t<10000){
double noise=nextNormalRand(mu,sg);
/*çsìÆÇ�ëIë�*/
double amu=w1*x;
double asg=1/(1+Math.exp(-w2));
double a=nextNormalRand(amu,asg);
/*çsìÆÇ�Ç∆ÇÈ*/
if(x+noise+a>4) a=4-(x+noise);
if(x+noise+a<-4) a=-4-(x+noise);
x=x+a+noise;
c1.repaint();
t1.sleep(100);
t++;
}
} catch(Exception e){
System.out.println(e);
}
}
class MyCanvas extends Canvas{
public void paint(Graphics g){
Font f1=new Font("ÇlÇrÉSÉVÉbÉN",Font.PLAIN,50);
g.setColor(Color.red);
g.fillRect((int)(250+50*x),130,20,20);
g.setColor(Color.blue);
g.drawLine(50,150,450,150);
g.drawLine(250,150,250,140);
g.setFont(f1);
//g.drawString(""+t,this.getWidth()/2,this.getHeight()/2);
}
}
double nextNormalRand(double mu,double sg){
/*éüÇÃê≥ãKï™ïzÇ�éùǬóêêîÇ�éÊÇËèoÇ∑*/
34
)( tw i =Δ
double r1,r2,r;
r1=Math.random();
r2=Math.random();
r=(Math.sqrt(-2*Math.log(r1))*Math.sin(2*Math.PI*r2))*sg+mu;
//printf("noise=%f¥n",r);
return r;
}
}
35