Реализация накопления градиента Pytorch

Предисловие

В основном используется для решения проблемы нехватки памяти видеокарты.
Градиентное накопление позволяет использовать одну карту для достижения эффекта увеличения размера партии.

Принцип накопления градиента

Мини-пакет выполняется последовательно, одновременно с этим накапливается градиент. Накопленные результаты усредняются и обновляются после расчета последнего мини-пакета для обновления переменных модели.
накопленный = ∑ i = 0 N градиент \color{green}accumulated=\sum_{i=0}^{N}grad_{i}накопленный _ _ _ _ _ _ _ _ _"="я = 0Нбабушка _ _ _я

Накопление градиента — это способ разбить выборку данных для обучения нейронной сети на несколько небольших пакетов, а затем последовательно их вычислить.
Когда переменные модели не обновляются, исходный пакет данных фактически делится на несколько небольших мини-пакетов , а выборки, используемые на каждом этапе, фактически представляют собой меньшие наборы данных.
Переменные не обновляются в течение N шагов, поэтому все мини-пакеты используют одни и те же переменные модели для расчета градиента, чтобы обеспечить расчет одной и той же информации о градиенте и весе. Алгоритм эквивалентен использованию исходного размера пакета без разделения. То есть:
θ i = θ i − 1 − lr ∗ ∑ i = 0 N градиент \color{green}\theta _{i}=\theta _{i-1}-lr*\sum_{i=0}^ { Н}град_{я}яя"="яя - 1л ря = 0Нбабушка _ _ _я
Вставьте сюда описание изображения

Код

Код без накопления градиента

for i, (images, labels) in enumerate(train_data):
    # 1. forwared 前向计算
    outputs = model(images)
    loss = criterion(outputs, labels)

    # 2. backward 反向传播计算梯度
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

Добавлен код для накопления градиента.

# 梯度累加参数
accumulation_steps = 4


for i, (images, labels) in enumerate(train_data):
    # 1. forwared 前向计算
    outputs = model(imgaes)
    loss = criterion(outputs, labels)

    # 2.1 loss regularization loss正则化
    loss += loss / accumulation_steps

    # 2.2 backward propagation 反向传播计算梯度
    loss.backward()

    # 3. update parameters of net
    if ((i+1) % accumulation)==0:
        # optimizer the net
        optimizer.step()
        optimizer.zero_grad() # reset grdient

Установка в коде Assessment_steps = 4 означает, что Batch_size скрыто увеличивается в четыре раза. Потому что градиент очищается, а параметры обновляются каждые 4 итерации кода.
loss = loss/accumulation_steps, градиент накапливается четыре раза, затем среднее значение нужно разделить на 4. В то же время, поскольку накоплено 4 пакета, скорость обучения также следует увеличить в 4 раза, чтобы увеличить шаг обновления.
Справочный блог: 1. Градиентное накопление крутой операции pytorch, которое замаскировано увеличивает размер пакета
2. Как четко понимать накопление градиента

Acho que você gosta

Origin blog.csdn.net/fcxgfdjy/article/details/133294760
Recomendado
Clasificación