Уравнение Эйнсума:

Ссылка на мой профиль блогаe: https://rakshithv-deeplearning.blogspot.com/

Это элегантный способ выполнения матричных или векторных манипуляций.

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

Пример: если вам нужно умножить матрицу A формы (1 200,2,32) и матрицу B формы (2,32,32) и получить матрицу C формы (1 200,32).

Это может быть реализовано следующим образом:

np.einsum('abcd,cde-›abe',A,B)

Вот и все !

Это может быть реализовано аналогично в Tensor-flow и PyTorch.

Я проходил реализацию keras для Multi-head внимание https://github.com/tensorflow/tensorflow/blob/v2.5.0/tensorflow/python/keras/layers/multi_head_attention.py#L124-L516

В статье «Внимание — это все, что вам нужно» они объединяют разные головы, но в реализации они умножают разные головы с матрицей весов, я буду обсуждать несколько примеров из этой статьи.

Синтаксис уравнения «einsum»:

np.einsum('shape_of_A, shape_of_B -> shape_of_C',A,B)

Возьмем простой пример:

Здесь мы умножаем матрицу A формы (2,3) и матрицу формы (3,5) и получаем матрицу формы (2,5).

A.shape[0] = а, A.shape[1] = b,

B.shape[0] = b, B.shape[1] = c

C.shape[0] = а, C.shape[1] = с

Если мы хотим реализовать то же самое с помощью циклов:

  1. Выходные индексы (индексы после ‘-›’) ‘ac’ образуют внешний цикл

2. Если индекс находится в обеих матрицах, а не в выходной матрице, он будет суммирован по этому индексу.

‘ab,bc’ -> ‘b’ находится в обеих матрицах, а не в выходной матрице, поэтому они будут суммированы (‘ab,bc-›ac’)

Теперь еще несколько примеров из статьи «Внимание — это все, что вам нужно». Предположим, что размер партии равен 1, max_words равен 200, а встраивание равно 32. Наши входные данные будут [1,200,32], и чтобы получить запрос, ключ и значение, мы можем умножить на матрицу весов, скажем, у нас есть 2 головы, тогда[ 2,32,32] -> Wq . Точно так же мы будем иметь Wk и Wv.

So [1,200,32] *[32,2,32] → [1,200,2,32]

После выполнения внимания имеем матрицу [1,200,2,32]. Теперь, как на бумаге, головы соединяются, но на самом деле они умножаются, как я упоминал ранее.

Как показано ранее, это можно записать и с помощью циклов.

a, b и e образуют внешний цикл, и мы суммируем (c и d), которые являются общими для обоих и не появляются в выводе.

Простые примеры транспонирования и добавления строк соответственно