Compartilhar via


Times e TransposeTimes

CNTK produto de matriz.

A * B
Times (A, B, outputRank=1)
TransposeTimes (A, B, outputRank=1)

Parâmetros

  • A primeiro argumento do produto de matriz. Pode ser uma sequência de tempo.
  • B segundo argumento do produto de matriz. Pode ser uma sequência de tempo.
  • outputRank (padrão: 1): número de eixos que constituem a dimensão de A saída. Consulte 'Interpretação estendida para tensores' abaixo.

Valor Retornado

Produto de matriz resultante (tensor). Essa é uma sequência de tempo se uma das entradas for uma sequência de tempo.

Descrição

A Times() função implementa o produto de matriz, com extensões para tensores. O * operador é uma mão curta para ele. TransposeTimes() transpõe o primeiro argumento.

Se A e B forem matrizes (tensor de nível 2) ou vetores de coluna (tensor de classificação 1), A * B calcularão o produto de matriz comum, da mesma forma que se esperaria.

TransposeTimes (A, B) calcula o produto A^T * Bde matriz, em que ^T indica transposição. TransposeTimes (A, B) tem o mesmo resultado Transpose (A) * Bque, mas é mais eficiente, pois evita uma cópia temporária da versão transposta de A.

Sequências de tempo

Ambos A e B podem ser matrizes individuais ou sequências de tempo. Um caso comum para redes recorrentes é que A é uma matriz de peso, enquanto B é uma sequência de entradas.

Observação: se A for uma sequência de tempo, a operação não será eficiente, pois iniciará uma invocação gemm separada para cada etapa de tempo. A exceção é TransposeTimes() onde ambas as entradas são vetores de coluna, para os quais existe uma otimização especial.

Suporte esparso

Times() e dar TransposeTimes() suporte à matriz esparsa. O resultado é uma matriz densa, a menos que ambas sejam esparsas. Os dois casos de uso mais importantes são:

  • B sendo uma representação única de uma palavra de entrada (ou, mais comumente, uma sequência inteira de vetores únicos). Em seguida, A * B denota uma inserção de palavras, em que as colunas são A os vetores de inserção das palavras. A seguir está a maneira recomendada de realizar inserções em CNTK:

    ```
    Embedding (x, dim) = Parameter (dim, 0/*inferred*/) * x
    e = Embedding (input, 300)
    ```
    
  • A sendo uma representação única de uma palavra de rótulo. O popular critério entre entropias e o contador de erros podem ser gravados usando TransposeTimes() da seguinte maneira, respectivamente, onde z está a entrada para o classificador Softmax() de nível superior e L a sequência de rótulos que pode ser esparsa:

    ```
    CrossEntropyWithSoftmax (L, z) = ReduceLogSum (z) - TransposeTimes (L,          z)
    ErrorPrediction         (L, z) = BS.Constants.One - TransposeTimes (L, Hardmax (z))
    ```
    

Multiplicação com um escalar

O produto de matriz não pode ser usado para multiplicar uma matriz com um escalar. Você receberá um erro em relação às dimensões incompatíveis. Para multiplicar com um escalar, use o produto .* em termos de elemento. Por exemplo, a média ponderada de duas matrizes pode ser escrita desta forma:

z = Constant (alpha) .* x + Constant (1-alpha) .* y

Multiplicação com uma matriz diagonal

Se a matriz de entrada for diagonal e armazenada como um vetor, não use Times() , mas uma multiplicação em termos de elemento (ElementTimes() ou o .* operador). Por exemplo

dMat = ParameterTensor {(100:1)}
z = dMat .* v

Isso aproveita a semântica de difusão para multiplicar cada elemento v com a respectiva linha de dMat.

Interpretação estendida do produto de matriz para tensores da classificação > 2

Se A e/ou B são tensores de classificação mais alta, a * operação denota um produto de matriz generalizado em que todos, exceto a primeira dimensão, A devem corresponder às dimensões principais de B, e são interpretados por nivelamento. Por exemplo, um produto de um tensor e [J x K x L] um tensor (que abreviaremos daqui em diante como [I x J x K] * [J x K x L]) é reinterpretado remodelando os dois tensores como matrizes, [I x (J * K)] * [(J * K) x L]para os quais o produto de matriz é definido e produz um resultado da dimensão[I x L].[I x J x K] Isso fará sentido se considerarmos que as linhas de uma matriz de peso são padrões com os quais os vetores de ativação são correspondidos. A generalização acima permite que esses padrões sejam multidimensionais, como imagens ou janelas em execução de recursos de fala.

Também é possível ter mais de uma dimensão não correspondente em B. Por exemplo [I x J] * [J x K x L] , é interpretado como este produto de matriz: [I x J] * [J x (K * L)] que, portanto, produz um resultado de dimensões [I x K x L]. Por exemplo, isso permite aplicar uma matriz a todos os vetores dentro de uma janela sem interrupção dos recursos de L fala da dimensão J.

Se o resultado do produto deve ter várias dimensões (como organizar ativações de uma camada como um campo 2D), em vez de usar o * operador, deve-se dizer Times (A, B, outputRank=m) onde m está o número de dimensões nas quais os "padrões" são organizados e que são mantidos na saída. Por exemplo, Times (tensor of dim [I x J x K], tensor of dim [K x L], outputRank=2) será interpretado como o produto [(I * J) x K] * [K x L] de matriz e produzirá um resultado de dimensões [I x J x L].