En tancar el mòdul anterior vam deixar una idea a l'aire: tots els models que hem construït fins ara per a TecnoMarket —la xarxa densa de MNIST, la mini-VGG de fotos de producte, el classificador de ressenyes, la LSTM de vendes— classifiquen o prediuen, però cap no crea. En aquesta lliçó creuem aquesta frontera amb les Xarxes Generatives Adversàries (GAN), una arquitectura en què dues xarxes competeixen entre si fins que una aprèn a generar dades noves indistingibles de les reals. Per a TecnoMarket això obre una porta ben concreta: generar imatges promocionals i augmentar les dades de productes amb poques fotos. Aquí aprendràs la tècnica i la seva arquitectura; el projecte guiat complet d'entrenament el farem a la lliçó 07-04.
Contingut
- Models discriminatius vs. generatius
- La idea adversària: falsificador contra policia
- L'espai latent
- La dinàmica d'entrenament i les seves pèrdues
- Problemes típics de les GAN
- Variants clau: DCGAN, GAN condicional i companyia
- Esquelet d'una DCGAN en Keras
- GAN a TecnoMarket: usos i límits
Models discriminatius vs. generatius
Tots els models del curs fins a aquest punt pertanyen a la mateixa família: els models discriminatius. Reben una entrada i produeixen una decisió o un número:
- La xarxa densa de 02-05 rep un dígit i respon "és un 7".
- La CNN de 03-04 rep una foto i respon "és una torradora".
- La LSTM de 04-03 rep una ressenya i respon "sentiment negatiu".
- La LSTM de 04-04 rep vendes passades i respon "demà vendràs 412 unitats".
Formalment, un model discriminatiu aprèn la frontera que separa classes (o la relació entrada→sortida). Un model generatiu fa una cosa més ambiciosa: aprèn com són les dades en si, la seva distribució, i amb aquest coneixement pot fabricar exemples nous que no han existit mai.
| Aspecte | Model discriminatiu | Model generatiu |
|---|---|---|
| Pregunta que respon | "Què és això?" | "Com és això?" |
| Aprèn | Fronteres entre classes | La distribució de les dades |
| Sortida | Etiqueta, probabilitat, número | Una dada nova (imatge, text...) |
| Exemple al curs | CNN de fotos de producte (03-04) | GAN d'imatges promocionals |
| Analogia | Un crític d'art | Un pintor |
L'analogia del crític i el pintor és útil: el crític distingeix un Velázquez d'una falsificació sense saber pintar; el pintor, per pintar bé, necessita entendre la llum, la composició, l'anatomia... és a dir, un coneixement més profund. Les GAN tenen la genialitat de posar un crític i un pintor a entrenar-se mútuament.
La idea adversària: falsificador contra policia
Una GAN es compon de dues xarxes neuronals que competeixen:
- El generador (G): el falsificador de bitllets. Rep soroll aleatori i produeix imatges falses. Al principi són gargots; el seu objectiu és que passin per reals.
- El discriminador (D): el policia. Rep imatges (unes de reals del dataset, altres de fabricades per G) i ha de dir quines són autèntiques. És un classificador binari, exactament com els que ja saps construir.
La competició els millora tots dos:
- Al principi, el falsificador produeix bitllets barroers i el policia els detecta amb facilitat.
- El falsificador estudia en què falla (rep el "repartiment de culpa" del gradient, la mateixa backpropagation de 02-03, però travessant el policia) i millora els seus bitllets.
- El policia, davant falsificacions millors, afina el criteri: mira la marca d'aigua, el relleu...
- El cicle es repeteix fins que les falsificacions són tan bones que el policia encerta poc més que llançant una moneda.
flowchart LR
Z[Soroll aleatori z] --> G[Generador]
G --> F[Imatges falses]
R[(Imatges reals<br/>del dataset)] --> D[Discriminador]
F --> D
D --> V{Real o falsa?}
V -- error de D --> D
V -- gradient a traves de D --> G
Fixa't en l'última fletxa del diagrama: el generador no veu mai les imatges reals. Només aprèn del veredicte del discriminador. Tot el seu coneixement sobre "com és una foto de producte real" li arriba filtrat pel seu adversari.
L'espai latent
Què és aquest "soroll aleatori" que entra al generador? És un vector z de, per exemple, 100 números extrets d'una distribució normal. Aquest vector viu a l'espai latent, i el generador aprèn a mapar cada punt d'aquest espai a una imatge.
Això et sonarà: a 03-04 vam veure que una CNN converteix imatges en embeddings —vectors on la proximitat (similitud cosinus) significa semblança visual— i a 04-03 vam fer el mateix amb paraules. L'espai latent d'una GAN és la mateixa idea en sentit invers: en lloc de comprimir una imatge a un vector, expandim un vector a una imatge. I hereta les propietats interessants dels embeddings:
- Punts propers generen imatges semblants: si mous
zuna mica, la torradora generada canvia lleugerament d'angle o de color. - Es pot interpolar: recórrer la línia recta entre
z1(que genera una cafetera vermella) iz2(una cafetera negra) produeix una transició suau de cafeteres intermèdies. - Direccions amb significat: en GAN ben entrenades apareixen direccions de l'espai latent que controlen atributs ("més brillantor", "fons més clar"), igual que en els embeddings de paraules hi havia direccions de significat.
El generador és, en essència, un descodificador de l'espai latent a l'espai d'imatges. Guarda aquesta idea: a la propera lliçó (autoencoders) construirem aquest espai latent de manera explícita i controlada.
La dinàmica d'entrenament i les seves pèrdues
L'entrenament alterna dos passos, repetits milers de vegades:
Pas 1 — entrenar el discriminador (el generador es congela):
- Se li mostren imatges reals amb etiqueta 1 i imatges generades amb etiqueta 0.
- La seva pèrdua és l'entropia creuada binària (BCE) que ja vas fer servir a 02-04 per a classificació binària. Res de nou: és un classificador fent la seva feina.
Pas 2 — entrenar el generador (el discriminador es congela):
- El generador produeix imatges i les passa al discriminador amb etiqueta 1 ("vull que te les creguis").
- La pèrdua torna a ser BCE, però mesurada sobre l'opinió del discriminador. Si el discriminador diu "0.05 de probabilitat de real", la pèrdua del generador és alta i el gradient li indica com retocar els seus pesos per enganyar-lo millor.
Aquest estira-i-arronsa és un joc minimax: el discriminador intenta maximitzar el seu encert i el generador intenta minimitzar-lo. No cal el formalisme matemàtic complet; la intuïció operativa és aquesta:
L'equilibri ideal no és que un guanyi, sinó un empat d'alt nivell: el generador produeix imatges tan bones que el discriminador respon ~0.5 ("no t'ho sabria dir") per a tot.
Això té una conseqüència pràctica important que distingeix les GAN de tot l'anterior: la corba de pèrdua ja no baixa monòtonament fins a estabilitzar-se, com les que vas analitzar a 02-05. Les pèrdues de G i D oscil·len, pugen i baixen en funció del rival. Per saber si la GAN va bé no n'hi ha prou de mirar les corbes: cal mirar les imatges generades periòdicament.
Problemes típics de les GAN
Entrenar dues xarxes en competició és notòriament inestable. Aquests són els tres problemes clàssics:
| Problema | Què passa | Símptomes | Remeis habituals |
|---|---|---|---|
| Mode collapse (col·lapse de modes) | El generador descobreix una imatge que enganya el discriminador i la produeix sempre, ignorant la diversitat real | Totes les mostres generades són gairebé idèntiques (p. ex., sempre la mateixa cafetera amb el mateix angle) | Batch de mostres divers, variants com WGAN, minibatch discrimination |
| Inestabilitat / desequilibri | Una xarxa aixafa l'altra: si D esdevé perfecte, el gradient que arriba a G s'esvaeix (el vanishing gradient de 02-03 reapareix) i G deixa d'aprendre | La pèrdua de D cau a ~0 i la de G es dispara; les imatges deixen de millorar | Learning rates baixos i diferents per a G i D, label smoothing (etiquetes 0.9 en lloc d'1), no sobreentrenar D |
| No convergència | Les dues xarxes oscil·len sense arribar a l'equilibri: G enganya, D s'adapta, G canvia d'estratègia... en cercles | Pèrdues que oscil·len sense patró; la qualitat de les imatges millora i empitjora cíclicament | Adam amb beta_1 baix (0.5), arquitectures provades (DCGAN), paciència i checkpoints freqüents |
Consell transversal: guarda imatges generades cada N èpoques i compara-les. És l'equivalent visual de les corbes train/val que ja domines.
Variants clau
La GAN original (2014) feia servir capes denses. Des de llavors la família ha crescut; aquestes són les variants que has de conèixer a nivell conceptual:
- DCGAN (Deep Convolutional GAN): substitueix les capes denses per convolucions. El discriminador és una CNN normal (com les del mòdul 3) i el generador fa servir convolucions transposades que fan el camí invers: d'un vector petit a una imatge gran, doblant la resolució a cada capa. És l'arquitectura de referència per començar i la que farem servir a 07-04.
- GAN condicional (cGAN): a més del soroll, el generador rep una etiqueta ("genera un dígit 7", "genera una cafetera"). Així es controla què es genera, no només que sigui realista. Per a TecnoMarket és la variant interessant: sense condició, la GAN genera "un producte qualsevol"; amb condició, genera productes de la categoria que demanis.
- StyleGAN: la família responsable dels rostres hiperrealistes que hauràs vist per la web; introdueix control fi per nivells de detall (posa, trets, textura).
- CycleGAN: tradueix entre dominis sense parells d'exemple (foto↔quadre, estiu↔hivern). Pista de la seva utilitat comercial: convertir la foto d'un sofà en "el mateix sofà en una sala d'estar nòrdica".
Existeix una altra família generativa, els models de difusió, que avui domina la generació d'imatges comercials; la mencionarem en parlar de tendències a 08-03.
Esquelet d'una DCGAN en Keras
Vegem com es materialitzen generador i discriminador per a imatges de 64×64 en color (com miniatures de producte de TecnoMarket). Aquest és l'esquelet arquitectònic; el bucle d'entrenament alternat complet el construirem pas a pas a 07-04.
from tensorflow import keras
from tensorflow.keras import layers
DIM_LATENT = 100 # mida del vector de soroll z
# --- GENERADOR: d'un vector de 100 numeros a una imatge 64x64x3 ---
generador = keras.Sequential([
# Projectem el soroll a un "mapa" petit de 4x4 amb 512 canals
layers.Dense(4 * 4 * 512, input_shape=(DIM_LATENT,)),
layers.Reshape((4, 4, 512)),
# Cada Conv2DTranspose amb strides=2 DUPLICA la resolucio:
# es l'operacio inversa a la convolucio amb stride 2 del modul 3
layers.Conv2DTranspose(256, 4, strides=2, padding="same"), # 8x8
layers.BatchNormalization(), # estabilitza (ho veurem a 05-04)
layers.LeakyReLU(0.2), # ReLU "amb fuita": deixa passar
# una mica de gradient en negatius
layers.Conv2DTranspose(128, 4, strides=2, padding="same"), # 16x16
layers.BatchNormalization(),
layers.LeakyReLU(0.2),
layers.Conv2DTranspose(64, 4, strides=2, padding="same"), # 32x32
layers.BatchNormalization(),
layers.LeakyReLU(0.2),
# Ultima capa: 3 canals (RGB) i tanh -> valors a [-1, 1],
# per aixo les imatges reals es normalitzen tambe a [-1, 1]
layers.Conv2DTranspose(3, 4, strides=2, padding="same",
activation="tanh"), # 64x64x3
], name="generador")
# --- DISCRIMINADOR: una CNN binaria com les del modul 3 ---
discriminador = keras.Sequential([
# Convolucions amb stride 2 que REDUEIXEN la resolucio a la meitat
layers.Conv2D(64, 4, strides=2, padding="same",
input_shape=(64, 64, 3)), # 32x32
layers.LeakyReLU(0.2),
layers.Conv2D(128, 4, strides=2, padding="same"), # 16x16
layers.LeakyReLU(0.2),
layers.Conv2D(256, 4, strides=2, padding="same"), # 8x8
layers.LeakyReLU(0.2),
layers.Flatten(),
layers.Dropout(0.3), # regularitzacio (05-04)
layers.Dense(1, activation="sigmoid") # probabilitat de "real"
], name="discriminador")Punts que convé entendre bé:
- El generador és una CNN al revés: allà on la CNN del mòdul 3 reduïa la imatge amb stride/pooling fins a un vector,
Conv2DTransposeambstrides=2l'amplia (4→8→16→32→64). La jerarquia vores→textures→parts→objectes es recorre en sentit contrari: primer l'estructura global, després el detall. - LeakyReLU en lloc de ReLU: una ReLU pura dona gradient zero per a entrades negatives; en un entrenament tan delicat, això mata neurones i desestabilitza. LeakyReLU deixa passar un petit pendent (0.2) a la zona negativa.
tanhfinal i dades a [-1, 1]: el rang de sortida del generador ha de coincidir amb el rang de les imatges reals que veu el discriminador; si no, el policia distingiria els bitllets pel "color del paper" i no pel seu contingut.- El discriminador no porta BatchNormalization en la pràctica habitual de la primera capa, i sí que porta Dropout: no volem que sigui massa bo massa aviat.
GAN a TecnoMarket: usos i límits
Per a què vol una botiga en línia generar imatges?
- Imatges promocionals: generar variacions d'una foto de producte (fons, ambientacions, composicions per a bàners) sense sessió fotogràfica. Una cGAN condicionada per categoria podria produir esborranys de creativitats que l'equip de disseny refina.
- Augment de dades per a productes rars: el classificador de fotos de 03-04 funciona malament en categories amb poques imatges (quantes fotos hi ha d'una fregidora d'aire d'una marca minoritària?). Una GAN entrenada en la categoria pot generar exemples sintètics addicionals per reequilibrar el dataset, complementant l'augment de dades clàssic que veurem a 05-04.
- Prototipatge de catàleg: visualitzar com quedaria un producte en diferents colors o entorns abans de fabricar-lo o fotografiar-lo.
I els límits, que no són pas petits:
- Qualitat i artefactes: una GAN modesta genera imatges amb defectes (textures estranyes, geometries impossibles). Per a material de cara al client cal filtrar amb revisió humana — el mateix patró de cua de revisió que vam muntar al pipeline de 03-04.
- Cost d'entrenament: les GAN d'alta qualitat exigeixen moltes dades i molta GPU; per a una empresa mitjana sol compensar més partir de models ja entrenats (idea que generalitzem a 05-03).
- Riscos d'ús indegut: la mateixa tecnologia genera deepfakes i imatges enganyoses. Publicar una imatge sintètica d'un producte que no es correspon amb la realitat no és un problema tècnic sinó ètic i legal; el tractem en profunditat a 08-01.
Errors Comuns i Consells
- Jutjar la GAN per les seves corbes de pèrdua com si fos un classificador. És l'error número u quan véns de models discriminatius. Les pèrdues de G i D oscil·len per disseny; una pèrdua de G que baixa a zero sol ser mal senyal (D ha deixat d'aprendre). Avalua mirant mostres generades.
- Oblidar alinear els rangs. Si les imatges reals estan a [0, 255] o [0, 1] i el generador emet a [-1, 1] (tanh), el discriminador "guanya" trivialment. Normalitza les dades reals a [-1, 1].
- Entrenar massa el discriminador. Sembla lògic ("com millor el policia, millor aprendrà el falsificador"), però un D perfecte retorna gradients gairebé nuls a G. Equilibri, no perfecció.
- Esperar diversitat sense comprovar-la. Genera una graella de 8×8 mostres amb diferents
zcada poques èpoques; si totes s'assemblen, tens mode collapse i convé reduir el learning rate o canviar de variant. - Començar per arquitectures exòtiques. DCGAN amb els hiperparàmetres clàssics (Adam, lr=0.0002, beta_1=0.5) és el punt de partida assenyat; innova només quan el bàsic funcioni.
Exercicis
Exercici 1. Classifica cadascun d'aquests models del curs com a discriminatiu o generatiu, i justifica-ho en una frase: (a) la LSTM de predicció de vendes de 04-04; (b) el generador d'una GAN; (c) el discriminador d'una GAN; (d) el classificador de ressenyes de 04-03.
Exercici 2. Durant l'entrenament d'una DCGAN sobre fotos de cafeteres de TecnoMarket observes que, a partir de l'època 40, la pèrdua del discriminador cau cap a 0.01 i la del generador creix sense parar, i les imatges generades deixen de millorar. (a) Quin dels tres problemes típics és? (b) Proposa dos remeis concrets.
Exercici 3. A l'esquelet de la DCGAN, calcula la seqüència de resolucions espacials que travessa el generador des del Reshape fins a la sortida, i explica quin paper hi juga strides=2 a Conv2DTranspose comparant-lo amb l'strides=2 d'una Conv2D del mòdul 3.
Solucions
Solució 1.
- (a) Discriminatiu: mapa una entrada (finestra de vendes passades) a una predicció numèrica; no modela com "són" les sèries, només la relació entrada→sortida.
- (b) Generatiu: fabrica dades noves (imatges) a partir de soroll; implícitament aprèn la distribució de les imatges reals.
- (c) Discriminatiu: és un classificador binari real/fals, amb BCE, com qualsevol classificador del mòdul 2-3. Que visqui dins d'una GAN no en canvia la naturalesa.
- (d) Discriminatiu: entrada (ressenya) → etiqueta (sentiment).
Solució 2.
- (a) És el problema d'inestabilitat per desequilibri: el discriminador ha esdevingut gairebé perfecte i el gradient útil que travessa D cap a G s'esvaeix (el mateix fenomen de vanishing gradient de 02-03), de manera que G ja no pot aprendre.
- (b) Remeis raonables: abaixar el learning rate del discriminador (o entrenar-lo menys passos per cada pas de G); aplicar label smoothing (etiquetar les reals com a 0.9 en lloc d'1.0 perquè D no es torni tan confiat); afegir Dropout al discriminador. Qualsevol parell d'aquests és vàlid.
Solució 3.
La seqüència és 4×4 → 8×8 → 16×16 → 32×32 → 64×64: el Reshape crea un mapa de 4×4×512 i cadascuna de les quatre Conv2DTranspose amb strides=2 duplica alçada i amplada. En una Conv2D normal, strides=2 significa "salta de dos en dos en lliscar el filtre", amb la qual cosa la sortida té la meitat de resolució (reducció, com al mòdul 3). A Conv2DTranspose l'operació s'inverteix: cada posició d'entrada "pinta" un veïnat en una sortida més gran, de manera que strides=2 duplica la resolució. El generador recorre així la jerarquia de la CNN en sentit invers: de representació abstracta i petita a imatge concreta i gran.
Conclusió
Has creuat la frontera entre classificar i crear. Les idees clau: els models generatius aprenen la distribució de les dades, no només fronteres; una GAN enfronta un generador (falsificador) i un discriminador (policia) en un joc minimax l'objectiu del qual és un empat d'alt nivell; el generador mapa un espai latent —cosí germà dels embeddings que ja coneixies— a imatges; i l'entrenament és inestable per naturalesa, amb el mode collapse i el desequilibri com a enemics habituals. Amb la DCGAN tens l'arquitectura de referència, i a 07-04 l'entrenarem de cap a cap.
Però queda una pregunta oberta: la GAN crea el seu espai latent "a cegues", empesa per un adversari. I si poguéssim construir aquest espai latent de manera directa, obligant la xarxa a comprimir i reconstruir les dades reals? Això és exactament l'autoencoder, protagonista de la propera lliçó — i, de passada, l'eina amb què TecnoMarket detectarà el frau.
Curs de Deep Learning
Mòdul 1: Introducció al Deep Learning
- Què és el Deep Learning?
- Història i evolució del Deep Learning
- Aplicacions del Deep Learning
- Conceptes bàsics de xarxes neuronals
- Preparació de l'entorn de treball
Mòdul 2: Fonaments de Xarxes Neuronals
- Perceptró i Perceptró Multicapa
- Funció d'activació
- Propagació cap endavant i cap enrere
- Optimització i funció de pèrdua
- La teva primera xarxa neuronal completa
Mòdul 3: Xarxes Neuronals Convolucionals (CNN)
- Introducció a les CNN
- Capes convolucionals i de pooling
- Arquitectures populars de CNN
- Aplicacions de CNN en reconeixement d'imatges
Mòdul 4: Xarxes Neuronals Recurrents (RNN)
- Introducció a les RNN
- LSTM i GRU
- Aplicacions de RNN en processament del llenguatge natural
- Seqüències i sèries temporals
Mòdul 5: Tècniques Avançades en Deep Learning
- Xarxes Generatives Adversàries (GAN)
- Autoencoders
- Transfer Learning
- Regularització i tècniques de millora
- Mecanismes d'atenció i Transformers
Mòdul 6: Eines i Frameworks
- Introducció a TensorFlow
- Introducció a PyTorch
- Comparació de frameworks
- Entorns de desenvolupament i recursos addicionals
- Desar, carregar i desplegar models
Mòdul 7: Projectes Pràctics
- Classificació d'imatges amb CNN
- Generació de text amb RNN
- Detecció d'anomalies amb Autoencoders
- Creació d'una GAN per a generació d'imatges
- Fine-tuning d'un model preentrenat
