Redes Generativas Adversarias
Rubén Rodríguez Abril
Las Redes Generativas Adversarias representan uno de los más recientes y relevantes avances en el mundo del Aprendizaje Profundo. Analizaremos en este artículo la estructura de estas redes y su sistema de aprendizaje.
Redes Generativas Adversarias
Este último artículo de la serie sobre Aprendizaje Profundo está dedicado a las Redes Generativas Adversarias, que son algoritmos que simulan dos redes neuronales contrapuestas que se entrenan la una a la otra, y que en los últimos años han demostrado ser capaces de generar de un modo bastante realista imágenes, textos y videos. No en vano, el investigador francés Yann LeCun las calificó, de un modo jocoso, como “la cosa más chula desde la invención del pan en lonchas”.
Un sistema de redes generativas adversarias se compone de dos redes neuronales orientadas hacia adelante. La primera de ellas, la red generativa o generador, absorbe ruido y entropía desde el exterior y lo transforma en imágenes. La segunda de ellas, la red discriminadora o discriminador, compara estas imágenes con otras reales procedentes de un conjunto de referencia (por ejemplo, paisajes con mar). El objetivo del entrenamiento es conseguir es que el generador sea capaz de construir nuevas imágenes similares a las del conjunto de referencia, y que el discriminador sea capaz de reconocer imágenes de dicho conjunto.

La misión del generador es intentar “engañar” al discriminador haciendo que sea incapaz de distinguir entre las imágenes reales y las imágenes generadas a partir del ruido. Cuando el discriminador acierta y consigue distinguirlas esto se considera una derrota para el generador, y viceversa.
A partir de los resultados del discriminador, el generador poco a poco aprende a generar imágenes más realistas y que por tanto, suponen un reto cada vez mayor para el discriminador.
Convolución Traspuesta
La red generadora está formada por varias capas de convolución traspuesta, que transforman progresivamente el ruido de fondo en una imagen reconocible. El lector recordará que en los sistemas de aprendizaje profundo especializados en el reconocimiento de imágenes, la entrada se hacía pasar por varias capas convolucionales alternadas con capas de agrupación (pooling).
En el caso de la red generadora, de lo que se trata es de revertir este proceso, y para ello se utilizan capas neuronales que realizan la operación matemática opuesta a la convolución: la convolución traspuesta. En la siguiente sección mostraremos cómo se aplica una operación de convolución sobre una imagen. Seguidamente expondremos cómo aplicando una convolución traspuesta sobre ese resultado, se puede generar un mapa de la misma resolución que el original.
La resolución de la convolución
Como vemos en la imagen de abajo, la aplicación de la convolución sobre una misma matriz de píxeles devuelve mapas de diferente resolución, dependiendo de dos parámetros: el padding y el stride (desplazamiento).

Con el padding same y un stride igual a 1, el mapa convolucionado es de la misma resolución que la capa original. En determinados modelos, los diseñadores prefieren prescindir de la operación de pooling, y en su lugar, la disminución de resolución de los mapas la realiza la propia capa convolucional, que pasa a tener un desplazamiento superior a uno. En el ejemplo de arriba, en el tercero de los casos aplicamos un desplazamiento de dos (con un kernel de 3×3 y padding same). Como consecuencia, la resolución del mapa resultante se divide entre dos, y el efecto es el mismo que el de haber aplicado una capa posterior de agrupación (pooling) de 2×2.
La Convolución Traspuesta
En el caso de que la convolución altere la resolución de la imagen original, es posible recuperarla por medio de la convolución traspuesta. Se realiza en dos pasos:
– En primer lugar, se intercalan columnas y filas de ceros. El grosor de las columnas/filas es de s – 1, donde s es el stride de la convolución ordinaria previa. Si era de dos, las columnas y filas tendrán el grosor de un cero. Con ello, se produce un incremento de resolución.
– En segundo lugar, se aplica el filtro de convolución, utilizando un stride de uno.

