Las Redes Antagónicas (o Adversarias) Generativas (Generative Adversarial Networks) , o GAN para abreviar, son un enfoque para el modelado generativo utilizando métodos de aprendizaje profundo, como las redes neuronales convolucionales.
El modelado generativo consiste en una tarea de aprendizaje no supervisada en aprendizaje automático que implica descubrir y aprender automáticamente las regularidades o patrones en los datos de entrada de tal manera que puede utilizarse una red neuronal para generar nuevos ejemplos que podrían haberse extraído del conjunto de datos de entrenamiento original.
Mujer trabajando en un CPD, click para ver más fotos como esta. |
El paradigma GAN es una forma ingeniosa de entrenar una red generativa al enmarcar el problema como un problema de aprendizaje supervisado con dos subredes: una red generadora que entrenamos para generar nuevos ejemplos, y una red discriminadora que trata de clasificar las salidas de la red anterior como reales (del dominio de entrenamiento) o falsos (generado por la red generadora). Las dos redes se entrenan juntas en un juego de suma cero, (las ganancias de un jugador son las pérdidas del adversario) hasta que se engaña a la red discriminadora aproximadamente la mitad del tiempo, lo que significa que la red generadora está generando ejemplos tan buenos como las entradas utilizadas para entrenar la red.
Las GAN son un campo emocionante en constante desarrollo, tienen capacidad de generar ejemplos realistas en una variedad de dominios problemáticos, especialmente en tareas de traducción de imagen a imagen, como la traducción de fotos de verano a invierno o día. a la noche, y de generar fotos fotorrealistas de objetos, escenas y personas que incluso los humanos no somos capaces de decir si son falsas o verdaderas.
Aprendizaje supervisado versus no supervisado
Un problema típico de aprendizaje automático implica el uso de una red para hacer una predicción, p. modelado predictivo, esto requiere un conjunto de datos de entrenamiento que se utilizan para entrenar una red, el conjunto está compuesto por múltiples muestras, cada una con variables de entrada (X) y etiquetas de clase de salida (y). Un modelo se entrena mostrando ejemplos de entradas, haciendo que prediga salidas y corrigiendo la red para que las salidas se parezcan más a las esperadas.
En el enfoque de aprendizaje predictivo o supervisado, el objetivo es conformar un mapeo de entradas x y sus correspondientes salidas, partiendo de un conjunto previamente etiquetado de pares de entrada-salida que llamamos conjunto de datos de entrenamiento original o dominio.
Esta corrección de la red se conoce como aprendizaje supervisado, pues el dominio de entrenamiento ha sido generado o supervisado previamente por un humano.
Existe otro paradigma de aprendizaje en el que la red solo recibe las variables de entrada (X) y el problema no tiene ninguna variable de salida (y). Una red se construye extrayendo o resumiendo los patrones en los datos de entrada. No hay corrección de la red, ya que la red no predice nada.
Este segundo tipo de aprendizaje automático lo llamamos aprendizaje descriptivo o no supervisado. Aquí solo se nos dan entradas, y el objetivo es encontrar "patrones interesantes" en los datos. Este es un problema mucho menos definido, ya que no se nos dice qué tipo de patrones debemos buscar, y no hay una métrica de error obvia que usar (a diferencia del aprendizaje supervisado, donde podemos comparar nuestra predicción de y para un valor dado de x observado). Esta falta de corrección generalmente se conoce como aprendizaje no supervisado.
Los ejemplos de problemas de aprendizaje no supervisado incluyen la agrupación y el modelado generativo, y ejemplos de algoritmos de aprendizaje no supervisados como K-means y las Generative Adversarial Networks GAN.
Redes discriminativa vs. generativa
En el aprendizaje supervisado, podemos estar interesados en desarrollar una red para predecir una etiqueta de una clase dado un ejemplo de variables de entrada. Esta tarea de red predictiva se llama clasificación, modelado discriminativo o red discriminativa.
Utiliza los datos de entrenamiento para encontrar una función discriminante f(x) que asigna a cada x de entrada una etiqueta de clase (tipo), combinando así las etapas de inferencia y decisión en un solo problema de aprendizaje. Debe elegir o tomar una decisión sobre a qué clase pertenece un ejemplo dado. Por ejemplo, dadas fotos de perros y gatos debe ser capaz de etiquetar una foto dada como perro o gato.
La arquitectura de una red GAN involucra dos sub-redes, una red generadora para generar nuevos ejemplos y una red discriminadora para clasificar si los ejemplos generados son reales, del dominio o falsos, generados por la red generadora.
La red generadora
La red generadora toma un vector aleatorio de longitud fija como entrada y genera una muestra del dominio. El vector se extrae aleatoriamente de una distribución gaussiana, y se utiliza para sembrar el proceso generativo. Después del entrenamiento, los puntos en este espacio vectorial multidimensional corresponderán a los puntos en el dominio del problema, formando una representación comprimida de la distribución de datos.
Este espacio vectorial se conoce como espacio latente, o espacio vectorial compuesto de variables latentes. Las variables latentes, o variables ocultas, son aquellas variables que son importantes para el dominio pero que no son directamente observables. Una variable latente es una variable aleatoria que no podemos observar directamente.
A menudo nos referimos a variables latentes, o espacio latente, como una proyección o compresión de una distribución de datos. Es decir, un espacio latente proporciona una compresión o conceptos de alto nivel de los datos brutos observados, como la distribución de datos de entrada. En el caso de las GAN, la red generadora aplica significado a los puntos en un espacio latente elegido, de modo que los nuevos puntos extraídos del espacio latente pueden proporcionarse a la red generadora como entrada y usarse para generar ejemplos de salida nuevos y diferentes.
Las redes de aprendizaje automático pueden aprender del espacio estadístico latente de imágenes, música e historias, y luego pueden tomar muestras de este espacio, creando nuevas obras de arte con características similares a las que el modelo han visto en sus datos de entrenamiento. Después del entrenamiento, el modelo del generador se mantiene y se usa para generar nuevas muestras.
Ejemplo de red generadora.
Una red generadora toma un punto de 100 dimensiones en el espacio latente como entrada y genera una salida de 28x28x3. El punto en el espacio latente es un vector de números aleatorios gaussianos. Esto se proyecta utilizando una capa densa en base a 64 pequeñas imágenes de 7 × 7.
Las imágenes pequeñas luego se muestrean dos veces usando dos capas convolucionales de transposición con un paso de 2 × 2 y seguidas de una capa BatchNormalization y LeakyReLU, que son una mejor práctica para las GAN.
La salida es una imagen de tres canales con valores de píxeles en el rango [-1,1] a través de la función de activación de tanh.
# definimos la red generadora
generadora = Sequential()
# imágenes de 7x7
n_nodes = 64 * 7 * 7
generadora.add(Dense(n_nodes, input_dim=100))
generadora.add(BatchNormalization())
generadora.add(LeakyReLU(alpha=0.2))
generadora.add(Reshape((7, 7, 64)))
# aumentamos el tamaño de las imágenes a 14 X 14
generadora.add(Conv2DTranspose(64, (3,3), strides=(2,2), padding='same'))
generadora.add(BatchNormalization())
generadora.add(LeakyReLU(alpha=0.2))
# repetimos el mismo paso para aumentar el tamaño de las imágenes a 28 X 28
generadora.add(Conv2DTranspose(64, (3,3), strides=(2,2), padding='same'))
generadora.add(BatchNormalization())
generadora.add(LeakyReLU(alpha=0.2))
generadora.add(Conv2D(3, (3,3), activation='tanh', padding='same'))
La red discriminadora
La red discriminadora es una red de clasificación normal y corriente, toma un ejemplo del dominio como entrada (real o generada) y le asigna una etiqueta binaria verdadera(dominio) o falsa (generada).
Después del proceso de capacitación, la red discriminadora se descarta ya que estamos interesados en el generador. Una forma de construir buenas imágenes es entrenando Redes Adversarias Generativas (GAN), y luego reutilizando partes de las redes generadoras y discriminadoras como extractores de funciones para tareas supervisadas
Ejemplo de red discriminadora.
La red neuronal discriminadora recibe una imagen con un tamaño de 28x28x3 píxeles y debe clasificarla como real (1) o falsa (0) a través de la función de activación sigmoidea.
Nuestra red tiene dos capas convolucionales con 64 filtros cada una y utiliza el mismo relleno. Cada capa convolucional disminuirá la entrada utilizando un paso de 2 × 2, que es una práctica recomendada para las GAN, en lugar de utilizar una capa de agrupación.
También siguiendo las mejores prácticas, las capas convolucionales son seguidas por una activación LeakyReLU con una pendiente de 0.2 y una capa de normalización por lotes.
# definimos la red discriminadora
discriminadora = Sequential()
# reducimos la imagen a 14x14
discriminadora.add(Conv2D(64, (3,3), strides=(2,2), padding='same', input_shape=(28,28,3)))
discriminadora.add(BatchNormalization())
discriminadora.add(LeakyReLU(alpha=0.2))
# reducimos la imagen a 7x7
discriminadora.add(Conv2D(64, (3,3), strides=(2, 2), padding='same'))
discriminadora.add(BatchNormalization())
discriminadora.add(LeakyReLU(alpha=0.2))
# clasificación
discriminadora.add(Flatten())
discriminadora.add(Dense(1, activation='sigmoid'))
Entrenamiento GAN
El generador y el discriminador, se entrenan juntos. Cada ciclo de entrenamiento implica seleccionar un lote de imágenes reales del dominio del problema. Se genera un lote de puntos latentes y se alimenta al generador para sintetizar un lote de imágenes.
Luego, el discriminador se actualiza utilizando un lote de imágenes reales y generadas, minimizando la pérdida de entropía cruzada binaria utilizada en cualquier problema de clasificación binaria.
El generador se actualiza a través del discriminador. Esto significa que las imágenes generadas se presentan al discriminador como si fueran reales (no generadas) y el error se propaga a través del generador. Esto tiene el efecto de actualizar el generador para generar imágenes que tienen más probabilidades de engañar al discriminador.
Este proceso se repite para un número dado de iteraciones de entrenamiento.
GAN como juego de suma cero
El modelado generativo es un problema de aprendizaje no supervisado, aunque la capacitación del modelo generativo es un problema de aprendizaje supervisado.
Las dos redes, el generador y el discriminador, se entrenan juntas. El generador genera un lote de muestras, y estas, junto con ejemplos reales del dominio, alimentan al discriminador que las clasifica como reales o falsas.
El discriminador se actualiza para mejorar la discriminación de muestras reales y falsas en la siguiente ronda, y lo que es más importante, el generador se actualiza en función de cómo de bien, o no, consiguió engañar al discriminador con sus muestras generadas.
Podemos pensar que el generador es como un falsificador, tratando de ganar dinero, y que el discriminador es como la policía, tratando de detectar el dinero falsificado. Para tener éxito en este juego, el falsificador debe aprender a falsificar dinero que no pueda distinguirse del dinero genuino, y la red del discriminadora debe aprender a detectar falsificaciones cada vez más elaboradas. De esta manera, las dos redes compiten entre sí, son antagónicas en el sentido de la teoría de juegos y están jugando un juego de suma cero. En este caso, suma cero significa que cuando el discriminador identifica con éxito muestras reales y falsas, se ajusta según se necesiten o no cambios en los parámetros de la red, mientras que el generador se penaliza con grandes actualizaciones de sus parámetros de red.
Alternativamente, cuando el generador engaña al discriminador, es recompensado o no se necesita ningún cambio en los parámetros de la red, pero el discriminador se penaliza y sus parámetros del modelo se actualizan.
El entrenamiento impulsa al discriminador a intentar aprender a clasificar correctamente las muestras como reales o falsas. Simultáneamente, el generador intenta engañar al discriminador para que crea que sus muestras son reales. En la convergencia, las muestras del generador no se pueden distinguir de los datos reales, y el discriminador genera 1/2 siempre, es decir, es incapaz de decir si la imagen es real o falsa. En este punto se puede desechar el discriminador.
GAN condicionales
Una extensión importante de la GAN está en su uso para generar condicionalmente una salida. La red generativa se puede entrenar para generar nuevos ejemplos del dominio de entrada, donde la entrada, el vector aleatorio del espacio latente, se proporciona (condicionado por) alguna entrada adicional.
La entrada adicional podría ser un valor de clase, como masculino o femenino en la generación de fotografías de personas, o un dígito, en el caso de generar imágenes de dígitos escritos a mano.
El discriminador también está condicionado, lo que significa que está provisto tanto de una imagen de entrada que es real o falsa como de la entrada adicional. En el caso de una entrada condicional de tipo de etiqueta de clasificación, el discriminador esperaría que la entrada fuera de esa clase, a su vez enseñando al generador a generar ejemplos de esa clase para engañar al discriminador.
De esta forma, se puede usar una GAN condicional para generar ejemplos de un dominio de un tipo dado.
Un paso más allá, las redes GAN se pueden condicionar a un ejemplo del dominio, como una imagen. Esto permite aplicaciones de GAN como traducción de texto a imagen o traducción de imagen a imagen. Esto permite algunas de las aplicaciones más impresionantes de las GAN, como la transferencia de estilo, la coloración de fotos, la transformación de fotos de verano a invierno o de día a noche, etc.
En el caso de las GAN condicionales para la traducción de imagen a imagen, como la transformación del día a la noche, se proporciona al discriminador ejemplos de fotos nocturnas reales y generadas, así como (durante la condición) fotos diurnas reales como entrada. El generador está provisto de un vector aleatorio del espacio latente, así como (condicionado) de fotos diurnas reales como entrada.
Funcion de pérdida
Pérdida en el discriminador
La red discriminadora está optimizada para maximizar la probabilidad de identificar correctamente las imágenes reales del conjunto de datos y las imágenes falsas o sintéticas emitidas por el generador.
Esto puede implementarse como un problema de clasificación binaria donde el discriminador genera una probabilidad para una imagen dada entre 0 y 1 para falso y real, respectivamente.
La red se puede entrenar con lotes de imágenes reales y falsas directamente y minimizar la probabilidad de registro negativo, implementada más comúnmente como la función de pérdida de entropía cruzada binaria.
Como mejor práctica, la red puede optimizarse utilizando la versión Adam del descenso de gradiente estocástico con una pequeña tasa de aprendizaje y un paso conservador.
# red optimizada
Mi_red.compile(loss='binary_crossentropy', optimizer=Adam(lr=0.0002, beta_1=0.5))
Pérdida en el generador
El generador no se actualiza directamente y no hay pérdida para esta red. En cambio, el discriminador se utiliza para proporcionar una función de pérdida indirecta o aprendida para el generador. Esto se consigue creando una red compuesta donde el generador emite una imagen que alimenta directamente al discriminador para su clasificación.
La red compuesta se puede entrenar proporcionando puntos aleatorios en el espacio latente como entrada e indicando al discriminador que las imágenes generadas son, de hecho, reales. Esto tiene el efecto de actualizar los pesos del generador para generar imágenes que tienen más probabilidades de ser clasificadas como reales por el discriminador.
Es importante destacar que los pesos del discriminador no se actualizan durante este proceso y se marcan como no entrenables. La red compuesta utiliza la misma pérdida de entropía cruzada categórica que la red discriminadora independiente y la misma versión de Adam del descenso de gradiente estocástico para realizar la optimización.
# creamos una red compuesta para entrenar al generador
generator = ...
discriminator = ...
…
# marcamos los pesos del discriminador como no entrenables
d_model.trainable = False
# los conectamos
model = Sequential()
# añadimos el generador
model.add(generator)
# añadimos el discriminador
model.add(discriminator)
# optimizamos la red
model.compile(loss='binary_crossentropy', optimizer=Adam(lr=0.0002, beta_1=0.5))
Algoritmo de entrenamiento GAN
Definir la red GAN es la parte difícil. El algoritmo de entrenamiento GAN es relativamente sencillo. Un ciclo de algoritmo implica primero seleccionar un lote de imágenes reales y utilizar la red generadora para generar un lote de imágenes falsas. Podemos desarrollar pequeñas funciones para realizar estas dos operaciones.
Estas imágenes reales y falsas se utilizan para actualizar el la red discriminadora directamente a través de una llamada a la función Keras train_on_batch ().
A continuación, se generan puntos en el espacio latente como entrada para el la red compuesta generador-discriminador y se pueden proporcionar etiquetas de "real" (clase = 1) para actualizar los pesos de la red generadora.
El proceso de capacitación se repite miles de veces.
La red generadora puede guardarse periódicamente y luego cargarse para verificar la calidad de las imágenes generadas.
El siguiente ejemplo muestra el algoritmo de entrenamiento GAN.
# algoritmo de entrenamiento gan
discriminator = ...
generator = ...
gan_model = ...
n_batch = 16
latent_dim = 100
for i in range(10000)
# obtenemos muestras 'reales' seleccionadas al azar
X_real, y_real = select_real_samples(dataset, n_batch)
# generamos ejemplos ‘falsos’
X_fake, y_fake = generate_fake_samples(generator, latent_dim, n_batch)
# creamos un conjunto de entrenamiento para el discriminador
X, y = vstack((X_real, X_fake)), vstack((y_real, y_fake))
# actualizamos los pesos de la red discriminadora
d_loss = discriminator.train_on_batch(X, y)
# preparamos los puntos del espacio latente como entrada para el generador
X_gan = generate_latent_points(latent_dim, n_batch)
# creamos etiquetas invertidas para las muestras falsas
y_gan = ones((n_batch, 1))
# actualizamos el generador a través del error del discriminador
g_loss = gan_model.train_on_batch(X_gan, y_gan)
Tipos de Redes GAN
GAN para traducción de imágenes
La traducción de imagen a imagen es la conversión controlada de una imagen de origen dada a una imagen de destino. Un ejemplo podría ser la conversión de fotografías en blanco y negro a fotografías en color. Las GAN se pueden entrenar para realizar la traducción de imagen a imagen por ejemplo, las redes Pix2Pix y CycleGAN.
Pix2Pix
Pix2Pix es un enfoque general para la traducción de imagen a imagen. La red está entrenada en un conjunto de datos de ejemplos emparejados, donde cada par incluye un ejemplo de la imagen antes y después de la traducción deseada.
La red Pix2Pix se basa en la red de confrontación generativa condicional, donde un
ordenador genera la imagen de destino, dadas unas condiciones en una imagen de entrada dada. La red discriminadora recibe una imagen de entrada y una imagen emparejada real o generada y debe determinar si la imagen emparejada es real o falsa.
La red generadora se proporciona con una imagen dada como entrada y genera una versión traducida de la imagen. Se entrena tanto para engañar a la red discriminadora como para minimizar la pérdida entre la imagen generada y la imagen objetivo esperada.
Se utilizan redes neuronales convolucionales profundas más sofisticadas en Pix2Pix. Específicamente, se utiliza una red U-Net para la red generadora y PatchGAN para la red discriminadora.
CycleGAN
Una limitación de una red Pix2Pix es que requiere un conjunto de datos de ejemplos emparejados antes y después de la traducción deseada.
Hay muchas tareas de traducción de imagen a imagen en las que es posible que no tengamos ejemplos de la traducción, como traducir fotos de cebra a caballos. Hay otras tareas de traducción de imágenes en las que no existen ejemplos pareados, como traducir el arte de paisajes a fotografías.
CycleGAN es una técnica que implica la capacitación automática de redes de traducción de imagen a imagen sin ejemplos emparejados. Las redes se entrenan de manera no supervisada utilizando una colección de imágenes del dominio de origen y destino que no necesitan estar relacionadas de ninguna manera.
CycleGAN es una extensión de la arquitectura GAN que implica la capacitación simultánea de dos redes generadoras y dos redes discriminadoras.
Un generador toma imágenes del primer dominio como entrada y produce imágenes para el segundo dominio, y el otro generador toma imágenes del segundo dominio como entrada y genera imágenes del primer dominio. Las redes discriminadoras se utilizan para determinar qué tan plausibles son las imágenes generadas y actualizar las redes generadoras en consecuencia.
CycleGAN usa una extensión adicional a la arquitectura llamada consistencia de ciclo. Esta es la idea de que una imagen emitida por el primer generador podría usarse como entrada para el segundo generador y la salida del segundo generador debería coincidir con la imagen original. Lo contrario también es cierto: que una salida del segundo generador se puede alimentar como entrada al primer generador y el resultado debe coincidir con la entrada al segundo generador.
GAN avanzadas
BigGAN
BigGAN es un enfoque para reunir un conjunto de mejores prácticas recientes en la capacitación de GAN y ampliar el tamaño del lote y la cantidad de parámetros de la red. Como su nombre indica, BigGAN se centra en ampliar las redes GAN. Esto incluye redes GAN con:
Más parámetros de red (por ejemplo, muchos más mapas de características).
Tamaños de lote más grandes (por ejemplo, cientos o miles de imágenes).
Cambios arquitectónicos (por ejemplo, módulos de auto atención).
La red generadora BigGAN resultante es capaz de generar imágenes de alta calidad de 256 × 256 y 512 × 512 en una amplia gama de clases de imágenes.
GAN de crecimiento progresivo
Progressive Growing GAN es una extensión del proceso de capacitación de GAN que permite la capacitación estable de redes generadoras que pueden generar imágenes grandes de alta calidad. Implica comenzar con una imagen muy pequeña y agregar de forma incremental bloques de capas que aumenten el tamaño de salida de la red generadora y el tamaño de entrada de la red discriminadora hasta lograr el tamaño de imagen deseado.
Quizás el logro más impresionante de Progressive Growing GAN es la generación de grandes caras generadas fotorrealistas de 1024 × 1024 píxeles.
StyleGAN
Style Generative Adversarial Network, o StyleGAN para abreviar, es una extensión de la arquitectura GAN que propone grandes cambios en la red generadora.
Esto incluye el uso de una red de mapeo para mapear puntos en el espacio latente a un espacio latente intermedio, el uso del espacio latente intermedio para controlar el estilo en cada punto en la red del generador y la introducción de ruido como fuente de variación en cada punto de la red generadora.
La red resultante es capaz no solo de generar fotos fotorrealistas de caras de alta calidad, sino que también ofrece control sobre el estilo de la imagen generada a diferentes niveles de detalle mediante la variación de los vectores de estilo y el ruido.
Por ejemplo, los bloques de capas en la red de síntesis a resoluciones más bajas controlan estilos de alto nivel como la pose o el peinado, los bloques a resoluciones más altas controlan esquemas de color y detalles muy finos como pecas y colocación de mechones de cabello.
No hay comentarios:
Publicar un comentario