【ニューラルネットワークの基礎研究25】
放物運動の軌跡から空気抵抗係数を学習してみる
ここまででは、ニューラルネットワークを用いて指定した関数形を学習させました。今回からは、実際の物理系における指定した問題に対するパラメータ探索を目的とした学習を行っていきます。当面は「解析解は得られないが数値解が容易に得られる系で、学習の成果を簡単に検証できる問題」を対象として、物理シミュレーションと深層学習を組み合わせを検証していきたいと思います。
対象とする系:空気抵抗力が存在する放物運動
物体を斜めに投射(斜方投射)すると物体は放物線状の軌跡を描いて飛んでいきます。地球上で空気が存在するために、物体には運動を阻害する抵抗力(空気抵抗)が加わるため、この放物線状の軌跡は完全な放物線(2次関数)にはなりません。 次のグラフは先の加速度ベクトルを用いて空気抵抗力が存在する斜方投射を計算した結果です。初速度20[m/s]で様々な投射角度()で投射しています。その他のパラメータは 、 、 です。空気抵抗力が存在しない場合には が最も遠くに飛びますが、空気抵抗力が存在する場合の到達距離が最大となる投射角度はとなります。
なお、数値計算については「【ルンゲ・クッタで行こう!】放物運動シミュレーション」を参照ください。
問題設定
手始めに放物運動の軌跡から空気抵抗係数を学習してみましょう。
投射角度、投射初速度と粘性抵抗係数をランダムに与えて、放物運動の軌跡を数値計算します。
ネットワークへの入力と出力は以下のとおりとします。
入力:得られた運動の軌跡(x,z)の時系列データ100個
出力:粘性抵抗係数
ニューラルネットワークの基本パラメータ
・ニューラルネットワークの構造:順伝播型ニューラルネットワーク(FFNN)
・学習方法:通常の勾配法(学習率固定、逆誤差伝搬法)
・学習率:eta = 0.01;
・ミニバッチ数:100 (サンプルは無限に用意できるためミニバッチという概念は存在しませんが、ランダムに用意したミニバッチ数分のサンプルに対する平均を用いて学習を進める)
・活性化関数(中間層):ReLU(ランプ関数)
・活性化関数(出力層):恒等関数
・損失関数:2乗和
※独立したネットワークを10個用意してそれぞれ個別に学習させて、学習効果の高かった上位5つの「学習回数」vs「損失値」をグラフ化します。
中間層1層のニューラルネットワーク(200-200-1)
学習回数に対する損失値
100,000回学習後のチェック
空気抵抗係数を0, 0.5, 1.0, 1.5として、投射角度を0°から90°までそれぞれ計算した軌跡データからニューラルネットワークが推定した空気抵抗係数の値。 もし完璧に学習できていれば、それぞれ横一線になる。
考察と次の課題
・gamma=0やthetaが90に近いほど、精度が悪いことが確認できる。これは学習対象とするパラメータの下限や上限に近いためと考えられる。
・空気抵抗力として粘性抵抗力に加えて、速度の2乗に比例する慣性抵抗力が存在する場合を検証する。
・また、指定したパラメータに対する飛距離を学習させてみる。
プログラムソース(C++)
・http://www.natural-science.or.jp/files/NN/FFNNs_epoch_ProjectileMotion_AirResistance.zip
※VisualStudio2017のソルーションファイルです。GCC(MinGW)でも動作確認しています。