fit()은 표준 학습 경로를 훌륭하게 처리해. 하지만 GAN처럼 옵티마이저가 둘이거나, 그래디언트 누적과 동적 손실 가중치가 필요하다면 train_step()을 재정의하거나 tf.GradientTape, torch.autograd, jax.grad로 직접 루프를 만들어야 해. 이 트랙에서는 네 백엔드의 방식을 모두 살펴본다.
fit()은 확장할 수 있는 계약이야
대부분의 학습은 model.fit()으로 충분해. 에포크 반복, 배치 처리, 평가지표 기록, 콜백, 분산 전략까지 이미 맡아 주거든. 이 트랙의 목적은 그 기반을 버리는 게 아니라 계약의 경계를 이해하고 꼭 필요한 지점에만 개입하는 거야. 다음처럼 순전파·손실·역전파의 단일 주기로 표현할 수 없을 때 사용자 정의 단계를 고려해:
- GAN — 생성자와 판별자를 번갈아 학습하며 손실 함수와 옵티마이저를 둘씩 사용
- 지식 증류 — 교사 모델의 출력을 함께 반영하는 사용자 정의 손실
- 연구 실험 — 그래디언트 조작, 사용자 정의 규제, 메타 학습
- 그래디언트 누적 — 메모리 한계 안에서 더 큰 배치 효과 구현
제어 비용에 따라 세 단계로 올라가
Keras는 점진적인 선택지를 제공해. 첫째, train_step()만 재정의하면 사용자 정의 로직을 fit() 안에서 실행하면서 진행 표시줄, 콜백, 분산 처리를 유지할 수 있어. 둘째, 반복 구조 자체를 통제해야 할 때 전체 루프를 직접 작성해. 셋째, 원시 그래디언트 기록 장치가 꼭 필요한 드문 경우에 백엔드 고유 API까지 내려가. 한 단계 올라갈 때마다 더 많은 제어를 얻는 대신 기존 기반을 직접 관리해야 해. 문제를 표현할 수 있는 가장 낮은 단계에서 멈추는 것이 핵심이야.