(57)【要約】【課題】非負値テンソル因子分解に関する処理を高速化すること。【解決手段】行列積計算用プロセッサを有し、Ｎ次（Ｎは２以上の整数）の非負値テンソルデータを因子分解によってＮ個の因子行列に分解するテンソルデータ計算装置であって、所定の目的関数値を最適化するための前記因子行列の更新式を、該因子行列以外の他のＮ−１個の因子行列をクロネッカー積により展開した第１の行列と、前記非負値テンソルデータと前記Ｎ個の因子行列のテンソル積とにより定義される第２の行列との行列積を含む形式で表現し、前記更新式を計算する因子分解手段と、前記更新式に含まれる前記行列積を前記行列積計算用プロセッサにより計算する行列計算手段と、を有し、前記因子分解手段は、前記行列計算手段により計算された前記行列積の計算結果を用いて、前記更新式を計算する、ことを特徴とする。【選択図】図３
2020027547.tif 000002
【特許請求の範囲】
【請求項１】
行列積計算用プロセッサを有し、Ｎ次（Ｎは２以上の整数）の非負値テンソルデータを因子分解によってＮ個の因子行列に分解するテンソルデータ計算装置であって、
所定の目的関数値を最適化するための前記因子行列の更新式を、該因子行列以外の他のＮ−１個の因子行列をクロネッカー積により展開した第１の行列と、前記非負値テンソルデータと前記Ｎ個の因子行列のテンソル積とにより定義される第２の行列との行列積を含む形式で表現し、前記更新式を計算する因子分解手段と、
前記更新式に含まれる前記行列積を前記行列積計算用プロセッサにより計算する行列計算手段と、
を有し、
前記因子分解手段は、
前記行列計算手段により計算された前記行列積の計算結果を用いて、前記更新式を計算する、ことを特徴とするテンソルデータ計算装置。
【請求項２】
前記非負値テンソルデータは、Ｉ×Ｊ×Ｋの３次のテンソルを示すデータであり、
前記第２の行列は、
ｐ＝ｊ×Ｋ＋ｋ（ただし、ｊは１≦１≦Ｊとなる整数、ｋは１≦ｋ≦Ｋとなる）として、前記非負値テンソルデータの（ｉ，ｊ，ｋ）要素と、前記Ｎ個の因子行列のテンソル積の（ｉ，ｊ，ｋ）要素との商を（ｉ，ｐ）要素とする行列である、ことを特徴とする請求項１に記載のテンソルデータ計算装置。
【請求項３】
前記因子行列を、Ｉ×Ｒの因子行列Ａ、Ｊ×Ｒの因子行列Ｂ，Ｋ×Ｒの因子行列Ｃとして、
前記因子行列Ａの更新式に含まれる行列積を定義する前記第１の行列は、
前記因子分解の基底数Ｒを表す変数をｒ（１≦ｒ≦Ｒ）、前記因子行列Ｂの各要素をｂｊｒ、前記因子行列Ｃの各要素をｃｋｒとして、ｂｊｒ×ｃｋｒを（ｐ，ｒ）要素とする行列である、ことを特徴とする請求項２に記載のテンソルデータ計算装置。
【請求項４】
前記因子分解手段は、
前記更新式の所定の項を、前記因子分解の基底数を表す変数のみに依存する項として計算する、ことを特徴とする請求項１乃至３の何れか一項に記載のテンソルデータ計算装置。
【請求項５】
行列積計算用プロセッサを有し、Ｎ次（Ｎは２以上の整数）の非負値テンソルデータを因子分解によってＮ個の因子行列に分解するテンソルデータ計算装置が、
所定の目的関数値を最適化するための前記因子行列の更新式を、該因子行列以外の他のＮ−１個の因子行列をクロネッカー積により展開した第１の行列と、前記非負値テンソルデータと前記Ｎ個の因子行列のテンソル積とにより定義される第２の行列との行列積を含む形式で表現し、前記更新式を計算する因子分解手順と、
前記更新式に含まれる前記行列積を前記行列積計算用プロセッサにより計算する行列計算手順と、
を実行し、
前記因子分解手順は、
前記行列計算手順により計算された前記行列積の計算結果を用いて、前記更新式を計算する、ことを特徴とするテンソルデータ計算方法。
【請求項６】
コンピュータを、請求項１乃至４の何れか一項に記載のテンソルデータ計算装置における各手段として機能させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、テンソルデータ計算装置、テンソルデータ計算方法及びプログラムに関する。
【背景技術】
【０００２】
購買ログやチェックインログ等のログデータは、一般に、テンソルとして表現することが可能である。また、これらのログデータは正の実数値で表現されるため、テンソルとして表現されたログデータは非負値テンソル因子分解（ＮＴＦ：Nonnegative Tensor Factorization）を用いて因子分析を行うことが可能である。例えば、非特許文献１には、一般的な非負値テンソル因子分解の手法が開示されている。
【０００３】
複数の商品の中からユーザが購入した商品を表すデータが、ユーザ毎に数日間分存在する例を考える。この例の場合、これらのデータは「ユーザ×商品×日」の３次のテンソルデータ（すなわち、モード数が３のテンソルデータ）として表現することができる。そこで、ユーザ数をＩ、商品数をＪ、日数をＫとして、当該テンソルデータをＲ（Ｒａｎｋ）個の基底に因子分解するとすれば、この因子分解の計算量はＩ×Ｊ×Ｋ×Ｒに比例する。したがって、例えば、Ｉ＝１０００、Ｊ＝１０００、Ｋ＝１０００、Ｒ＝１００とした場合、当該テンソルデータの非負値テンソル因子分解には１０００億回規模の計算が必要となる。
【０００４】
ここで、非負値テンソル因子分解の計算例について、より具体的に説明する。非負値テンソル因子分解では、非負性を保ったまま、テンソルデータを因子行列のテンソル積に分解する。例えば、「ユーザ数Ｉ×商品数Ｊ×日数Ｋ」の３次のテンソルデータＸは３個の因子行列Ａ、Ｂ及びＣに分解することができ、以下の式（１）のように表すことができる。
【０００５】
【数１】
2020027547.tif 000003
なお、本明細書のテキストでは、推定量を表す記号であるハット「＾」を、便宜上、文字の頭上ではなく、文字の直前に記載する。例えば、Ｘの推定量は「＾Ｘ」と表す。上記の因子行列Ａ、Ｂ及びＣはそれぞれＩ×Ｒ、Ｊ×Ｒ、Ｋ×Ｒの非負値の行列である。以降では、Ｘの各要素をｘｉｊｋ、Ａの各要素をａｉｒ、Ｂの各要素をｂｊｒ、Ｃの各要素をｃｋｒ、＾Ｘの各要素を＾ｘｉｊｋと表す。なお、ｘｉｊｋ、ａｉｒ、ｂｊｒ、ｃｋｒ及び＾ｘｉｊｋは非負値である。
【０００６】
このとき、因子行列Ａ、Ｂ及びＣのテンソル積は、以下の式（２）のように各基底の積で表される。
【０００７】
【数２】
2020027547.tif 000004
上記のテンソルデータＸと＾Ｘとが近似的に等しくなるように、因子行列Ａ、Ｂ及びＣを求める手法がテンソル因子分解である。すなわち、テンソル因子分解では、Ｌを距離関数（この距離関数が最適化問題の目的関数となる。）として、Ｌ（Ｘ｜＾Ｘ）を最小化させるような因子行列Ａ、Ｂ及びＣを求める。距離関数Ｌとして、一般化ＫＬダイバージェンス（ｇＫＬ）距離を用いた場合、距離関数Ｌは以下の式（３）のように表される。
【０００８】
【数３】
2020027547.tif 000005
このとき、Ａ、Ｂ及びＣの更新式はそれぞれ以下の式（４）〜（６）のように表される。
【０００９】
【数４】
2020027547.tif 000006
また、＾Ｘの更新式は以下の式（７）のように表される。
【００１０】
【数５】
2020027547.tif 000007
各ａｉｒ、ｂｊｒ及びｃｋｒを適切な値に初期化した上で、任意の最適化アルゴリズムにより、上記の式（４）〜（７）の更新式を何回か繰り返し適用することで、因子分解後のＡ、Ｂ及びＣが得られる。
【００１１】
ここで、上記の式（４）に示すａｉｒの更新式をプログラムの処理として実行する場合、Ｉ×Ｒ個の各ａｉｒに対して、当該ａｉｒの値を求めるためのＪ×Ｋ回のループ処理を実行する必要がある。したがって、この場合、最終的にＩ×Ｊ×Ｋ×Ｒ回のループ処理を実行する必要がある。また、＾ｘｉｊｋ、ｂｊｒ及びｃｋｒの更新式についても同様の回数のループ処理を実行する必要がある。
【００１２】
ところで、近年、ＧＰＵ（Graphics Processing Unit）を数値計算に利用した手法が深層学習を中心に広まっている。深層学習では行列積計算を行う処理が多く、その計算量が問題となっている。例えば、Ｎ×Ｎの正方行列同士の積は、その計算量がＮ×Ｎ×Ｎに比例する。これに対して、ＧＰＵは単純な並列処理を得意とし、行列積計算等を高速に行うことが可能である。ＧＰＵにより行列積を計算することで、例えば、ＣＰＵ（Central Processing Unit）と比較して１００倍以上の高速化を図ることが可能となっている。また、行列積の計算に特化した専用のチップ（又はプロセッサ）が組み込まれたＧＰＵも知られており、このＧＰＵにより更に１０倍以上の高速化を図ることも可能となっている。以降では、行列積の計算に特化した専用のチップ（又はプロセッサ）を「行列積専用プロセッサ」とも表す。
【先行技術文献】
【非特許文献】
【００１３】
【非特許文献１】Liu, Weixiang, Tianfu Wang, and Siping Chen. "Nonnegative tensor factorization for clustering genes with time series microarrays from different conditions: A case study." Biomedical Engineering and Informatics (BMEI), 2010 3rd International Conference on. Vol. 6. IEEE, 2010.
【発明の概要】
【発明が解決しようとする課題】
【００１４】
しかしながら、例えば、上記の式（４）〜（７）に示すように、因子行列の更新式は、テンソル積で表現されている。このため、行列積専用プロセッサが組み込まれたＧＰＵを用いて、因子行列の更新式をそのまま計算することはできない。
【００１５】
これに対して、因子行列の更新式におけるテンソル積を行列積として表現することができれば、行列積専用プロセッサが組み込まれたＧＰＵを用いて、因子行列の更新式を計算することができ、非負値テンソル因子分解に関する処理を高速化することができる。
【００１６】
本発明の実施の形態は、上記の点に鑑みてなされたもので、非負値テンソル因子分解に関する処理を高速化することを目的とする。
【課題を解決するための手段】
【００１７】
上記目的を達成するため、本発明の実施の形態は、行列積計算用プロセッサを有し、Ｎ次（Ｎは２以上の整数）の非負値テンソルデータを因子分解によってＮ個の因子行列に分解するテンソルデータ計算装置であって、所定の目的関数値を最適化するための前記因子行列の更新式を、該因子行列以外の他のＮ−１個の因子行列をクロネッカー積により展開した第１の行列と、前記非負値テンソルデータと前記Ｎ個の因子行列のテンソル積とにより定義される第２の行列との行列積を含む形式で表現し、前記更新式を計算する因子分解手段と、前記更新式に含まれる前記行列積を前記行列積計算用プロセッサにより計算する行列計算手段と、を有し、前記因子分解手段は、前記行列計算手段により計算された前記行列積の計算結果を用いて、前記更新式を計算する、ことを特徴とする。
【発明の効果】
【００１８】
非負値テンソル因子分解に関する処理を高速化することができる。
【図面の簡単な説明】
【００１９】
【図１】行列積専用プロセッサが組み込まれたＧＰＵの構成の一例を説明するための図である。
【図２】行列積専用プロセッサにおける行列積の計算の一例を説明するための図である。
【図３】本発明の実施の形態におけるテンソルデータ計算装置の機能構成の一例を示す図である。
【図４】本発明の実施の形態におけるテンソルデータ計算装置のハードウェア構成の一例を示す図である。
【図５】更新処理の手順の一例を説明するための図（その１）である。
【図６】更新処理の手順の一例を説明するための図（その２）である。
【図７】更新処理の手順の一例を説明するための図（その３）である。
【図８】更新処理の手順の一例を説明するための図（その４）である。
【図９】更新処理の手順の一例を説明するための図（その５）である。
【発明を実施するための形態】
【００２０】
以下、本発明の実施の形態について説明する。本発明の実施の形態では、行列積専用プロセッサにより行列積を計算することで、非負値テンソル因子分解に関する処理を高速に行うことが可能なテンソルデータ計算装置１０について説明する。
【００２１】
＜行列積専用プロセッサが組み込まれたＧＰＵの構成＞
まず、行列積専用プロセッサが組み込まれたＧＰＵの構成について、図１を参照しながら説明する。図１は、行列積専用プロセッサが組み込まれたＧＰＵの構成の一例を説明するための図である。なお、以降の本発明の実施の形態の説明では、ＧＰＵは、行列積専用プロセッサが組み込まれたＧＰＵを指すものとする。
【００２２】
図１に示すように、本発明の実施の形態におけるテンソルデータ計算装置１０には、１台以上のＧＰＵ（図１では、一例として４台）が搭載されている。そして、各ＧＰＵは、ＰＣＩ  Ｅｘｐｒｅｓｓ等のバスを介してＣＰＵやメモリ等と通信可能に接続されている。
【００２３】
また、各ＧＰＵには、複数のＧＰＣ（GPU Processing Cluster）や複数のデバイスメモリ、メモリコントローラ、Ｌ２キャッシュ、ギガスレッドエンジン、ハイスピードハブ等が含まれる。また、各ＧＰＣには、複数のＳＭ（Stream Multiprocessor）や複数のＴＰＣ（Texture Processor Cluster）等が含まれる。更に、各ＳＭには、Ｌ１キャッシュ（又は共有メモリ）や複数のＰＢ（Processing Block）等が含まれる。
【００２４】
そして、各ＰＢには、Ｌ０キャッシュやＷａｒｐスケジューラ、Ｄｉｓｐａｔｃｈ  Ｕｎｉｔ、レジスタ等に加えて、行列積専用プロセッサを含む様々なプロセッサが含まれる。このような様々プロセッサには、例えば、倍精度（６４ｂｉｔ）の浮動小数点演算を可能とするプロセッサ（ＦＰ６４）、単精度（３２ｂｉｔ）の浮動小数点演算を可能とするプロセッサ（ＦＰ３２）、整数演算を可能とするプロセッサ（ＩＮＴ）等がある。また、図１に示す例では、１つのＰＢ内に２つの行列積専用プロセッサが含まれており、各行列積専用プロセッサが４×１６個の積和演算器により構成されている。
【００２５】
各ＰＢはＳＭのＬ１キャッシュと高速かつ低遅延でデータ通信が可能であり、通信量を抑えつつ多くのプロセッサを同時に利用することによって、並列処理の高速化を実現している。なお、行列積専用プロセッサとしては、例えば、ＮＶＩＤＩＡ社のＧＰＵアーキテクチャの１つである「Ｖｏｌｔａ」世代以降のＧＰＵに組み込まれる「ＴｅｎｓｏｒＣｏｒｅ」等が挙げられる。
【００２６】
＜行列積専用プロセッサにおける行列積の計算＞
ここで、行列積専用プロセッサによる行列積の計算について、図２を参照しながら説明する。図２は、行列積専用プロセッサにおける行列積の計算の一例を説明するための図である。図２では、より一般に、行列積と行列和とを計算する場合、すなわち、４×４の行列をＡ、Ｂ及びＣとして、Ｄ＝ＡＢ＋Ｃを計算する場合について説明する。なお、行列積のみを計算する場合は、Ｃ＝０とすれば良く、４×４よりも大きい行列積を扱う場合には、分割して計算した結果を随時Ｃに代入して積算することによって、より大きな行列積を計算することができる。以降では、Ａ、Ｂ、Ｃ及びＤの各要素をそれぞれａｉｊ、ｂｉｊ、ｃｉｊ及びｄｉｊとする。
【００２７】
図２に示すように、行列積専用プロセッサは、ｉ＝１からｉ＝４まで行列Ａのｉ行目の要素ａｉ１、ａｉ２、ａｉ３、ａｉ４を順に入力して、この行列Ａのｉ行目のａｉ１、ａｉ２、ａｉ３、ａｉ４と、Ｌ１キャッシュ（又は共有メモリ）に格納されているＢのｊ列目の要素ｂ１ｊ、ｂ２ｊ、ｂ３ｊ、ｂ４ｊとの積和をｊに関して並列に計算した上で、Ｌ１キャッシュ（又は共有メモリ）に格納されているＣのｉ行ｊ列目の要素ｃｉｊをｊに関して並列に加算する。
【００２８】
このように、行列積専用プロセッサは、流れ作業的にＤの各要素ｄｉｊをｊに関して並列に計算することができるため、効率的に行列積及び行列和Ｄ＝ＡＢ＋Ｃを計算することができる。なお、行列積専用プロセッサが４×４の行列同士の行列積と行列和とをｊに関して並列に計算することは一例であって、行列積プロセッサに含まれる積和演算器の構成によっては、任意の行数及び列数の行列同士の行列積を並列に計算することができても良い。
【００２９】
＜テンソルデータ計算装置１０の機能構成＞
次に、本発明の実施の形態におけるテンソルデータ計算装置１０の機能構成について、図３を参照しながら説明する。図３は、本発明の実施の形態におけるテンソルデータ計算装置１０の機能構成の一例を示す図である。
【００３０】
図３に示すように、本発明の実施の形態におけるテンソルデータ計算装置１０は、データ入力部１０１と、データ格納部１０２と、テンソル因子分解部１０３と、行列積計算部１０４と、データ出力部１０５とを有する。これらの機能部のうち、例えば、データ入力部１０１、データ格納部１０２、テンソル因子分解部１０３及びデータ出力部１０５は、テンソルデータ計算装置１０にインストールされた１以上のプログラムがＣＰＵに実行させる処理により実現可能である。他方で、例えば、行列積計算部１０４は、テンソルデータ計算装置１０にインストールされた１以上のプログラムがＣＰＵ及びＧＰＵに実行させる処理により実現可能である。
【００３１】
また、本発明の実施の形態におけるテンソルデータ計算装置１０は、データ記憶部２０１と、行列積計算用記憶部２０２とを有する。データ記憶部２０１は、例えば補助記憶装置等の記憶装置を用いて実現される。他方で、行列積計算用記憶部２０２は、上述したＧＰＵのＬ１キャッシュや共有メモリ等を用いて実現される。
【００３２】
データ入力部１０１は、テンソルとして表現可能なデータを入力する。ここで、データ入力部１０１は、例えば、通信ネットワークを介して他の装置等からデータを受信することで、当該データを入力しても良いし、補助記憶装置等の記憶装置に格納されているデータを読み出すことで、当該データを入力しても良い。
【００３３】
データ格納部１０２は、データ入力部１０１が入力したデータをテンソルデータとしてデータ記憶部２０１に格納する。これにより、テンソルデータがデータ記憶部２０１に記憶される。
【００３４】
テンソル因子分解部１０３は、データ記憶部２０１に記憶されているテンソルデータを非負値テンソル因子分解するための処理を行う。このとき、テンソル因子分解部１０３は、因子行列の更新式（例えば、上記の式（４）〜（６））におけるテンソル積を行列積で表現する。そして、テンソル因子分解部１０３は、因子行列の更新式における行列積の計算を行列積計算部１０４に依頼する。
【００３５】
行列積計算部１０４は、テンソル因子分解部１０３からの依頼に応じて、行列積計算用記憶部２０２を用いて行列積専用プロセッサにより行列積を計算する。そして、行列積計算部１０４は、行列積の計算結果をテンソル因子分解部１０３に返信する。
【００３６】
データ出力部１０５は、テンソル因子分解部１０３による処理結果（すなわち、非負値テンソル因子分解により得られた因子行列）を示すデータを出力する。ここで、データ出力部１０５の出力先は限定されない。データ出力部１０５の出力先は、例えば、補助記憶装置等の記憶装置であっても良いし、ディスプレイ等の表示装置であっても良いし、通信ネットワークを介して接続される所定の装置等であっても良い。
【００３７】
＜テンソルデータ計算装置１０のハードウェア構成＞
次に、本発明の実施の形態におけるテンソルデータ計算装置１０のハードウェア構成について、図４を参照しながら説明する。図４は、本発明の実施の形態におけるテンソルデータ計算装置１０のハードウェア構成の一例を示す図である。
【００３８】
図４に示すように、本発明の実施の形態におけるテンソルデータ計算装置１０は、入力装置３０１と、表示装置３０２と、外部Ｉ／Ｆ３０３と、ＲＡＭ（Random Access Memory）３０４と、ＲＯＭ（Read Only Memory）３０５と、通信Ｉ／Ｆ３０６と、ＣＰＵ３０７と、１以上のＧＰＵ３０８と、補助記憶装置３０９とを有する。これら各ハードウェアは、それぞれがバスＢを介して通信可能に接続されている。
【００３９】
入力装置３０１は、例えばキーボードやマウス、タッチパネル等であり、ユーザが各種操作を入力するのに用いられる。表示装置３０２は、例えばディスプレイ等であり、テンソルデータ計算装置１０の処理結果を表示する。なお、テンソルデータ計算装置１０は、入力装置３０１及び表示装置３０２のうちの少なくとも一方を有していなくても良い。
【００４０】
外部Ｉ／Ｆ３０３は、外部装置とのインタフェースである。外部装置には、記録媒体３０３ａ等がある。テンソルデータ計算装置１０は、外部Ｉ／Ｆ３０３を介して、記録媒体３０３ａ等の読み取りや書き込みを行うことができる。記録媒体３０３ａには、テンソルデータ計算装置１０が有する各機能部（例えば、データ入力部１０１、データ格納部１０２、テンソル因子分解部１０３、行列積計算部１０４及びデータ出力部１０５）を実現する１以上のプログラム等が記録されていても良い。
【００４１】
記録媒体３０３ａとしては、例えば、フレキシブルディスク、ＣＤ（Compact Disc）、ＤＶＤ（Digital Versatile Disk）、ＳＤメモリカード（Secure Digital memory card）、ＵＳＢ（Universal Serial Bus）メモリカード等が挙げられる。
【００４２】
ＲＡＭ３０４は、プログラムやデータを一時保持する揮発性の半導体メモリである。ＲＯＭ３０５は、電源を切ってもプログラムやデータを保持することができる不揮発性の半導体メモリである。ＲＯＭ３０５には、例えば、ＯＳ（Operating System）に関する設定情報や通信ネットワークに関する設定情報等が格納されている。
【００４３】
通信Ｉ／Ｆ３０６は、テンソルデータ計算装置１０を通信ネットワークに接続するためのインタフェースである。テンソルデータ計算装置１０が有する各機能部を実現する１以上のプログラムは、通信Ｉ／Ｆ３０６を介して、所定のサーバ等から取得（ダウンロード）されても良い。
【００４４】
ＣＰＵ３０７は、ＲＯＭ３０５や補助記憶装置３０９等からプログラムやデータをＲＡＭ３０４上に読み出して、各種の制御処理等を実行する演算装置である。ＧＰＵ３０８は、データを並列に処理可能な演算装置である。ＧＰＵ３０８には、行列積の計算に特化した行列積専用プロセッサ３１０が組み込まれている。行列積専用プロセッサ３１０は、上述したように、例えば４×４行列同士の行列積を並列処理することにより効率的に行列積を計算することが可能な演算装置である。テンソルデータ計算装置１０が有する各機能部は、例えば補助記憶装置３０９に格納されている１以上のプログラムがＣＰＵ３０７又は／及びＧＰＵ３０８に実行させる処理により実現される。
【００４５】
補助記憶装置３０９は、例えばＨＤＤ（Hard Disk Drive）やＳＳＤ（Solid State Drive）等であり、プログラムやデータを格納している不揮発性の記憶装置である。補助記憶装置３０９に格納されているプログラムやデータには、例えば、ＯＳ、アプリケーションプログラム、テンソルデータ計算装置１０が有する各機能部を実現する１以上のプログラム等が挙げられる。
【００４６】
本発明の実施の形態におけるテンソルデータ計算装置１０は、図４に示すハードウェア構成を有することにより、後述する各種処理を実現することができる。なお、図４に示す例では、テンソルデータ計算装置１０が１台のコンピュータで実現される場合のハードウェア構成を示したが、これに限られず、テンソルデータ計算装置１０は複数台のコンピュータで実現されていても良い。
【００４７】
＜非負値テンソル因子分解＞
ここで、本発明の実施の形態におけるテンソルデータ計算装置１０により非負値テンソル因子分解を行う場合について説明する。以降では、データ記憶部２０１に記憶されているＩ×Ｊ×Ｋの３次のテンソルデータＸを、Ｉ×Ｒの因子行列Ａと、Ｊ×Ｒの因子行列Ｂと、Ｋ×Ｒの因子行列Ｃとに分解する場合について説明する。ただし、Ｘの各要素ｘｉｊｋ、Ａの各要素ａｉｒ、Ｂの各要素ａｊｒ及びＣの各要素ｃｋｒはいずれも非負値である。なお、Ｒは因子行列Ａ、Ｂ及びＣの基底数である。
【００４８】
このとき、上述したように、テンソルデータＸは、上記の式（１）のように表すことができる。また、因子行列Ａ、Ｂ及びＣを求めるための距離関数Ｌとして一般化ＫＬダイバージェンス（ｇＫＬ）距離を用いた場合、この距離関数Ｌ（Ｘ｜＾Ｘ）は、上記の式（３）のように表すことができる。そして、このとき、因子行列Ａ、Ｂ及びＣの更新式は、上記の式（４）〜（６）のように表される。
【００４９】
そこで、上記の式（４）〜（６）に示す更新式（すなわち、ａｉｒの更新式、ｂｊｒの更新式及びｃｋｒの更新式）におけるテンソル積を行列積で表現する場合について説明する。なお、以降では、データ入力部１０１により入力されたデータが、データ格納部１０２によってテンソルデータＸとしてデータ記憶部２０１に格納されているものとする。
【００５０】
≪ａｉｒの更新式≫
まず、上記の式（４）に示すａｉｒの更新式における分数部分の分母は、ｒのみに依存する項として、以下の式（８）のように表すことができる。
【００５１】
【数６】
2020027547.tif 000008
このＱｒは、図５に示す更新処理により事前に計算することができる。図５は、更新処理の手順の一例を説明するための図（その１）である。以降では、Ｑｒを格納する配列要素をＱ［ｒ］、計算結果を一時的に保持する変数をＢｒ＿ｔｍｐ及びＣｒ＿ｔｍｐ、因子行列Ｂの各要素ｂｊｒを格納する配列要素をｂ［ｊ］［ｒ］、因子行列Ｃの各要素ｃｋｒを格納する配列要素をｃ［ｋ］［ｒ］とする。
【００５２】
図５に示すように、テンソル因子分解部１０３は、ｒに関するＲ回のループ処理（Ｓ１００）の中で、ｒ毎に、Ｂｒ＿ｔｍｐ及びＣｒ＿ｔｍｐを０に初期化（Ｓ１００−１）した上で、ｊに関するＪ回のループ処理（Ｓ１００−２）と、ｋに関するＫ回のループ処理（Ｓ１００−３）と、Ｑ［ｒ］←１．０／（Ｂｒ＿ｔｍｐ×Ｃｒ＿ｔｍｐ）の計算処理（Ｓ１００−４）とを実行する。ここで、「←」は、右辺の計算結果を左辺に代入することを表す。
【００５３】
また、テンソル因子分解部１０３は、ｊに関するＪ回のループ処理の中で、ｊ毎に、Ｂｒ＿ｔｍｐ←Ｂｒ＿ｔｍｐ＋ｂ［ｊ］［ｒ］の計算処理（Ｓ１００−２−１）を実行する。同様に、テンソル因子分解部１０３は、ｋに関するＫ回のループ処理の中で、ｋ毎に、Ｃｒ＿ｔｍｐ←Ｃｒ＿ｔｍｐ＋ｃ［ｋ］［ｒ］の計算処理（Ｓ１００−３−１）を実行する。
【００５４】
以上により、ｒのみに依存する項として、上記の式（４）に示すａｉｒの更新式の分母Ｑｒが計算される。上述したように、このＱｒは、上記の式（４）の更新式によって実際にａｉｊを更新する前に、事前に計算しておくことができる。
【００５５】
次に、上記の式（４）に示すａｉｒの更新式における分数部分の分子は、２つの行列Ｗ及びＺの行列積として表現することができる。具体的には、ＷをＰ×Ｒの非負行列（ただし、Ｐ＝Ｊ×Ｋ）として、
【００５６】
【数７】
2020027547.tif 000009
とした場合に、Ｗの各要素ｗｐｒは、因子行列Ｂの要素ｂｊｒと因子行列Ｃの要素ｃｋｒとの積ｗｐｒ＝ｂｊｒ×ｃｋｒで表されるものとする。これは、因子行列Ｂと因子行列Ｃとをクロネッカー積により展開することを意味する。ここで、ｐ＝ｊ×Ｋ＋ｋである。
【００５７】
ただし、ｐ＝ｊ×Ｋ＋ｋは、変数ｊの取り得る値がｊ＝０，・・・，Ｊ−１である場合を想定したものである。例えば、変数ｊの取り得る値がｊ＝１，・・・，Ｊである場合は、ｐ＝（ｊ−１）×Ｋ＋ｋとする。
【００５８】
上記の行列Ｗを用いて、＾ｘｉｊｋは、以下の式（９）のように表すことができる。
【００５９】
【数８】
2020027547.tif 000010
ここで、ｔは転置を表す。また、｛ＡＷｔ｝ｉｐは行列積ＡＷｔの（ｉ，ｐ）要素である。ｐはｊ及びｋで表現することができるため、この行列積ＡＷｔは間接的に行列積計算が可能である。なお、上記の式（９）では、Ｗの転置行列としてＷｔと表現しているが、行列積専用プロセッサ３１０により行列積を計算する際には、データ構造の形式上、Ｗｔを別の行列Ｗ´＝Ｗｔとして、行列積ＡＷ´を計算した方が好ましい場合もある。
【００６０】
これらのＷ及びＷ´＝Ｗｔは、図６に示す更新処理により計算することができる。図６は、更新処理の手順の一例を説明するための図（その２）である。以降では、行列Ｗのｗｐｒを格納する配列要素をｗ［ｐ］［ｒ］、行列Ｗ´＝Ｗｔの各要素ｗｒｐ´を格納する配列要素をｗ＿ｄａｓｈ［ｒ］［ｐ］とする。
【００６１】
図６に示すように、テンソル因子分解部１０３は、ｊに関するＪ回のループ処理（Ｓ２００）の中で、ｊ毎に、ｋに関するＫ回のループ処理（Ｓ２００−１）を実行する。また、テンソル因子分解部１０３は、ｋに関するＫ回のループ処理の中で、ｋ毎に、ｐ←ｊ×Ｋ＋ｋの計算処理（Ｓ２００−１−１）を行った上で、ｒに関するＲ回のループ処理（Ｓ２００−１−２）を実行する。更に、テンソル因子分解部１０３は、ｒに関するＲ回のループ処理の中で、ｒ毎に、ｗ［ｐ］［ｒ］←ｂ［ｊ］［ｒ］×ｃ［ｋ］［ｒ］の計算処理（Ｓ２００−１−２−１）を実行した後、ｗ＿ｄａｓｈ［ｒ］［ｐ］←ｗ［ｐ］［ｒ］の計算処理（Ｓ２００−１−２−２）を実行する。
【００６２】
また、＾Ｘの各要素＾ｘｉｊｋ＝｛ＡＷｔ｝ｉｐは、上記の図６に示す更新処理でＷ´が計算された後に、図７に示す更新処理により計算することができる。図７は、更新処理の手順の一例を説明するための図（その３）である。以降では、＾Ｘの各要素＾ｘｉｊｋを格納する配列要素をｘ＿ｈａｔ［ｉ］［ｐ］とする。なお、＾Ｘの各要素＾ｘｉｊｋを格納する配列要素をｘ＿ｈａｔ［ｉ］［ｊ］［ｋ］として、＾ｘｉｊｋを３次元配列に格納しても良い。ただし、行列積専用プロセッサ３１０の計算結果を直接格納するためには、２次元配列に格納する方が好ましい場合もある。
【００６３】
図７に示すように、テンソル因子分解部１０３は、ｉに関するＩ回のループ処理（Ｓ３００）を実行する。このとき、テンソル因子分解部１０３は、ｉに関するＩ回のループ処理の中で、ｉ毎に、行列積計算部１０４に対して行列積の計算を依頼する。
【００６４】
行列積の計算が依頼された場合、行列積計算部１０４は、ｐに関するＰ／４回のループ処理（Ｓ３００−１）を実行する。また、行列積計算部１０４は、ｐに関するＰ／４回のループ処理の中で、ｐ毎に、ｒに関するＲ／４回のループ処理（Ｓ３００−１−１）を実行する。更に、行列積計算部１０４は、ｒに関するＲ／４回のループ処理の中で、ｒ毎に、各ｘ＿ｈａｔ［ｉ］［ｐ］←行列積専用プロセッサ３１０による行列積計算（ａ，ｗ＿ｄａｓｈ）の計算処理（Ｓ３００−１−１−１）を実行する。
【００６５】
ここで、上記のステップＳ３００−１−１の計算処理の右辺は、行列Ａ及びＷ´をそれぞれ４×４行列に分割した場合に、ｒに関するループ回数及びｉに関するループ回数に対応する４×４行列Ａｉｒと、当該ｒに関するループ回数及びｐに関するループ回数に対応する４×４行列Ｗｒｐ´との行列積を計算することを表す。なお、Ａｉｒの各配列要素ａ［ｉ］［ｒ］は、Ａの各配列要素ａ［ｉ］［ｒ］のうちの或る１６個の配列要素である。同様に、Ｗｒｐ´の各配列要素ｗ＿ｄａｓｈ［ｒ］［ｐ］は、Ｗ´の各配列要素ｗ＿ｄａｓｈ［ｒ］［ｐ］のうちの或る１６個の配列要素である。
【００６６】
また、上記のステップＳ３００−１−１の計算処理の左辺は、当該ｒに関するループ回数及びｐに関するループ回数に対応する４×４行列＾Ｘｒｐの各配列要素ｘ＿ｈａｔ［ｉ］［ｐ］を表す。なお、＾Ｘｒｐの各配列要素ｘ＿ｈａｔ［ｉ］［ｐ］は、＾Ｘの各配列要素ｘ＿ｈａｔ［ｉ］［ｐ］のうちの或る１６個の要素である。
【００６７】
このように、行列積計算部１０４は、行列積専用プロセッサ３１０により、４×４行列毎に、＾Ｘの各配列要素＾ｘｉｊｋ（すなわち、行列積ＡＷ´の（ｉ，ｐ）要素）を計算する。このとき、行列積計算部１０４は、例えば、各配列要素ｗ＿ｄａｓｈ［ｒ］［ｐ］を行列積計算用記憶部２０２に格納した上で、図２で説明したように、４×４の行列毎に、１６個の配列要素ａ［ｉ］［ｒ］と、１６個の配列要素ｗ＿ｄａｓｈ［ｒ］［ｐ］との積和を並列に計算することで、行列積ＡＷ´を計算する。なお、ｐに関するループ回数がＰ／４、ｒに関するループ回数がＲ／４であるが、これは、本発明の実施の形態における行列積専用プロセッサ３１０が４×４の行列同士の行列積を同時に計算するためである（すなわち、行列積を（Ｐ×Ｒ）／１６回の処理に分割して計算を行うためである。）。一般に、例えば、行列積専用プロセッサ３１０がＭ×Ｍの行列同士の行列積を同時に計算することができる場合、ｐに関するループ回数をＰ／Ｍ、ｒに関するループ回数をＲ／Ｍとすれば良い。
【００６８】
なお、テンソル因子分解部１０３は、例えば、ｃｕｂｌａｓＧｅｍｍＥｘ（）関数等を呼び出すことで、行列積計算部１０４に対して行列積ＡＷ´の計算を依頼することができる。また、行列ＡやＷ´の行数や列数が４の倍数でない場合は、例えば、適宜０でパディングすれば良い。
【００６９】
次に、ＺをＩ×Ｐの非負行列として、
【００７０】
【数９】
2020027547.tif 000011
とした場合に、Ｚの各要素ｚｉｐは、
【００７１】
【数１０】
2020027547.tif 000012
で表されるものとする。
【００７２】
これにより、上記の式（４）に示すａｉｒの更新式は、以下の式（１０）のように表すことができる。
【００７３】
【数１１】
2020027547.tif 000013
ここで、｛ＺＷ｝ｉｒは行列積ＺＷの（ｉ，ｒ）要素であり、
【００７４】
【数１２】
2020027547.tif 000014
として行列積を計算することができる。したがって、最終的に、この行列積を行列積専用プロセッサ３１０により計算させることで、非負値テンソル因子分解に関する処理の高速化が可能となる。
【００７５】
Ｚの各要素ｚｉｐは、上記の図７に示す更新処理で＾Ｘが計算された後に、図８に示す更新処理により計算することができる。図８は、更新処理の手順の一例を説明するための図（その４）である。以降では、Ｚの各要素ｚｉｐを格納する配列要素をｚ［ｉ］［ｐ］、Ｘの各要素ｘｉｊｋを格納する配列要素をｘ［ｉ］［ｊ］［ｋ］とする。
【００７６】
図８に示すように、テンソル因子分解部１０３は、ｉに関するＩ回のループ処理（Ｓ４００）の中で、ｉ毎に、ｊに関するループ処理（Ｓ４００−１）を実行する。また、テンソル因子分解部１０３は、ｊに関するループ処理の中で、ｊ毎に、ｋに関するＫ回のループ処理（Ｓ４００−１−１）を実行する。更に、テンソル因子分解部１０３は、ｋに関するＫ回のループ処理の中で、ｋ毎に、ｐ←ｊ×Ｋ＋ｋの計算処理（Ｓ４００−１−１−１）を実行した後、ｚ［ｉ］［ｐ］←ｘ［ｉ］［ｊ］［ｋ］／ｘ＿ｈａｔ［ｉ］［ｐ］の計算処理（Ｓ４００−１−２）を実行する。
【００７７】
そして、因子行列Ａの各要素ａｉｒは、上記の図８に示す更新処理でＺが計算された後に、図９に示す更新処理により更新することができる（すなわち、上記の式（１０）により各ａｉｒを更新することができる。）。図９は、更新処理の手順の一例を説明するための図（その５）である。以降では、計算結果を一時的に保持する配列をＺＷ＿ｔｍｐ、この配列の配列要素をＺＷ＿ｔｍｐ［ｒ］とする。
【００７８】
図９に示すように、テンソル因子分解部１０３は、ｉに関するＩ回のループ処理（Ｓ５００）を実行する。また、テンソル因子分解部１０３は、ｉ毎に、ＺＷ＿ｔｍｐ［ｒ］を０に初期化（Ｓ５００−１）した上で、行列積計算部１０４に対して行列積の計算を依頼する。
【００７９】
行列積の計算が依頼された場合、行列積計算部１０４は、ｒに関するＲ／４回のループ処理（Ｓ５００−２）を実行する。また、行列積計算部１０４は、ｒに関するＲ／４回のループ処理の中で、ｒ毎に、ｐに関するＰ／４回のループ処理（Ｓ５００−２−１）を実行する。更に、行列積計算部１０４は、ｐに関するＰ／４回のループ処理の中で、ｐ毎に、各ＺＷ＿ｔｍｐ［ｒ］←行列積専用プロセッサ３１０による行列積計算（ｚ，ｗ）の計算処理（Ｓ５００−２−１−１）を実行する。
【００８０】
また、行列積計算部１０４は、行列積計算部１０４によりｐに関するＰ／４回のループ処理が実行された後、ａ［ｉ］［ｒ］←ａ［ｉ］［ｒ］×ＺＷ＿ｔｍｐ［ｒ］×Ｑ［ｒ］の計算処理（Ｓ５００−２−２）を実行する。これにより、因子行列Ａの各配列要素ａ［ｉ］［ｒ］が更新される。
【００８１】
ここで、上記のステップＳ５００−２−１−１の計算処理の右辺は、行列Ｚ及びＷをそれぞれ４×４行列に分割した場合に、ｐに関するループ回数及びｉに関するループ回数に対応する４×４行列Ｚｉｐと、当該ｐに関するループ回数及びｒに関するループ回数に対応する４×４行列Ｗｐｒとの行列積を計算することを表す。なお、Ｚｉｐの各配列要素ｚ［ｉ］［ｐ］は、Ｚの各配列要素ｚ［ｉ］［ｐ］のうちの或る１６個の配列要素である。同様に、Ｗｐｒの各配列要素ｗ［ｐ］［ｒ］は、Ｗの各配列要素ｗ［ｐ］［ｒ］のうちの或る１６個の配列要素である。
【００８２】
また、上記のステップＳ５００−２−１−１の計算処理の左辺は、４×４行列Ｚｉｐと４×４行列Ｗｐｒとの行列積ＺｉｐＷｐｒの各配列要素ＺＷ＿ｔｍｐ［ｒ］を表す。
【００８３】
このように、行列積計算部１０４は、行列積専用プロセッサ３１０により、４×４行列毎に、行列積ＺＷを計算する。このとき、行列積計算部１０４は、例えば、各配列要素ｗ［ｐ］［ｒ］を行列積計算用記憶部２０２に格納した上で、図２で説明したように、４×４の行列毎に、１６個の配列要素ｚ［ｉ］［ｐ］と、１６個の配列要素ｗ［ｐ］［ｒ］との積和を並列に計算することで、行列積ＺＷを計算する。なお、ｐに関するループ回数がＰ／４、ｒに関するループ回数がＲ／４であるが、これは、上述したように、本発明の実施の形態における行列積専用プロセッサ３１０が４×４の行列同士の行列積を同時に計算するためである（すなわち、行列積を（Ｐ×Ｒ）／１６回の処理に分割して計算を行うためである。）。一般に、例えば、行列積専用プロセッサ３１０がＭ×Ｍの行列同士の行列積を同時に計算することができる場合、ｐに関するループ回数をＰ／Ｍ、ｒに関するループ回数をＲ／Ｍとすれば良い。
【００８４】
なお、テンソル因子分解部１０３は、上述したように、例えば、ｃｕｂｌａｓＧｅｍｍＥｘ（）関数等を呼び出すことで、行列積計算部１０４に対して行列積ＡＷ´の計算を依頼することができる。また、行列ＡやＷ´の行数や列数が４の倍数でない場合は、例えば、適宜０でパディングすれば良い。
【００８５】
≪ｂｊｒの更新式≫
上記の式（５）に示すｂｊｒの更新式については、上述したａｉｒの更新式の説明において、各記号を以下のように読み替えれば良い。
【００８６】
・ａｉｒ→ｂｊｒ
・ｂｊｒ→ａｉｒ
・ｊに関するＪまでの和Σ→ｉに関するＩまでの和Σ
・Ｐ＝Ｊ×Ｋ→Ｐ＝Ｉ×Ｋ
・ｐ＝ｊ×Ｋ＋ｋ→ｐ＝ｉ×Ｋ＋ｋ
・｛ＡＷｔ｝ｉｐ→｛ＢＷｔ｝ｊｐ
・ｚｉｐ→ｚｊｐ（すなわち、ＺをＪ×Ｐの行列と読み替える。）
・｛ＺＷ｝ｉｒ→｛ＺＷ｝ｊｒ
これにより、上記の式（５）に示すｂｊｒの更新式についても、ｂｊｒ：＝ｂｊｒＱｒ｛ＺＷ｝ｊｒと行列積で表現することができる。
【００８７】
≪ｃｋｒの更新式≫
上記の式（６）に示すｃｋｒの更新式については、上述したａｉｒの更新式の説明において、各記号を以下のように読み替えれば良い。
【００８８】
・ａｉｒ→ｃｋｒ
・ｃｋｒ→ａｉｒ
・ｋに関するＫまでの和Σ→ｉに関するＩまでの和Σ
・Ｐ＝Ｊ×Ｋ→Ｐ＝Ｊ×Ｉ
・ｐ＝ｊ×Ｋ＋ｋ→ｐ＝ｊ×Ｉ＋ｉ
・｛ＡＷｔ｝ｉｐ→｛ＣＷｔ｝ｋｐ
・ｚｉｐ→ｚｋｐ（すなわち、ＺをＫ×Ｐの行列と読み替える。）
・｛ＺＷ｝ｉｒ→｛ＺＷ｝ｋｒ
これにより、上記の式（６）に示すｃｋｒの更新式についても、ｃｋｒ：＝ｃｋｒＱｒ｛ＺＷ｝ｋｒと行列積で表現することができる。
【００８９】
以上のように、本発明の実施の形態におけるテンソルデータ計算装置１０は、３次の非負値のテンソルデータＸをテンソル因子分解する場合に、このテンソルデータＸの因子行列Ａ、Ｂ及びＣの更新式を行列積で表現することができる。そして、本発明の実施の形態におけるテンソルデータ計算装置１０は、この行列積を行列積専用プロセッサ３１０により計算する。これにより、本発明の実施の形態におけるテンソルデータ計算装置１０は、非負値テンソル因子分解に関する処理を高速に実行することができるようになる。なお、非負値テンソル因子分解の処理結果（すなわち、最終的に得られた因子行列Ａ、Ｂ及びＣをそれぞれ示すデータ）は、データ出力部１０５により所定の出力先に出力される。
【００９０】
＜２次のテンソルの場合＞
上記では３次の非負値のテンソルデータＸをテンソル因子分解する場合について説明したが、本発明の実施の形態は、２次のテンソル（すなわち、行列）の因子分解でも同様に適用することができる。以降では、２次の非負値のテンソルデータＸのテンソル因子分解（すなわち、非負値の行列データＸの行列因子分解）について説明する。
【００９１】
２次の非負値のテンソルデータＸのテンソル因子分解は、因子行列をＡ及びＢとして、以下の式（１１）のように表すことができる。
【００９２】
【数１３】
2020027547.tif 000015
このとき、例えば、ａｉｒの更新式は、以下の式（１２）のように表される。
【００９３】
【数１４】
2020027547.tif 000016
また、このとき、＾Ｘの各要素＾ｘｉｊは
【００９４】
【数１５】
2020027547.tif 000017
であり、＾Ｘは行列積ＡＢｔで表現することができる。このため、＾Ｘは行列積専用プロセッサ３１０により計算することができる。
【００９５】
また、３次のテンソルの場合と同様に、行列Ｚを
【００９６】
【数１６】
2020027547.tif 000018
として表現する。同様に、Ｑｒも
【００９７】
【数１７】
2020027547.tif 000019
と表現する。これにより、ａｉｒの更新式は、以下の式（１３）で表すことができる。
【００９８】
【数１８】
2020027547.tif 000020
したがって、この更新式に含まれる行列積を行列積専用プロセッサ３１０に計算させることで、２次のテンソルの非負値テンソル因子分解に関する処理の高速化も可能となる。なお、ｂｊｒの更新式についても、３次のテンソルの場合と同様に読み替えることによって行列積で表現することができる。
【００９９】
＜高次のテンソルの場合＞
また、本発明の実施の形態は、高次の非負値のテンソルデータＸをテンソル因子分解する場合についても同様に適用することができる。以降では、Ｎ次（Ｎ≧４）の非負値のテンソルデータＸのテンソル因子分解について説明する。
【０１００】
Ｎ次のテンソルデータ
【０１０１】
【数１９】
2020027547.tif 000021
のテンソル因子分解は、以下の式（１４）に示すように、
【０１０２】
【数２０】
2020027547.tif 000022
がＸを再現できるように（すなわち、Ｘと＾Ｘとが近似的に等しくなるように）、Ｎ個の因子行列
【０１０３】
【数２１】
2020027547.tif 000023
を求める手法である。
【０１０４】
【数２２】
2020027547.tif 000024
ここで、上記の式（１４）のテンソル積＾Ｘは、以下の式（１５）のように表すことができる。
【０１０５】
【数２３】
2020027547.tif 000025
このとき、距離関数Ｌとして一般化ＫＬダイバージェンス（ｇＫＬ）距離を用いた場合、
【０１０６】
【数２４】
2020027547.tif 000026
の更新式は、以下の式（１６）のように表される。
【０１０７】
【数２５】
2020027547.tif 000027
この更新式は、２次や３次のテンソルの場合と同様に、行列積として表現することができる。
【０１０８】
まず、上記の式（１６）に示す更新式における分数部分の分母は、ｒのみに依存する項として、以下の式（１７）のように表すことができる。
【０１０９】
【数２６】
2020027547.tif 000028
次に、上記の式（１６）に示す更新式における分数部分の分子は、２つの行列Ｗ（ｎ）及びＺ（ｎ）の行列積として表現することができる。具体的には、Ｗ（ｎ）をＰ（ｎ）×Ｒの非負行列（ただし、Ｐ（ｎ）＝Ｉｎ＋１×・・・×ＩＮ×Ｉ１×・・・×Ｉｎ−１）として、
【０１１０】
【数２７】
2020027547.tif 000029
とする。このとき、Ｗ（ｎ）の各要素は行列Ｙｎの要素の積として、
【０１１１】
【数２８】
2020027547.tif 000030
と表されるものとする。これは、因子行列Ｙｎ＋１，・・・，ＹＮ，Ｙ１，・・・，Ｙｎ−１をクロネッカー積により展開することを意味する。ここで、
【０１１２】
【数２９】
2020027547.tif 000031
である。
【０１１３】
上記の行列Ｗ（ｎ）を用いて、＾Ｘの各要素は、以下の式（１８）のように表すことができる。
【０１１４】
【数３０】
2020027547.tif 000032
ここで、
【０１１５】
【数３１】
2020027547.tif 000033
は行列積ＹｎＷ（ｎ）ｔの（ｉｎ，ｐ）要素であり、ｐを用いて間接的に行列積計算が可能である。
【０１１６】
次に、２次や３次のテンソルの場合と同様に、行列Ｚ（ｎ）を、
【０１１７】
【数３２】
2020027547.tif 000034
として、
【０１１８】
【数３３】
2020027547.tif 000035
とする。
【０１１９】
これにより、上記の式（１６）に示す更新式は、以下の式（１９）のように表すことができる。
【０１２０】
【数３４】
2020027547.tif 000036
ここで、
【０１２１】
【数３５】
2020027547.tif 000037
は行列積Ｚ（ｎ）Ｗ（ｎ）の（ｉｎ，ｒ）要素であり、
【０１２２】
【数３６】
2020027547.tif 000038
として、行列積を計算することができる。したがって、最終的に、この行列積を行列積専用プロセッサ３１０により計算させることで、Ｎ次のテンソルの非負値テンソル因子分解に関する処理の高速化も可能となる。
【０１２３】
＜まとめ＞
以上のように、本発明の実施の形態におけるテンソルデータ計算装置１０は、非負値のテンソルデータＸをテンソル因子分解する場合に、このテンソルデータＸの各因子行列の更新式を行列積で表現することができる。すなわち、本発明の実施の形態におけるテンソルデータ計算装置１０は、各因子行列をクロネッカー積により展開することで、各因子行列の更新式を行列積で表現することを可能としている。
【０１２４】
これにより、本発明の実施の形態におけるテンソルデータ計算装置１０は、この行列積を行列積専用プロセッサ３１０により計算ことができ、非負値テンソル因子分解に関する処理を高速に実行することができるようになる。
【０１２５】
なお、本発明の実施の形態は、更に、特開２０１６−１３９３９１号公報に開示されている手法を組み合わせることもできる。この場合、メモリへのランダムアクセスによる処理速度の低下を抑えることができると共に、非負値テンソル因子分解に関する処理を高速化させることができるようになる。
【０１２６】
本発明は、具体的に開示された上記の実施形態に限定されるものではなく、特許請求の範囲から逸脱することなく、種々の変形や変更が可能である。
【符号の説明】
【０１２７】
１０        テンソルデータ計算装置
１０１      データ入力部
１０２      データ格納部
１０３      テンソル因子分解部
１０４      行列積計算部
１０５      データ出力部
２０１      データ記憶部
２０２      行列積計算用記憶部
【図１】
2020027547.tif 000039
【図２】
2020027547.tif 000040
【図３】
2020027547.tif 000041
【図４】
2020027547.tif 000042
【図５】
2020027547.tif 000043
【図６】
2020027547.tif 000044
【図７】
2020027547.tif 000045
【図８】
2020027547.tif 000046
【図９】
2020027547.tif 000047