cc-ai / climategan

Code and pre-trained model for the algorithm generating visualisations of 3 climate change related events: floods, wildfires and smog.
https://thisclimatedoesnotexist.com
GNU General Public License v3.0
76 stars 18 forks source link

Cross-entropy isn't the right loss for domain adaptation #4

Closed vict0rsch closed 4 years ago

vict0rsch commented 4 years ago

@gcosne You mean to change the loss for the updates of G coming from C in update_g and the updates of C alone in update_c ?

vict0rsch commented 4 years ago
Two options:

(1) push the domain-classifier output towards a maximum entropy output (i.e. 0.5, here), as in

https://arxiv.org/abs/1802.09386

(2) or change the target to something like a squared loss (targets of say -1 and 1 with no output nonlinearity), in the same spirit as

https://arxiv.org/abs/1702.08431
or
https://arxiv.org/abs/1611.04076
vict0rsch commented 4 years ago

@adrienju :

Pour la loss (conversation gautier et yoshua), il semble que la convergence est meilleure quand tu utilises une l2 plutôt qu'une Cross-entropy. Si on utilise softmax + l2, il semble aussi qu'il est préférable de définir les labels de la façon suivante :

Entrainement du classifier :

Ground truth pour une image réel = (1, 0), pour une image sim = (0, 1)

Entrainement du générateur :

Ground truth pour une image réel = (0.5, 0.5) et pour une image sim = (0.5, 0.5) et pas (0, 1), (1, 0).

Point de débat avec gautier : doit-on mélanger dans un batch d'entrainement du classifier des données sim et réel afin de fournir un meilleur signal d'entrée à celui-ci ou peut-on l’entraîner séquentiellement comme c'est le cas pour le moment ?

vict0rsch commented 4 years ago

Ground truth pour une image réel = (1, 0), pour une image sim = (0, 1)

Entrainement du générateur :

Ground truth pour une image réel = (0.5, 0.5) et pour une image sim = (0.5, 0.5) et pas (0, 1), (1, 0).

sounds legit ça me va

vict0rsch commented 4 years ago

doit-on mélanger dans un batch d'entrainement du classifier des données sim et réel afin de fournir un meilleur signal d'entrée à celui-ci ou peut-on l’entraîner séquentiellement comme c'est le cas pour le moment ?

Pour l'instant tel que c'est codé c'est bien en parallèle parce que bien qu'on traite les batchs séquentiellement for batch_domain, batch in multi_domain_batch.items() en fait le loss.backward() et c_opt_step() sont appelés une seule fois après cette loop

vict0rsch commented 4 years ago

Je pense que garder une telle structure permettra d'éviter des phénomènes oscillatoires mais pas sûr. Thoughts?