強化学習(DQN)に強引にSceneKitの物理エンジンを使う
強化学習で物理エンジンを使いたいが
↑ここにも書いたんだけど、強化学習(DQN)やる時に物理エンジンを使うと次の時刻の状態や報酬は1通りしか取れないのでだめじゃん?と理解してる。
【強化学習中級者向け】実装例から学ぶDueling Network DQN 【CartPoleで棒立て:1ファイルで完結】
↑Dueling Networkとかあるみたいなんだけど、まだよくわからないのでとりあえずもっとベタな方法を試してみた。
物理エンジンにある状態を与えてdT後の状態を得るというのを繰り返す、というもの。
物理エンジンに下手に初期値を与えると瞬間的に移動するので慣性ですっとんで行ってしまったり期待通りの位置、姿勢になるのに時間がかかるんじゃないの?とか思っていたので、ちゃんとSceneKitで指定の状態を与えることができるのか?というところから確かめた。
与える状態は
位置 position
姿勢 orientation
速度 velocity
角速度 angularVelocity
の4つ。
これをループの最初に振り子(SCNNodeオブジェクト)に与える。
SCNSceneRendererDelegateメソッドのおなじみの
- (void)renderer:(id)renderer updateAtTime:(NSTimeInterval)time;
内で上記の状態を取得する。
このメソッドは適当な時間間隔でコールされるので、きっちりと指定したタイミングでの状態を得ることはできないので仕方なく近似してる。
これでなんとかそれらしい値を取得することができそうだと確認できた。
↑学習時にはこんな感じに見える。ある状態から2種類のアクションをやった場合にどういう状態になるかを得るのでちらついて見える。
負荷を減らすつもりで照明もなし、振り子以外のオブジェクトもなし。
scnscene.physicsWorld.speed
でスピードを早くすることもできなくもないんだけど、2.0にしただけで取得する値がばらつきやすくなったので結局デフォの1.0のままでやってる。
なので計算に時間がかかる(やっぱDueling Networkとか勉強するか?)。
なんとも面倒なことをやってるけど、これがうまくいけば物理エンジンを使わないとできないようなややこしい動き(二足歩行とか)に対しても強化学習ができる可能性が出てくるんだよな。
↑ここにも書いたんだけど、強化学習(DQN)やる時に物理エンジンを使うと次の時刻の状態や報酬は1通りしか取れないのでだめじゃん?と理解してる。
【強化学習中級者向け】実装例から学ぶDueling Network DQN 【CartPoleで棒立て:1ファイルで完結】
↑Dueling Networkとかあるみたいなんだけど、まだよくわからないのでとりあえずもっとベタな方法を試してみた。
物理エンジンにある状態を与えてdT後の状態を得るというのを繰り返す、というもの。
物理エンジンに下手に初期値を与えると瞬間的に移動するので慣性ですっとんで行ってしまったり期待通りの位置、姿勢になるのに時間がかかるんじゃないの?とか思っていたので、ちゃんとSceneKitで指定の状態を与えることができるのか?というところから確かめた。
与える状態は
位置 position
姿勢 orientation
速度 velocity
角速度 angularVelocity
の4つ。
これをループの最初に振り子(SCNNodeオブジェクト)に与える。
SCNSceneRendererDelegateメソッドのおなじみの
- (void)renderer:(id)renderer updateAtTime:(NSTimeInterval)time;
内で上記の状態を取得する。
このメソッドは適当な時間間隔でコールされるので、きっちりと指定したタイミングでの状態を得ることはできないので仕方なく近似してる。
これでなんとかそれらしい値を取得することができそうだと確認できた。
SceneKitの物理エンジンを強化学習 (DQN)に使ってるとこ。複数のアクションに対する結果を得てるのでチラついて見える (精神的に良くないよな)。 pic.twitter.com/XfJmQ5YuRZ
— Tatsuya (@yt) 2018年6月19日
↑学習時にはこんな感じに見える。ある状態から2種類のアクションをやった場合にどういう状態になるかを得るのでちらついて見える。
負荷を減らすつもりで照明もなし、振り子以外のオブジェクトもなし。
scnscene.physicsWorld.speed
でスピードを早くすることもできなくもないんだけど、2.0にしただけで取得する値がばらつきやすくなったので結局デフォの1.0のままでやってる。
なので計算に時間がかかる(やっぱDueling Networkとか勉強するか?)。
なんとも面倒なことをやってるけど、これがうまくいけば物理エンジンを使わないとできないようなややこしい動き(二足歩行とか)に対しても強化学習ができる可能性が出てくるんだよな。
スポンサーサイト
<< semaphoreでコードがスッキリする TopPage SceneKitでオブジェクトの速度・角速度が取得できない >>
トラックバック
トラックバックURL
https://ringsbell.blog.fc2.com/tb.php/1150-08e28969
https://ringsbell.blog.fc2.com/tb.php/1150-08e28969