[Перевод] Знание линейной алгебры, необходимое для глубокого обучения

глубокое обучение Программа перевода самородков Python GitHub

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

глубокое обучениеЭто область машинного обучения, включающая некоторые алгоритмы искусственной нейронной сети, которые имитируют структуру и функции человеческого мозга.

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

Почему математика?

Линейная алгебра, теория вероятностей и исчисление — это три «языка», из которых состоит машинное обучение. Изучение этих математических знаний поможет глубже понять лежащий в основе механизм алгоритма и разработать новые алгоритмы.

Когда мы доберемся до сути, все, что стоит за глубоким обучением, — это математика. Поэтому понимание базовых знаний линейной алгебры имеет решающее значение перед изучением глубокого обучения и программирования.

источник

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

скаляр

Скалярединый номер, который также можно рассматривать как тензор ранга 0. Обозначение x∈ℝ означает, что x является скаляром и принадлежит множеству действительных значений ℝ.

Ниже приведены представления различных наборов чисел в глубоком обучении. ℕ представляет набор положительных целых чисел (1,2,3,…). ℤ представляет собой набор целых чисел, объединяющих положительные, отрицательные и нулевые значения. ℚ представляет собой набор рациональных чисел.

В Python есть несколько встроенных скалярных типов,int,float,complex,bytes and Unicode. В Numpy, библиотеке Python, есть 24 новых примитивных типа данных для описания различных типов скаляров. Информацию о типах данных см.Документация.

Определите скаляры и связанные с ними операции в Python:

Следующие фрагменты кода объясняют применение некоторых арифметических операторов к скалярам.

# 内置标量
a = 5
b = 7.5
print(type(a))
print(type(b))
print(a + b)
print(a - b)
print(a * b)
print(a / b)
<class 'int'>
<class 'float'>
12.5
-2.5
37.5
0.6666666666666666

Следующий фрагмент кода может проверить, является ли данная переменная скалярной.

import numpy as np

# 判断是否为标量的函数
def isscalar(num):
    if isinstance(num, generic):
        return True
    else:
        return False

print(np.isscalar(3.1))
print(np.isscalar([3.1]))
print(np.isscalar(False))
True
False
True

вектор

Вектор — это упорядоченный массив сингулярных чисел, пример тензора первого порядка. Вектор — это фрагмент объекта, называемый векторным пространством. Векторное пространство можно рассматривать как совокупность всех возможных векторов определенной длины (или размерности). Трехмерное векторное пространство с действительным знаком, обозначаемое как ℝ^3, часто используемое для математического представления нашей реальной концепции трехмерного пространства.

Чтобы однозначно найти компонент вектора, i-й скалярный элемент вектора записывается как x[i].

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

Определите векторы и связанные с ними операции в Python:

import numpy as np

# 定义向量

x = [1, 2, 3]
y = [4, 5, 6]

print(type(x))

# 这样做不会得到向量和
print(x + y)

# 使用 Numpy 进行向量相加

z = np.add(x, y)
print(z)
print(type(z))

# 向量叉乘
mul = np.cross(x, y)
print(mul)
<class 'list'>
[1, 2, 3, 4, 5, 6]
[5 7 9]
<class 'numpy.ndarray'>
[-3  6 -3]

матрица

Матрица представляет собой прямоугольный массив чисел и является примером тензора второго порядка. Если m и n — положительные целые числа, то есть m, n∈ℕ, то матрица размера m×n содержит m*n чисел с m строками и n столбцами.

Полная матрица m на n может быть записана как:

Часто полезно сокращать полное матричное отображение следующим выражением:

В Python мы используем библиотеку Numpy, которая помогает нам создавать N-мерные массивы. Массивы в основном можно рассматривать как матрицы, мы используем матричный метод и строим матрицу из списков.

$python

>>> import numpy as np
>>> x = np.matrix([[1,2],[2,3]])
>>> x
matrix([[1, 2],
        [2, 3]])

>>> a = x.mean(0)
>>> a
matrix([[1.5, 2.5]])
>>> # 对矩阵求均值。(其中 axis 不设置值,对 m*n 个数求均值,返回一个实数;axis = 0:压缩行,对各列求均值,返回 1* n 矩阵;axis =1 :压缩列,对各行求均值,返回 m *1 矩阵)。
>>> z = x.mean(1)
>>> z
matrix([[1.5],
        [2.5]])
>>> z.shape
(2, 1)
>>> y = x - z
matrix([[-0.5,  0.5],
        [-0.5,  0.5]])
>>> print(type(z))
<class 'numpy.matrixlib.defmatrix.matrix'>

Определите матрицы и связанные с ними операции в Python:

сложение матриц

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

# 矩阵加法

import numpy as np

x = np.matrix([[1, 2], [4, 3]])

sum = x.sum()
print(sum)
# Output: 10

матрица к матрице сложения

C = A + B (**A и B должны иметь одинаковые размеры**)

shapeметод возвращает размеры матрицы,addМетод принимает два матричных аргумента и возвращает сумму двух матриц. Если размеры двух матриц не совпадаютaddМетод выдаст исключение о невозможности добавления.

# 矩阵与矩阵相加

import numpy as np

x = np.matrix([[1, 2], [4, 3]])
y = np.matrix([[3, 4], [3, 10]])

print(x.shape)
# (2, 2)
print(y.shape)
# (2, 2)

m_sum = np.add(x, y)
print(m_sum)
print(m_sum.shape)
"""
Output :
[[4  6]
 [7 13]]
(2, 2)
"""

матричное и скалярное сложение

Добавляет данный скаляр ко всем элементам в данной матрице.

# 矩阵与标量相加

import numpy as np

x = np.matrix([[1, 2], [4, 3]])
s_sum = x + 1
print(s_sum)
"""
Output:
[[2 3]
 [5 4]]
"""

Умножение матрицы и скаляра

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

# 矩阵与标量的乘法

import numpy as np

x = np.matrix([[1, 2], [4, 3]])
s_mul = x * 3
print(s_mul)
"""
[[3  6]
 [12  9]]
"""

умножение матриц

Матрица A размерности (m x n) умножается на матрицу B размерности (n x p), в результате чего получается матрица C размерности (m x p).

источник

# 矩阵乘法

import numpy as np

a = [[1, 0], [0, 1]]
b = [1, 2]
np.matmul(a, b)
# Output: array([1, 2])

complex_mul = np.matmul([2j, 3j], [2j, 3j])
print(complex_mul)
# Output: (-13+0j)

Транспонирование матрицы

С помощью транспонирования вы можете преобразовывать векторы-строки в векторы-столбцы и наоборот:

A=[a_ij_]mxn

AT=[a_ji_]n×m


# 矩阵转置

import numpy as np

a = np.array([[1, 2], [3, 4]])
print(a)
"""
[[1 2]
 [3 4]]
"""
a.transpose()
print(a)
"""
array([[1, 3],
       [2, 4]])
"""

Тензор

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

источник

Вместо использования вложенных матриц мы объявляем тензоры с помощью библиотеки Python, такой как TensorFlow или PyTorch.

Определите простой тензор в PyTorch:


import torch

a = torch.Tensor([26])

print(type(a))
# <class 'torch.FloatTensor'>

print(a.shape)
# torch.Size([1])

# 创建一个 5*3 的随机 torch 变量。
t = torch.Tensor(5, 3)
print(t)
"""
 0.0000e+00  0.0000e+00  0.0000e+00
 0.0000e+00  7.0065e-45  1.1614e-41
 0.0000e+00  2.2369e+08  0.0000e+00
 0.0000e+00  0.0000e+00  0.0000e+00
        nan         nan -1.4469e+35
[torch.FloatTensor of size 5x3]
"""
print(t.shape)
# torch.Size([5, 3])

Операции с тензорами в Python:

import torch

# 创建张量

p = torch.Tensor(4,4)
q = torch.Tensor(4,4)
ones = torch.ones(4,4)

