Разница между тензорами, массивами и матрицами
Что такое тензор?
Большинство специалистов по глубокому обучению знают о них, но не могут дать точное определение.
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 действительно менее эффективны для умножения матриц.
В этом истинная сила тензоров: они невероятно быстры! Производительность может варьироваться в зависимости от размеров, реализации, и аппаратного обеспечения, но эта скорость является причиной того, что тензоры (а не массивы) так распространены в глубоком обучении.
📝 Заключение
В этой статье мы написали определение тензоров на основе:
- Их использование в информатике (структура данных);
- В частности, в глубоком обучении (они могут работать на графических процессорах).
Вот как мы можем обобщить это в одном предложении:
Тензоры — это n-мерные массивы с неявным предположением, что они могут работать на графическом процессоре.
Наконец, мы увидели разницу в производительности между тензорами и массивами, что мотивирует потребность в тензорах в глубоком обучении.
Так что в следующий раз, когда кто-то попытается объяснить вам, что тензоры не являются в точности обобщением матриц, вы будете знать, что они правы в конкретном определении тензоров, но не в компьютерных науках/глубоком обучении.
Если вы ищете больше материалов по науке о данных и машинному обучению в n-измерениях, подпишитесь на меня в Твиттере @maximelabonne. Вы можете найти код, использованный в этой статье, по этому адресу. 📣