SciPyで最適化

Deep learningのRBMやAutoEncoderの数式は分かったので、Pythonで実装してみようと思ってSciPyから始めることにします。

非線形最適化と3Dプロットを試してみました。ソースコード。緑の点が初期値、赤の点が最適化結果。緑の4点のぶんだけ最適化関数を試しました。いくつか局所解にハマってますね。

SciPyはニュートン法のような関数の勾配を与える方法だけでなく、勾配情報なしで純粋に関数だけで数値的にやるBFGS法とネルダーミード法というのがあるらしい。BFGSは疑似ニュートン法といって勾配情報を自前で作り上げて動かす方法、ネルダーミード法というのはちょっと変わっていて、三角形をパタパタとひっくり返したり伸び縮みさせたりして尺取虫風に最適な方面に歩いていく方法。

ニューラルネットの重み推定には最尤法を使うそうですが、それはには尤度関数の微分偏導関数)を求めて勾配法でやるらしいので、SciPyよりも尤度関数の数式自体を記号微分してくれるライブラリtheanoを使うのが便利らしい。

とりあえずもろもろ出来たらまたシェアします。