sprocket icon indicating copy to clipboard operation
sprocket copied to clipboard

逆行列の計算には np.linalg.inv よりも np.linalgn.solve を使ったほうが速い

Open r9y9 opened this issue 7 years ago • 5 comments

機能の実装に比べて重要ではないけど、パフォーマンスを上げるためにやっておいたほうがよいことの一つ。

参考:

  • http://d.hatena.ne.jp/sleepy_yoshi/20120513/p1

このあたり https://github.com/TakedaLab/sprocket/blob/6acb52ef3bdf2172253b5c6fac4bf1a874bf61b0/sprocket/model/GMM.py#L183-L203

r9y9 avatar Jun 21 '17 13:06 r9y9

MLPGの逆行列計算のところで使って,どの程度早くなるか確認してみます.その後,GMM周りの逆行列計算の修正も実施するかと思います.

k2kobayashi avatar Jun 22 '17 09:06 k2kobayashi

numpy.linalg.solveが想定している A^-1 b の形ではなく、 A B^-1 の形ならあまりメリットがないと思います 以下の例ではむしろ遅くなっています

In [1]: import scipy as sp

In [2]: from scipy import linalg as lin

In [3]: A = sp.randn(1024, 1024)

In [4]: B = sp.randn(1024, 1024)

In [5]: %timeit A @ lin.inv(B)
43.4 ms ± 91.1 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [6]: %timeit lin.solve(B.T, A.T).T
5.23 s ± 28.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

In [7]: ((lin.solve(B.T, A.T).T - A @ lin.inv(B)) ** 2).sum()
Out[7]: 1.5073045265136212e-18

tats-u avatar Sep 25 '17 09:09 tats-u

一応補足しておくと、戸田先生の論文 https://www.cs.cmu.edu/~pmuthuku/mlsp_page/lectures/Toda_VC.pdf における式22, 23に現れる逆行列の部分を指していました。それぞれ、A^-1bの形になっているので、少なくとも式を素直に計算しようとすると、linalg.solveで速くなると思います。僕が過去にGMM声質変換 (https://gist.github.com/r9y9/88bda659c97f46f42525) を(ナイーブに)実装して、少し高速化された経験から、イシューを立てました。

が、今考えると、式22の期待値の計算を、A^-1 bの形で解こうとすると、t のループがでてきてしまうので、A^1 を明示的に計算して、tのループをなくす方が速そうです。式23に関しては、それ単体でみればA^1 b の形を解く方が速くなると思いますが、式22の計算の時点で元話者の共分散の逆行列を明示的に求めていれば、それをそのまま使えばよいので、linalg.solveを使う必要はなくなりますね。

まとめると、現状の実装にあるlinalg.invは、np.linalgn.solve によって置き換えられるものではなく、すでに効率の良い実装になっている、と思いました。あまり実装をちゃんと見ずに、流し読みでイシューを立ててしまっていました、すいません。

言い訳になってしまいますが、コードを見てAbって何・・・ってなった記憶があるので、コードと論文の対応がわかりやすくなっていると(式番号の参照を書く、論文と同じ記号を使う、など)、読み手にとっては助かるので、今後検討してもらえると幸いです

r9y9 avatar Sep 25 '17 10:09 r9y9

変数命名問題は別でIssue立てるとして、このIssueはCloseすべきですか?

tats-u avatar Sep 25 '17 15:09 tats-u

いえ,このままissueを残して,論文に対応する数式番号のコメントを追記しましょう.

k2kobayashi avatar Sep 25 '17 15:09 k2kobayashi