終了条件

数学的には,滑らかな関数の極小値についての十分な条件は極めて分かりやすい.でヘッセ行列が正定値行列ならば, が極小値となる(ヘッセ行列が半正定値行列であることは必要条件である).根に関する条件はさらに簡単である.しかし,その値がせいぜいある程度の精度までしか分かっていないコンピュータ上で関数 を計算しており,実質的にかなり限られた回数の評価しかできない場合,探索が最小値あるいは根に十分近付いた時点を判断し,有限の許容誤差までの解を計算するためには誤差推定を使う必要がある.ほとんどの場合,このような推定で十分だが,場合によっては関数の未解決な微細動作のために,誤差が生じることがある.

許容範囲は探索が終了するまでに,検索が根や極小値にどのくらい近付こうとするかに影響を及ぼす.通常数値を使って計算された場合に見られることだが,関数自体に何らかの誤差が含まれると仮定すると,使っている数の精度の半分以上の精度で最小値の位置を突き止めるのは不可能なのが一般的である.これは,極小値の二次的性質によるものである.放物線の底付近では最小値から移動する際の高さの変化が非常に緩やかである.このため,関数に何らかの誤差ノイズがあると,そのノイズの平方根にほぼ等しい幅に渡って放物線の実際の上昇が隠されてしまうのが一般的である.これは例題を見るとよく分かる.

いくつかのユーティリティ関数を含むパッケージをロードする.
In[1]:=
Click for copyable input
次のコマンドは,次第に範囲を狭めながら関数の最小値を示す一連のプロットを表示する.機械数で計算された曲線は黒で,100桁精度で計算された実際の曲線は青で示される.
In[2]:=
Click for copyable input
Out[2]=

一連のプロットから,機械数のほぼ半分かあるいはそれ以下である次数の変化で,関数の誤差が最小値付近の実際の曲線を隠してしまっているのが明かである.この精度で関数のサンプルを見ただけでは,与えられた点が許容範囲近くの関数の極小値の値であるかどうかを確認する術はない.

導関数の値は,記号的に計算された場合には,信頼性がずっと高くなるが,一般には,導関数の値だけに頼るのは十分ではない.探索では,導関数が一般に許容範囲を満足するほど小さいような関数の極小値を求める必要がある.関数の記号的導関数が計算できず,有限差分や導関数を使わない方法を使った場合,解の確度はより低下する可能性があるので注意が必要である.

根の探索もこれと同じ関数の不正確さの影響を受けることがある.一般にそれほど激しくではないが,誤差推定の中には二次型のメリット関数に基づいているものがある.

このような制約のため,関数Findのデフォルトによる許容範囲はすべて,最終的な作業精度の半分に設定されている.関数にどれほどの誤差があるのかにより,これが到達できる場合もあればできない場合もある.しかしほとんどの場合,これは合理的な目標である.AccuracyGoalオプションとPrecisionGoalオプションを使うと,許容誤差を調整することができる.AccuracyGoal->agPrecisionGoal->pg であれば,許容範囲が と定義される.

FindMinimum を与えると,となるような値 を求めようとする.もちろん,最小値の厳密な位置 は分からないので,は推定される.これは通常過去のステップと導関数の値に基づいて行われる.導関数の条件を最小にするために,追加的な必要条件 が加えられる.FindRootでこれに相当する条件は,根において残差が小さくなるというである.

以下では,が少なくとも12桁精度であるか,の許容範囲内に収まることが分かる.目標精度のを意味しているので,式に影響は与えない.これと同じように目標確度をとすることはできない点に注意する.これは常に残差の大きさに使われるからである.
In[3]:=
Click for copyable input
Out[3]=
これは,結果が要求した許容誤差を満足したことを示している.
In[4]:=
Click for copyable input
Out[4]=
以下は,関数の最小値を8桁確度まで求めようとする.プロットに見られるように,関数内の誤差のためにFindMinimumは警告メッセージを出す.
In[5]:=
Click for copyable input
Out[5]=
最小値における値は基本的に機械イプシロンであるが,位置は次数程度までしか見付からないことを示している.
In[6]:=
Click for copyable input
Out[6]=

複数次元では状況がより複雑になる.これは,Freudenstein Roth問題の例におけるように,最小値が比較的狭い谷で見付かった場合等では方向によって誤差にばらつきがあるためである.このような探索の場合はよく探索のパラメータがスケールされ,これが誤差推定に影響を及ぼす.しかし,これにも関わらず,最小値の二次形式が現実的に到達し得る許容範囲に影響を与えるのが一般的である.

