【问题标题】:Accumulating Gradients累积梯度
【发布时间】:2019-04-19 06:27:42
【问题描述】:

我想在反向传递之前累积梯度。所以想知道正确的做法是什么。根据this article 它是:

model.zero_grad()                                   # Reset gradients tensors
for i, (inputs, labels) in enumerate(training_set):
    predictions = model(inputs)                     # Forward pass
    loss = loss_function(predictions, labels)       # Compute loss function
    loss = loss / accumulation_steps                # Normalize our loss (if averaged)
    loss.backward()                                 # Backward pass
    if (i+1) % accumulation_steps == 0:             # Wait for several backward steps
        optimizer.step()                            # Now we can do an optimizer step
        model.zero_grad()

而我期望它是:

model.zero_grad()                                   # Reset gradients tensors
loss = 0
for i, (inputs, labels) in enumerate(training_set):
    predictions = model(inputs)                     # Forward pass
    loss += loss_function(predictions, labels)       # Compute loss function                              
    if (i+1) % accumulation_steps == 0:             # Wait for several backward steps
        loss = loss / accumulation_steps            # Normalize our loss (if averaged)
        loss.backward()                             # Backward pass
        optimizer.step()                            # Now we can do an optimizer step
        model.zero_grad()     
        loss = 0  

我在这里累积损失,然后除以累积步骤来平均它。

第二个问题,如果我是对的,考虑到我只在每个累积步骤中进行反向传递,你会期望我的方法更快吗?

【问题讨论】:

    标签: python pytorch gradient-descent


    【解决方案1】:

    所以根据here的回答,第一种方法是内存高效。两种方法所需的工作量大致相同。

    第二种方法不断累积图形,因此需要accumulation_steps 倍以上的内存。第一种方法直接计算梯度(并简单地添加梯度),因此需要较少的内存。

    【讨论】:

      【解决方案2】:

      向后传递loss.backward() 是实际计算梯度的操作。

      如果您只进行前向传递 (predictions = model(inputs)),则不会计算梯度,因此不可能进行累积。

      【讨论】:

      • 嗯,在得到预测后,我已经在计算线上的 Los,所以不要认为这回答了我的问题。
      猜你喜欢
      • 2021-01-04
      • 2020-09-15
      • 2021-09-02
      • 2023-03-27
      • 2022-01-24
      • 2021-06-08
      • 2021-09-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多