-
Notifications
You must be signed in to change notification settings - Fork 116
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
逆行列の計算には np.linalg.inv よりも np.linalgn.solve を使ったほうが速い #12
Comments
MLPGの逆行列計算のところで使って,どの程度早くなるか確認してみます.その後,GMM周りの逆行列計算の修正も実施するかと思います. |
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 |
一応補足しておくと、戸田先生の論文 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の形で解こうとすると、 まとめると、現状の実装にあるlinalg.invは、np.linalgn.solve によって置き換えられるものではなく、すでに効率の良い実装になっている、と思いました。あまり実装をちゃんと見ずに、流し読みでイシューを立ててしまっていました、すいません。 言い訳になってしまいますが、コードを見て |
変数命名問題は別でIssue立てるとして、このIssueはCloseすべきですか? |
いえ,このままissueを残して,論文に対応する数式番号のコメントを追記しましょう. |
機能の実装に比べて重要ではないけど、パフォーマンスを上げるためにやっておいたほうがよいことの一つ。
参考:
このあたり https://github.com/TakedaLab/sprocket/blob/6acb52ef3bdf2172253b5c6fac4bf1a874bf61b0/sprocket/model/GMM.py#L183-L203
The text was updated successfully, but these errors were encountered: