Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

2.3 Линейная алгебра

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

2.3.1 Скаляры

Если вы когда-нибудь расплачивались в ресторане, вы уже знакомы с некоторыми базовыми понятиями линейной алгебры, например со сложением и умножением чисел. Допустим, температура в Пекине составляет (градусы Фаренгейта — единица измерения температуры, отличная от градусов Цельсия). Строго говоря, одно число называют скаляром (scalar). Чтобы перевести это значение в более привычные градусы Цельсия, можно вычислить выражение , подставив . В этом выражении каждое из чисел (, и ) — скаляр. Символы и называют переменными (variable): они обозначают неизвестные скалярные значения.

В этой книге скалярные переменные обозначаются обычными строчными буквами (например, , и ). Через обозначают пространство всех (непрерывных) вещественных скаляров; строгое определение пространства (space) мы дадим позже, а пока достаточно помнить, что запись — формальный способ сказать, что — вещественный скаляр. Символ читается как «принадлежит» и означает «является элементом множества». Например, запись показывает, что и — числа, которые могут принимать только значения или .

Скаляр представляется тензором, содержащим один элемент. Следующий код создаёт два скаляра и выполняет над ними знакомые арифметические операции: сложение, умножение, деление и возведение в степень.

MXNet:

from mxnet import np, npx
npx.set_np()

x = np.array(3.0)
y = np.array(2.0)

x + y, x * y, x / y, x ** y

PyTorch:

import torch

x = torch.tensor(3.0)
y = torch.tensor(2.0)

x + y, x * y, x / y, x**y

TensorFlow:

import tensorflow as tf

x = tf.constant(3.0)
y = tf.constant(2.0)

x + y, x * y, x / y, x**y

PaddlePaddle:

import warnings
warnings.filterwarnings(action='ignore')
import paddle

x = paddle.to_tensor([3.0])
y = paddle.to_tensor([2.0])

x + y, x * y, x / y, x**y

2.3.2 Векторы

Вектор можно рассматривать как список скалярных значений. Эти значения называют элементами (element) или компонентами (component) вектора. Когда векторы представляют примеры из набора данных, значения их компонентов имеют вполне конкретный смысл. Например, если мы обучаем модель оценивать риск невозврата кредита, каждому заявителю можно сопоставить вектор, компоненты которого соответствуют его доходу, стажу работы, числу прошлых просрочек и другим факторам. Если же мы изучаем риск сердечного приступа у пациентов больницы, каждого пациента можно представить вектором, компоненты которого — последние показатели жизнедеятельности, уровень холестерина, ежедневное время физической активности и т. д. В математической записи векторы обычно обозначают жирными строчными буквами (например, , и ).

Вектор представляют одномерным тензором. В общем случае тензор может иметь любую длину в пределах ограничений памяти компьютера.

MXNet:

x = np.arange(4)
x

PyTorch:

x = torch.arange(4)
x

TensorFlow:

x = tf.range(4)
x

PaddlePaddle:

x = paddle.arange(4)
x

К любому элементу вектора можно обратиться по индексу: например, обозначает -й элемент. Заметим, что элемент — скаляр, поэтому при обращении к нему он не выделяется жирным шрифтом. Большинство литературы по умолчанию считает векторы столбцами, и в этой книге мы придерживаемся того же соглашения. В математической записи вектор можно представить так:

где — элементы вектора. В коде элементы вектора доступны через индексацию тензора.

MXNet:

x[3]

PyTorch:

x[3]

TensorFlow:

x[3]

PaddlePaddle:

x[3]

2.3.2.1 Длина, размерность и форма

Вектор — это просто массив чисел, и, как у любого массива, у вектора есть длина. Если мы хотим сказать, что вектор состоит из вещественных скаляров, можно записать . Длину вектора обычно называют его размерностью (dimension).

Как и у обычных массивов Python, длину тензора можно получить с помощью встроенной функции len().

MXNet:

len(x)

PyTorch:

len(x)

TensorFlow:

len(x)

PaddlePaddle:

len(x)

Когда вектор представлен тензором с одной осью, его длину можно получить и через атрибут .shape. Форма (shape) — это кортеж, в котором перечислены длины тензора вдоль каждой оси (то есть размеры по каждому измерению). У тензора с одной осью форма содержит только один элемент.

MXNet:

x.shape

