このブログは、株式会社フィックスターズのエンジニアが、あらゆるテーマについて自由に書いているブログです。
メモリ事業部の 眞鍋 です。
本日は 「収束加速法」という話題を取り上げたいと思います。
同じ結果を得るにしても、その目的に特化することで高速にする技法、というのは世の中にたくさんあります。
例えば代表的なものは各種ソートアルゴリズムたちであり、
本ブログでも紹介されている「Segment Tree」につきましても、
ある目的に対して計算量を抑えることのできる技法です。
詳しくは記事をご覧ください!
こうしたアルゴリズムは、例えば 蟻本 などのプログラミング本で紹介されており、勉強することができます。
今回紹介する「収束加速法」は、
こうした本には載っていない話であり、
どちらかといえばコンピューター界隈の方からするとメジャーではない話だと思いますが、
目的はこうしたアルゴリズムと同じ内容になります。
説明の前に、
例えばどういったことに使えるのでしょうか?
Google の創始者である Brin と Page は、
例えば The Anatomy of a Large-Scale Hypertextual Web Search Engine という論文の中で
ある行列の固有値を引き離すための (収束の速さを改善するための)
ハイパーパラメータを用意し、その値を 0.85 として計算することで、
「超々大規模な」疎行列の乗算回数を劇的に減らし高速化を行いました。
あまりにも大規模な行列のため、一回の行列演算を省くだけでとてつもない高速化になります。
この Brin と Page の方法をさらに高速化するために、
今回紹介する「収束加速法」を使ってさらに高速化する研究が知られています。
例えば Google’s PageRank and Beyond: The Science of Search Engine Rankings という
PageRank アルゴリズムに関する歴史・背景などを詳しく書いている本には、
この収束加速法を適用する話に 1章使っています (Chapter 9. Accelerating the Computation of PageRank)
つまり 収束を加速することで、計算回数を劇的に減らす技法、というのが「収束加速法」であります。
PageRankアルゴリズムを題材にするにはいささか導入に時間がかかりますので、
おもちゃで遊んでみたいと思います。
有名な式にライプニッツ級数というものがあります。
この式で円周率の計算をするのはいい方法とは言えませんが、
この式を題材として扱ってみたいと思います。
ライプニッツ級数:
$$\pi = \displaystyle 4\sum_{n=0}^\infty \frac{(-1)^n}{2n+1}$$
この級数は $\pi $ に収束する級数なのですが非常に非常に収束測度が遅いことで有名です。
その収束の遅さをみるために次をご覧ください:
例えば 10000 項の結果を使った
$$\frac{4}{1} – \frac{4}{3} + \frac{4}{5} – \frac{4}{7} + \frac{4}{9} + \dotsb + \frac{4}{20001}$$
を計算しても $3.141$ までの結果しか得られません。
n = 9 までで得られた結果のみを使って、収束精度を上げてみます。
使う計算式は上図の ○・△・□の式で、適用してみます:
もう一度適用してみます:
この操作で、何故か改善された結果を得られました。
さらにこれを繰り返しますと次のような結果になります:
つまり、9項の情報だけで 「3.141592」と 7桁精度が得られました。
先ほどは愚直に 10000項の計算で 4桁精度しか得られていないことを考えると黒魔術的です!
上のアルゴリズム、ライプニッツ級数にしか使えないような特殊な計算なのでは?
という心の声が聞こえてきそうです。
そうではないことを、別の話で遊んでみましょう。
$$\sum_{n=0}^\infty (-1)^n (n+1) = 1-2+3-4+5-\dotsb$$
という式は何を表しているかご存知でしょうか?
高校数学までは、収束しない、つまり「発散級数」と習います。
しかしながら、wikipedia の「1-2+3-4+・・・」をみてみますと次のように書かれています:
しかし計算方法によってはこの級数が収束すると考えることもでき、その場合の収束値は 1/4 である。
すなわち、 1/4 に収束する数とみなす考え方もあるんだ!ということがわかります。
詳細を知りたい方はゼータ関数などを勉強いただければと思います。
この数をこの方法で計算するとどうなるのでしょうか。
まずは先ほどと同様に部分的に計算した数を用意します。
これに先ほどの計算を行うと?
そうなのです。 1/4 になるのです!
面白いですね!
Fixstars ではこうした技も駆使して高速化しております!
興味のある方は是非一緒に仕事しましょう。
よろしくお願いします。
keisuke.kimura in Livox Mid-360をROS1/ROS2で動かしてみた
Sorry for the delay in replying. I have done SLAM (FAST_LIO) with Livox MID360, but for various reasons I have not be...
Miya in ウエハースケールエンジン向けSimulated Annealingを複数タイルによる並列化で実装しました
作成されたプロファイラがとても良さそうです :) ぜひ詳細を書いていただきたいです!...
Deivaprakash in Livox Mid-360をROS1/ROS2で動かしてみた
Hey guys myself deiva from India currently i am working in this Livox MID360 and eager to knwo whether you have done the...
岩崎システム設計 岩崎 満 in Alveo U50で10G Ethernetを試してみる
仕事の都合で、検索を行い、御社サイトにたどりつきました。 内容は大変参考になりま...
Prabuddhi Wariyapperuma in Livox Mid-360をROS1/ROS2で動かしてみた
This issue was sorted....