はじめに
本記事は、京都大学人工知能研究会KaiRAのAdvent Calender 17日目の記事です。
皆さんこんにちは、早速ですが勾配法はご存じでしょうか?
勾配法とは、関数の勾配を用いた反復法で関数の最小値を求める手法です。
イメージとしてはお椀の端に球を置くとコロコロとお椀の中央の方に転がっていくようなイメージですね。
もう少し厳密な話をすると、$\nabla f$が関数$f$を最も大きくする方向だから、$-\nabla f$方向に点を更新していきますよっていう話です。
初めて勉強するときには疑問に思ったりしませんでしたか?
$\nabla f$が関数$f$を最も大きくする方向になってるのは何故か、と。
疑問を感じたものの放置していたり、1次元の時の説明で満足していたりしないでしょうか?
実はこの疑問、大学の微分積分学の知識が少しあれば簡単に解決できてしまいます!
今日はこの疑問について掘り下げていきたいと思います!!
(この話は私がKaiRAではしょっちゅうしているので、KaiRAの人にとっては耳にたこができるほど聞いてる話かもしれません。しかし、その場できちんと証明を説明していることはほぼないので、もしかしたらKaiRAのメンバーにとっても役に立つかも??)
前提
- ユークリッド空間$\mathbb{R}^n$は知っているものとします
- ベクトルの内積は知っているものとします
- 偏微分は知っているものとします
- 多変数関数におけるchain ruleは知っているものとします(高校数学で言うところの合成関数の微分)
これだけの知識があれば理解することは可能です。
本題
$f:\mathbb{R}^n \to \mathbb{R}$を$C^1$級関数とします。
($C^1$級関数とは、どの方向にも偏微分が可能で偏導関数が連続になる関数のことです。十分になめらかな関数ということですね。もしも$C^1$級関数が分からなくてもこの先問題ないです。)
ディープラーニングの文脈では$f$は損失関数だと思ってください。
ここで、偏微分の拡張として、新たに方向微分というのを考えます。
点$x \in \mathbb{R}^n$における$v \in \mathbb{R}^n$方向の方向微分$D_x f(v)$とは、
D_x f(v) = \lim_{t\to 0}\frac{f(x+tv)-f(x)}{t}
のことです。
$D_xf$にベクトル$v$を渡すと、点$x$におけるベクトル$v$方向の微分が返ってくるわけですね。
イメージ的には人が今$x$にいて$v$方向に歩こうとしたら$v$方向はどれぐらいの坂になっているのかが分かる感じです。
後で証明しますが、実は、
D_x f(v) = \nabla f(x)\cdot v = \frac{\partial f(x)}{\partial x_1}v_1+\cdots+\frac{\partial f(x)}{\partial x_n}v_n
が成り立ちます。
ただし、
\nabla f(x) = \left(\begin{array}[c]\\
\frac{\partial f(x)}{\partial x_1}\\
\vdots\\
\frac{\partial f(x)}{\partial x_n}
\end{array}\right)
で$\cdot$はベクトルの内積を表します。
ここで現れた$\nabla f(x)$が勾配と呼ばれる量です。
直観的には、点$x$からベクトル$v$方向への坂の大きさは、$v$を$x_1, x_2, \cdots, x_n$方向に分解して$v_1, \cdots, v_n$の大きさに応じて$\frac{\partial f(x)}{\partial x_1}, \cdots,
\frac{\partial f(x)}{\partial x_n}$の重み付き和を取ったものになっていることをこの命題は表しています。
一旦この命題が成り立つとして議論を進めてみましょう。
このとき、点$x$における方向微分$D_x f(v)$が最大になるようなベクトル$v$の方向はどちらでしょうか?
実は$\nabla f(x)$方向です。なぜなら、$\nabla f(x)\cdot v$が最も大きくなるような$v$の方向は、内積の性質から$v$が$\nabla f(x)$方向を向いているときだからです。
ということで、$\nabla f(x)$が$f$の方向微分を最も大きくする方向であることが分かりました!
$\nabla f(x)$が点$x$における"勾配"が最も大きくなっている方向のわけですね!
上の命題の証明
上の命題の証明も簡単です。
明らかに
D_x f(v) = \lim_{t\to 0}\frac{f(x+tv)-f(x)}{t}=\lim_{t\to 0}\frac{f(x_1+tv_1,\cdots,x_n+tv_n)-f(x_1,\cdots,x_n)}{t}
で、
微分の定義より、
D_x f(v) = \frac{df(x_1+tv_1,\cdots,x_n+tv_n)}{dt}
です。
そこで、chain ruleより、
\begin{equation}
\begin{aligned}
D_x f(v) &= \frac{df(x_1,\cdots,x_n)}{dx_1}\frac{d(x_1+tv_1)}{dt}+\cdots+\frac{df(x_1,\cdots,x_n)}{dx_n}\frac{d(x_n+tv_n)}{dt}\\
&=\frac{df(x_1,\cdots,x_n)}{dx_1}v_1+\cdots+\frac{df(x_1,\cdots,x_n)}{dx_n}v_n\\
&=\frac{df(x)}{dx_1}v_1+\cdots+\frac{df(x)}{dx_n}v_n
\end{aligned}
\end{equation}
となって、命題が示せました。
終わりに
$f$の勾配を最大する方向が$\nabla f$方向であることを示してきました。
僕はディープラーニング系の本ではこのような説明をほとんど読んだことが無いのですが、実は結構簡単に示せるのに読んだことが無いのは不思議です。
初心者向けの本に書いてもいいのではないかと思ったり…
誤差逆伝搬法でもchain ruleが必要ですし、この内容を勉強するのにディープラーニングを勉強する人たちにとっても前提知識は十分のように感じます。
なお、僕はこのネタは杉浦先生の解析入門 Ⅰで初めて知りました。