変わりモノがいい!

変わりモノには価値がある・・・ハズ?

PiCar-V Self-riving tensorflow + keras 学習パラメータの決定

学習パラメータを決めました。

先の記事で書いたようにtensorflow + kerasの回帰モデルに対する学習パラメータを色々と変えていき、やっとパラメータの値を決めることができました。
今回は、参考にした情報を紹介しながら実施内容を纏めておきたいと思います。

f:id:ken2017:20201012100132p:plain

まずは、学習率について

学習率とは、機械学習の最適化においてどのくらい値を動かすかというパラメーターであり、学習率を大きくしすぎると発散し、小さくしすぎると収束まで遅くなるという性格を持っています。
今回の学習が上手くいかなかった最大の原因は回帰モデルに分類的な設定をしてしまったことに尽きますが、学習パラメータにおいても学習率を始め適切な値の設定ができていませんでした。
学習率に関しては、時間がかかっても良い、できるだけ正確に、と考えて学習率を必要以上に小さくしたのが良くありませんでした。
なんと学習率を、1e-5としていました。
その結果、学習が遅々として進まないという結果になりました。
当たり前ですよね。
その結果を反省してネットを調べた結果、以下の記事を見つけました。

qiita.com

この記事を参考にして、学習率を変化させデータを取りました。
学習率を、1e-2、1e-3、1e-4、1e-5と取っていきました。
結果は以下。
学習率       epoch数1、10、100、150でのステアリングLoss
1e-2               898     (epoch数5で学習停止)
1e-3               630     350       36          5.7
1e-4               944     504     152        77
1e-5             5405     947     419     383
記事にある添付グラフと同じような結果を得ました。

f:id:ken2017:20201012102056p:plain
結果から学習率を1e-3とすることとしました。

次はバッチサイズです。

バッチサイズとepoch数の決め方には、コレ、といったものが無いようなので試行錯誤で決めることにします。
ちなみにバッチサイズとは以下の図におけるサブセットの大きさのことを意味しています。
下の図では、バッチサイズは200となります。

f:id:ken2017:20201012104957p:plain
学習をしていて気になったことは、ステアリングLossの値がある程度までは大きな乱れもなく比較的単調に減少するも、学習が進みLossがある値を下回った段階から変動が大きくなる現象が見られたことです。
気になってネットを調べたら上に載せた記事に、完全に収束まで実行すると過学習になる恐れがある、という記載がありました。
コレだったのだな、と思った次第です。
Lossが二桁の時までは良いのですが、Lossが一桁になると大きな変動が出始め、Lossが1を切ると頻繁に変動が出ることが確認されました。
学習がキチンと進み、完全収束の前で学習をコントロールできるようなバッチサイズを選びたいと思い、バッチサイズを50、100、150、200、250、300、500、1000と変えてデータを取りました。
どのバッチサイズにおいてもepoch数を進めていくと完全収束に至るので、できるだけepoch数が進んだ段階で完全収束になるよう、言い換えれば、できるだけepoch数を稼げるようなバッチサイズを選ぶこととしました。
ちなみに、epoch数とは、一つの訓練データを何回繰り返して学習させるか、の数のことです。
目標のepoch数を500以上と決め、epoch数が500まで完全収束をしないバッチサイズを見つけることとしました。
結果、バッチサイズが500以下ではepoch数が500未満で完全収束が発生し、バッチサイズが1000の時にはぎりぎりではありますが、epoch数が500まで完全収束は起きていないことが確認できました。
これはあくまでも今の手持ちのデータに関してのことではありますが。
ということでバッチサーズは1000としました。
ちなみにLossが1を切り完全収束状態になると、Lossが不意に変動し、100epochの中で5回、6回と変動が起きていることが確認できました。
バッチサイズの決定に関しては以下の記事も参考にしました。

www.st-hakky-blog.com

最後に、epoch数とiteration数を決めます。

epoch数とiteration数も学習がキチンと進み、かつ完全収束を起こさない状態を見極めて決めることにします。
iteration数を5、10、15、20と変えてepoch数を進めていきデータを取りました。
その結果、iteration数が大きくなるにつれ、Lossの低減が促進されepoch数が少なくてもLossが1を切りやすくなり、完全収束状態になりやすくなり、それと共にLossの変動回数も増えることとなりました。
epoch数が500でLossが1を切らないのはiteration数が5と10であり、その中でもLossが一桁でLossの変動が少ないのはiteration数が5の時となりました。
      (参考データ)
         iteration数が5の時、
         epoch数が500でLossは14.8、600で14.1、700で11.4、800で5.4(1)、
         900で4.1、1000で5.9(1)となった。 ()内はLossの変動回数
         iteration数が10の時、
         epoch数が500でLossは3.8(1)、600で2.9(2)、700で3.0(3)、800で8.5(3)、
         900で18.1(3)、1000で1.3(4)となった。 ()内はLossの変動回数
         iteration数が15の時、
         epoch数が500でLossは0.6(2)、600で0.4(3)、700で0.3(4)、800で0.1(3)、
         900で0.0(3)、1000で0.0(5)となった。 ()内はLossの変動回数
          f:id:ken2017:20201012152347j:plain   
           学習時のLossの状況:epoch数900の近辺でLossの変動が発生
以上のことから、epoch数は1000、iteration数は5とすることとしました。
これで必要な学習パラメータを決めることができました。
いよいよ速度とステアリング角度の同時学習に向けたコードの作成に入ります。
今回は図やグラフが少なく文字ばかりで判りにくかったと思います。
ちょっと反省ですね。

では、また。

 

プライバシーポリシー お問い合わせ