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 deA
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 * B
de matriz, em que ^T
indica transposição. TransposeTimes (A, B)
tem o mesmo resultado Transpose (A) * B
que, 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ãoA
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 usandoTransposeTimes()
da seguinte maneira, respectivamente, ondez
está a entrada para o classificador Softmax() de nível superior eL
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]
.