【Excelでわかりやすく】勾配降下法で最小値が見つかる理由を視覚的に理解する

2021年9月8日

説明変数が一つしかない最小二乗法では、Excelでいろいろな解法がありました。

>> 【6つもあった!】Excelで単回帰分析の最小二乗法を解く解法をすべて実演

 

しかし多変数になってくると、このように簡単には求まりません。

そのため、コンピュータでパラメータを少しずつ変化させながら解を探すアルゴリズムがいろいろと開発されています。

中でも有名なのは勾配降下法です。

 

今回は、この勾配降下法が最小二乗法とどう関係しているのかということから出発し、その原理を視覚的に理解した上でExcelで実践してみます。

 

最小二乗法との関係

説明を簡単にするために、説明変数が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=1y=2に収束して、その時f(x,y)=-13になりました。

グラフにすると収束していく様子がよく分かります。

 

更に3Dグラフで見てみると、初期値の(10,10)から出発して、(1,2)まで転がり落ちていく様子がもっとよく分かります。

 

興味深いことに、一直線には転がり落ちていませんね。

これは遠回りをしているのではなくて、これが本当の最短距離なのです。

(10,10)の点でボールから手を離すと、この軌道でボールは転がり落ちます。

なぜなら、それぞれの点において一番傾きが急な方向に点を動かしているからです。

 

このように勾配降下法では最短距離で底に辿り着けるため、最急降下法とも呼ばれているようです。

こちらでも更に詳しく解説しています。

>> 【例題をExcelでわかりやすく】最急降下法で単回帰の最小二乗法を解いてみる