El coeficiente de Gini como herramienta para evaluar las representaciones de las capas en redes neuronales profundas

Artículo original por Olivia Guest: http://neuroplausible.com/gini

Traducción por: DANIEL MORALES, PhD de McGill University en Montreal, Canadá.

El coeficiente de Gini puede ser utilizado para evaluar el grado de dispersión de una capa en una red neuronal.

El grado de dispersión es un aspecto importante de la representación neuronal, uno que debe ser medido en las redes neuronales artificiales si se desea entender la forma en la que cada capa de la red representa información. Es decir, cuando una red representa un concepto, ¿hay pocas unidades que se encargan de la labor, o hay un patrón de activación distribuido que involucra a todas las unidades? (Si una red representa conceptos diferentes por medio de la activación de grupos pequeños de distintas unidades, se dice que es dispersa. Entre más unidades de la red jueguen papeles en común en representaciones diversas como “gato” y “coche”, menos dispersa es.) En el artículo científico “What the Success of Brain Imaging Implies about the Neural Code” (Lo que el éxito de la imagenología cerebral nos indica acerca de la codificación neuronal; Guest & Love (2017), decidimos utilizar el coeficiente de Gini para evaluar el grado de dispersión en cada una de las capas de la red neuronal artificial Inception-v3 GoogLeNet.
El coeficiente de Gini es utilizado principalmente para medir la distribución de los ingresos en un grupo de personas, normalmente de todos los habitantes de un país. Pero esta medida también puede ser aplicada de manera más general, tomando cualquier vector numérico y produciendo una descripción del grado de distribución de los valores que lo componen.

Figure 2B from Guest and Love (2017): “A deep artificial neural network and the ventral stream can be seen as performing related computations. As in our simulation results, neural similarity should be more difficult to recover in the more advanced layers.” DOI: http://dx.doi.org/10.7554/eLife.21397.005

Hice una búsqueda en línea para ver si podía encontrar una herramienta para calcular el coeficiente de Gini, escrita en Python, que fuera confiable y veloz. Desafortunadamente, las que logré encontrar, a pesar de ser útiles, no eran veloces y sufrían de “bugs” (errores). Así que decidí escribir el código de un calculador yo misma (https://github.com/oliviaguest/gini). 
Necesitaba una herramienta que tuviera una complejidad de espacio y tiempo relativamente baja, pues estaba trabajando con una cantidad pesada de data – Inception-v3 GoogLeNet es una red con bastantes capas. En cuanto a velocidad, mi propio calculador Gini resultó ser mucho más rápido que la función de calculador de coeficiente de Gini disponible actualmente en la PySAL (Python Spatial Analysis Library, una biblioteca libre y “open source” de código de funciones de análisis; https://github.com/pysal/pysal/issues/855; http://pysal.readthedocs.io/en/latest/_modules/pysal/inequality/gini.html), y los resultados de sus operaciones son indistinguibles hasta aproximadamente seis unidades decimales. También es un poco más veloz que la función de calculador de coeficiente de Gini creada por David en Ellipsix.
La función calculadora que yo creé (https://github.com/oliviaguest/gini/blob/master/gini.py) está basada en la tercera ecuación de esta página, que define al coeficiente de la siguiente forma:

Donde i es el índice de cada dato Xi y n es el número total de datos. En una muestra muy desigual, por ejemplo en una muestra de mil datos con 999 ceros y un solo uno, el coeficiente de Gini será muy alto (con un valor cercano a 1). En una muestra de datos aleatorios distribuidos de manera uniforme, el valor del coeficiente será bajo, alrededor de 0.33. Finalmente, en una muestra completamente homogénea, el coeficiente de Gini tiene un valor de cero. Es decir, entre más bajo sea el valor de G, más “igualdad” hay en la distribución de ingresos/datos. Pueden ver el archivo “readme” (https://github.com/oliviaguest/gini/blob/master/README.md) para obtener ejemplos de datos (https://github.com/oliviaguest/gini/blob/master/README.md#examples) que pueden ser analizados con la función gini().
El cálculo del coeficiente requiere por definición una serie de datos sin ceros, todos con valor positivo, en orden ascendiente, dentro de un vector de una dimensión. Estas cuatro suposiciones pueden ser violadas, pues están controladas dentro de la función gini:

 
¡Y eso es todo! La función tiene solamente dos suposiciones que no pueden ser violadas: debes haber instalado “NumPy” (un paquete de funciones de Python, http://www.numpy.org/) y debes utilizar datos ordenados en una colección NumPy (“NumPy array”, puedes usar la función np.asarray() para checar si tu colección de datos es NumPy).
¿Y qué tiene que ver todo esto con las redes neuronales artificiales? Pues en lugar de medir la desigualdad entre los habitantes de un país, podemos aplicar el coeficiente a las unidades que conforman una capa de una red. Y en lugar de enfocarse en ingresos monetarios, podemos analizar el grado de activación de las unidades cuando la capa recibe una entrada de información (input). Dada una cierta entrada, podemos medir el grado de dispersión (desigualdad) en la distribución de la activación de las unidades. De esta forma, un solo número nos da una idea de qué tan local o distribuida es la representación que la red ha aprendido. Y si uno calcula el coeficiente de Gini de la activación de las unidades de una capa para cada una de todas las posibles entradas de información a la capa, y luego saca el promedio de todos estos valores, podemos calcular el grado general de dispersión de las representaciones de una capa de una red neuronal.
La red neuronal Inception-v3 GoogLeNet en particular siempre produce salidas altamente dispersas/locales, dado a que utiliza la codificación “one-hot” para sus clasificaciones. La codificación “one-hot” asegura que las salidas de la red serán ortogonales y locales (propiedades que no son necesariamente mutualmente inclusivas). Cuando la red recibe una imagen como entrada, la salida (output) tendrá un coeficiente de Gini con un valor aproximado a 1. En general para esta red, se puede esperar que el valor del coeficiente de Gini de las salidas será cercano a 1, excepto en el caso, poco común, de que la red no esté segura de lo que le hemos mostrado.
Por otro lado, cuando uno observa las salidas de las capas individuales de la red encontramos que el valor del coeficiente de Gini puede ser alto o bajo. El valor cambia de manera no-monótona en función de la profundidad de la capa. Hay una cierta tendencia a que el valor sea más alto en las capas más avanzadas/profundas, pero esta regla no siempre se cumple. Lo que esto nos dice es que la red no tiene una arquitectura en la que, por definición, los conceptos son representados de una forma más y más dispersa en las capas profundas. En nuestra investigación nos enfocamos en dos capas de Inception-v3 GoogLeNet. El valor del coeficiente de Gini de la penúltima capa (casi la más profunda) fue 0.579, mientras que el de una capa menos profunda fue 0.947 (usando como entrada el estímulo específico que nosotros elegimos). El valor del coeficiente de Gini promedio de la salida de la red fue 0.941. Pueden encontrar mucha más información acerca de las propiedades de las representaciones de capas específicas de la red en el artículo Guest & Love (2017).

Deja un comentario

Item added to cart.
0 items - 0,00 
A %d blogueros les gusta esto: