1. Введение

Всем привет. Давайте разберемся с тензорами в машинном обучении. Прежде чем начать с тензоров, мы предполагаем, что вы знаете, что такое машинное обучение. Но для краткости давайте взглянем на определение машинного обучения из книги Андрея Буркова «Стостраничная книга по машинному обучению».

2.Понимание тензоров

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

Исходя из первоначальных предположений, мы можем сделать вывод, что тензоры представляют собой вложенные списки объектов начального порядка, все из которых имеют одинаковый размер. Например, тензор третьего порядка можно рассматривать как набор матриц с одинаковым количеством строк и столбцов. Эти упомянутые тензоры имеют второй порядок, и, поскольку все они имеют одинаковое/одинаковое количество строк и столбцов, тензор третьего порядка будет кубоидом чисел, и мы можем открывать числа, путешествуя по любой из трех осей (см. изображения 2 и 3). Строка, столбец и глубина, на которой хранится число, отличают его. Для формализации этой идеи можно использовать понятие формы.

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

3. Тензоры в машинном обучении.

Помните, что большинство машин не могут обучаться без данных. Более того, сегодняшние данные часто многомерны. Тензоры могут помочь в машинном обучении, кодируя многомерные данные. Изображение, например, часто представлено тремя полями: ширина, высота и глубина (цвет). Имеет смысл представить его в виде трехмерного тензора. Однако часто мы имеем дело с десятками тысяч изображений. В результате в картину вступает четвертое поле — размер выборки. Коллекция фотографий, например известный набор данных MNIST, может храниться в Tensor-flow как 4D-тензор. Такое представление упрощает решение задач, связанных с большими объемами данных.

4.Элементарные тензорные операции

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

4.1 Добавление тензора

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

p111, p121, p131 p112, p122, p132
P = (p211, p221, p231), (p112, p122, p132)

q111, q121, q131 q112, q122, q132
Q = (q211, q221, q231), (q112, q122, q132)

D= P+ Q

p111 + q111, p121 + q121, p131 + q131 p112 + q112, p122 + q122, p132 + q132
D= (p211 + q211, p221 + q221, p231 + q231), (p112 + q112, p122 + q122, p132 + q132)

В случае с NumPy, добавляя массивы, мы можем добавлять тензоры.

из массива импорта numpy
P= array([
[[1,2,3], [4,5,6], [7,8,9]],
[[11 ,12,13], [14,15,16], [17,18,19]],
[[21,22,23], [24,25,26], [27,28,29 ]],
])
Q = array([
[[1,2,3], [4,5,6], [7,8,9]],
[[11,12,13], [14,15,16], [17,18,19]],
[[21,22,23], [24,25,26], [ 27,28,29]],
])
D = P + Q
print(D)

4.2 Тензорное вычитание

Когда один тензор вычитается из другого тензора точных размеров поэлементно, создается новый тензор точных размеров, причем каждое скалярное значение представляет собой поэлементное вычитание скаляров в родительском/основном тензорах.

p111, p121, p131 p112, p122, p132
P= (p211, p221, p231), (p112, p122, p132)

q111, q121, q131 q112, q122, q132
Q = (q211, q221, q231), (q112, q122, q132)

D = P— Q

p111 — q111, p121 — q121, p131 — q131 p112 — q112, p122 — q122, p132 — q132
D = (p211 — q211, p221 — q221, p231 — q231), (p112 — q112, p122 — q122, p132 — q132)

В случае с NumPy, вычитая массивы, мы можем вычитать тензоры.

из массива импорта numpy
P = array([
[[1,2,3], [4,5,6], [7,8,9]],
[[11 ,12,13], [14,15,16], [17,18,19]],
[[21,22,23], [24,25,26], [27,28,29 ]],
])
Q= array([
[[1,2,3], [4,5,6], [7,8,9]],
[[11,12,13], [14,15,16], [17,18,19]],
[[21,22,23], [24,25,26], [ 27,28,29]],
])
D= P—Q
print(D)

4.3 Тензорное деление

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

p111, p121, p131 p112, p122, p132
P = (p211, p221, p231), (p112, p122, p132)

q111, q121, q131 q112, q122, q132
Q = (q211, q221, q231), (q112, q122, q132)

D = P/ Q

p111 / q111, p121 / q121, p131 / q131 p112 / q112, p122 / q122, p132 / q132
D = (p211 / q211, p221 / q221, p231 / q231), (p112 / q112, p122 / q122, p132 / q132)

