ゼロから作るDeep Learning(19日目)
こんにちは、筋肉めがねです。
本当に困っている時に、大勢の人々に助けて頂くと、とても良い気持ちになりますね。という経験をしたのでシェアしようと思います。
とある国に出張に行ってきたんですけれども、その時の往路の際に気持ちの良い体験をしました。フライトは朝9:50、フランクフルト発だったので、8:00頃に家の近くでタクシーに乗り、8:30頃空港に着いたんです。荷物のチェックインを済ませ、セキュリティチェックの列に並んだのが8:40分頃、ながーいながーい列に唖然としましたが、時間に余裕があったので、悠々としておりました。セキュリティチェックを終えたのが、9時頃、搭乗時刻が9時15分であったため、早歩きで行き、間に合うだろうと、歩いて3分、見えてきたのはパスポートコントロール前の長蛇の列でした。おっとこれはヤバいぞと周りを見渡してもここはドイツ、長蛇の列の中から優先して搭乗すべき人を探してケアしてくれるような係員はいません。列を整備している係員が唯一1人いたので、彼に助けを求めますと、"unfortunatelly, there is no priority lane, you have to be in the queue"との事。僕は、"...ooohh...seriously..."と返すのが精一杯。そんな僕を見ていた彼が一言、"you have to ask people by yourself"。この一言が僕に勇気をくれました。迷う事無く、人々を囲んでいるポールの外側から最前列の人にアプローチし、状況を説明しました。すると、"yeah, but we have also boarding time at 9:20"と。"....."、返す言葉がなく、立ちすくんでいると、"but, of course you can come"と。。。。ありがとう!thank you so muchでございます。
人々の好意に助けられた素敵な出張の始まりとなりました。
それでは、本日も「ゼロから作るDeep Learning」を進めていきましょう。
本日は6章です。6章ではニューラルネットワークの「学習」フェーズにおける様々な手法を紹介しております。
「学習」とは、「合ってなさ加減」を最小化する、という事でした。現時点でのニューラルネットワークの出力が、教師データに対してどれだけ適合していないのか、どれだけ一致していないのか、という事を表す損失関数を最小化する、という事でした。
そして、「学習」させる一つの方法として、勾配降下法というものを4章で学びました。本日は、勾配降下法が常に優れたメソッドではない、という事、そして勾配降下法が適切でないケースがあった時に、どのような手法を用いる事ができるのか、3つの手法を紹介しましょう。
勾配降下法を用いる事のできるケースは、盆地のある地点におけるベクトル(傾き)が盆地の一番低い地点を示している時なんです。例えば、以下のケースですね。この場合は勾配降下法が有効に機能します。
しかし、我々が最適化を行いたい世の中の事象は、常に上のグラフのような綺麗な分布になってはいないですよね。
例えば、本書で例としてあげている f(x, y) = 1/20 * x^2 + y^2というグラフの場合、グラフのある地点におけるベクトルは、(0, 0)の位置を指していない事がわかります。例として、(x, y) = (-10, -10)の地点(下のグラフにおける手前側の一番左上のポイント)における傾斜は、x軸方向への傾きはほとんどなく、y=0の地点へ向けて傾いている事がわかります。つまり、勾配降下法で勾配を求めると、ニューラルネットワーク自体が勾配を減らしていく、という過程において不必要なステップが発生してしまうんです。
そこで、勾配降下法以外の3つの手法、及び勾配降下法を用いて、「学習」時における「合ってなさ加減」がどのように更新されているか、検証しましょう。
先ずは、結果です。
各手法に対して、ラベルを二つづつ描画してしまっている事は、ご愛嬌という事で。
それで、結果については、SGD(勾配降下法)に対して一目瞭然で他の3種類の手法の方が、「学習」の早いフェーズで損失関数を小さくする、という事に優れている、という事が分かります。
それでは、他の3種類の手法とは何なんか。ざっくり説明をすると;
Momentum: 空気抵抗のある状態で、ボールをお椀の中に転がすイメージです。ボールが転がっている際に、勾配と同じ方向へ転がっている場合、重みパラメーターをそちらの方向へ更新しようとし、ボールの進行方向と勾配の向きが逆である場合、重みパラメーターを勾配とは逆の方向へ更新しようとします。
AdaGrad: 「学習」フェーズが進むにつれて、学習係数を減衰させる、という手法です。
Adam: MomentumとAdaGradの手法を組み合わせてものです。
という事です。
続いてコードです。
今回は、隠れ層が4層ある5層の、そして入力ノード784個、出力ノード10のニューラルネットワークを用いて、検証しました。結果はAdaGradの手法が一番早い段階で損失関数を小さくできる、という事が観察できたわけですが、これは学習係数のハイパーパラメーターや、ニューラルネットワークの構造によって結果が変わります。
それでは、本日は以上でございます。