次の方法で共有


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]の結果が生成されます。