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

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

Одной из наиболее важных из этих операций являются производные. Возможно, вы слышали термин «градиент», если читали об обучении нейронной сети. Для обучения любых нейронных сетей существует два прохода. Первый — прямой проход, когда вы выполняете серию линейных и нелинейных операций над входной матрицей для получения выходных данных. А затем для фактического обучения этих нейронных сетей вам нужно выполнить обратный проход, Где вам нужно рассчитать градиент операций прямого прохода, чтобы вы могли обновлять свои веса на основе этих градиентов. Для вычисления этих градиентов вам нужна возможность эффективного дифференцирования произвольной функции. Исторически эти операции дифференцирования выполнялись вручную путем вычисления уравнений градиента функций, но этот ручной расчет дифференцирования часто подвержен ошибкам, с риском ошибок в вашем коде и числовой точностью. Это также требует больших ручных усилий и производительности. потеря.

Чтобы решить эту проблему, теперь большая часть библиотек поддерживает автоматический расчет градиента с более новыми библиотеками, например. Autograd, Jax, PyTorch, TensorFlow 2.0 даже дают очень хорошую и простую для понимания встроенную поддержку автоградиентов Python в своей экосистеме.

Взгляните на эти фрагменты кода, чтобы лучше понять градиенты с помощью Autograd и Pytorch.

Шаг 1. Установите и импортируйте autograd в файл Python или блокнот Jupyter.

import autograd.numpy as np 
from autograd import grad

Шаг 2. Определите функцию

# Define a function
def tanh(x):
    y = np.exp(-2.0 * x)
    return (1.0 - y) / (1.0 + y)

Шаг 3. Расчет градиентов

grad_tanh = grad(tanh)
print(grad_tanh(1.0))
print((tanh(1.0001) - tanh(0.9999)) / 0.0002)

Вывод:

0.419974341614026
0.41997434264973155

Шаг 4. Постройте график функции на интервале:

import matplotlib.pyplot as plt
from autograd import elementwise_grad as egrad
x = np.linspace(-7, 7, 200)
plt.plot(x, tanh(x))
plt.show()

Шаг 5. Постройте градиент по интервалу:

plt.plot(x, tanh(x), x, egrad(tanh)(x))
plt.show()

Эквивалентный код в PyTorch:

import torch
import numpy as np
import matplotlib.pyplot as plt
# Define a function
def tanh(x):
    y = torch.exp(-2.0 * x)
    return (1.0 - y) / (1.0 + y)

x = torch.tensor(1.0, requires_grad = True)
z = tanh(x)
z.backward() #Computes the gradient 
print(x.grad.data) #Prints '3' which is dz/dx 
print((tanh(torch.tensor(1.0001)) - tanh(torch.tensor(0.9999))) / 0.0002)

который печатает результаты:

tensor(0.4200)
tensor(0.4202)

Функция графика и градиент по интервалу:

x = np.linspace(-7, 7, 200)
x = torch.from_numpy(x)
x.requires_grad_(True)
tan_h_of_x = tanh(x)
# Calculate Gradients 
tan_h_of_x.backward(x.clone())
# Plot function and Gradients over interval: 
plt.plot(x.detach().numpy(),tan_h_of_x.detach().numpy(),
         x.detach().numpy(), x.grad.data.detach().numpy())
plt.show()