勾配降下法で最小値が見つかる理由を数式と視覚でわかりやすく解説
多変数の最小二乗法は簡単には解けない
説明変数が一つしかない最小二乗法では、Excelでいろいろな解法がありました。
>> 【6つもあった!】Excelで単回帰分析の最小二乗法を解く解法をすべて実演
しかし多変数になってくると、このように簡単には求まりません。
そのため、コンピュータでパラメータを少しずつ変化させながら解を探すアルゴリズムがいろいろと開発されています。
中でも有名なのは勾配降下法です。
今回は、この勾配降下法が最小二乗法とどう関係しているのかということから出発し、その原理を視覚的に理解した上でExcelで実践してみます。
3変数以上の最小二乗法は勾配降下法で解く
説明を簡単にするために、説明変数が1つだけの場合を想定します。
説明変数をx、目的変数をyすると、予測式は次のように書けます。
y=ax+b
通常xとyの観測データの組が多数ありますので、それらをxi、y iとすると、
y i =axi+b
の式がデータの数だけできることになります。
そして、一番当てはまりの良いaとbを求めます。
そのための方法が最小二乗法で、残差平方和である
Σ(y i -(axi+b))2
が最小になるようなaとbを求めるのでした。
この式を展開するとaとbについての二次関数になります。
(xiとy iはすべて定数になるため)
つまり、
f(a,b)=β0+β1a2+β2a+β3b2+β4b
と書けます。
このf(a,b)を最小にするようなaとbを求めるのが最小二乗法です。
では、説明変数が2つになるとどうなるでしょうか?
説明変数をx1、x2とすると、
y=ax1+bx2+c
となるa、b、cを求める問題になりますので、f(a,b,c)の二次関数を最小化するようなa、b、cを求める最小二乗法の問題になります。
つまり説明変数がn個になると、n+1個の変数を含む二次関数の最小値を見つける最小二乗法の問題になります。
変数が1つの場合に二次関数の最小値を求めるやり方は、高校で習っていますね。
変数が2つの場合に二次関数の最小値を求めるやり方については、こちらで解説しました。
【6つの方法を実演!】Excelで最小二乗法を計算する方法をわかりやすく
変数が3つ以上になると難しいので、勾配降下法を使いましょうということです。
勾配降下法のアルゴリズム
任意の点から最小値に少しずつ近づかせるアルゴリズム
変数が3つ以上では勾配降下法を使いましょうといっておきながら、説明を簡単にするために変数が2つの場合で説明します。
次のような二次関数を例にとります。
f(x,y)=x2-2x+3y2-12y
この式ではx=1、y=1ではf(x,y)=-10のように、xとyの値が決まるとf(x,y)が決まるので、グラフに描くと次のような3次元のグラフになります。
最小二乗法では下図のように、グラフの底とその時のxとyの値を求めたいわけです。
グラフの底がf(x,y)の最小値ということです。
これを勾配降下法で解くには、まず適当なグラフ上の1点を決めます。
そして、その点の傾きを調べると、常に傾きと逆方向に底があるはずなので、その方向に少しずつ点を動かしていくのです。
任意の点における傾きを偏微分で求める
例えば、次のような位置に点があるとしましょう。
この図ではどちらの方向に底があるのかは明確です。
でも、いつもこのようにグラフを描いて調べるのは面倒ですし、変数がこれ以上増えるとそもそもグラフが描けません。
(人は4次元の世界は見れないから)
その代わりに、その点での傾きを調べるのです。
まず、このグラフを真正面から見てみましょう。
すると、左右方向にx軸、高さ方向にz軸が見えます。
y軸は奥行き方向で見えません。
そしてグラフを見ると、下に凸の放物線に見え、点は左のグラフ上にあります。
ここの傾きは負ですので、x方向にはプラス方向に点を少し移動させます。
次に、グラフを左側から見てみましょう。
すると、左右方向にy軸、高さ方向にz軸が見えます。
x軸は奥行き方向で見えません。
そしてグラフを見ると、下に凸の放物線に見え、点は左のグラフ上にあります。
ここの傾きは正(y軸は左方向が正であることに注意)ですので、y方向にはマイナス方向に点を少し移動させます。
このようなことを地道にやっていくと、始めに選んだ点が適当であっても底に向かって進んでいけますね。
では、どのようにしてx方向とy方向の傾きを計算するのか?
それが偏微分です。
偏微分は名前は難しそうですが、それぞれの変数について微分するだけです。
このグラフの関数は
f(x,y)=x2-2x+3y2-12y
でした。
xとyの2つの変数がありますが、まずxで偏微分してみましょう。
この場合はx以外はすべて定数と見なします。
つまりyは定数と見なします。
すると、
2x-2
ですね。
次にyについて偏微分する時には、xを定数と見なします。
すると、
6y-12
ですね。
f(x,y)のxでの偏微分は記号で∂f(x,y)/∂x、yでの偏微分は∂f(x,y)/∂yと書くので、
∂f(x,y)/∂x=2x-2
∂f(x,y)/∂y=6y-12
と書きます。
この偏微分が、それぞれの方向の傾きを表します。
例えば(10,10)の点のx方向の傾きは
∂f(x,y)/∂x=2x-2=18
y方向の傾きは
∂f(x,y)/∂y=6y-12=48
となります。
傾きと逆方向に点を少しだけ移動させることを繰り返す
後は、この傾きと逆方向にどれだけの距離を移動させるかを決める必要があります。
傾きが大きいほど大きく移動させるべきということは直観的に分かりますので、傾きにある係数を掛けた値だけ逆方向に移動させます。
この係数のことを学習率といっており、通常0から1までの値にします。
学習率を決める式などはなく、自分でエイヤで決めます。
例えば0.1と決めた場合には、(10,10)の点からはx方向に-1.8、y方向に-4.8移動させ、(8.2,5.2)が新しい点の位置になります。
そして、再度傾きを計算すると、x方向の傾きは
∂f(x,y)/∂x=2x-2=14.4
y方向の傾きは
∂f(x,y)/∂y=6y-12=19.2
となりますので、x方向に-1.44、y方向に-1.92移動させ、新しい点は(6.76,3.28)になります。
これを延々と繰り返していけばグラフの底、つまりf(x,y)の最小値が求まるのです。
勾配降下法をExcelに実装してみる
それでは、このアルゴリズムをExcelで試してみましょう。
関数は
f(x,y)=x2-2x+3y2-12y
をそのまま使います。
すると偏微分は
∂f(x,y)/∂x=2x-2
∂f(x,y)/∂y=6y-12
で、学習率は0.1とします。
最初に決める適当な点(初期値)はx=y=10としました。
Excelシートに入力すると、次のようになります。
これを40回繰り返すと、x=1、y=2に収束して、その時f(x,y)=-13になりました。
グラフにすると収束していく様子がよく分かります。
グラフで点が転がり落ちる様子を視覚化する
更に3Dグラフで見てみると、初期値の(10,10)から出発して、(1,2)まで転がり落ちていく様子がもっとよく分かります。
興味深いことに、一直線には転がり落ちていませんね。
これは遠回りをしているのではなくて、これが本当の最短距離なのです。
(10,10)の点でボールから手を離すと、この軌道でボールは転がり落ちます。
なぜなら、それぞれの点において一番傾きが急な方向に点を動かしているからです。
このように勾配降下法では最短距離で底に辿り着けるため、最急降下法とも呼ばれているようです。
こちらでも更に詳しく解説しています。
【最急降下法とは?】Excelを使って具体例を計算する過程をお見せします