不安定な浮動小数点計算を識別する方法は?


15

数値では、不安定なスキームを識別し、その安定性を改善できることが非常に重要です。不安定な浮動小数点計算を識別する方法は?

私は多くの数値スキームが連携する非常に複雑なシミュレーションに取り組んでおり、その弱点を特定するための方法論を探しています。私は微分方程式を含む物理モデルに取り組んでいます。プロセス全体の概観は次のとおりです。

  1. (準備手順)物理的観測Pを収集します。

  2. シミュレーションの初期パラメーターを決定します。この用途我々は、パラメータのパラメータ空間ルックで歩く最適化アルゴリズム、Cは、いくつかの誤差関数ように、E(F(C)、P)が最小化され、Fは、パラメータの一部由来の量です。

  3. シミュレーションエンジンのプラグC。これはEDPのオイラースキームであるため、各タイムステップで、動的を駆動する項を計算し(それぞれが複雑な関数であり、不安定になる可能性があります)、次を計算するためにこれらの動的項をオイラースキームに供給します状態。これは数千の時点で続きます。

  4. シミュレーションの最後に、最終状態Sの関数Proof(S)を計算し、観測量から推定されるいくつかの量Require(P)と比較します。これは、結果の正式な証拠ではなく、妥当性チェックです。

また、複雑な操作の塔(オイラースキーム内、Proof内の動的な用語の計算)を見ています。そして、「不良部品」を認識して修正したいと思います。

精度が低下した浮動小数点数のソフトウェア実装を使用すると、数値スキームの不安定性が拡大し、異なる実装間の比較が容易になると推測します。これは、この質問を調査する一般的な手法ですか?Bochsとして仮想マシンを使用して、プログラムを変更せずにこれを達成することは可能ですか?

安定性の問題に適切に対処するために、数値手順の一般的な入力を対象とすることが許容される場合があります。そのため、その入力でうまく機能するように調整できます。典型的な入力のサンプルが与えられると、いくつかの中間結果をスヌーピングし、それらの統計プロファイルを準備することが可能です。繰り返しますが、これは安定性の問題を研究する一般的な手法ですか?これには仮想マシンが便利ですか?



@サイモンあなたは正しいかもしれませんが、これは間違いなくクロスドメインの質問です。答えられる人は数学とプログラマの両方に登録されているか、誰にも登録されていないかと思います。
user40989

1
区間演算?
SKロジック


2
オイラーを使用して状態を伝播することは、必ずしも悪ではありません。どちらも最適化ではありませんが、実際には問題をサブタスクに分割する必要があります。数値的不安定性は、あなたの最悪の最小かもしれません-誤った最大値への収束と、ODE / PDEの剛性に関連する問題はそれよりも大きくなります。そして、はい、決して単精度を使用することはありません:)
ディアハンター

回答:


6

浮動小数点計算の安定性の研究は数値解析の一部であり、本当に健全な結果が必要な場合は、使用しているアルゴリズムの分析をその分野の知識のある人に依頼してください。

不安定なアルゴリズムを実験的に識別するのに役立ついくつかのことがあります。丸めを異なるモード(アップ/ダウン/ランダム)に設定するか、異なる精度で実行し、結果が大きく変化しないことを確認します。答えはこれが多すぎますか?単純ではなく、答えが「いいえ」であっても、アルゴリズムが安定していることを意味するわけではなく、使用したデータセットで不安定であることが検出されなかったというだけです。

間隔計算はコメントで提案されています。私がそれを見ると、区間演算の最も狂暴な支持者でさえ、区間演算用に設計されたアルゴリズムではうまく機能したが、アルゴリズムを分析せずにアルゴリズムに切り替えて、うまく動作しないことがわかっているパターンがなかったことを確認しないと認めた実用的である(反対者は、制限が厳しすぎて実用的ではない場合に、区間演算の前提条件が有用であるという意見に思われた)


3

安定した浮動小数点アルゴリズムの設計は非常に重要です。私よりも数学的に熟練している人は、あなた自身のものをロールバックしようとするのではなく、可能であれば、評価の高いライブラリを使用することを提案します。この地域の標準的な基準は次のようです:

NJハイアム。数値アルゴリズムの精度と安定性。Society for Industrial and Applied Mathematics、フィラデルフィア、ペンシルベニア州、米国、第2版、2002年。ISBN0-89871-521-0

どのような種類の計算、言語などについての詳細を知らないと、具体的な答えの多くを与えるのが難しくなります。ここには良い講義があります:http : //introcs.cs.princeton.edu/java/91float/これは少し基本的なことかもしれませんが、Javaを使用している場合には良い入門書です。


1

不安定な浮動小数点計算を識別する方法は?これは、この質問を調査する一般的な手法ですか?

エラーに関する統計を表示する必要がない限り、サンプルを収集する必要は本当にないと思います。必要なのは、数値解析、数値線形代数などの主題にも該当する数値解析です。これらはコンピューターサイエンスの一部であるため、cs.stackexchangeでもいくつかの答えが得られる可能性があります。

とにかく、一般的なプログラミングでは、浮動小数点がどのように機能するかについての基本的な理解と基本的な数値的手法を考えると、ほとんどの問題を簡単に見つけることができます。しかし、より複雑な問題は、128ビットの浮動小数点を使用できるため、エラーサンプルを生成する理由がさらに少なくなり、今日ではより簡単に解決できます。ここに私のポイントを示す問題の例をいくつか示します。

  1. 通貨値の計算に浮動小数点を使用します。
  2. 大きな数に浮動小数点を使用します。
  3. 可能な場合は、他の操作の前に分割を行わない。(値を0に近づける)。
  4. エラー伝播の特別な処理なしでの長い計算。

また、分散を計算するための単純なアルゴリズムとエラー補正アルゴリズムの例もあります。この例では、単純なバージョンを見ると、ループで計算を行うとエラーが発生し、補正されないというだけの匂いがします。


あなたの答えをありがとう、しかし、私はより詳細な情報を探しています。私は非常に大規模な計算を行っており、その弱い部分を特定したいと考えています。それに応じて質問を編集しました。
user40989

大規模な計算があり、弱い部分を特定したいと言ったとき、あなたの状況は正確にはわかりません。単純な加算操作であっても、数値計算には本質的にエラーがあります。したがって、大規模な計算がエラー補正されない限り、全体として修正する必要があります。弱点を改善するだけでは十分ではないかもしれません。浮動小数点モデルの「イプシロン」になった場合、単純な分析により、長い計算で伝播するエラーの大きさがわかります。
imel96

0

適切なデータ型(連続分数など)を使用すると、数値エラーを回避できます。浮動小数点演算を使用する必要がある場合は、数値のノウハウを適用してエラーを知る必要があります。


数値エラーを避けたくありません。計算のどの部分が不安定であるかを見つけたいです。これは、速度を最適化するときに速度のボトルネックを特定することに似ています。そのため、精度を最適化したいため、精度のボトルネックを見つけたいと思っています。(ここでは、連続した分数は有用ではありません。)
user40989

1
@ user40989、それから間違いなく区間演算が必要です。
SKロジック
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.