グラム・シュミットの直交化法

列がどれくらい近いかを選んでから、二つのグリッドを見てください。ここには、二つの計算手法が返すベクトルのすべてのペアがなす角度が示されています。

インタラクティブシミュレーションを読み込んでいます...

古典的グラム・シュミットは60度離れた二つのベクトルを返す 🖖

ε = 10⁻⁸、古典的 を押してみてください。古典的の手法のグリッドでは、両隅にある q₂ と q₃ のペアの2セルが 60.00° となっており、両グリッドのそれ以外の角度はすべて 90.00° です。これらの背景にある内積は 0.5000 であり、倍精度小数の末位の1単位まで正確に半分となっています。

この行列は三つの列からなり、それぞれの列はベクトル (1, 0, 0, 0) の異なる位置に一つだけ 10⁻⁸ を挿入したものです。Peter Läuchli が1961年に用いて以来、彼にちなんで名付けられています。互いにほとんど同じ列というのは、どのような最小二乗法の当てはめにとっても厄介なケースですが、二つの測定値がほぼ同一である場合にはいつでも現れます。

修正版グラム・シュミットに同じ三つの列を渡すと、乗算の回数は同じであるにもかかわらず、返される角度はすべて 90.00° になります。

間隔を一つ戻して 10⁻⁷ にすると、そのセルは 89.24° になります。スライダーを一つ動かすだけで、誤差が4分の3度で済むか、それとも30度にもなるかの違いが生まれるのです。

二つの手法は一つの数値を異なって解釈する 🖖

解説を第3列に設定し、「Classical」、続いて「Modified」を押してください。q₂が第3列から取り除く成分 の行が 0 から 7.0711 × 10⁻⁹ へと変化します。列が三つの場合、二つのアルゴリズム間で計算結果が異なる係数はこれだけです。その下の対角成分も、グリッド上のあらゆる角度も、すべてこの係数から導かれます。

古典的手法では、与えられた列をそのまま使い、この係数を q₂ᵀa₃ として評価します。修正手法では、列から q₁ の成分を取り除いた残りを用いて、q₂ᵀv として評価します。数式の上では、両者はまったく同じ値です。v と a₃ の違いは q₁ の定数倍だけであり、かつ q₂ は q₁ に直交しているからです。しかし実際の演算では q₂ は q₁ と完全には直交しておらず、a₃ には q₂ 方向の成分が 7.0711 × 10⁻⁹ だけ残っています。古典的手法はここを一切見ないため、q₃ がそれを引き継ぐことになります。あの60°という角度はそこから来ています。

スライダーを 10⁻¹ から 10⁻⁸ まで動かし、下のパネルで二つの曲線が離れていく様子を見てください。この範囲の113点でフィッティングを行うと、これら三列において直交性の喪失は、古典的手法では κ1.98 に、修正手法では κ0.98 に比例して増大します。パネルは選択した列数に合わせて再計算されるため、行列の幅を広げるとこれら二つの指数も変化します。引き算の順序を一つ変えるだけで、条件数のまる一乗分もの違いが生まれるのです。

基底は崩壊しても、分解は正確である 🖖

結果テーブルの最終行は ‖A − QR‖ / ‖A‖ です。古典的手法で ε = 10⁻⁸ のとき、この値は 0 になります。直交性の崩れた Q と、それと一緒に生成された R を掛けてみてください。元の行列が成分ごとに、余りを一切残さず復元されます。

四つの列数、十段階の分離度、そして二つのアルゴリズム。コントロールで設定できるすべての状態を走査しても、この相対残差が 5.5511 × 10⁻¹⁷ を超えることは決してありません。1と次の倍精度数との間隔は 2.2204 × 10⁻¹⁶ です。つまり、誤差は末尾の一単位の四分の一に収まっているのです。

グラム・シュミット法は確かに、出力するベクトルと記録した係数の積として A を表現していました。出来なくなっていたのは、互いに直交するベクトルを返すことだけです。これら二つの性質のどちらが必要になるかは、あなた自身のコード次第です。Qᵀb でベクトルを射影するなら失われた性質に依存し、Q と R から A を再構築するなら維持された性質に依存することになります。

