GAN: generator + discriminator 두 model, 두 optimizer, 번갈아 학습. (1) D 학습: real/fake 분류, D-loss 만 update. (2) G 학습: G 가 만든 fake 를 D 가 real 로 분류하게 학습, G-loss 만 update. fit() 의 단일 loss/optimizer 모델로 안 됨.
train_step override 가 정답: 안에서 두 GradientTape, 두 apply_gradients. metrics dict 에 d_loss / g_loss 둘 다 반환. fit() 의 callback / distribution 인프라 그대로.