Разница между тензорами, массивами и матрицами

Что такое тензор?

Большинство специалистов по глубокому обучению знают о них, но не могут дать точное определение.

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

И все же их определение невероятно размыто: одна только категория Википедии содержит более 100 страниц, связанных с тензорами.

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

💻 Тензоры в информатике

Так почему же так много определений?

Все очень просто: разные поля имеют разные определения. Тензоры в математике — это не совсем то же самое, что тензоры в физике, которые отличаются от тензоров в информатике.

Эти определения можно разделить на две категории: тензоры как структуры данных или как объекты (в смысле объектно-ориентированного программирования).

  • Структура данных: это определение, которое мы используем в информатике. Тензоры — это многомерные массивы, в которых хранится значение определенного типа.
  • Объекты: это определение используется в других полях. В математике и физике тензоры — это не просто структура данных: у них тоже есть список свойств, как у конкретного произведения.

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

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

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

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

🧠 Тензоры в глубоком обучении

Так почему же их называют «тензорами», а не «многомерными массивами»? Хорошо, это короче, но это все, что нужно? На самом деле люди делают неявное предположение, когда говорят о тензорах.

Официальная документация PyTorch дает нам практический ответ:

Самая большая разница между массивом numpy и тензором PyTorch заключается в том, что тензор PyTorch может работать как на ЦП, так и на графическом процессоре.

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

Это то, чего не хватало в нашем предыдущем определении: тензоры в глубоком обучении — это не просто n-мерные массивы, есть также неявное предположение, что их можно запускать на графическом процессоре.

⚔️ NumPy против PyTorch

Давайте посмотрим на разницу между массивами NumPy и тензорами PyTorch.

Эти два объекта очень похожи: мы можем инициализировать одномерный массив и одномерный тензор практически с одинаковым синтаксисом. Они также имеют много общих методов и могут быть легко преобразованы друг в друга.

Вы можете найти код, использованный в этой статье, по этому адресу.

NumPy Array: [1 2 3]
PyTorch Tensor: tensor([1, 2, 3])

Инициализация двумерных массивов и двумерных тензоров не сложнее.

NumPy Array: [[1 2 3]
              [4 5 6]]
PyTorch Tensor: tensor([[1, 2, 3],
                        [4, 5, 6]])

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

Давайте сравним производительность между массивами NumPy и тензорами PyTorch при умножении матриц. В следующем примере мы случайным образом инициализируем четырехмерные массивы/тензоры и перемножаем их.

>>> 1.32 s
>>> 25.2 ms

Как мы видим, тензоры PyTorch завершили работу лучше, чем массивы NumPy: они выполнили умножение в 52 раза быстрее!

Мы могли бы объяснить эту производительность различными факторами, такими как:

  • Массивы NumPy используют формат float64, тогда как тензоры PyTorch используют более эффективный формат float32. Однако даже когда массивы NumPy преобразуются в float32, тензоры PyTorch по-прежнему работают в 40 раз быстрее.
  • Тензоры PyTorch хранятся на графическом процессоре, в отличие от массивов NumPy. Но если мы повторим тот же эксперимент на процессоре, тензоры PyTorch все равно будут работать в среднем в 2,8 раза быстрее.

Даже при объединении обоих факторов тензоры PyTorch оказываются в 1,4 раза быстрее, показывая, что массивы NumPy действительно менее эффективны для умножения матриц.

В этом истинная сила тензоров: они невероятно быстры! Производительность может варьироваться в зависимости от размеров, реализации, и аппаратного обеспечения, но эта скорость является причиной того, что тензоры (а не массивы) так распространены в глубоком обучении.

📝 Заключение

В этой статье мы написали определение тензоров на основе:

  1. Их использование в информатике (структура данных);
  2. В частности, в глубоком обучении (они могут работать на графических процессорах).

Вот как мы можем обобщить это в одном предложении:

Тензоры — это n-мерные массивы с неявным предположением, что они могут работать на графическом процессоре.

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

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

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