print(p, q, ones)
"""
Output:
 0.0000e+00  0.0000e+00  0.0000e+00  0.0000e+00
 1.6009e-19  4.4721e+21  6.2625e+22  4.7428e+30
 3.1921e-09  8.0221e+17  5.1019e-08  8.1121e+17
 8.1631e-07  8.2022e+17  1.1703e-19  1.5637e-01
[torch.FloatTensor of size 4x4]

 0.0000e+00  0.0000e+00  0.0000e+00  0.0000e+00
 1.8217e-44  1.1614e-41  0.0000e+00  2.2369e+08
 0.0000e+00  0.0000e+00  2.0376e-40  2.0376e-40
        nan         nan -5.3105e+37         nan
[torch.FloatTensor of size 4x4]

 1  1  1  1
 1  1  1  1
 1  1  1  1
 1  1  1  1
[torch.FloatTensor of size 4x4]
"""

print("Addition:{}".format(p + q))
print("Subtraction:{}".format(p - ones))
print("Multiplication:{}".format(p * ones))
print("Division:{}".format(q / ones))

"""
Addition:
 0.0000e+00  0.0000e+00  0.0000e+00  0.0000e+00
 1.6009e-19  4.4721e+21  6.2625e+22  4.7428e+30
 3.1921e-09  8.0221e+17  5.1019e-08  8.1121e+17
        nan         nan -5.3105e+37         nan
[torch.FloatTensor of size 4x4]
Subtraction:
-1.0000e+00 -1.0000e+00 -1.0000e+00 -1.0000e+00
-1.0000e+00  4.4721e+21  6.2625e+22  4.7428e+30
-1.0000e+00  8.0221e+17 -1.0000e+00  8.1121e+17
-1.0000e+00  8.2022e+17 -1.0000e+00 -8.4363e-01
[torch.FloatTensor of size 4x4]
Multiplication:
 0.0000e+00  0.0000e+00  0.0000e+00  0.0000e+00
 1.6009e-19  4.4721e+21  6.2625e+22  4.7428e+30
 3.1921e-09  8.0221e+17  5.1019e-08  8.1121e+17
 8.1631e-07  8.2022e+17  1.1703e-19  1.5637e-01
[torch.FloatTensor of size 4x4]
Division:
 0.0000e+00  0.0000e+00  0.0000e+00  0.0000e+00
 1.8217e-44  1.1614e-41  0.0000e+00  2.2369e+08
 0.0000e+00  0.0000e+00  2.0376e-40  2.0376e-40
        nan         nan -5.3105e+37         nan
[torch.FloatTensor of size 4x4]
"""

Дополнительная документация по тензорам и PyTorchкликните сюда.


важная ссылка

Начало работы с глубоким обучением в Python:

заключительные замечания

Спасибо за чтение. Если вы нашли эту историю полезной, пожалуйста, нажмите ? ниже, чтобы поделиться любовью.

Специальная благодарностьSamhita AllaВклад в эту статью.

Если вы обнаружите ошибки в переводе или в других областях, требующих доработки, добро пожаловать наПрограмма перевода самородковВы также можете получить соответствующие бонусные баллы за доработку перевода и PR. **Постоянная ссылка на эту статью** в начале статьи — это ссылка MarkDown на эту статью на GitHub.


Программа перевода самородковэто сообщество, которое переводит высококачественные технические статьи из Интернета сНаггетсДелитесь статьями на английском языке на . Охват контентаAndroid,iOS, [интерфейс](https://github.com/xitu/gold-miner# интерфейс), [бэкенд](https://github.com/xitu/gold-miner#backend), [блокчейн] (https:/ /github.com/xitu/gold-miner# блокчейн), [продукт](https://github.com/xitu/gold-miner# продукт), [дизайн](https://github .com/xitu/gold -miner# дизайн), [искусственный интеллект](https://github.com/xitu/gold-miner# искусственный интеллект) и другие поля, если вы хотите видеть более качественные переводы, пожалуйста, продолжайте обращать вниманиеПрограмма перевода самородков,официальный Вейбо,Знай колонку.