PyTorch:

x.shape

TensorFlow:

x.shape

PaddlePaddle:

x.shape

Слово «размерность» (dimension) в разных контекстах означает разное, и это часто сбивает с толку. Чтобы избежать путаницы, уточним: размерность вектора или оси — это длина вектора или оси, то есть число его элементов. Однако размерность тензора — это число его осей. В этом смысле размерность оси тензора — это длина этой оси.

2.3.3 Матрицы

Как вектор обобщает скаляр с нулевого порядка на первый, так матрица обобщает вектор с первого порядка на второй. Матрицы обычно обозначают жирными заглавными буквами (например, , и ), а в коде представляют тензорами с двумя осями.

Запись означает, что матрица состоит из строк и столбцов вещественных скаляров. Любую матрицу можно представить как таблицу, в которой каждый элемент стоит в -й строке и -м столбце:

Для любой матрицы её форма — (, ), или . Если у матрицы одинаковое число строк и столбцов, её форма квадратная; такую матрицу называют квадратной (square matrix).

Когда мы вызываем функцию, создающую тензор, матрицу формы можно получить, задав два размера и .

MXNet:

A = np.arange(20).reshape(5, 4)
A

PyTorch:

A = torch.arange(20).reshape(5, 4)
A

TensorFlow:

A = tf.reshape(tf.range(20), (5, 4))
A

PaddlePaddle:

A = paddle.reshape(paddle.arange(20), (5, 4))
A

Скалярный элемент матрицы можно получить по индексу строки () и индексу столбца (), например как . Если элементы матрицы не выписаны явно, как в формуле (2.3.2), для обозначения можно просто использовать строчную букву с двумя индексами. Чтобы запись оставалась компактной, запятую между индексами ставим только тогда, когда это необходимо, например и .

Если поменять местами строки и столбцы матрицы, результат называют транспонированием (transpose). Транспонированную матрицу обычно обозначают : если , то для любых и выполняется . Таким образом, транспонированная матрица из формулы (2.3.2) имеет форму :

Теперь получим транспонированную матрицу в коде.

MXNet:

A.T

PyTorch:

A.T

TensorFlow:

tf.transpose(A)

PaddlePaddle:

paddle.transpose(A, perm=[1, 0])

Особый вид квадратных матриц составляют симметричные матрицы (symmetric matrix): матрица симметрична, если она равна своей транспонированной: . Определим симметричную матрицу :

MXNet:

B = np.array([[1, 2, 3], [2, 0, 4], [3, 4, 5]])
B

PyTorch:

B = torch.tensor([[1, 2, 3], [2, 0, 4], [3, 4, 5]])
B

TensorFlow:

B = tf.constant([[1, 2, 3], [2, 0, 4], [3, 4, 5]])
B

PaddlePaddle:

B = paddle.to_tensor([[1, 2, 3], [2, 0, 4], [3, 4, 5]])
B

Теперь сравним B с её транспонированной матрицей.

MXNet, PyTorch:

B == B.T

TensorFlow:

B == tf.transpose(B)

PaddlePaddle:

B == paddle.transpose(B, perm=[1, 0])

Матрицы — полезные структуры данных: они позволяют организовывать данные с разными закономерностями. Например, строки матрицы могут соответствовать разным домам (примерам данных), а столбцы — разным признакам. Тем, кто работал с электронными таблицами или прочитал раздел 2.2, это знакомо. Поэтому, хотя отдельный вектор по умолчанию считается столбцом, в матрице, представляющей табличный набор данных, каждый пример чаще записывают строкой. Это соглашение будет использоваться в следующих главах и соответствует распространённой практике глубокого обучения. Например, вдоль самой внешней оси тензора можно обращаться к минибатчу примеров или перебирать его.

2.3.4 Тензоры

Так же как векторы обобщают скаляры, а матрицы — векторы, можно построить структуры данных с большим числом осей. Тензоры (здесь слово «тензор» означает алгебраический объект) — общий способ описания -мерных массивов с произвольным числом осей. Например, вектор — это тензор первого порядка, а матрица — тензор второго порядка. Тензоры обозначают прописными буквами особого шрифта (например, , и ), а их индексация (например, и ) устроена так же, как у матриц.