Tenemos un mapa de 3×3 resultado de aplicar una convolución de stride 2 y padding same sobre una matriz original de 6×6. La imagen muestra cómo podemos generar otra matriz de la misma resolución a partir del mapa convolucionado mediante la convolución traspuesta. Observar cómo, dado que el stride de la convolución previa es 2, el número de columnas y filas de 0s es una.
Generador de las Redes Generativas Adversarias
El lector recordará que en la convolución directa, la aplicación del kernel sobre una imagen era usada para extraer determinadas características de la misma. Conforme se avanzaba hacia la salida, las convoluciones y los mapas de características resultantes de las mismas extraían rasgos de cada vez mayor nivel y complejidad.
En el caso de las convoluciones transpuestas, el proceso transcurre exactamente al revés: los bytes procedentes del ruido (cuyo valor es aleatorio o pseudoaleatorio) generan 1.024 mapas de características diferentes en la primera capa, que corresponden a los rasgos de mayor nivel. Estos mapas tienen una resolución reducida, de 4×4. Conforme avanzamos hacia la salida, va reduciéndose el número de capas pero aumentado su resolución. En el proceso las capas de convolución traspuesta van agregando rasgos de cada vez más bajo nivel, hasta que finalmente, la convolución cuarta produce tres mapas distintos, correspondientes a los tres canales de color de la imagen final.

Cada mapa de la capa sucesiva está formado por la aplicación de diferentes filtros sobre todos los mapas de la capa anterior. Se trata por tanto de una conexión densa entre mapas (todos con todos).

Todos los mapas de la capa anterior contribuyen a generar cada uno de los mapas de la capa sucesiva. Los píxeles del nuevo mapa surgen de sumar los resultado de todos los filtros. Para conseguir el aumento de resolución de 4×4 a 8×4 se aplica el intercalado de 0s, tal y como se vio antes.
Discriminador de las Redes Generativas Adversarias
El discriminador es una red convolucional ordinaria. Tiene como entrada una imagen, que puede provenir del conjunto de referencia o puede haber sido creada por el generador. Su única neurona de salida calcula la posibilidad de que la imagen pertenezca al conjunto de referencia y por lo tanto, sea real. Por ejemplo, si este conjunto está formado por imágenes de árboles, el discriminador señalará qué posibilidad (de 0 a 1) existe de que la imagen de entrada sea un árbol.
A diferencia de las redes convolucionales de artículos previos, en el discriminador no hay capas de agrupación (pooling), ni tampoco capas densamente conectadas. Las neuronas de la última convolución son conectadas directamente con la neurona de salida, que utiliza la función logística como función de activación.
Entrenamiento de las Redes Generativas Adversarias
En las Redes Generativas Adversarias la actualización de los pesos sinápticos de ambas redes se realiza mediante retropropagación del gradiente. En el trabajo original de Goodfellow y sus compañeros del año 2014, el sistema empleado era el descenso del gradiente por minilotes (minibatch gradient descent). Cada lote incluye m operaciones de la red adversaria, y cada una de estas operaciones implica que el discriminador debe comparar dos imágenes, una real y otra creada por el generador.
Una vez que el lote al completo ha pasado por la red, se practican dos tipos de operaciones matemáticas diferentes: la normalización de las neuronas convolucionales y el cálculo de la función de pérdida.
En el caso de la función de pérdida, se ha de calcular su valor medio para todo el lote, y será este valor medio el que se use para calcular el gradiente, que entonces se retropropagará a través de la red. La actualización de los pesos sinápticos se realiza, pues, al final de cada lote.
La normalización
Respecto a la primera de ellas, el concepto de normalización por lotes (batch normalization) se basa en la idea siguiente. En un mapa convolucional cuyo kernel tenga un tamaño de mxm, y que esté comunicado con los k mapas convolucionales de la capa anterior, para calcular el valor de cada píxel (equivalente a la salida de la neurona, su función de activación) es necesario sumar mxmxk coeficientes diferentes. Esto provoca que el rango de los valores de activación sea extraordinariamente alto, y que la red pueda llegar a colapsar, produciendo la misma salida para la mayoría o buena parte de las entradas.
Para prevenirlo, el algoritmo de entrenamiento calcula la media de todas las salidas (de la misma neurona) a lo largo de todo el lote, y tras ello, las salidas son ajustadas de tal manera que la distribución resultante tenga una media de cero y varianza de uno. La normalización, además, dificulta la aparición de sobreajuste (overfitting) y permite incrementar la tasa de aprendizaje de la red.

