GAN은 단일 손실 구조로 표현할 수 없어
GAN은 최소최대 게임으로 연결된 두 신경망이야. 판별자는 실제 자료와 생성 자료를 구분하도록 배우고, 생성자는 판별자가 가려내기 어려운 가짜를 만들도록 배워. 두 목적은 서로 반대이며 가중치와 옵티마이저도 따로 관리해. 따라서 fit()이 기본으로 가정하는 단일 손실·단일 옵티마이저 구조에는 들어맞지 않고, 배치마다 서로 다른 두 갱신 단계를 순서대로 실행해야 해.
그래도 train_step() 재정의가 알맞은 이유
번갈아 학습한다고 곧바로 수동 루프가 필요한 건 아니야. GAN 객체가 두 하위 모델을 보유하고, 한 train_step() 안에서 첫째 실제·가짜 배치로 판별자를 학습하고, 둘째 판별자를 통과한 신호로 생성자를 학습한 뒤, 두 손실을 반환하면 돼. fit() 안에 남아 있으므로 콜백, 체크포인트, 분산 처리도 그대로 사용할 수 있어. 아래 뼈대는 두 갱신을 _train_discriminator와 _train_generator라는 보조 메서드로 분리했어. 각 메서드가 자신의 그래디언트 기록 장치와 옵티마이저를 맡아, 코드가 두 모델의 대결 구조처럼 읽히지.