Тензоры становятся особенно важными, когда мы начинаем работать с изображениями. Изображение — это -мерный массив, в котором три оси соответствуют высоте, ширине и каналу (channel) — оси цветовых каналов (красного, зелёного и синего). Однако пока отложим тензоры более высоких порядков и сосредоточимся на основах.

MXNet:

X = np.arange(24).reshape(2, 3, 4)
X

PyTorch:

X = torch.arange(24).reshape(2, 3, 4)
X

TensorFlow:

X = tf.reshape(tf.range(24), (2, 3, 4))
X

PaddlePaddle:

X = paddle.reshape(paddle.arange(24), (2, 3, 4))
X

2.3.5 Основные свойства арифметики тензоров

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

MXNet:

A = np.arange(20).reshape(5, 4)
B = A.copy()  # Выделяем новую память и присваиваем B копию A
A, A + B

PyTorch:

A = torch.arange(20, dtype=torch.float32).reshape(5, 4)
B = A.clone()  # Выделяем новую память и присваиваем B копию A
A, A + B

TensorFlow:

A = tf.reshape(tf.range(20, dtype=tf.float32), (5, 4))
B = A  # Нельзя скопировать A в B с выделением новой памяти
A, A + B

PaddlePaddle:

A = paddle.reshape(paddle.arange(20, dtype=paddle.float32), (5, 4))
B = A.clone()  # Выделяем новую память и присваиваем B копию A
A, A + B

В частности, поэлементное умножение двух матриц называют произведением Адамара (Hadamard product) и обозначают символом . Для матрицы элемент, стоящий в -й строке и -м столбце, равен . Произведение Адамара матриц (определённой в формуле (2.3.2)) и имеет вид:

MXNet:

A * B

PyTorch:

A * B

TensorFlow:

A * B

PaddlePaddle:

A * B

Умножение тензора на скаляр или сложение с ним не меняет форму тензора: каждый элемент тензора складывается со скаляром или умножается на него.

MXNet:

a = 2
X = np.arange(24).reshape(2, 3, 4)
a + X, (a * X).shape

PyTorch:

a = 2
X = torch.arange(24).reshape(2, 3, 4)
a + X, (a * X).shape

TensorFlow:

a = 2
X = tf.reshape(tf.range(24), (2, 3, 4))
a + X, (a * X).shape

PaddlePaddle:

a = 2
X = paddle.reshape(paddle.arange(24), (2, 3, 4))
a + X, (a * X).shape

2.3.6 Редукция

Полезная операция, которую можно выполнить над любым тензором, — вычисление суммы его элементов. Для обозначения суммы используется символ . Сумму элементов вектора длины можно записать как . В коде для этого есть функция суммирования:

MXNet:

x = np.arange(4)
x, x.sum()

PyTorch:

x = torch.arange(4, dtype=torch.float32)
x, x.sum()

TensorFlow:

x = tf.range(4, dtype=tf.float32)
x, tf.reduce_sum(x)

PaddlePaddle:

x = paddle.arange(4, dtype=paddle.float32)
x, x.sum()

Можно записать сумму элементов тензора произвольной формы. Например, сумма элементов матрицы записывается как .

MXNet:

A.shape, A.sum()

PyTorch:

A.shape, A.sum()

TensorFlow:

A.shape, tf.reduce_sum(A)

PaddlePaddle:

A.shape, A.sum()

По умолчанию вызов функции суммирования уменьшает размерность тензора по всем осям, превращая его в скаляр. Кроме того, можно указать, по какой оси выполнять суммирование для уменьшения размерности. Для матрицы, чтобы просуммировать все строки и уменьшить размерность по оси 0, укажем axis=0. Поскольку входная матрица суммируется по оси 0 для получения выходного вектора, размерность по оси 0 пропадает из формы результата.

MXNet:

A_sum_axis0 = A.sum(axis=0)
A_sum_axis0, A_sum_axis0.shape

PyTorch:

A_sum_axis0 = A.sum(axis=0)
A_sum_axis0, A_sum_axis0.shape

TensorFlow:

A_sum_axis0 = tf.reduce_sum(A, axis=0)
A_sum_axis0, A_sum_axis0.shape

PaddlePaddle:

A_sum_axis0 = A.sum(axis=0)
A_sum_axis0, A_sum_axis0.shape

Указание axis=1 приводит к суммированию элементов по всем столбцам, то есть к уменьшению размерности по оси 1. Поэтому размерность по оси 1 пропадает из формы результата.

