PyTorch, начало

PyTorch, начало


Рассмотрим стандартный для PyTorch псевдо-код. Псевдо- по тому что он очень упрощен. Чтобы использовать его на практике, пришлось бы много всего дописать. Но примеров полноценного торчевского кода в Интернете масса, а наша задача пройтись по всем строчкам и объяснить, что происходит.


Входящие данные:

batch – кусок данных, который “скармливается” модели за раз. Должен быть в точности в том виде, в котором модель ожидает

target – результат модели, к которому модель пытается максимально приблизиться (для задач классификации это правильный класс объекта, но может быть также число, вектор, и.т.д.)


Элементы модели:

model(nn.Module) – собственно модель (нейронная сеть), которая обучается, а впоследствии будет использоваться для предсказаний. Все модели в конечном счете являются представителями класса nn.Module (часто через один или более под-классов)

optimizer = optim.optimizer_type(model.parameters()) - алгоритм оптимизации модели. Он должен быть привязан к параметрам, которые он будет оптимизировать. В текущей записи он привязан к model.parameters(), то есть одновременно будут оптимизироваться все параметры модели. Это наиболее стандартный вариант, хотя возможна и оптимизация только какой-то части параметров. Есть несколько стандартных алгоритмов оптимизации, сейчас не будет на этом останавливаться (поэтому в псевдо-коде стоит optimizer_type)

loss_function = nn.loss_function_type() - функция, которая будет считать размер “потерь”, то есть отклонение результата, посчитанного моделью от правильного значения (“target”). Используемые функции зависят от типов данных и задач. Например, если целью модели является предсказать число, то вероятно, будет использоваться "среднеквадратическое отклоенение" (nn.MSELoss()).


Обучение модели:

output = model(batch). Считается “предсказание” модели, исходя из ее текущих параметров. Данная запись эквивалентна строчке output = model.forward(batch), то есть считается результат прохода куска данных по модели вперед.

loss = loss_function(output, target). Определяется размер потерь, то есть насколько сильно результат модели отличается от “правильного”, на основе выбранной функции.

loss.backward(). Это самая важная строчка, которая и делает PyTorch таким могущественным и таким удобным. Потери автоматически разносятся по всем оптимизируемым параметрам. Напоминаем, в модели могут быть миллионы, даже сотни миллионов параметров. Каждый из них, вероятно, не оптимален, соответственно, в какой-то небольшой степени отвечает за итоговые потери. На данном шаге вычисляется градиент (направление) изменения каждого из параметров.

optimizer.step() - параметры модели обновляются на основании градиента согласно зафиксированному алгоритму оптимизации.


Мы рассмотрели обработку одного кусочка данных моделью. По окончании данного шага значения параметров модели изменились. Если мы еще раз “скормим” модели те же самые данные, результат, в общем случае будет другим.


Конечно, мы не покрыли множество вопросов. Из чего состоит модель и как ее создавать? Как разбить данные на батчи и их подготовить? Как использовать ранее обученную модель? Наконец, что происходит “за кадром” и почему это так эффективно? Об этом и многом другом в следующих постах серии.

Report Page