行列計算
数値線形代数。科学計算の中核。
BLAS と LAPACK#
| 層 | 内容 |
|---|---|
| BLAS Level 1 | ベクトル同士(内積、スケール) |
| BLAS Level 2 | 行列 × ベクトル |
| BLAS Level 3 | 行列 × 行列 |
| LAPACK | 分解、固有値、連立方程式 |
Level 3 が最も効率が良い。
データ 1 個あたりの計算量が多いほど、 メモリ帯域の制約から逃れられる。 そのためアルゴリズムを行列積の形に持ち込むのが定石。
実装が性能を決める#
同じ でも、 素朴な三重ループと OpenBLAS では100 倍以上違う。
| 技法 | 効果 |
|---|---|
| ブロック化(タイリング) | キャッシュに収まる単位で処理 |
| SIMD | 複数要素を同時演算 |
| マルチスレッド | コアを使い切る |
| プリフェッチ | メモリ待ちを隠す |
自分で行列積を書かない。 既存の実装を使う。
分解#
| 分解 | 用途 |
|---|---|
| LU | 連立一次方程式 |
| QR | 最小二乗、直交化 |
| コレスキー | 正定値対称。LU の半分のコスト |
| 固有値分解 | 固有値 |
| SVD | 低ランク近似、擬似逆行列、主成分分析 |
逆行列を作らない#
python
x = np.linalg.inv(A) @ b # 遅く、精度も悪い
x = np.linalg.solve(A, b) # こちら逆行列を明示的に求めるのは 計算量が多く、誤差も増える。 連立方程式として解くのが常に正しい。
条件数#
条件数が大きい(悪条件)と、 入力のわずかな誤差が解を大きく狂わせる。
なら 倍精度の有効数字が全部失われる。 解が出たことと、その解が正しいことは別。
参考文献#
- Gene H. Golub, Charles F. Van Loan. Matrix Computations, 4th ed. Johns Hopkins University Press, 2013.
- Lloyd N. Trefethen, David Bau III. Numerical Linear Algebra. SIAM, 1997. https://doi.org/10.1137/1.9780898719574
- Kazushige Goto, Robert A. van de Geijn. Anatomy of high-performance matrix multiplication. ACM TOMS 34(3), 2008. https://doi.org/10.1145/1356052.1356053