MXNet:

A_sum_axis1 = A.sum(axis=1)
A_sum_axis1, A_sum_axis1.shape

PyTorch:

A_sum_axis1 = A.sum(axis=1)
A_sum_axis1, A_sum_axis1.shape

TensorFlow:

A_sum_axis1 = tf.reduce_sum(A, axis=1)
A_sum_axis1, A_sum_axis1.shape

PaddlePaddle:

A_sum_axis1 = A.sum(axis=1)
A_sum_axis1, A_sum_axis1.shape

Суммирование по строкам и столбцам матрицы даёт тот же результат, что и суммирование всех её элементов.

MXNet, PyTorch:

A.sum(axis=[0, 1])  # Результат совпадает с A.sum()

TensorFlow:

tf.reduce_sum(A, axis=[0, 1])  # Результат совпадает с tf.reduce_sum(A)

PaddlePaddle:

A.sum(axis=[0, 1])

Связанная с суммой величина — среднее значение (mean или average). Его вычисляют, разделив сумму на число элементов. В коде есть функция для вычисления среднего значения тензора любой формы.

MXNet:

A.mean(), A.sum() / A.size

PyTorch:

A.mean(), A.sum() / A.numel()

TensorFlow:

tf.reduce_mean(A), tf.reduce_sum(A) / tf.size(A).numpy()

PaddlePaddle:

A.mean(), A.sum() / A.numel()

Аналогично, функция среднего значения может уменьшать размерность тензора по заданной оси.

MXNet, PyTorch:

A.mean(axis=0), A.sum(axis=0) / A.shape[0]

TensorFlow:

tf.reduce_mean(A, axis=0), tf.reduce_sum(A, axis=0) / A.shape[0]

PaddlePaddle:

A.mean(axis=0), A.sum(axis=0) / A.shape[0]

2.3.6.1 Суммирование без уменьшения размерности

Иногда при вычислении суммы или среднего полезно сохранить число осей неизменным.

MXNet, PyTorch:

sum_A = A.sum(axis=1, keepdims=True)
sum_A

TensorFlow:

sum_A = tf.reduce_sum(A, axis=1, keepdims=True)
sum_A

PaddlePaddle:

sum_A = paddle.sum(A, axis=1, keepdim=True)
sum_A

Например, поскольку sum_A после суммирования по строкам по-прежнему имеет две оси, мы можем разделить A на sum_A с помощью broadcasting.

MXNet:

A / sum_A

PyTorch:

A / sum_A

TensorFlow:

A / sum_A

PaddlePaddle:

A / sum_A

Если нужно вычислить накопленную сумму элементов A вдоль оси, например axis=0 (по строкам), можно вызвать функцию cumsum. Она не уменьшает размерность входного тензора ни по одной из осей.

MXNet, PyTorch:

A.cumsum(axis=0)

TensorFlow:

tf.cumsum(A, axis=0)

PaddlePaddle:

A.cumsum(axis=0)

2.3.7 Скалярное произведение (dot product)

Мы уже изучили поэлементные операции, суммирование и среднее значение. Ещё одна из самых базовых операций — скалярное произведение. Для двух векторов их скалярное произведение (dot product) (или ) — это сумма произведений элементов, стоящих на одинаковых позициях: .

MXNet:

y = np.ones(4)
x, y, np.dot(x, y)

PyTorch:

y = torch.ones(4, dtype = torch.float32)
x, y, torch.dot(x, y)

TensorFlow:

y = tf.ones(4, dtype=tf.float32)
x, y, tf.tensordot(x, y, axes=1)

PaddlePaddle:

y = paddle.ones(shape=[4], dtype='float32')
x, y, paddle.dot(x, y)

Заметим, что скалярное произведение двух векторов можно вычислить поэлементным умножением с последующим суммированием:

MXNet:

np.sum(x * y)

PyTorch:

torch.sum(x * y)

TensorFlow:

tf.reduce_sum(x * y)

PaddlePaddle:

paddle.sum(x * y)

Скалярное произведение полезно во многих случаях. Например, пусть задан набор значений, представленный вектором , и набор весов, представленный вектором . Взвешенная сумма значений из с весами записывается как скалярное произведение . Если веса неотрицательны и в сумме дают 1 (то есть ), скалярное произведение задаёт взвешенное среднее (weighted average). Если нормировать оба вектора до единичной длины, скалярное произведение равно косинусу угла между ними. Понятие длины (length) будет формально введено далее в этом разделе.

