Суммирование Эйнштейна

Тензорные операции в Python
методы суммирования Эйнштейна
примеры Numpy и тензорного потока
Суммирование Эйнштейна cover image

Обозначение суммирования Эйнштейна — это краткий и мощный способ представления тензорных операций, часто используемый в физике и машинном обучении. Это позволяет нам писать сложные вычисления на тензорах в компактной форме. Мы рассмотрим основы суммирования Эйнштейна, способы его использования в Python с Numpy и Tensorflow, а также приведем примеры, иллюстрирующие его использование.

Основы суммирования Эйнштейна

Обозначение суммирования Эйнштейна (Einsum) основано на идее суммирования по повторяющимся индексам в тензорных выражениях. В его основе лежат следующие два правила:

1. Суммирование по повторяющимся индексам: Если индекс встречается в термине дважды, он суммируется по

2. Свободные индексы: Индексы, которые появляются только один раз, являются свободными индексами и представляют оси выходного тензора.

Проиллюстрируем это на примере умножения двух матриц A и B: результирующая матрица C определяется как

Cik=jAijBjkC_{ik} = \sum\limits_{j}^{}A_{ij}B_{jk}

В Python библиотеки Numpy и Tensorflow предоставляют функцию einsum.

Нампи

import numpy as np

# Define two matrices A and B
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])

# Perform matrix multiplication using einsum
C = np.einsum('ij,jk->ik', A, B)

print(C)
# [[19 22]
#  [43 50]]

В приведенном выше примере ij,jk->ik — это строка einsum:

ij представляет индексы матрицы A

jk представляет индексы матрицы B

->ik задает индексы выходной матрицы C

Операция суммируется по индексу j

Тот же код в Tensorflow будет выглядеть так

import tensorflow as tf

# Define two matrices A and B
A = tf.constant([[1, 2], [3, 4]], dtype=tf.float32)
B = tf.constant([[5, 6], [7, 8]], dtype=tf.float32)

# Perform matrix multiplication using einsum
C = tf.einsum('ij,jk->ik', A, B)

print(C)
# tf.Tensor(
# [[19. 22.]
#  [43. 50.]], shape=(2, 2), dtype=float32)

Дополнительные примеры

Внутренний продукт векторов

Внутренний продукт (скалярное произведение) двух векторов a и b определяется как

c=iaibic = \sum\limits_{i}^{}a_{i}b_{i}

a = np.array([1, 2, 3])
b = np.array([4, 5, 6])

c = np.einsum('i,i->', a, b)

print(c)  # Output: 32

Внешний продукт векторов

Внешний продукт двух векторов a и b определяется выражением:

Cij=aibjC_{ij} = a_{i}b_{j}

C = np.einsum('i,j->ij', a, b)

print(C)
# Output
# [[4 5 6]
#  [8 10 12]
#  [12 15 18]]

Транспонирование матрицы

Транспонирование матрицы A можно получить, поменяв местами ее индексы.

A_transpose = np.einsum('ij->ji', A)

print(A_transpose)
# Output
# [[1. 3.]
#  [2. 4.]]

След матрицы

След матрицы A — это сумма ее диагональных элементов:

Tr(A)=iAiiAiiTr(A) = \sum\limits_{i}^{}A_{ii}A_{ii}


trace = np.einsum('ii->', A)

print(trace)
# Output: 5.0

Пакетное умножение матриц

Einsum особенно полезен для пакетных операций. Предположим, у нас есть пакет матриц A и B, и мы хотим перемножить соответствующие матрицы в пакете:


A = np.random.rand(3, 2, 2)
B = np.random.rand(3, 2, 2)

# Perform batch matrix multiplication
C = np.einsum('bij,bjk->bik', A, B)

print(C)

Здесь b представляет размер партии.

Преимущества нотации Einsum

1. Краткость: Нотация Einsum компактна и может лаконично представлять сложные операции.

2. Гибкость: он может обрабатывать широкий спектр тензорных операций без явного изменения или транспонирования массивов.

3. Эффективность: многие библиотеки внутренне оптимизируют операции einsum, что потенциально приводит к повышению производительности.


Career Services background pattern

Карьерные услуги

Contact Section background image

Давай останемся на связи

Code Labs Academy © 2025 Все права защищены.