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]
.