GAN 이 단일 loss 틀을 깨는 이유
GAN 은 minimax 게임에 묶인 두 네트워크야. discriminator 는 real 과 generated 를 구분하는 법을 배우고, generator 는 discriminator 가 못 잡는 fake 를 만드는 법을 배워. 목적이 정반대고, weight 도 optimizer 도 따로야 — 그래서 fit() 이 가정하는 '단일 loss, 단일 optimizer' 모양으로는 표현이 안 돼. batch 마다 서로 다른 update step 두 개가 순서대로 필요해.
그래도 train_step() 이 맞는 이유
여기서 바로 manual loop 로 가고 싶지만, 이 번갈아-학습 패턴은 train_step() override 안에 완벽하게 들어가. GAN object 에 두 sub-model 을 들고, 한 step 안에서 (1) real+fake batch 로 discriminator 학습 → (2) discriminator 를 고정한 채 그 feedback 으로 generator 학습 → 두 loss 반환. fit() 을 안 떠났으니 GAN 전체가 callback / checkpoint / distribution 을 공짜로 상속해. 아래 뼈대는 두 update 를 named helper (_train_discriminator / _train_generator) 로 빼서 step 이 모델링하는 게임처럼 읽히게 했어 — 각 helper 가 자기 gradient tape 와 optimizer 를 들어.