Поделиться через


Times и TransposeTimes

CNTK матричный продукт.

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

Параметры

  • A первый аргумент матричного продукта. Может быть последовательностью времени.
  • B второй аргумент матричного продукта. Может быть последовательностью времени.
  • outputRank (по умолчанию: 1): число осей, составляющих A выходное измерение. См. раздел "Расширенная интерпретация для тензоров" ниже.

Возвращаемое значение

Результирующий продукт матрицы (tensor). Это последовательность времени, если входные данные были последовательностью времени.

Описание

Функция Times() реализует матричный продукт с расширениями для тензоров. Оператор * является коротким для него. TransposeTimes() транспонирует первый аргумент.

Если A и B являются матрицами (тензор ранг-2) или векторами столбцов (тензор ранг-1), A * B вычислит общий матричный продукт так же, как и ожидалось.

TransposeTimes (A, B) вычисляет матричный продукт A^T * B, где ^T обозначает транспозицию. TransposeTimes (A, B) имеет тот же результат, что Transpose (A) * Bи , но он более эффективен, так как он позволяет избежать временной копии транспонируемой версии A.

Последовательности времени

B Оба A и могут быть либо одним матрицами, либо последовательностями времени. Типичным случаем для повторяющихся сетей является A матрица веса, в то время как B последовательность входных данных.

Примечание. Если A это последовательность времени, операция не эффективна, так как она запускает отдельный вызов GEMM для каждого шага. Исключение заключается в том TransposeTimes() , что оба входных данных являются векторами столбцов, для которых существует специальная оптимизация.

Разреженная поддержка

Times() и TransposeTimes() поддержка разреженной матрицы. Результатом является плотная матрица, если оба не разрежены. Два наиболее важных варианта использования:

  • B является одно-горячим представлением входного слова (или, чаще всего, целой последовательности одно-горячих векторов). A * B Затем обозначает внедрение слов, где столбцы A являются векторами внедрения слов. Ниже приведен рекомендуемый способ реализации внедрения в CNTK:

    ```
    Embedding (x, dim) = Parameter (dim, 0/*inferred*/) * x
    e = Embedding (input, 300)
    ```
    
  • A является одно-горячим представлением слова метки. Популярный критерий перекрестной энтропии и счетчик ошибок могут быть записаны TransposeTimes() следующим образом, z где входные данные для классификатора Softmax() верхнего уровня и L последовательность меток, которая может быть разреженной:

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

Умножение с скалярным

Не удается использовать матричный продукт для умножения матрицы скалярным. Вы получите ошибку относительно несоответствия измерений. Чтобы умножить скаляр, используйте вместо этого элемент .* управления. Например, взвешенный средний из двух матриц можно написать следующим образом:

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

Умножение с помощью диагонали матрицы

Если входная матрица имеет диагонали и хранится в качестве вектора, не используйте Times() , а умножение по элементам (ElementTimes() или .* оператор). Например.

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

Это использует семантику трансляции для умножения каждого элемента v с соответствующей строкой dMat.

Расширенная интерпретация матричного продукта для тензоров 2-го ранга >

Если A и /или B являются тензорами более высокого ранга, операция обозначает обобщенный матричный продукт, * где все, кроме первого измерения A , должны соответствовать начальным измерениям Bи интерпретируются путем выравнивания. Например, произведение тензора [I x J x K] и [J x K x L] тензора (которое мы будем сокращено отсюда [I x J x K] * [J x K x L]) повторно интерпретируется путем изменения двух тензоров в виде матриц, как [I x (J * K)] * [(J * K) x L], для которого матричный продукт определен и дает результат измерения [I x L]. Это имеет смысл, если один считает строки матрицы веса шаблонами, с которыми сопоставляются векторы активации. Описанная выше обобщение позволяет таким шаблонам быть многомерными, например изображениями или окнами речевых функций.

Кроме того, можно использовать несколько несовпадных измерений.B Например [I x J] * [J x K x L] , интерпретируется как этот матричный продукт: [I x J] * [J x (K * L)] что дает результат измерений [I x K x L]. Например, это позволяет применять матрицу ко всем векторам в последовательном окне L функций речи измерения J.

Если результат продукта должен иметь несколько измерений (например, упорядочивание активаций слоя в виде 2D-поля), то вместо использования * оператора следует сказать Times (A, B, outputRank=m) , где m находится количество измерений, в которых упорядочивается шаблон, и которые хранятся в выходных данных. Например, Times (tensor of dim [I x J x K], tensor of dim [K x L], outputRank=2) будет интерпретироваться как матричный продукт [(I * J) x K] * [K x L] и получить результат измерений [I x J x L].