2.3.8 Матрично-векторное произведение

Теперь, когда мы знаем, как вычислять скалярное произведение, можно перейти к матрично-векторному произведению (matrix-vector product). Вспомним матрицу и вектор , определённые в формулах (2.3.2) и (2.3.1). Представим матрицу через её вектор-строки:

где каждый — вектор-строка, задающая -ю строку матрицы. Матрично-векторное произведение — это вектор-столбец длины , -й элемент которого равен скалярному произведению :

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

MXNet: В коде матрично-векторное произведение тензоров вычисляется той же функцией dot, что и скалярное произведение. При вызове np.dot(A, x) для матрицы A и вектора x выполняется матрично-векторное произведение. Заметим, что число столбцов A (длина по оси 1) должно совпадать с размерностью x (его длиной).

PyTorch: В коде матрично-векторное произведение тензоров вычисляется функцией mv. При вызове torch.mv(A, x) для матрицы A и вектора x выполняется матрично-векторное произведение. Заметим, что число столбцов A (длина по оси 1) должно совпадать с размерностью x (его длиной).

TensorFlow: В коде для матрично-векторного произведения тензоров используется функция matvec. При вызове tf.linalg.matvec(A, x) выполняется матрично-векторное произведение. Заметим, что число столбцов A (длина по оси 1) должно совпадать с размерностью x (его длиной).

MXNet:

A.shape, x.shape, np.dot(A, x)

PyTorch:

A.shape, x.shape, torch.mv(A, x)

TensorFlow:

A.shape, x.shape, tf.linalg.matvec(A, x)

PaddlePaddle:

A.shape, x.shape, paddle.mv(A, x)

2.3.9 Матрично-матричное умножение

Освоив скалярное произведение и матрично-векторное произведение, понять матрично-матричное умножение (matrix-matrix multiplication) несложно.

Пусть даны две матрицы и :

Обозначим вектор-строкой -ю строку матрицы , а вектор-столбцом — -й столбец матрицы . Чтобы получить матричное произведение , проще всего рассмотреть строки и столбцы :

Если просто вычислять каждый элемент как скалярное произведение , получим:

Матрично-матричное умножение можно рассматривать как матрично-векторных произведений, результаты которых объединяются в матрицу размера . В коде ниже мы перемножаем A и B. Здесь A — матрица 5×4, а B — матрица 4×3. После умножения получаем матрицу 5×3.

MXNet:

B = np.ones(shape=(4, 3))
np.dot(A, B)

PyTorch:

B = torch.ones(4, 3)
torch.mm(A, B)

TensorFlow:

B = tf.ones((4, 3), tf.float32)
tf.matmul(A, B)

PaddlePaddle:

B = paddle.ones(shape=[4, 3], dtype='float32')
paddle.mm(A, B)

Матрично-матричное умножение можно называть просто умножением матриц; не путайте его с произведением Адамара.

2.3.10 Нормы

Одними из самых полезных операций линейной алгебры являются нормы (norm). Неформально норма вектора показывает, насколько «велик» этот вектор. Понятие «величины» (size) здесь не связано с размерностью: речь идёт о величине компонентов.

В линейной алгебре норма вектора — это функция , которая сопоставляет вектору скаляр. Для любого вектора норма должна обладать определёнными свойствами. Первое свойство: если умножить все элементы вектора на константу , его норма умножится на абсолютное значение этой константы:

Второе свойство — знакомое неравенство треугольника:

Третье свойство: норма неотрицательна:

Это разумно: в большинстве случаев наименьший «размер» чего бы то ни было равен 0. Последнее свойство требует, чтобы норма равнялась 0 тогда и только тогда, когда все компоненты вектора равны 0:

Норма напоминает метрику расстояния. Неотрицательность и неравенство треугольника, знакомые из школьной геометрии (например, из теоремы Пифагора), дают хорошее представление о том, что это такое. На самом деле евклидово расстояние является -нормой: если элементы -мерного вектора равны , то его -норма равна квадратному корню из суммы квадратов его элементов:

где в обозначении -нормы индекс , как правило, опускают: означает . В коде -норму вектора можно вычислить так.

