Отказ от ответственности: Я сделал хотя о публикации в математический обмен стека или какой-либо другой. Но я слышал от моих друзей по математике, что они не очень часто используют суммирование по Эйнштейну, но я знаю, что машинное обучение часто использует это. Поэтому я разместил эту проблему здесь (как оптимизация производительности алгоритма).
При проведении исследования о матричных вычислениях (например, сколько поэлементных умножений по крайней мере необходимо), я пытался вычислить следующий градиент:
, где ABC
означает сокращение трех матриц по первой оси (например, 2x3
, 2x4
и 2x5
становится 3x4x5
с суммированной осью 2
). По сути, он вычисляет градиент нормы 3-матричного сжатия ABC
относительно A
. Затем снова вычисляет норму этого градиента относительно A
.
Это эквивалентно:
или немного упростить (доказано autograd
):
Мы можем записать это в форме суммирования Эйнштейна (используется функцией einsum
многих пакетов, таких как numpy
, tensorflow
и т. Д.)
np.einsum('ia,ib,ic,jb,jc,jd,je,kd,ke->ka', A, B, C, B, C, B, C, B, C)
При написании этого я обнаружил, что матрицы B
и C
повторяются снова и снова при суммировании. Мне интересно, могу ли я упростить эти "много B и C" до некоторой мощности матрицы ? Это должно сделать вещи логарифмически быстрее. Я попытался упростить вручную, но не понял.
Большое спасибо! Пожалуйста, поправьте меня, если что-то, что я говорю, неверно.