Bird
Raised Fist0
PyTorchml~8 mins

Forward pass, loss, backward, step in PyTorch - Model Metrics & Evaluation

Choose your learning style10 modes available
Metrics & Evaluation - Forward pass, loss, backward, step
Which metric matters for Forward pass, loss, backward, step and WHY

The key metric here is the loss. Loss tells us how far the model's predictions are from the true answers. During the forward pass, the model makes predictions. The loss measures the error of these predictions. Then, during backward, the model learns how to improve by calculating gradients. Finally, the step updates the model to reduce the loss. Tracking loss helps us know if the model is learning well.

Confusion matrix or equivalent visualization

For classification tasks, a confusion matrix shows how many predictions were correct or wrong:

      | Predicted Positive | Predicted Negative |
      |--------------------|--------------------|
      | True Positive (TP)  | False Negative (FN) |
      | False Positive (FP) | True Negative (TN)  |
    

While the forward pass and backward step do not directly produce this matrix, the loss computed during the forward pass reflects how well the model is doing overall. Lower loss usually means better confusion matrix results.

Precision vs Recall tradeoff with concrete examples

Though precision and recall are not computed during forward/backward steps, the loss function influences them indirectly. For example:

  • If the loss focuses on overall error (like cross-entropy), the model balances precision and recall.
  • If the loss is weighted to penalize false negatives more, the model improves recall (finding more true positives).
  • If the loss penalizes false positives more, the model improves precision (fewer wrong positive predictions).

Choosing the right loss guides the model to the desired tradeoff between precision and recall.

What "good" vs "bad" metric values look like for this use case

Good: Loss decreases steadily over training steps, showing the model is learning. For example, loss dropping from 1.0 to 0.1 means predictions are closer to true labels.

Bad: Loss stays high or fluctuates wildly, meaning the model is not learning or the learning rate is too high/low. For example, loss stuck around 1.0 or increasing means poor training.

Metrics pitfalls
  • Accuracy paradox: Loss might decrease but accuracy may not improve if the model predicts common classes well but misses rare ones.
  • Data leakage: If training data leaks into validation, loss looks good but model fails on new data.
  • Overfitting indicators: Training loss decreases but validation loss increases, showing the model memorizes training data but does not generalize.
  • Ignoring loss scale: Different loss functions have different scales; comparing raw loss values across tasks can be misleading.
Self-check question

Your model has a loss that decreases from 1.2 to 0.3 over training, but validation loss stays around 1.1. Is it good?

Answer: No, this suggests overfitting. The model learns training data well (loss 0.3) but does not generalize (validation loss 1.1). You should try regularization, more data, or early stopping.

Key Result
Loss is the key metric during forward, backward, and step; decreasing loss means the model is learning.

Practice

(1/5)
1. What is the main purpose of the forward pass in a PyTorch model?
easy
A. To compute gradients for backpropagation
B. To update the model weights after training
C. To run input data through the model and get predictions
D. To calculate the loss between predictions and targets

Solution

  1. Step 1: Understand the forward pass role

    The forward pass takes input data and processes it through the model layers to produce predictions.
  2. Step 2: Differentiate from other steps

    Updating weights is done by the optimizer step, loss calculation measures error, and backward computes gradients.
  3. Final Answer:

    To run input data through the model and get predictions -> Option C
  4. Quick Check:

    Forward pass = predictions [OK]
Hint: Forward pass means getting predictions from inputs [OK]
Common Mistakes:
  • Confusing forward pass with weight update
  • Mixing loss calculation with forward pass
  • Thinking backward computes predictions
2. Which of the following is the correct PyTorch code to perform a backward pass on a loss tensor named loss?
easy
A. loss.step()
B. loss.backward()
C. loss.forward()
D. loss.update()

Solution

  1. Step 1: Identify the backward method

    In PyTorch, calling loss.backward() computes gradients for all tensors with requires_grad=True.
  2. Step 2: Check other options

    step() is for optimizers, forward() is for models, and update() is not a PyTorch method.
  3. Final Answer:

    loss.backward() -> Option B
  4. Quick Check:

    Backward pass uses loss.backward() [OK]
