手習ひデジタル信号処理(207) Scilab、{Scilabデモ}、バナナ関数最適化

Joseph Halfmoon

信号処理素人老人がScilabの「信号処理のデモ」脱出。「最適化とシミュレーション」のデモに入ってます。前回は「傾きのある楕円」のフィッティングでした。今回は「バナナ(Rosenbrock)」関数の最適化です。最適化アルゴリズムのベンチマークとしてよく使われる(収束させるのが一寸難しい)関数らしいです。

※「手習ひデジタル信号処理」投稿順 Indexはこちら

※Windows11上の    Scilab2024.0.0を使用させていただいております。(Scilabについては御本家 Scilab 様へ)

Rosenbrock

今回「鑑賞」させていただくScilabのデモは、Rosenbrockです。以下のデモ選択画面から起動できます。selectRosenbrock

モグリなお惚け老人は、今日の今日まで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ビット符号付整数のほぼほぼ上限となります。その辺に限界があるみたい?ムツカシー。

実行結果

デモの実行結果は地味、とても地味。RosenbrockResult

位置 x = 1 1というのは、(2次元なので)縦横の座標とも 1.0 ってことね。その時の値 f は0っと。まあ、期待通りの結果ではありますが、ほんと地味。

手習ひデジタル信号処理(206) Scilab、{Scilabデモ}、傾いた楕円? へ戻る

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です