"0"からAI~ふらっとどうぞ~

自分は独学でゼロからAIについて学んでいる学生です。このブログは主にAIやネットワークの基本を理解できるようにブログという形で分かりやすくアウトプットしたものです。AIについて学びたいなと思っている方。ぜひこのブログで勉強して見てください!またある程度AIについて知識がある方も何かをを得るヒントにしてくてくれれば幸いです。Twitterアカウントもあるので是非フォローお願いします!

手探りで最適解を。勾配降下法


こんにちは。今日も張り切っていきましょう。

本日は勾配降下法についてお話ししていきます。

 

~今日の内容~

 勾配降下法とは?

勾配降下法の問題点と改善方法

参考文献

引用サイト・画像

勾配降下法とは?

機械学習でもディープラーニングでも同じでネットワークの学習の際の計算は

正解データと実際の予測値から得られた誤差を最小にすることが基本です。

(その誤差を得る方法もいくつかあるのですが、今回は割愛させていただきます。)

その誤差をどのように無くすかがポイントになってきます。

機械学習の場合、その方法として数学的にアプローチして解決させます。

 どんな方法かと言うと・・

得られた誤差を誤差関数として定義してその誤差関数を最小化することで

誤差をなくしていきます。ここで皆さんに質問です。

「関数の最小値はどうやって求めるか?」

 

なんだか覚えてますか??高校でやっているはずですよ・・

それは微分です。微分を使うことで関数の最小値を求めることができました。

ニューラルネットワークでも同様で各層のパラメーターで誤差関数を微分して

最小値になるようにパラメータを調整すればいいのです。

 

しかしだ

ニューラルネットワークを利用したディープラーニングが扱うデータは

多次元(とても複雑)で、微分してパッと最小値を求めたいけどそう上手くいかない。

例えば単純な「y=x^2」みたいな誤差関数になればいいが

モデルのパラメータである重みは一種類だけではないので

どの重みを調整すればいいのか混乱してしまう(=x以外にも変数が多くあるので

ちんぷんかんぷんになる。)

 

モデルによって誤差はそれぞれ変化しているし、どんな関数になるのかも

検討がつかないのです。ではどうするのか??

ここで考えられたアプローチが

勾配降下法なのです。

 

勾配降下法とは勾配(=接戦の傾き)に沿って降りていき最適解を求めるの手法です。

勾配というのは誤差関数の微分の値でパラメーター(重みやバイアス)を更新しながら

勾配を求めて少しづつ最小になる点を求めて行くのです。

 

つまりニューラルネットワークの学習は地道に勾配降下法を用いて繰り返し計算を行い

最適解を手探りで探して行くのです。

当然手探りで最小値を見つけるわけですから学習に時間を要してしまいます。

 

またバックプロパゲーションは勾配降下法によるパラメーターの調整を

出力層から入力層へ誤差が伝播する形で行う手法のことです。

 

「手探りで隈なく探すのだからこれで最小値が求められるんだ」

と思ったそこのあなた。まあそんなうまくいかないんですね・・・

次に勾配降下法の問題点といきましょう。

 

勾配降下法の問題点・改善方法

問題点1 適切な解が得られないかもしれない。

少しづつパラメータを調整して、勾配を求めて最適解を求める勾配降下法。

本当はその誤差関数の中で最小の値を見つけたいのですが、関数の性質によっては

見つけられない場合があります。例えばこんな関数です。

f:id:zawapython:20190226170023p:plainこんな誤差関数があるとしましょう。

見て分かるようにこの関数の最小値は赤色の点ですよね。

しかし黒い点から探索を始めてしまうと途中で青色の点にたどり着きます。

そうすると青色の点が最適解だと認識してしまい青色の点を最小値と誤解

してしまうのです。

このような青色の点を局所最適解赤色の点を大域最適解と言います。

勾配降下法では誤差関数の局所最適解なのか、大域最適解なのか

見抜くことができないのです。

 

ではどのように対策するのか??それは

学習率」の値の設定を大きくすることです。

学習率というのはめっちゃ簡単に言うと一度にどれだけ点を動かすか?と言うもの

この値を大きくすれば一度に点を大きくずらせるので局所最適解に一度ハマっても

抜け出しやすいと言うものです。ただし、学習率を大きくしすぎると大域最適解を

逃してしまうので適切なタイミングでの学習率の調整が必要です。

 

問題点2 鞍点から抜け出せない

 

鞍点とは「ある次元から見ると極大で、別の次元から見ると極小になる点」

のことを言います。

「どんな点だよ・・」と思った方。馬の鞍を想像して見てください。

f:id:zawapython:20190228104302j:plain

乗馬するときに敷いてるやつ

 

鞍をもう少し簡単に図示して見ると・・こんな感じです。

f:id:zawapython:20190228105756p:plain

鞍を単純化した

 鞍点というのは上の図を赤色の点を指します。というのも赤色の点ではある見方を

すれば極小値となる点であるし、別の見方をすれば極大値となる点だからです。

f:id:zawapython:20190228111139p:plain横から見ると極小値となるし

 

f:id:zawapython:20190228111320p:plain正面から見ると極大値になっている。

理解できたでしょうか?(絵が下手ですみません)一度鞍点に入ってしまうと鞍点

のところは勾配が緩やかなので抜け出すことができなくなってしまいます。

この状態をプラトーと言います。

ディープラーニングではより次元数がとても大きいのでより鞍点に入りやすいのです。

 

では鞍点を回避するのにはどうすればいいのでしょうか?

注目するのは先ほどと同じく「学習率」なのですが、それに加えて

どの方向に進んでいるときに学習率を大きくするべきか考える必要があります。

 

参考文献

深層学習教科書 ディープラーニング G検定(ジェネラリスト) 公式テキスト

はじめてのディープラーニング -Pythonで学ぶニューラルネットワークとバックプロパゲーション- (Machine Learning)

ディープラーニング (やさしく知りたい先端科学シリーズ2)

 

引用サイト・画像

www.photo-ac.com

ja.wikipedia.org

 

 



 

当ブログはAmazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、Amazonアソシエイト・プログラムの参加者です。