現在機械学習ではディープラーニングの活躍が目立っています。
その基礎はニューラルネットワークの学習にあり、この学習を知っているのとそうでないのとでは、各手法に関する理解度が大きく異なってくるものと思います。
今回はニューラルネットワークの学習における不思議の1つ、「学習の停滞」の原因について述べてみたいと思います。
はじめに
ニューラルネットワークでは学習が停滞したと思いきや、しばらく学習を根気強く続けていると、学習が進むときが訪れます。既にニューラルネットワークのプログラムを動かしたことがある人ならば経験したことがあるでしょう。なぜに学習が停滞し、そして再び進むということが起こるのでしょうか。 今回はそのことについて述べていきます。
勾配法
ニューラルネットは通常誤差逆伝播法によって学習を行います。ご存知の通り、これは損失関数のパラメータによる勾配を求め、損失関数を減少させるようにパラメータを更新していく勾配法の一種です。
勾配法
勾配法では、損失関数に対するパラメータについて
と更新することで、損失関数が先程よりは幾分か減少したに変更することを繰り返していきます。は学習率と呼ばれ、どれくらい大きく進ませるかを決定するものです。
具体的な例題
勾配法とは損失関数を減少させる方向にパラメータを少しずつ更新する至ってシンプルな手法です。最も簡単な例題を考えて、パラメータによる損失関数が以下で表されるとしましょう。
損失関数が最小になるのはだとすぐにわかります。それは二乗が必ず正の値になるので、以外にありえないとも考えられますし、あるいは微分してになるところだという考え方もできます。勾配法では後者の考え方、「微分してになるところ」というのが重要です。
具体的に勾配法を見てみましょう。
損失関数のによる微分は、スカラーをベクトルで微分しており、これは以下で定義されます。
スカラーをベクトルの各成分で微分したベクトルになります。このベクトルは、損失関数が上昇する方向を示しているため、勾配法では、
と値を更新します。これにより損失関数が先程よりは幾分か減少したが得られるはずです。もちろん、あるから少しずつ変更していくので、に初期値が必要になります。今回はとりあえず初期値をとして始めてみましょう。上記の損失関数の設定で勾配を計算すると
となっていますから更新は
です。運良く学習率をと設定していた場合は直ちにが得られます。このときの勾配はと計算され、以降更新は行われません。
仮に学習率をと設定していた場合は
と新しい値が得られます。この値における勾配を再び計算すると
と求まるので、再び同じように更新をしていきます。
少しずつ最適解であるに近づいています。いつか最適解にたどり着きそうなのは想像が着きますね。
学習が停滞する原因
上の例題は、紙に書いて進めていけば分かる通り、進む毎に勾配が小さくなっていきます。
ということは単純に考えて、学習が停滞するのは、損失関数が現在のパラメータの値においてかなり平坦な状態であるからと言えます。
勾配法の落とし穴
解に近づくと、平らな場所に行き着くため、結果的に勾配は小さくなり、学習は停滞し始めます。では「学習が停滞し始める=解がすぐそこに迫っている」とも言えるのでしょうか。
先ほどの例題ならば答えは「yes」です。微分してになるような場所は一箇所しか無いため、「平坦な場所=解」であると結論づけられるためです。通常このような最適化問題は「凸最適化問題」と言います。そうでない場合は「非凸最適化問題」と呼ばれます。
通常ニューラルネットワークの損失関数というのは「非凸」です。微分してになるような点がいっぱいあります。例えば
のような関数をパラメータについて勾配法で初期値をとして解いていくと、きっと以下のように学習が終わります。青の点において、勾配はなので更新はされません。もう少し進めばもっと低い値があるのに、勾配法ではそれは得られないのです。
最適解でなくとも平坦な場所においては、勾配は次第に小さくなり、そしてやがて止まってしまいます。このようなケースを、局所最適解に陥ったとか、ローカルミニマムに嵌ったとか言います。今回の簡単なケースならば、初期値を色々変えてみることで一応回避は可能です。例えば初期値がならばきっと最適解に辿り着くでしょう。
今は一次元で見ましたが、二次元の場合はローカルミニマム以外にも勾配が0になるような場面があります。「鞍点」と呼ばれる場所です。以下の図の赤い点が鞍点です。
wikipedia [saddle point]
このような場所でも学習は止まってしまいます。赤い点にピッタリ行き着かないにしても、この周辺では非常に勾配が小さいため、学習は中々進まなくなるのです。
学習が停滞し、再び進む原因
ニューラルネットの学習が停滞し、再び進むという現象は、この鞍点に囚われているところから何とか抜けだした瞬間に訪れるのです。
通常ローカルミニマムに捕まった場合は、特殊なことをしない限り勾配法では抜け出すことができません。なぜなら、どこに進もうとしても坂を登らなければならないからです。坂を登ることを許容してしまえば一見問題は解決しそうですが、するとローカルミニマムでないような場所で、わざわざ最適解から遠ざかる動きをする可能性もあるためリスクも伴います。しかし、鞍点ならばどうでしょう。少し移動すれば勾配がしっかり下る方向に存在しているため、少し揺さぶってやれば学習は進むはずです。
ニューラルネットで勾配の計算を工夫する様々な手法があるのはご存知だと思います。
AdaGradやAdaDelta、Adamなどはまさしく、この鞍点から素早く抜け出すための工夫が施された手法なのです。
鞍点はどこから現れるのか
ニューラルネットには、学習を停滞させる鞍点が非常に多く存在します。
もう少し鞍点のことについて詳しく整理してみましょう。
勾配が「」になる点
これが学習を停滞させる原因で、鞍点の周辺も基本的には勾配が非常に小さくなります。
ただし、鞍点はローカルミニマムと異なって少し移動すれば小さいながらも損失関数を減少させる勾配は存在するため、一見学習が進むように思われます。しかし、実際にはニューラルネットがとても長い時間鞍点に囚われ続けることがかなり多いです。
なぜでしょうか。勾配がになる点というのをもう少し詳しく考えましょう。
パラメータを少し変更しても、損失関数がまったく変化しない点
勾配がというのは、言い換えるとパラメータを少し変更しても損失関数がまったく変化しないということです。微分の定義に戻ってみれば当たり前といえば当たり前でしょう。
実はこの考え方が大事です。なぜなら、鞍点が実は「1つの点」ではない可能性があるからです。鞍点が非常に多く連なり、結果的に広大な線あるいは面を形成している可能性があるのです。
すなわち少し移動しても、そこはやはり鞍点で、ほとんど勾配が得られないという状況がありうるのです。
簡単な例
とっても退屈なニューラルネットワークを考えましょう。
1入力1出力で、隠れユニットが1個のニューラルネットワークです。
活性化関数が中間層で、出力層でとします。
するとこのニューラルネットワークは
という変換を行います。(バイアス項はメンドウなのでとしています)
さて、ニューラルネットワークの出力をパラメータを色々変えて最適化してやろうと試みるわけです。損失関数は目標値を使って
などと設定されるわけですが、を調整して損失関数を減少させるというのは、結局出力をを調整して上手いことコントロールしてやりたいということです。すなわち、損失関数を減少させるためには、を変更した結果、出力の値も変更を受けなければなりません。
は色々な値を取れます。色々変更してやりたいのです。
仮にだったとしましょう。するとがどれだけ調整を施されても出力は一切変わりません。ずっとです。従って損失関数も一切変化しません。
を変化させても損失関数に変化が起こらない。これは損失関数のに関する勾配が0ということです。と変えてもの領域で勾配が0なのです
これはあまりにもつまらない例題です。しかし、出力を変化させないパラメータの領域が線となって連なっている例となっています。
では入力多次元でとして中間層が2つ、出力が一次元としましょう。
この場合の出力は
となります。は何らかの変換をする関数ですが、問題は中身なので個々に着目しましょう。1つは先ほどと同じようにという場合には、がどんなふうに値を変えても出力に影響を及ぼしません。すなわち、においてによる損失関数の勾配は0です。仮にが二次元のベクトル(すなわち入力が二次元)ならば、パラメータ空間に面上の鞍点が生ずることになります。
次に、の場合、中間層のユニットはいずれも同じ値を取ることになります。
従って、の値によってのみ出力が変更されるのですが、仮にであるように値を変更したとしても出力は一切変更を受けません。例えばとはまったく同じ出力しか出せないのです。よってこのような場所に鞍点が生じます。
通常のニューラルネットワークだとどうなるか、想像に硬くないでしょう。このような関係が至るところで現れるために、実はパラメータ空間は鞍点だらけなのです。
しかも今回紹介したのは、単なる鞍点ではありません。空間的に広がりを持っていますから、少し動かしてあげた程度では、そこから抜け出すのは困難かもしれないのです。
特異点
先ほどまで「鞍点」と表現していましたが、実は上記のように現れる「パラメータを変更しても関数の出力が変化しない領域」を「特異点」と言います。
通常「鞍点」とは勾配が0になるが、少し移動すれば上昇も下降もできるような点のことを言います。従って特異点の方が圧倒的に質が悪いのです(少しの移動じゃ平坦な場所から抜け出せない)。
なぜ特異「点」と表現するのかというと、空間的に広がっているそのような領域は、関数にとってはまったく同一のものであるため、それを点とみなして圧縮してしまう方が便利だからです。
これより詳しい議論は
の第14章「学習の力学と特異点」に述べられています。
まとめ
・学習の停滞と再開は鞍点によって生ずる
・鞍点は勾配が0になる点
・勾配が0になる点⇛パラメータを少し変更しても出力にまったく変化を及ぼさない点
・ニューラルネットには特異点という質の悪い領域が広がっている
今回は鞍点から話をしていきました。
通常の鞍点自体ももちろん学習には悪い影響を与えており、鞍点の付近では勾配はやはり小さいため、停滞は免れません。ここから早いとこ抜け出す方法を様々な最適化手法が提供してくれています。それらについては
ここでの紹介が大変参考になります。