だれかの備忘録

主に自分用。

TensorFlowで学習率をいろいろ変えてみた

TensorFlowを使ったCNNサンプルプログラムでパラメータをいろいろ変えたらどうなるかを試していこうと思います。まず最初は学習率をいろいろな値に変えてみて精度を比較してみます。
ここでは学習の過程で学習率は固定です。AdamやMomentumのように学習の過程で学習率を変化させるのは扱いません。

サンプルプログラムについてはこちら。
MNIST分類のCNNサンプルプログラム - だれかの備忘録

学習率を振ってみる

サンプルプログラムの学習率は0.01固定となっています。これを0.0001~1の範囲で振ってみました。
各学習率で3回ずつ試行し、3回の精度のmax値とmin値をプロットしました。すると下図のような結果になりました。
f:id:positive_bedridden:20181202200148p:plain
学習率0.01を基準に見てみると3つの特徴があることが分かります。

  • 学習率が小さいと学習は正常に進むが、学習率が小さすぎると精度が伸びない。
  • 学習率が大きすぎると学習が全く進まない。
  • これらの中間では不安定。3回の試行で学習がうまく進む場合と全く進まない場合とにほぼ2極化する。

中間の不安定な部分の精度が良いところを拡大して見てみます。
f:id:positive_bedridden:20181202200852p:plain
学習率が0.01のときの精度は0.967なのですが、不安定なところの0.038では一番良い精度の0.981となりました。しかし、0.038での試行3回のうち2回は学習が全く進みませんでした。良い精度が出るかどうかは運次第となるようです。

ここまでは最終1000step後の結果を見てきましたが、1Step目からの過程も見てみます。
f:id:positive_bedridden:20181202203031p:plain
いくつか特徴的な学習率のみについてStep 1と100, 200, ..., 1000までの精度をプロットしています。
学習率0.0001では1000Step目でも学習途上のようです。もっと学習を続ければ精度は上がりそうです。
学習率0.038の良い方(0.038maxと記載)は最初の100Step目から精度0.9を超えて来ていますが、その後の伸びは小さいです。
学習率0.038の悪い方(0.038minと記載)や0.1では最初から最後まで精度は低いままです。これは学習を増やしても意味が無さそうです。

精度の高さだけを見ると学習率0.038前後が一番いいけど運任せにはできないので採用できません。サンプルプログラムの学習率0.01という値は精度がそこそこ良くて何度試行してもうまくいく丁度よい値ということが分かりました。

まとめ

今回は学習率をいろいろ変えてみて精度を比較しました。学習率が大きすぎるとき、小さすぎるときの挙動は分かりやすいですが、中間の挙動は注意が必要なことが分かりました。新しい学習をするときは何回か試行してみて安定して精度が出るか確認が必要のようです。