
信号処理素人老人がScilabの「信号処理のデモ」脱出。「最適化とシミュレーション」のデモに入ってます。前回は「傾きのある楕円」のフィッティングでした。今回は「バナナ(Rosenbrock)」関数の最適化です。最適化アルゴリズムのベンチマークとしてよく使われる(収束させるのが一寸難しい)関数らしいです。
※「手習ひデジタル信号処理」投稿順 Indexはこちら
※Windows11上の Scilab2024.0.0を使用させていただいております。(Scilabについては御本家 Scilab 様へ)
Rosenbrock
今回「鑑賞」させていただくScilabのデモは、Rosenbrockです。以下のデモ選択画面から起動できます。
モグリなお惚け老人は、今日の今日までRosenbrock関数について存じ上げておりませんでしたです。最適化アルゴリズムのベンチマークとしてよく使われる非凸な関数みたいです(例によってGoogleの生成AI、Gemini様の受け売りっす。)「バナナ関数」とも呼ばれるみたい。
なぜ「バナナ」かというとそのプロットの中に「バナナ型」の谷が現れるためのようです。Gemini様いわく「この谷を見つけるのは容易ですが、谷の底にある大域的最小値 へ収束するのは難しい」のだそうです。谷の形を眺めるのにピッタリのYouTube動画がありました。『AlphaOpt』様の以下です。
ただし、この動画はMatlabを使って同様なことをされている動画になります。こちらはScilabでやるんだけれども。
また、「最適化って何?」から始まって、その難しさとアルゴリズム、ベンチマーク関数についてなど、『@tomitomi3』様の以下のページが大変勉強になりました。あざ~す。
optim関数
さて、Rosenbrock関数の最適化に使われるScilab関数が、optim関数です。モロお名前からして最適化ね。今回の「非線形非制約最適化問題」も一撃で解いてくれます。解説ページが以下に。
https://help.scilab.org/docs/2026.0.0/ja_JP/optim.html
今回のデモのスクリプトを拝見すると、optim関数をデフォのままつかってます。
準ニュートン法のBFGSアルゴリズム
を使って解いているみたいです。準ニュートン法(Quasi-Newton method)についてまた受け売りすると「勾配降下法よりも速く、ニュートン法よりも計算コストが低い」のだと。要は純粋ニュートン法で必要になるヘッセ行列とかメンドイあれやこれやを「誤魔化して」簡略化しているらしいです。知らんけど。なお、BFGS(Broyden-Fletcher-Goldfarb-Shanno)アルゴリズムは、「準ニュートン法の更新公式の中で、現在実用上最も優れている」のだとか。ううむ、受け売りばかりだな。
なお、解説ページに曰く、このデフォが適用可能な数値範囲に制約あり、1行引用させていただくと
The “qn” cannot be used if size(x0)>46333.
だそうです。46333を二乗すると32ビット符号付整数のほぼほぼ上限となります。その辺に限界があるみたい?ムツカシー。
実行結果
位置 x = 1 1というのは、(2次元なので)縦横の座標とも 1.0 ってことね。その時の値 f は0っと。まあ、期待通りの結果ではありますが、ほんと地味。