MXNet:

u = np.array([3, -4])
np.linalg.norm(u)

PyTorch:

u = torch.tensor([3.0, -4.0])
torch.norm(u)

TensorFlow:

u = tf.constant([3.0, -4.0])
tf.norm(u)

PaddlePaddle:

u = paddle.to_tensor([3.0, -4.0])
paddle.norm(u)

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

По сравнению с -нормой -норма менее чувствительна к выбросам. Для вычисления -нормы сочетают функцию модуля и поэлементное суммирование.

MXNet:

np.abs(u).sum()

PyTorch:

torch.abs(u).sum()

TensorFlow:

tf.reduce_sum(tf.abs(u))

PaddlePaddle:

paddle.abs(u).sum()

И -норма, и -норма являются частными случаями более общей -нормы:

Аналогично -норме вектора, матрица имеет норму Фробениуса (Frobenius norm) — квадратный корень из суммы квадратов её элементов:

Норма Фробениуса удовлетворяет всем свойствам норм для векторов: её можно рассматривать как -норму матрицы, развёрнутой в вектор. Вызов следующей функции вычисляет норму Фробениуса матрицы.

MXNet:

np.linalg.norm(np.ones((4, 9)))

PyTorch:

torch.norm(torch.ones((4, 9)))

TensorFlow:

tf.norm(tf.ones((4, 9)))

PaddlePaddle:

paddle.norm(paddle.ones(shape=[4, 9], dtype='float32'))

2.3.10.1 Нормы и цели

В глубоком обучении мы часто решаем задачи оптимизации: максимизировать вероятность, приписанную наблюдаемым данным; минимизировать расстояние между предсказаниями и истинными наблюдениями. Объекты (слова, товары или новостные статьи) представляют векторами так, чтобы расстояние между похожими объектами было мало, а между различными — велико. Цель — пожалуй, самая важная составляющая алгоритмов глубокого обучения (помимо данных) — обычно выражается через норму.

2.3.11 Дополнительные сведения о линейной алгебре

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

Если хотите узнать о линейной алгебре больше, можно обратиться к онлайн-приложению об операциях линейной алгебры или к другим хорошим ресурсам (Strang, 1993; Kolter, 2008; Petersen and Pedersen, 2008).

Резюме

  • Скаляры, векторы, матрицы и тензоры — базовые математические объекты линейной алгебры.
  • Векторы обобщают скаляры, а матрицы обобщают векторы.
  • Скаляры, векторы, матрицы и тензоры имеют соответственно 0, 1, 2 и произвольное число осей.
  • Тензор можно уменьшать по размерности с помощью sum и mean по заданным осям.
  • Поэлементное умножение двух матриц называется их произведением Адамара. Оно отличается от матричного умножения.
  • В глубоком обучении мы часто используем нормы: -норму, -норму и норму Фробениуса.
  • Над скалярами, векторами, матрицами и тензорами можно выполнять разнообразные операции.

Упражнения

  1. Докажите, что транспонирование матрицы дважды даёт , то есть .
  2. Даны матрицы и . Докажите, что сумма их транспонированных равна транспонированной сумме, то есть .
  3. Для произвольной квадратной матрицы всегда ли матрица симметрична? Почему?
  4. В этом разделе определён тензор X формы . Что выведет len(X)?
  5. Для тензора X произвольной формы всегда ли len(X) соответствует длине какой-либо оси X? Какой именно?
  6. Выполните A/A.sum(axis=1) и посмотрите, что произойдёт. Объясните, почему так происходит.
  7. Рассмотрим тензор формы . Какую форму имеет результат суммирования по осям 0, 1 и 2?
  8. Передайте в функцию linalg.norm тензор с тремя или более осями и посмотрите на результат. Что эта функция вычисляет для тензора произвольной формы?

MXNet: Обсуждение

PyTorch: Обсуждение

TensorFlow: Обсуждение

PaddlePaddle: Обсуждение

Литература

  • Kolter, Z. (2008). Linear Algebra Review and Reference. Available online.
  • Petersen, K. B., Pedersen, M. S., et al. (2008). The matrix cookbook. Technical University of Denmark, 7(15), 510.
  • Strang, G. (1993). Introduction to linear algebra (Vol. 3). Wellesley-Cambridge Press, Wellesley, MA.