Вы находитесь на странице: 1из 5

2.

1 Векторные пространства, матрицы и тензорные


вычисления
Векторная алгебра
Операции с векторами и матрицами, используемые в нейросетях
Матрицы и матричное умножение: расчет нейросети
Трехмерные и четырехмерные тензоры
Представление и обработка картинок в виде тензоров

Матрицы

Если мы знаем как сдал к.р. только один студент, мы вряд ли сможем получить какую-то важную
информацию относительно заданий и к.р.

является ли к.р. сложной,


насколько легко решаются отдельные задания,
кто лучше всего справляется с самым сложным заданием?

ПОэтому на практике нас будут интересовать не отдельные вектора, а совокупности этих векторов.
Потому как именно они содержат важную для нас информацию.

Совокупности (выборки) векторов формируют матрицы - таблицы, каждая строка которой - вектор, n-
ка чисел, описывающая один объект.

a1,1 a1,2 ... a1,n


⎛ ⎞

⎜ a1,1 a1,2 ... a1,n ⎟


A = ⎜ ⎟
⎜ ⎟
⎜ ... ... ... ... ⎟

⎝ ⎠
am,1 am,2 ... am,n

Матрицы обозначают большими латинскими буквами A, B, C, . . . В вышеприведенной матрице A мы


видим имеется m строк и n столбцов. Такую матрицу обозначают A m,n
.

Элементы матрицы записывают с использованием строчных латинских букв с указанием номера строки
и столбца, например a i,j
- это элемент матрицы A, стоящий на пересечении i-й строки и j-го столбца.

Операции с матрицами. Матричное умножение


Поэлементное сложение и умножение. Умножение на число

Это самые простые операции. При этом соответствующие элементы двух одинаковых по размеру
матриц складываются или перемножаются. Проиллюстрируем это на примере numpy - матриц.

In [ ]:
# импорт библиотеки numpy
import numpy as np

In [ ]:
# Задаем две матрицы размера 2 х 3
Amat = np.array([[1,1,1],[2,2,2]])
Bmat = np.array([[1,2,3],[4,5,6]])

print(f'Amat=\n {Amat}')
print(f'Bmat=\n {Bmat}')
Amat=
[[1 1 1]
[2 2 2]]
Bmat=
[[1 2 3]
[4 5 6]]

In [ ]:
# Сложим эти две матрицы
Cmat = Amat + Bmat

print(f'Cmat= Amat + Bmat=\n {Cmat}')

Cmat= Amat + Bmat


[[2 3 4]
[6 7 8]]

In [ ]:
# Перемножим эти две матрицы
Dmat = Amat * Bmat

print(f'Dmat= Amat * Bmat=\n {Dmat}')

Dmat= Amat * Bmat


[[ 1 2 3]
[ 8 10 12]]

In [ ]:
# Умножим матрицу A на число 2
print(f'Amat=\n {Amat}')
print(f'2 * Amat=\n {Amat * 2}')

Amat=
[[1 1 1]
[2 2 2]]
2 * Amat=
[[2 2 2]
[4 4 4]]

In [ ]:
# Прибавим к матрице A число 2
print(f'Amat=\n {Amat}')
print(f'Amat + 2 =\n {Amat + 2}')

Amat=
[[1 1 1]
[2 2 2]]
Amat + 2 =
[[3 3 3]
[4 4 4]]

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

Это более сложное умножение. Матричное умножение не является коммутативным. В левой матрицы
выделим строки, а в правой - столбцы.

Результирующая матрица будет иметь размерность. совпадающую по кол-ву строк с матрицей слева и
по кол-ву столбцов - с матрицей справа:

Cm,n = Am,k ∗ Bk,n

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

Рис.3.1 Пример перемножения матриц

In [ ]:
# реализация в numpy матричного умножения

# Задаем две матрицы размера 3х2 и 2x2


Amat = np.array([[1,-2], [0, 3], [2,-1]])
Bmat = np.array([[2,1],[9,-3]])

print(f'Amat=\n {Amat}')
print(f'Bmat=\n {Bmat}')

Amat=
[[ 1 -2]
[ 0 3]
[ 2 -1]]
Bmat=
[[ 2 1]
[ 9 -3]]

In [ ]:
# перемножим их матричным умножением
Cmat = Amat @ Bmat
Dmat = np.dot(Amat, Bmat)

print(f'Cmat=\n {Cmat}')
print(f'Dmat=\n {Dmat}')

Cmat=
[[-16 7]
[ 27 -9]
[ -5 5]]
Dmat=
[[-16 7]
[ 27 -9]
[ -5 5]]
На этом умножении строится вся нейросетевая модель.

Если мы рассмотрим полносвязный слой, то он характеризуется не одним, а m нейронами, каждый из


которых описывается (n+1)-весовым вектором.

Поэтому слой характеризуется весовой матрицей W m,n+1 .

И, чтобы посчитать выход слоя, необходимо умножить эту матрицу на вектор x = (1, x1 , x2 , . . . , xn )

справа:

Z = W ∗ x
Рис. 3.2. Слой нейросети, состоящий из k нейронов, на вход которого подается m-мерный вектор

Пример.

Пусть у нас имеется слой, состоящий из 2-х нейронов, на вход которого подается вектор с 3-мя
компонентами (рис.3.2):

(x1 , x2 , x3 )

Выход слоя может быть рассчитан по формуле:

y = fa (z), z = W ∗ x,

где

1
⎛ ⎞

⎜ x1 ⎟
x = ⎜ ⎟
⎜x ⎟
2

⎝ ⎠
x3

w1,0 w1,1 w1,2 w1,3


W = ( )
w2,0 w2,1 w2,2 w2,3

In [ ]:
# проиллюстрируем конкретным примером расчета
x = np.array([[1], [-1], [2], [3]])
# x = np.array([1, -1, 2, 3]) # так тоже можно

W = np.array([[-3, 1, 1, 2], [-5, 2, 1, 1]])

z = np.dot(W, x)
y = np.sign(z)
print(f'z=\n {z}')
print(f'y=\n {y}')

z=
[[ 4]
[-2]]
y=
[[ 1]
[-1]]

ЗАДАЧА

Пусть курс состоит из 5 заданий, значения весов которых равны:

За каждое задание студент может получить от 0 до 10 баллов.

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

А для того, чтобы получить зачет автоматом нужно набрать не менее 80 баллов.

При расчете суммы баллов используются следующие веса заданий:

W = (1, 1, 2, 2, 3)

Определите получил студент зачет автоматом или только допуск к зачету, если его баллы за
соответствующие задания равны:

x = (10, 8, 7, 6, 5)

Указание: составьте матрицу из весов и умножьте ее на входной вектор, добавив в него x 0


= 1

На выходе вы должны получить вектор z из двух компонентов z = (z1 , z2 )

Если z 1
≥ 0 - студент имеет допуск к зачету.

Если z 2
≥ 0 - студент имеет зачет автоматом.

Какого размера будет весовая матрица?

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

Вам также может понравиться