読者です 読者をやめる 読者になる 読者になる

Adamのパラメータ設定

CNNの学習で大事なOptimizerの性質について整理します。 Optimizerの選択を間違えると、大きく2つの問題点が起こります。

  • 学習速度が遅い
  • 最終的な学習後も本当の最小値に落ち着かない

特に後者は重要です。CNNのようにパラメータ数が多く、しかも対称性が非常に高い状況では、どのパラメータを重点的に変化させて学習を進めるかが重要なポイントとなり、最終的なネットワークの質にまで大きな影響を与えます。

このエントリでは、最新のOptimizerであるAdamの仕組み、およびパラメータ設定による上記2ポイントへの影響について考察します。

Adamの仕組み

まずはwikipediaからAdamのパラメータ更新について引用してみたのが以下です。

f:id:ysasaki6023:20160507142001p:plain

f:id:ysasaki6023:20160507142015p:plain

f:id:ysasaki6023:20160507142033p:plain

f:id:ysasaki6023:20160507142039p:plain

f:id:ysasaki6023:20160507142050p:plain

f:id:ysasaki6023:20160507142058p:plain

tは現在のepoch、ωが更新されるパラメータ。◯は各要素ごとの積とのこと。mtやvtもすべて、「各パラメータ毎に」それぞれの値を持っていることが重要です。

また、論文中でのデフォルトのハイパーパラメータは、 f:id:ysasaki6023:20160507152846p:plain が推奨されています。

mtはもろもろのfine-tuneしているパラメータを取っ払って考えると、実質ωのgradientとなっています。 これにかかっているのが、学習速度を調整する係数であるα/sqrt(v)です。vについても同様に細かいfine-tuneパラメータを無視して考えると、各パラメータ毎に「これまでどれだけ更新を行ったか」の自乗に比例する大きさとなっています。これの逆数が学習速度として掛かるのでつまり、以下のことがいえます。

Adamでは、これまであまり更新されて来なかったパラメータが優先的に更新される

純粋数学的な最適化という観点からすると、これまで最急勾配を選び優先的に下げていく方向だったところに、いや少し待て、それ以外の勾配方向も積極的に試してみようということで、鞍点からの抜け出しが速くなります。

またニューラルネットワークにおいてこの性質は、スパースな情報の埋め込みに大きく貢献します。 ある特定のニューロンAが居たとしましょう。このニューロンAは様々なサンプルにとって重要度が高く、サンプル達を舐めながら学習をするに従って、接続パラメータが上げられたり下げられれたりすることが多いとします。そうすると、いつまで経ってもパラメータは行ったり来たりで、学習が進みません。本来は、他のニューロンBを活用することで、あるサンプルに対してはAが、あるサンプルに対してはBが、というような住み分けを行うことで学習を行うべきです。 Adamの学習方法はまさにそうなっており、更新頻度の高いパラメータは学習速度低、更新があまりされていない・活用されていないパラメータは学習速度を高めるような構造になっています。

β2は、更新頻度についてどの程度の期間覚えておくかを設定しています。「10年前はだいぶ更新されてたけど、最近は全然だなぁ」みたいなことは流石に避けたいので、更新頻度の情報はここ最近のものに限定します。とはいえ、デフォルトのパラメータβ2=0.999の場合、100回前の更新の影響もexp(-0.001*100)=90%程度残っており、基本的には最適化をはじめてからほぼすべての情報が合計されていると思って良さそうです。β2を弄る場合は、1/β2が記憶力の平均持続epoch数だと考えると良いと思います。

以上が"v"に関する理解です。次に、"m"について。 mは最急勾配の方向・傾斜が保存されているベクトルです。ただし、慣性項がついており、少し前に調べた時の最急勾配も含めて今後のパラメータ更新の量を決定します。デフォルトではβ2=0.9ですので、実質ここ10回分の勾配情報を踏まえて更新しているということになります。結構長く平均をしているものですね。振動を防ぐ効果とかあるんでしょうか。

ハットの付いているvとmは、1-βtとなっていることからも分かるように、tのごく小さい、初期のepochにおいて、十分な学習速度が得られるような補正がかけられています。mに関しては、学習をスタートしてから10epochくらいですぐに補正は無視できるようになってきます。一方でvは1000epochくらい経たないと無視できるようにはなりません。むしろ分母を近似してしまって、1/(1-β1t) ~ 1000/tとした方が良いかも。1000くらいからスタートして、100epoch目でようやく10程度の値に落ち着きます。それまでは学習係数を決定する主要因ですね。

Adamのパラメータ選定による最適化への影響

さて、以上をまとめたときに、学習係数は以下の3つの要因によって大きく決まります。

  • β1によって決まるmの値。上で述べたように、mはepochの逆数で減少していきますので、そのルートが掛かり1/sqrt(epoch)の依存性となります
  • 更新増加でvが1/sqrt(epoch)程度で減少
  • α

これ以外は学習係数に対する影響はほとんどありません。そうすると、だいたいα/epoch程度の学習係数となっていくと考えて良さそうです。

学習係数は、学習後半のfine-tune段階では徐々に下げていくのが理想的です。そうすることで、より最適なパラメータ組へと到達することができます。 epochの減少による学習係数の低下は、1/epoch程度のスピードでしか効かず、例えば今100epoch目だとすると、学習係数を半分にするのにさらに100epochが必要となります。それを加速するために、αを半分にするなどすることは学習の加速に有効だと考えられます。また、β1の効果のおかげで10回程度の過去履歴は残っていますので、αの操作はその程度の時間スケールで行うと、パラメータ更新が落ち着いたうえでのアップデートとなりそうです。