Times と TransposeTimes
マトリックス製品CNTKします。
A * B
Times (A, B, outputRank=1)
TransposeTimes (A, B, outputRank=1)
パラメーター
A
行列積の最初の引数。 時間シーケンスを指定できます。B
行列積の 2 番目の引数。 時間シーケンスを指定できます。outputRank
(既定値: 1): 出力ディメンションを構成する軸のA
数。 以下の「テンソルの拡張解釈」を参照してください。
戻り値
結果のマトリックス積 (テンソル)。 これは、いずれかの入力が時間シーケンスであった場合の時間シーケンスです。
説明
この関数は Times()
、テンソルの拡張を含むマトリックス積を実装します。 演算子は *
短い手です。 TransposeTimes()
は、最初の引数を入れ替えします。
B
行列 (ランク 2 テンソル) または列ベクトル (rank-1 tensor) A * B
の場合A
、一般的な行列積が期待どおりに計算されます。
TransposeTimes (A, B)
は行列積 A^T * B
を計算します。ここで ^T
、転置を示します。 TransposeTimes (A, B)
と同じ結果 Transpose (A) * B
が得られますが、置き換えたバージョン A
の一時的なコピーを回避するため、より効率的です。
時間シーケンス
両方 A
とも B
、単一の行列または時間シーケンスのいずれかになります。 繰り返しネットワークの一般的なケースは A
、重み行列であるのに対し B
、入力のシーケンスです。
注: 時間シーケンスの場合 A
、各時間ステップに対して個別の GEMM 呼び出しが起動されるため、操作は効率的ではありません。 例外は、 TransposeTimes()
両方の入力が列ベクトルであり、特別な最適化が存在する場合です。
スパース サポート
Times()
スパース 行列をサポートします TransposeTimes()
。 両方が疎でない限り、結果は高密度マトリックスになります。 2 つの最も重要なユース ケースは次のとおりです。
B
入力単語のワンホット表現 (または、より一般的には、ワンホット ベクトルのシーケンス全体)。 次に、A * B
単語の埋め込みを示します。ここで、列A
は単語の埋め込みベクトルです。 CNTKの埋め込みを実現するための推奨される方法を次に示します。``` Embedding (x, dim) = Parameter (dim, 0/*inferred*/) * x e = Embedding (input, 300) ```
A
は、ラベル ワードの 1 つのホットな表現です。 一般的なクロスエントロピ条件とエラー カウンターは、それぞれz
、最上位の Softmax() 分類子への入力とL
、スパースである可能性があるラベル シーケンスを次のように記述TransposeTimes()
できます。``` CrossEntropyWithSoftmax (L, z) = ReduceLogSum (z) - TransposeTimes (L, z) ErrorPrediction (L, z) = BS.Constants.One - TransposeTimes (L, Hardmax (z)) ```
スカラーを乗算する
行列積を使用して、スカラーを使用して行列を乗算 することはできません 。 ディメンションの不一致に関するエラーが発生します。 スカラーを乗算するには、代わりに要素ごとの積 .*
を使用します。 たとえば、2 つの行列の加重平均は次のように記述できます。
z = Constant (alpha) .* x + Constant (1-alpha) .* y
対角線行列を乗算する
入力行列が対角線であり、ベクトルとして格納されている場合は、要素ごとの乗算 (ElementTimes()
または.*
演算子) を使用Times()
しないでください。
次に例を示します。
dMat = ParameterTensor {(100:1)}
z = dMat .* v
これにより、ブロードキャスト セマンティクスを利用して、すべての要素 v
とそれぞれの行 dMat
を乗算します。
ランク > 2 のテンソルのマトリックス積の拡張解釈
上位ランクのテンソルまたはB
テンソルの場合A
、*
この演算は一般化された行列積を表します。最初のA
次元以外の次元はすべて先頭の次元B
と一致する必要があり、フラット化によって解釈されます。 たとえば、a [I x J x K]
と[J x K x L]
テンソルの積 (この値は次のように省略します[I x J x K] * [J x K x L]
) は、行列積が定義され、次元[I x L]
の結果が得られる行列として [I x (J * K)] * [(J * K) x L]
2 つのテンソルを再整形することによって再解釈されます。 これは、重み行列の行がアクティブ化ベクトルと一致するパターンであると見なす場合に理にかなっています。 上記の一般化により、画像や音声機能の実行ウィンドウなど、これらのパターン自体を多次元にすることができます。
に複数の非一致ディメンション B
を含めることもできます。 たとえば [I x J] * [J x K x L]
、次のマトリックス積 [I x J] * [J x (K * L)]
として解釈されます。これにより、ディメンションの結果が生成されます [I x K x L]
。 たとえば、これにより、ディメンションの音声機能のローリング ウィンドウ L
内のすべてのベクトルにマトリックスを適用できます J
。
製品の結果に複数のディメンション (2D フィールドとしてレイヤーのアクティブ化を配置するなど) が必要な場合は、演算子を使用*
する代わりに、"patterns" が配置され、出力に保持されるディメンションの数がどこにm
あるかを指定Times (A, B, outputRank=m)
する必要があります。 たとえば、 Times (tensor of dim [I x J x K], tensor of dim [K x L], outputRank=2)
行列積 [(I * J) x K] * [K x L]
として解釈され、次元 [I x J x L]
の結果が生成されます。