Compartir a través de


Times and TransposeTimes

CNTK producto de matriz.

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

Parámetros

  • A primer argumento del producto de matriz. Puede ser una secuencia de tiempo.
  • B segundo argumento del producto de matriz. Puede ser una secuencia de tiempo.
  • outputRank (valor predeterminado: 1): número de ejes de A que constituyen la dimensión de salida. Consulte la sección "Interpretación extendida de tensores" a continuación.

Valor devuelto

Producto de matriz resultante (tensor). Se trata de una secuencia de tiempo si alguna de las entradas era una secuencia de tiempo.

Descripción

La Times() función implementa el producto de matriz, con extensiones para tensores. El * operador es una mano corta para él. TransposeTimes() transpone el primer argumento.

Si A y B son matrices (tensor rank-2) o vectores de columna (tensor rank-1), A * B calculará el producto de matriz común, como cabría esperar.

TransposeTimes (A, B) calcula el producto A^T * Bde matriz , donde ^T denota la transposición. TransposeTimes (A, B) tiene el mismo resultado que Transpose (A) * B, pero es más eficaz, ya que evita una copia temporal de la versión transpuesta de A.

Secuencias de tiempo

Tanto A como B pueden ser matrices únicas o secuencias de tiempo. Un caso común para las redes recurrentes es que es una matriz de peso, mientras B que A es una secuencia de entradas.

Nota: Si A es una secuencia de tiempo, la operación no es eficaz, ya que iniciará una invocación de GEMM independiente para cada paso. La excepción es TransposeTimes() donde ambas entradas son vectores de columna, para las que existe una optimización especial.

Compatibilidad dispersa

Times() y TransposeTimes() admiten una matriz dispersa. El resultado es una matriz densa a menos que ambos sean dispersos. Los dos casos de uso más importantes son:

  • B siendo una representación one-hot de una palabra de entrada (o, más comúnmente, una secuencia completa de vectores one-hot). A continuación, A * B denota una palabra que inserta, donde las columnas de son los vectores de A inserción de las palabras. A continuación se muestra la manera recomendada de realizar inscrusiones en CNTK:

    ```
    Embedding (x, dim) = Parameter (dim, 0/*inferred*/) * x
    e = Embedding (input, 300)
    ```
    
  • A siendo una representación one-hot de una palabra de etiqueta. El criterio de entropía cruzada popular y el contador de errores se pueden escribir mediante TransposeTimes() , respectivamente, donde z es la entrada al clasificador Softmax() de nivel superior y L la secuencia de etiquetas que puede ser dispersa:

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

Multiplicación con un escalar

El producto de matriz no se puede usar para multiplicar una matriz con un escalar. Obtendrá un error con respecto a las dimensiones que no coinciden. Para multiplicar con un escalar, use en su lugar el producto .* en función del elemento. Por ejemplo, el promedio ponderado de dos matrices podría escribirse de la siguiente manera:

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

Multiplicación con una matriz diagonal

Si la matriz de entrada es diagonal y se almacena como vector, no use Times() sino una multiplicación por elementos (ElementTimes() o el .* operador ). Por ejemplo,

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

Esto aprovecha la semántica de difusión para multiplicar todos los elementos de v con la fila respectiva de dMat.

Interpretación ampliada del producto de matriz para tensores de rango > 2

Si A y/o B son tensores de rango superior, la * operación denota un producto de matriz generalizado donde todas las dimensiones menos la primera de A deben coincidir con las dimensiones iniciales de By se interpretan mediante la aplanación. Por ejemplo, un producto de y [I x J x K] un tensor (que se abreviará de ahí en adelante como [I x J x K] * [J x K x L]) se reinterpreta mediante la reconfiguración de los dos tensores como matrices como [I x (J * K)] * [(J * K) x L], para los que se define el producto de matriz y produce un resultado de dimensión [I x L][J x K x L] . Esto tiene sentido si se considera que las filas de una matriz de peso son patrones con los que coinciden los vectores de activación. La generalización anterior permite que estos patrones sean multidimensionales, como imágenes o ventanas de ejecución de características de voz.

También es posible tener más de una dimensión no coincidente en B. Por ejemplo [I x J] * [J x K x L] , se interpreta como este producto de matriz: [I x J] * [J x (K * L)] lo que produce un resultado de dimensiones [I x K x L]. Por ejemplo, esto permite aplicar una matriz a todos los vectores dentro de una ventana gradual de características de L voz de la dimensión J.

Si el resultado del producto debe tener varias dimensiones (por ejemplo, organizar las activaciones de una capa como un campo 2D), en lugar de usar el * operador , debe decir Times (A, B, outputRank=m) dónde m es el número de dimensiones en las que se organizan los "patrones" y que se mantienen en la salida. Por ejemplo, Times (tensor of dim [I x J x K], tensor of dim [K x L], outputRank=2) se interpretará como el producto [(I * J) x K] * [K x L] de matriz y producirá un resultado de dimensiones [I x J x L].