全プロセスの詳細解説

  1. 古典的グラム・シュミットが直角を失う場所 8 ステップ

    ツールには 10⁻⁸ 離れた三つの列と、それらに対する古典的グラム・シュミットの答えが表示されています。アルゴリズムを手計算で追い、30度の誤差を生む原因となった一つの丸め誤差を見つけ出してください。そして、それぞれの計算手法が実用に耐えなくなる限界がどこにあるかを説明してください。

    この問題をツールで開く

    1. それぞれの列は、ベクトル (1, 0, 0, 0) の異なる位置に一つだけ ε を挿入したものです。AᵀA はすべての成分が1である 3 × 3 行列に ε²I を足したものであり、その固有値は 3 + ε² が一つと ε² が二つです。したがって特異値は √(3 + ε²) と ε になり、条件数は推定値ではなく厳密に求まります。表の先頭行には 1.7321 × 10⁸ と表示されています。

    2. ‖a₁‖² は 1 + ε² であり、ε² は 10⁻¹⁶ です。倍精度小数が1を保持するとき、その次に保持できる数は 2.2204 × 10⁻¹⁶ だけ先にあるため、その間隔の半分である 1.1102 × 10⁻¹⁶ 未満の数は、1に足された時点で消えてしまいます。10のマイナス16乗はこの値より小さくなります。平方根は1となり、それで割っても何も変わらないため、q₁ は元の列そのものとして出力され、ε² は計算の記録から完全に消去されてしまいます。この問題における他のすべての丸め誤差は末位の1単位分に過ぎませんが、この丸め誤差だけは30度分の重みを持っているのです。

    3. 次は列 2 ですが、ここより前にはベクトルが一つしかないため、二つの手法はここで一致します。射影の係数は q₁ᵀa₂ = 1 となり、それを引くと (0, −ε, ε, 0) が残り、その長さは ε√2 = 1.4142 × 10⁻⁸ になります。倍精度小数の認識する限り列 2 は長さ1として計算に入ってきましたが、そのうち 1.4142 × 10⁻⁸ を除くすべてがすでに q₁ によって覆われていたことになります。

    4. 列 3 を、まずは古典的の手法で見てみましょう。q₁ に対する係数は再び1です。q₂ に対する係数は q₂ᵀa₃ ですが、q₂ は完全に第2、第3成分に収まっているのに対し、a₃ の ε は第4成分にあるため、その内積は 0 となります。これは q₂ が列 3 から取り除くもの の行に示されている通りです。q₁ だけを引くと (0, −ε, 0, ε) が残り、その長さは再び ε√2 となるため、列 3 の残り も同じく 1.4142 × 10⁻⁸ と表示されます。

    5. q₂ と q₃ はどちらも、先頭の1を共有する列から q₁ を引くことで作られています。そのため、両者とも第2成分に −1/√2 を持ち、それ以外に共通する成分はありません。それらの内積は半分になります。ツールは 0.5000 および 60.00° と出力しますが、±1/√2 が2進数の分数ではないため、内部に保存されている値は 0.4999999999999999 となり、代数計算が導く半分という値からは末位の1単位だけずれています。これがこの算術計算で起こりうる誤差の大きさです。あの30度の誤差はここから来たのではありません。古典的の手法による直交性の喪失の行には 0.7071 と表示されます。これは √(2 × 0.5²) であり、同じ半分という値が QᵀQ の両隅で一度ずつ数えられた結果です。

    6. 今度は同じ列に対して、修正版を適用してみましょう。q₁ の寄与を引いた後の残りは (0, −ε, 0, ε) となり、この手法では a₃ ではなくこれに対して計算を行います。これと q₂ の内積をとると、ゼロではなく ε/√2 = 7.0711 × 10⁻⁹ が得られます。これを取り除くと残るのは (0, −ε/2, −ε/2, ε) で、その長さは ε√(3/2) = 1.2247 × 10⁻⁸ となり、q₂ᵀq₃ は半分ではなく 1.1102 × 10⁻¹⁶ になります。修正版による直交性の喪失の行には 1.1547 × 10⁻⁸ と表示されています。そこに残っているのは、q₁ が取り除けなかった分だけです。つまり引き算によって q₁ 方向に −ε² が残り、それをわずか ε√2 の長さしかない残りで割ることで、再び ε/√2 に戻ってしまったのです。

    7. ツールが提供するすべての列数において、同じ議論が成り立ちます。古典的の手法では、先頭の1を共有する列から q₁ を引くことでそれ以降のすべての q を構成するため、それらの間のすべてのペアの角度が60°になります。その数は (n − 1)(n − 2)/2 組であり、直交性の喪失はそのペア数の半分の平方根に等しくなります。二つの列しかない場合はそのようなペアは存在せず、二つの手法に共通する ε の大きさの傾きだけが残ることになります。

    8. 古典的の手法の当てはめ直線は κ = 2.35 × 10⁸ で喪失が1に達します。そのため、古典的の曲線はパネルの右端ですでに平坦になっています。一方、修正版の手法では外挿ではなく測定された限界値が得られます。というのも、この曲線は 10⁻⁸ を過ぎると向きを変えるため、そこまで当てはめ直線を伸ばしてしまうと、その下にあるパネルの表示と矛盾してしまうからです。条件数を動かした724点全体において、直交性の喪失が 1.25 × (計算機イプシロン) × κ を超えることはなく、この限界値が1に達するのは κ = 3.60 × 10¹⁵ のときだけです。なお、計算機イプシロンの逆数は 4.50 × 10¹⁵ です。

    解答

    30度の誤差は、たった一行のコードから生じています。修正版が q₂ᵀv₃ = 7.0711 × 10⁻⁹ と読み取るところを、古典的の手法は q₂ᵀa₃ = 0 と読み取りますが、計算紙の上ではこれらは同じ数なのです。

    計算機イプシロンの半分の平方根は 1.0537 × 10⁻⁸ であるため、10⁻⁸ という間隔は 1 + ε² から ε² が完全に消え去る最初の段階になります。そこから先は、スライダーをどれほど下にドラッグしてもセルは 60.00° を示し続けます。一つ前の 10⁻⁷ の段階では 89.24° を示しており、古典的の手法はすでに 1.88 × 10⁻² の直交性を失っています。つまり、スライダーが完全に消し去る段階に到達するずっと前から、基底の崩壊は始まっているのです。

    Åke Björck が1967年に修正版の解析を発表して以来、この計算順序の入れ替えが標準となっています。二つの手法の乗算回数は同じですが、この間隔での直交性の喪失には 6.1 × 10⁷ 倍もの開きがあります。修正版は倍精度小数が列を全く区別できなくなる付近まで直角を保ちますが、古典的の手法はその7桁も前に直角を手放してしまうのです。

参考文献 (5)