頭と尻尾はくれてやる!

パソコンおやじのiPhoneアプリ・サイト作成・運営日記


強化学習で物理エンジンを使いたいが

TensorFlow、MPS、SceneKitで強化学習
↑この続き。

SceneKitの物理エンジンを使おうとしたんだけど、肝心のQ関数の更新であれ?となった。

強化学習入門 ~これから強化学習を学びたい人のための基礎知識~ - Platinum Data Blog by BrainPad
↑ここに強化学習でおなじみの↓この式があるんだけど、

Q値更新式

Q(s,a)って見るとなんとなくQ値はsとaを入力したら出てきそう〜って雰囲気だけど、NNではsが入力で各actionのQ値がそれぞれ出てくるよな。
Q(s,a)を更新、学習させるためにデータをたくさん集めないといけないわけだど、各actionのQ値を用意しないといけないことになる。
今回の倒立振子で言うと、
action0 : プラスのトルクを与える
action1 : マイナスのトルクを与える
という二種類のactionがあるとして、ある状態s(ここでは過去4つの振り子の角度)においてaction0,action1の両方のQ値が欲しいことになる。
Q(s,a0)とQ(s,a1)の二つ。
そうしないとTensorFlowに渡すデータセットにならないから。

でもさ、物理エンジン使ってたら、ある時点では片方のactionしかとられへんやん?!
Q値の更新に必要なデータには両方のactionをしたらどういうs’になるねん?っていうのが必要だけど、それが得られへんねん!
物理エンジンで強化学習やってる人はどうやってるんやろね?

単振り子(単振動)の運動方程式(微分)を解く(エクセルを用いたルンゲクッタ法)
↑幸い振り子の運動方程式を解析的に扱う方法があった。
振り子の運動方程式見たら簡単に解けそうなもんだけど、難しいのね、、、
ここにある4次のルンゲクッタ法を使えば微笑時刻後の振り子の角度、角速度を得ることができる!すげー!
{
    float omega0 = angularVelocity;
    float theta0 = angle;
    
    float k1 = MicroDuration * (-G*sinf(theta0));
    float m1 = MicroDuration * omega0;
    
    float k2 = MicroDuration*(-G*sinf(theta0+m1/2.0));
    float m2 = MicroDuration * (omega0 + k1/2.0);
    
    float k3 = MicroDuration*(-G*sinf(theta0+m2/2.0));
    float m3 = MicroDuration * (omega0 + k2/2.0);
    
    float k4 = MicroDuration*(-G*sinf(theta0+m3));
    float m4 = MicroDuration * (omega0+k3);
    
    float k = (k1+2.0*k2+2.0*k3+k4)/6.0;
    float m = (m1+2.0*m2+2.0*m3+m4)/6.0;
    
    
    float newAngularVelocity = omega0 + k;
    float newAngle = theta0 + m;
}
ええ、Objective-Cですが、何か?(と言いつつWWDC2018でSwiftのみのフレームワークを見てぼちぼちSwift勉強しようかなと思ってます)

これである時刻tにおいてどんなアクションをとった場合の角度を計算することができる。
ちなみにトルクを与えた場合には定数のプラスかマイナス角速度を与えた。

これでいける!と思ったんだが、、、そうそう簡単にはうまくいかなかったのです、、、

続く、、、はず



<< 日足チャート画像のCNNで株価予測  TopPage  TensorFlow、MPS、SceneKitで強化学習 >>

コメント


管理者にだけ表示を許可する
 

トラックバック

トラックバックURL
http://ringsbell.blog117.fc2.com/tb.php/1146-b1b758c1




Copyright ©頭と尻尾はくれてやる!. Powered by FC2 Blog. Template by eriraha.

FC2Ad