Partilhar via


Tempos e Tempos Transpostos

CNTK produto de matriz.

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

Parâmetros

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

Devolver Valor

Produto matricial resultante (tensor). Esta é uma sequência de tempo se uma das entradas foi uma sequência de tempo.

Description

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

Se A e B forem matrizes (tensor de grau 2) ou vetores de coluna (tensor de grau 1), A * B calculará o produto matriz comum, tal como seria de esperar.

TransposeTimes (A, B) calcula o produto A^T * Bmatriz, onde ^T denota a transposição. TransposeTimes (A, B) tem o mesmo resultado Transpose (A) * Bque , mas é mais eficiente, uma vez que evita uma cópia temporária da versão transposta de A.

Sequências de tempo

Ambos A podem ser B 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.

Nota: Se A for uma sequência de tempo, a operação não é eficiente, uma vez que lançará uma invocação GEMM separada para cada passo. A exceção é TransposeTimes() onde ambas as entradas são vetores de colunas, para os quais existe uma otimização especial.

Suporte escasso

Times() e TransposeTimes() apoiar a matriz escassa. O resultado é uma matriz densa, a menos que ambos sejam escassos. Os dois casos de utilização mais importantes são:

  • B sendo uma representação única de uma palavra de entrada (ou, mais comummente, uma sequência inteira de vetores de um só calor). Em seguida, A * B denota uma palavra incorporando, onde as colunas são A os vetores incorporados das palavras. Segue-se a forma recomendada de realizar incorporações em CNTK:

    ```
    Embedding (x, dim) = Parameter (dim, 0/*inferred*/) * x
    e = Embedding (input, 300)
    ```
    
  • A sendo uma representação de um só hot de uma palavra rótulo. O critério de cross-entropia popular e o contador de erros podem ser escritos da TransposeTimes() seguinte forma, respectivamente, onde z está a entrada para o classificador Softmax de nível superior e L a sequência de etiquetas que pode ser escassa:

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

Multiplicando-se com um escalão

O produto matricial não pode ser usado para multiplicar uma matriz com um escalar. Terá um erro em relação a dimensões desajustadas. Para se multiplicar com um escalar, utilize o produto .* em termos de elementos. Por exemplo, a média ponderada de duas matrizes poderia ser escrita assim:

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

Multiplicando-se com uma matriz diagonal

Se a sua matriz de entrada for diagonal e armazenada como vetor, não utilize Times() apenas uma multiplicação em termos de elementos (ElementTimes() ou o .* operador). Por exemplo

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

Isto aproveita a semântica de radiodifusão para multiplicar todos os elementos com v a respetiva fileira de dMat.

Interpretação alargada do produto matriz para tensores da categoria > 2

Se A e/ou B forem tensores de escalão superior, a * operação denota um produto matricial generalizado onde todas as dimensões, menos a primeira dimensão de A deve corresponder às dimensões principais de B, e são interpretadas por achatamento. Por exemplo, um produto de um tensor ([J x K x L]que vamos abreviar a partir de agora como [I x J x K] * [J x K x L]) é reinterpretado remodelando os dois tensores como matrizes como [I x (J * K)] * [(J * K) x L], para o qual o produto matriz é definido e produz um resultado de dimensão [I x L].[I x J x K] Isto faz sentido se considerarmos as linhas de uma matriz de peso como padrões que os vetores de ativação são compatíveis com. A generalização acima permite que estes padrões sejam multidimensionais, tais como imagens ou janelas de execução de características da fala.

Também é possível ter mais do que uma dimensão não igualada em B. Por exemplo, [I x J] * [J x K x L] é interpretado como este produto matricial: [I x J] * [J x (K * L)] que resulta de dimensões [I x K x L]. Por exemplo, isto permite aplicar uma matriz a todos os vetores dentro de uma janela rolante de características de L fala de dimensão J.

Se o resultado do produto tiver múltiplas dimensões (tais como a organização das ativações de uma camada como um campo 2D), então, em vez de utilizar o * operador, deve dizer-se Times (A, B, outputRank=m) onde m está o número de dimensões em que 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] matriz e produzirá um resultado de dimensões [I x J x L].