В случае с NumPy, разделив массивы, мы можем разделить тензоры.

из массива импорта numpy
P = array([
[[1,2,3], [4,5,6], [7,8,9]],
[[11 ,12,13], [14,15,16], [17,18,19]],
[[21,22,23], [24,25,26], [27,28,29 ]],
])
Q= array([
[[1,2,3], [4,5,6], [7,8,9]],
[[11,12,13], [14,15,16], [17,18,19]],
[[21,22,23], [24,25,26], [ 27,28,29]],
])
D= P/Q
print(D)

4.4 Тензорное произведение

Оператор тензорного произведения часто изображается графически в виде круга с маленьким y в центре. Мы будем называть его здесь «(y)».

Предположим, что у нас есть тензор P размерности p и тензор Q размерности q, тогда мы придем к выводу, что комбинация этих упомянутых тензоров приведет к тому, что новый тензор будет порядка либо q + p, либо, p + q Габаритные размеры.

Тензорное произведение не обязательно делать на тензорах; его также можно реализовать на матрицах и векторах, что может быть отличным местом для развития понимания высших измерений.

Давайте посмотрим на тензорное произведение векторов.

p = (p1, p2)

q= (q1, q2)

d = p(x) q

p1 * [q1, q2]
d = (p2 * [q1, q2])

Или в развернутом виде:

p1 * q1, p1 * q2
d= (p2 * q1, p2 * q2)

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

p11, p12
P = (p21, p22)

q11, q12
Q = (q21, q22)

D= P(x) Q

q11, q12 q11, q12
p11 * (q21, q22), p12 * (q21, q22)
D= [ q11, q12 q11, q12 ]
p21 * (q21, q22), p22 * (q21, q22)

Или в развернутом виде:

p11 * q11, a11 * q12, p12 * q11, p12 * q12
p11 * q21, p11 * q22, p12 * q21, p12 * q22
D= (p21 * q11, p21 * q12, p22 * q11, p22 * q12)
p21 * q21, p21 * q22, p22 * q21, p22 * q22

Функцию tensordot() NumPy можно использовать для вычисления тензорного произведения.
Функция принимает два тензора для умножения и ось, по которой суммируются результаты, называемые суммированием. В NumPy ось должна быть установлена ​​на ноль, чтобы вычислить тензорное произведение, широко известное как тензорное скалярное произведение.

В приведенном ниже примере мы определяем два тензора (вектора) порядка 1 с помощью и вычисляем тензорное произведение.

from numpy import array
from numpy import tensordot
P = array([1,2])
Q = array([3,4])
D= tensordot (P, Q, оси=0)
print(D)

Тензорное произведение является наиболее распространенным типом тензорного умножения, но есть и многие другие, такие как тензорное скалярное произведение и тензорное сжатие.

5.Как тензоры используются в программировании?

Тензоры в математике — это не то же самое, что тензоры в программировании. Они просто наследуют некоторые из их характеристик. Они заимствуют некоторые из их приемов изображения.

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

Каждый тензор представлен в Tensorflow свойством формы. Каждый тензор имеет форму (x, y), где x обозначает длину тензора, а y обозначает размерность матриц или списка/массива, содержащихся в тензоре в этом случае. Он должен быть одинаковым для каждого списка/массива, включенного внутрь.

Например, в большинстве рекомендательных систем основанные на модели методы совместной фильтрации, такие как матричная факторизация, не позволяют включать контекстную информацию в модели. Исследователи создали более надежную модель, которая предлагает контекстно-зависимые предложения, используя N-мерный тензор, а не обычную двумерную матрицу User-Item. Увеличение вычислительной мощности в последние годы также позволяет реализовать эти ресурсоемкие тензорные операции.

6.Почему внезапно возник интерес к тензорам в машинном и глубоком обучении?

Тензоры представляются с помощью матриц. Это упрощает процесс хранения данных в массиве. Рассмотрим следующее изображение с разрешением Y x Y. Пиксельные данные изображения могут быть выражены в виде массива. То же самое может быть справедливо и для видеокадров. Представление становится намного более простым. Таким образом, главный вывод заключается в том, что мы можем получить точное представление почти идентичных данных с естественным представлением этих вещей.

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

Заключение

На этом я заканчиваю обсуждение тензоров. Это фундаментальные концепции, полезные при работе с тензорами. Я надеюсь, что эта статья помогла вам расширить кругозор. Большое спасибо, что нашли время, чтобы прочитать этот пост!