La normalización es una operación bien conocida en el ámbito estadístico para tratar conjuntos de datos. En el dibujo, cada píxel de la matriz original (izquierda, A) tiene un valor a que se transforma en un nuevo valor z por medio de una sencilla ecuación. Los datos de la nueva matriz Z tienen una media μ de valor 0, y una desviación típica δ de 1. El objetivo es simplemente hacer los cálculos mucho más fáciles.
El aprendizaje del discriminador
La función de pérdida (entropía binaria cruzada) para la red discriminadora es la siguiente:

donde ∇ es el operador gradiente, Θ_{d} es el peso sináptico de la conexión d de que se trate y D es la función de activación de la última neurona del discriminador, aquella que calcula la probabilidad de que la entrada pertenezca al conjunto de figuras de referencia, es decir, que sea tomada por real. En cada operación i del lote de m operaciones, se le proporcionan al discriminador una figura de referencia real, representadas por los vectores x^i , y una figura creada por el generador G(z^i) , correspondientes a los vectores z^i .
La función de pérdida es siempre negativa (se trata del logaritmo de un número menor que uno), y cuanto mayores sean los aciertos de la red, más cercana a 0 será la función de pérdida. De lo que se trata es de que la función de pérdida tenga el valor más alto (esto es, cercano a cero), posible. Se dice que el gradiente es ascendiente.
El aprendizaje del generador
Por otro lado, la función de pérdida de la red generadora se representa por la siguiente ecuación:
Cada vez que la red generadora logre crear un dibujo lo suficientemente realista como para engañar al discriminador, el valor de D(G(z^{i}))) se acercará a uno, y la función de pérdida tenderá a menos infinito. En este caso, de lo que se trata es, pues, de que el valor de la función de pérdida sea el más bajo posible. El gradiente es descendiente.

En las Redes Generativas Adversarias el generador y el discriminador entran en una serie de juego de suma cero, en cuya virtud el incremento de la eficiencia de una red hace aumentar la función de pérdida de la otra, provocando con ello la modificación de sus pesos sinápticos y la optimización de su funcionamiento. Idealmente, el entrenamiento debe de desembocar en un equilibrio de Nash entre ambas redes, momento a partir del cual ya no es posible mejorar la eficiencia de las mismas.
A partir de este momento, las capas de convolución inversa dispondrán de filtros (kernels) capaces de ir construyendo progresivamente imágenes similares a las del conjunto de referencia.
Usos de las Redes Generativas Adversarias
Desde su invención en el año 2014, las Redes Generativas Adversarias han sido utilizadas ampliamente para la generación de imágenes y de videos de contenido cada vez más realista, hasta tal punto que constituyen una de las tecnologías más utilizadas para la falsificación de contenidos multimedia (deepfake). A nuestro juicio, constituyen un claro ejemplo de hasta dónde la retroalimentación y la interacción entre redes neuronales artificiales es capaz de potenciar las capacidades de las mismas.
Una de las aplicaciones más exitosas de estas redes ha sido la arquitectura GauGAN de Nvidia, capaz de convertir dibujos hechos a mano en paisajes hiperrealistas. En La Máquina Oráculo le hemos dedicado un artículo.
Lecturas recomendadas
– Goodfellow, I. J. et als.(2014) Generative Adversarial Networks.
– Radford, A. et als. (2015) Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks.