最急降下法について
まぁ探せばでてくるのだけど、まとめて書いておく。
準備
ちゃんとした定義は位相の本とか最適化の本とか参照してほしい。
無制約最適化問題
無制約最適化問題(unconstrained optimization)とは関数の最小解を求めるような問題:
のことをいう。 要は関数の最小値を求めたいという問題。
近傍
点の近傍(neighborhood)とはを含むような適当なまとまった集合のことをいう。 例えば点を中心とするような球とか点を中心とするような円などが近傍となる。
局所最小解
局所最小解(local minimum)とはの近傍が存在して
を満たすことをいう。 感覚としてはあるまとまった範囲内で関数を最小化するような解のことをいう。
大域最小解
局所最小解の定義にでてくる近傍を全体集合であるにしても成立するような解のことを大域最小解(global minumum)という。 この解を探すのは広大な無限の空間から探してくるのでかなり難しいが、この解が満たしている性質がある。 それは微分してとなるところという性質。 高校とかでやった二次関数の最小値を求めるやり方を思い出してもらえればいい。 しかし、この性質では大域最小解のみを探すことはできない。 なぜならば、これは局所最小解も満たすし、大域最小解でも局所最小解でもない鞍点と呼ばれる点もこの性質を満たすことになるからだ。 しかも、二次関数のように単純な関数は現実世界ではほとんどでてこないし、そんな関数は全ての関数のごく小数にすぎない。 しかし、現実には局所最小解をもとめられればいいということも多いと思う。 今回紹介する最急勾配法でも大域最小解を求めるのではなく、微分したところがとなるところを探すアルゴリズムとなっている。
原理
谷を降りていくところを想像しよう。 谷底に辿り着くには谷を降りていけばいいのだけど、最も速く谷を降りるには最も勾配が急なところを降りていけばいい。 この考えを関数の最小値を求めるのに利用したものが最急勾配法というのが直感的な考え方となる。 しかし、一般には関数という谷における最急勾配からどれほど進めばよいのかを決めるのは難しい。 最急勾配からどれだけ移動すればよいのかを決める方法はいくつか提案されていて、ここではそのうちいくつか触れるが、詳しくは各自で探してほしい。
アルゴリズム
最急勾配法のアルゴリズムはもの凄く単純。 以下がアルゴリズムの全体像。
入力: 関数とその微分に初期点
- とする
- が最適解に十分近ければ終了
- 最急降下方向を求める
- とを用いて直線探索問題を解いて移動量を求める
- とする
- として 2. へ
たった6ステップで構成されている。 短いし、必要な情報も解きたい関数とその微分だけでいい。 初期点はランダムに生成してもかまわないが、選んだ初期点によっては鞍点が求められてしまう場合もある。
直線探索問題
しかし、アルゴリズムにおいて 4. で解いている直線探索問題を解くのは一般に難しい。 ではどうするのかというと
- 2分割法
- セカント法
の2つで近似的に解を得ることが多い。
2分割法
アルゴリズムは単純。
入力: 関数、初期値、停止基準
- とする
- 停止基準が満たされたいたら終了
- とする
- として1.へ
この停止基準としてはよく使われるものとして、
となるを採用するというArmijoの基準 が使われる。 はを満たしていればいい。 他にはWolfeの基準があるが、ここでは扱わない。
セカント法
の微分が簡単に計算できる場合に使用されることがある。 アイデアとしては目的関数であるを二次近似:
する。 この関数の最適解はで、もし等号が成立していれば、
が成立する。 を代入してを求めれば、
となるので、これをとするのである。 具体的には
入力: 関数とその微分、および初期値、停止基準
- とする
- 停止基準が満たされていれば終了
- とする。
- として 2. へ
停止基準は2分割法と同じようにArmijo基準などを使用すればいい。
補足
最急勾配法はアルゴリズムが非常に単純なのだけど、収束がわりと遅い。 もし、関数がさらにヘッセ行列までもとめられるならNewton法というアルゴリズムを利用する方が2次収束するのでより速く収束する。 ただこのアルゴリズムの利点としては微分までしか利用しないのと、アルゴリズムが非常に単純であるところにあるのだと思う。