Skip to content
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

Open
r9y9 opened this issue Jun 21, 2017 · 5 comments

Comments

@r9y9
Copy link
Collaborator

r9y9 commented Jun 21, 2017

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

参考:

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

@k2kobayashi
Copy link
Owner

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

@tats-u
Copy link
Collaborator

tats-u commented Sep 25, 2017

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

@r9y9
Copy link
Collaborator Author

r9y9 commented Sep 25, 2017

一応補足しておくと、戸田先生の論文 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って何・・・ってなった記憶があるので、コードと論文の対応がわかりやすくなっていると(式番号の参照を書く、論文と同じ記号を使う、など)、読み手にとっては助かるので、今後検討してもらえると幸いです

@tats-u
Copy link
Collaborator

tats-u commented Sep 25, 2017

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

@k2kobayashi
Copy link
Owner

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

@k2kobayashi k2kobayashi mentioned this issue Oct 30, 2017
10 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants