sn42
R&D Job in Japan.
Topics
My Twitter
TensorLyは、Pythonでシンプルで高速なテンソル学習ができるパッケージです。
GitHub: https://github.com/tensorly/tensorly
documentation: http://tensorly.org
paper: https://arxiv.org/abs/1610.09555
pipやcondaでインストールできます。
pip install -U tensorly
conda install -c tensorly tensorly
Numpy 配列から変換できます。3次のテンソル()を作成します。
import tensorly as tl
import numpy as np
tensor = tl.tensor(np.arange(24).reshape((3, 4, 2)), dtype=tl.float64)
print(tensor)
[[[ 0. 1.]
[ 2. 3.]
[ 4. 5.]
[ 6. 7.]]
[[ 8. 9.]
[10. 11.]
[12. 13.]
[14. 15.]]
[[16. 17.]
[18. 19.]
[20. 21.]
[22. 23.]]]
バックエンドは、Numpy, MXNet, PyTorch, TensorFlow, CuPy が使える模様です。デフォルトは Numpy となっています。
テンソルをより次数の少ないテンソルの積和で表現する手法です。行列分解のテンソルへの拡張とも言えます。分解したテンソルは元のテンソルの特徴を集約して表現するため、画像処理や言語処理などに用いられています。
参考:
CP分解は、PARAFAC や CANDECOMP とも呼ばれる方法で、テンソルを次数と同じ数のベクトルの積の和で表す方法です。3次のテンソルの場合、以下のような演算が成立するように分解されます。
このとき、 をまとめてベクトル、行列として表示できます。
3次のテンソル()を で CP分解すると、因子 は()と()と()になります。
TensorLy では、tensorly.decomposition.parafac で CP分解ができます。因子からテンソルを復元するには、tensorly.kruskal_to_tensor を使います。
from tensorly.decomposition import parafac
factors = parafac(tensor, rank=2)
reconstructed_tensor = tl.kruskal_to_tensor(factors)
print([f.shape for f in factors])
[(3, 2), (4, 2), (2, 2)]
参考:Alternating Least Square (ALS) でCP分解 - でかいチーズをベーグルする
タッカー分解は、テンソルをコアテンソルと次数と同じ数のベクトルの積の和で表す方法です。3次のテンソルの場合、以下のような演算が成立するように分解されます。
このとき、 はコアテンソル の要素となります。
3次のテンソル()を で タッカー分解すると、コアテンソル は()に、 因子 は()と()と()になります。
TensorLy では、tensorly.decomposition.tucker で タッカー分解ができます。コアテンソルと因子からテンソルを復元するには、tensorly.tucker_to_tensor を使います。
from tensorly.decomposition import tucker
core, factors = tucker(tensor, rank=[2, 2, 2])
reconstructed_tensor = tl.tucker_to_tensor(core, factors)
print(core.shape)
print([f.shape for f in factors])
[output]
(2, 2, 2)
[(3, 2), (4, 2), (2, 2)]
参考:Tucker分解の導出と実装 - でかいチーズをベーグルする
テンソルトレイン分解は、テンソルを3次のテンソルの積の和で表す方法です。3次のテンソルの場合、以下のような演算が成立するように分解されます。
3次のテンソル()を TT-Rank で テンソルトレイン分解すると、TTコア は()と()と()になります。
TensorLy では、tensorly.decomposition.matrix_product_state で テンソルトレイン分解ができます。TTコアからテンソルを復元するには、tensorly.mps_to_tensor を使います。
from tensorly.decomposition import matrix_product_state
ttcore = matrix_product_state(tensor, rank=[1,2,2,1])
reconstructed_tensor = tl.mps_to_tensor(ttcore)
print([c.shape for c in ttcore])
[output]
[(1, 3, 2), (2, 4, 2), (2, 2, 1)]
参考:Rでtensor train decomposition してみた