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