반복 구조 자체를 직접 소유해야 할 때
전체 수동 루프는 두 번째 선택지야. fit()에 운전대를 맡기지 않고 에포크와 배치 반복을 직접 작성하지. 원하는 시점에 평가를 끼우거나 사용자 정의 일정에 따라 분기하고, 배치 사이에 별도 작업을 실행할 수 있는 완전한 제어를 얻어. 대신 진행 표시줄, 콜백, 체크포인트, 분산 처리처럼 물려받던 편의도 사라져. 이전에는 설정 한 줄이던 기능을 이제 직접 구현하고 유지해야 해.
수동 루프의 공통 뼈대
바깥에는 에포크 반복, 안쪽에는 데이터셋 반복이 있고, 각 단계는 순전파 → 손실 계산 → 그래디언트 계산 → 옵티마이저 갱신 순서로 진행돼. 순전파와 손실 계산은 비교적 공통으로 작성할 수 있지만 그래디언트 단계는 백엔드에 종속돼. 아래 예시는 TensorFlow의 tf.GradientTape를 사용하고, PyTorch라면 loss.backward(), JAX라면 jax.grad가 필요해. 이 차이 때문에 완전히 백엔드 독립적인 수동 루프는 만들 수 없어.