Hint: Use loss.backward() to compute gradients [OK]
Common Mistakes:
  • Using step() on loss instead of optimizer
  • Calling forward() on loss tensor
  • Trying to update loss directly
3. Given the following PyTorch code snippet, what will be printed?
import torch
import torch.nn as nn

model = nn.Linear(2, 1)
optimizer = torch.optim.SGD(model.parameters(), lr=0.1)

inputs = torch.tensor([[1.0, 2.0]])
targets = torch.tensor([[1.0]])

outputs = model(inputs)
loss_fn = nn.MSELoss()
loss = loss_fn(outputs, targets)

loss.backward()
optimizer.step()

print(loss.item())
medium
A. A positive float value representing the loss before weight update
B. Zero, because optimizer.step() resets the loss
C. A tensor object, not a float
D. An error because backward() must be called after step()

Solution

  1. Step 1: Understand loss calculation and printing

    The loss is computed before backward and step, so loss.item() returns the scalar loss value as a float.
  2. Step 2: Confirm optimizer.step() effect

    Calling optimizer.step() updates weights but does not change the already computed loss tensor value.
  3. Final Answer:

    A positive float value representing the loss before weight update -> Option A
  4. Quick Check:

    loss.item() shows loss before update [OK]
Hint: Loss printed is before optimizer updates weights [OK]
Common Mistakes:
  • Thinking loss becomes zero after optimizer.step()
  • Expecting loss to be a tensor when printed
  • Calling backward() after step() causes error
4. Identify the error in this PyTorch training snippet:
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
outputs = model(inputs)
loss = loss_fn(outputs, targets)
optimizer.step()
loss.backward()
medium
A. Missing optimizer.zero_grad() before backward
B. Model parameters not passed to optimizer
C. Using wrong loss function
D. Calling optimizer.step() before loss.backward()

Solution

  1. Step 1: Check order of backward and step

    Gradients must be computed by loss.backward() before calling optimizer.step() to update weights.
  2. Step 2: Analyze given code order

    The code calls optimizer.step() before loss.backward(), so weights update happens without gradients.
  3. Final Answer:

    Calling optimizer.step() before loss.backward() -> Option D
  4. Quick Check:

    Backward before step is required [OK]
Hint: Always call loss.backward() before optimizer.step() [OK]
Common Mistakes:
  • Swapping backward and step order
  • Forgetting to zero gradients
  • Assuming step() computes gradients
5. You want to train a PyTorch model for one step with input x and target y. Which sequence of commands correctly performs forward pass, loss calculation, backward pass, and weight update?
hard
A. optimizer.zero_grad(); outputs = model(x); loss = loss_fn(outputs, y); loss.backward(); optimizer.step()
B. outputs = model(x); loss = loss_fn(outputs, y); optimizer.step(); loss.backward(); optimizer.zero_grad()
C. loss = loss_fn(x, y); outputs = model(x); optimizer.zero_grad(); loss.backward(); optimizer.step()
D. optimizer.step(); optimizer.zero_grad(); outputs = model(x); loss = loss_fn(outputs, y); loss.backward()

Solution

  1. Step 1: Understand correct training step order

    The correct order is: clear gradients, forward pass, compute loss, backward pass, then update weights.
  2. Step 2: Check each option's sequence

    optimizer.zero_grad(); outputs = model(x); loss = loss_fn(outputs, y); loss.backward(); optimizer.step() follows the correct order. Others call optimizer.step() too early or compute loss before forward pass.
  3. Final Answer:

    optimizer.zero_grad(); outputs = model(x); loss = loss_fn(outputs, y); loss.backward(); optimizer.step() -> Option A
  4. Quick Check:

    Zero grad -> forward -> loss -> backward -> step [OK]
Hint: Clear grads, forward, loss, backward, then step [OK]
Common Mistakes:
  • Calling optimizer.step() before backward
  • Not zeroing gradients before backward
  • Computing loss before forward pass
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard