Создание нейронных сетей и обратное распространение с помощью PyTorch
Некоторое время назад в Нанкине произошла эпидемия, вероятно, из-за того, что уборщики заграничных самолетов не были должным образом очищены, что привело к заражению уборщиков. Говорят, что если чужая страна не останавливается ни на день, то отечественную нужно строго охранять. В Шэньяне был зараженный человек.Я сел на самолет из Шэньяна в Ханчжоу 22-го числа.Я оказался в последних трех рядах близкого контактного лица.Таким образом, я стал вторым близким контактным лицом.Человек заболел Я вышел из самолета и прибыл в Ханчжоу. Центр контроля заболеваний забрал меня, и я получил совершенно бесплатный карантинный пакет. Должен сказать, что контроль над большими данными в Центре контроля заболеваний действительно силен. В этот период времени это тоже заставило меня успокоиться и что-то предпринять, да и официальный аккаунт голубя тоже начал писаться. . . Но период карантина действительно задушил таких, как я. . . С таким количеством болтовни давайте приступим к делу, в этом разделе будет дополнительно проанализирован алгоритм нейронной сети на основе PyTorch из алгоритма обратного распространения.
Создавайте нейронные сети
При обучении нейронной сети обычно используется алгоритм обратного распространения ошибки. В этом алгоритме параметры настраиваются в соответствии с градиентом заданных параметров, соответствующих функции потерь. Чтобы вычислить эти градиенты, используйте встроенные функции PyTorch.torch.autograd. Он поддерживает вычисление градиента для любой сети. Выполнить детальный анализ, построив слой нейронной сети;
import torch
x = torch.ones(5) # input tensor
y = torch.zeros(3) # expected output
w = torch.randn(5, 3, requires_grad=True)
b = torch.randn(3, requires_grad=True)
z = torch.matmul(x, w)+b
loss = torch.nn.functional.binary_cross_entropy_with_logits(z, y)
Определяется PyTorch с вводомx,параметрw,bИ функцию потерь, а затем построить слой нейронной сети.
Тензоры, функции, вычислительные графы
print('Gradient function for z =',z.grad_fn)
print('Gradient function for loss =', loss.grad_fn)
Выход выглядит следующим образом;Мы используем тензоры для построения вычислительных графиков Суть функции заключается в следующем.FunctionОбъект. Этот объект определяет функцию прямого вычисления, которая вычисляет производные в обратном распространении. Сохраните функцию обратного распространения вgrad_fnсередина.
Обратитесь к документации PyTorch.pytorch.orgПо всей сети,w,bпараметры, которые необходимо оптимизировать. Чтобы вычислить градиент функции потерь для этих параметров, установитеrequires_gradсвойства этих тензоров.
Рассчитать градиент
Градиент, который должен быть вектором, указывает на то, что производная функции по направлению в этой точке принимает максимальное значение вдоль этого направления, то есть функция быстрее всего изменяется по этому направлению (направлению этого градиента) в этой точке. , а скорость изменения самая большая. Для оптимизации веса параметров нейронной сети необходимо вычислить производную функции потерь по параметрам по формулеloss.backward()Расчет.
loss.backward()
print(w.grad)
print(b.grad)
Выход выглядит следующим образом;
мы можем получить толькоgradВычислить листовые узлы графаrequeires_gradсвойства, для которых установлено значение True.backwardПри необходимости на графике можно использовать только один расчет градиента.backwardВызывается несколько раз на одном и том же графике, нам нужно передатьretain_graph-Trueиbackwardперечислить
Больше вычислений графа
Концептуально,autogradчерезFunctionНаправленный ациклический граф (DAG) объектов, который содержит данные (тензоры) и запись всех выполненных операций (и созданных новых тензоров). на этоDAGгде листья — входные тензоры, а корни — выходные тензоры. Проследив этот граф от корня до листа, градиенты могут быть вычислены автоматически с использованием цепного правила. Во время паса впередautogradПолученный тензор необходимо вычислить вDAGсохранить функцию градиента в существуетDAGвызыватьabckward()Соответствующие градиенты должны быть рассчитаны и накоплены в соответствующихgradАтрибуты по цепному правилу передаются листовым тензорам.
DAGявляется динамическим, каждый раз, когда вызывается функция **backward()**,autogradНачните заполнять новую форму, делая это каждую итерацию, если это необходимо.
Градиент и продукт Якоби
Градиент, градиент тензора в направлении любой константы c:n-й заказГрадиент тензора равенn+1Тензорное поле. Продукт Якоби — это матрица, представляющая все возможные частные производные двух векторов. Это градиент одного вектора по отношению к другому вектору,AutogradТензоры можно дифференцировать для выполнения обратного распространения, начиная с одной переменной. В глубоком обучении эта переменная обычно содержит значение функции стоимости, которая автоматически вычисляет все градиенты обратного распространения.вычислить произведение Якоби вместо самой матрицы Якоби;
Расчетные оценки следующие
inp = torch.eye(5, requires_grad=True)
out = (inp+1).pow(2)
out.backward(torch.ones_like(inp), retain_graph=True)
print("First call\n", inp.grad)
out.backward(torch.ones_like(inp), retain_graph=True)
print("\nSecond call\n", inp.grad)
inp.grad.zero_()
out.backward(torch.ones_like(inp), retain_graph=True)
print("\nCall after zeroing gradients\n", inp.grad)
когдаbackwardПри втором вызове с теми же параметрами значение градиента другое. Это происходит потому, что при выполнении обратного распространенияPyTorchбудет накапливать градиент, т.е. добавлять значение градиента кgradВ свойствах всех узлов графа вычисление. Если вы хотите рассчитать правильный градиент, вам нужноgradсбросить на ноль.
Эпилог
Что касается вопроса отключения отслеживания градиента, то иногда нам не нужно отслеживать всю историю вычислений, фиксация некоторых параметров нейронной сети — это распространенный способ тонкой настройки нейронных сетей, и ускорения вычислений при передаче только вперед. В задачах вычисления графа autograd хранит данные (тензоры) и записи всех выполненных операций (и сгенерированных новых тензоров) в ориентированном ациклическом графе (DAG), состоящем из объектов Function. В этом DAG листья — это входные тензоры, а корни — выходные тензоры. Проследив этот график от корня к листу, вы можете использовать цепное правило для автоматического вычисления градиентов. На прямом проходе autograd вычисляет результирующий тензор, поддерживает градиентную функцию операции в dag, а на обратном проходе вычисляет каждый градиент .grad_fn, накапливает их в свойстве .grad и распространяется на листовые тензоры с помощью цепное правило. В следующем разделе мы узнаем с точки зрения оптимизации параметров модели.