根あるいは最小値をデフォルトの許容範囲を超えて求めたければ,最終的な作業精度を上げる必要があるかもしれない.これにはWorkingPrecisionオプションを使う.WorkingPrecision->prec とすると,探索は初期値の精度で始り,探索が収束するにつれて prec になるまで適応的に大きくなる.デフォルトではWorkingPrecision->MachinePrecisionとなっているので,機械数が使われる.これだとずっと速い.精度を上げるとかなり時間がかかるようになるが,関数が適切に定義されていればはるかに正確な結果が得られる.非常に高精度の解の場合はニュートン法を勧める.ニュートン法の二次収束率が,最終的に必要なステップ数を大幅に減らすからである.

WorkingPrecisionオプションの設定値を大きくしても,関数の定義に低い精度の数が使われている場合は意味がないことは記憶しておいた方がよい.一般にWorkingPrecision->prec が効果的になるためには,関数の定義に使われた数は厳密数であるか,少なくとも精度が prec でなければならない.可能であれば,関数に含まれる数の精度は,収束するように,SetPrecisionを使って人為的に prec に上げるとよいが,これは常に可能な訳ではない.いずれにせよ,関数と導関数が数値的に評価されると,内部演算が prec 桁精度で実行できるよう,必要に応じて結果の精度は prec に上がる.それでも,根また最小値の実際の精度・確度およびその位置は,関数の確度によって限定される.このことは,FindFitで精度までしか分からないデータを使うときに,特に注意しなければならないことである.

機械数を使って定義された関数である.
In[7]:=
Click for copyable input
作業精度を高くしても,プロットで示されるのと同じエラーが実際の関数にあるため,最小値はうまく解けない.導関数は,前述のように機械精度での計算と矛盾のないよう指定された.
In[8]:=
Click for copyable input
Out[8]=
関数が機械数を持たないときに,20桁精度で計算を行う.
In[9]:=
Click for copyable input
Out[9]=

WorkingPrecision->prec と指定して,AccuracyGoalPrecisionGoalオプションを明示的に指定しない場合,Automaticのデフォルトの設定は,AccuracyGoal->prec/2PrecisionGoal->prec/2となる.これにより,前述の通り,一般に現実的に期待できる最小の許容誤差が導かれる.

AccuracyGoalPrecisionGoalオプションの設定を明示的に指定せずに,50桁精度で計算を行う.
In[10]:=
Click for copyable input
Out[10]=
最小値の値は,デフォルトの25桁の許容誤差よりも実際にずっとよいことが分かる.
In[11]:=
Click for copyable input
Out[11]=

以下の表は,精度および確度に影響するオプションの要約である.

オプション名
デフォルト値
WorkingPrecisionMachinePrecision使用する最終作業精度 prec.精度は prec と初期条件の精度のうち小さい方から始まり,prec まで適応的に増加する
AccuracyGoalAutomatic設定 ag により絶対許容誤差を決定する.Automaticのときである
PrecisionGoalAutomatic設定 pg により絶対許容誤差を決定する.Automaticのとき である

関数の精度・確度オプション

場合によっては,探索がゆっくりと収束することがある.遅い探索が無限に続くのを防ぐために,Findコマンドには終了までに許される最大反復回数(ステップ)が付いている.これはオプションMaxIterationsで制御でき,デフォルト値はMaxIterations->100である.この条件により探索が終了したときは,コマンドによりメッセージが表示される.

以下でOptimization`UnconstrainedProblems`パッケージのBrown-Dennis問題を取り出す.
In[12]:=
Click for copyable input
Out[12]//Short=
関数が平方和なので,デフォルトのLevenberg-Marquardtメソッドで問題を解く.
In[13]:=
Click for copyable input
Out[13]=

Levenberg-Marquardtメソッドはこの問題でゆっくりと収束している.それは,残差が最小値付近で非零であり,ヘッセ行列の二次形が必要とされるためである.このメソッドは最終的に400ステップ未満で収束するが,収束の速いメソッドを使った方がよいだろう.

In[44]:=
Click for copyable input
Out[44]=

大規模計算では,反復限界に達したときに,別のメソッドとともに返されることのある最終探索点を,探索続行の初期条件として使うことができる.

New to Mathematica? Find your learning path »
Have a question? Ask support »