En el artículo anterior de este blog, titulado 'Algunas estrategias genéricas para la explicabilidad de la inteligencia artificial' vimos en concreto cuatro formas más o menos genéricas de enfocar la obtención de explicaciones comprensibles acerca de la forma de razonar de los algoritmos de inteligencia artificial, y más en concreto de algoritmos de deep learning con base en lo aportado en uno de los primeros capítulos del libro 'Explainable AI: Interpreting, Explaining and Visualizing Deep Learning' editado por Wojciech Samek, Grégoire Montavon, Andrea Vedaldi, Lars Kai Hansen y Klaus-Robert Müller.
No se trataba de un censo completamente exhaustivo ni mucho menos detallado, pero la idea era estructurar de forma preliminar un poco las posibilidades de explicabilidad en que se trabaja.
Con la misma idea quisiera en este artículo ahondar un poco más (tampoco mucho) en dos familias de algoritmos para la explicabilidad que aparecen en abundancia en la citada fuente: las explicaciones basadas en gradiente ('gradient-based explanations') y la propagación en capas de la relevancia ('layer-wise relevance propagation', LRP).
Me apoyo para ello en la misma fuente bibliográfica, aunque en un capítulo diferente y, teniendo en cuenta que el libro citado es un libro coral, con diferentes autores por capítulos, la fuente última es en realidad ligeramente diferente. Advierto también que las denominaciones en castellano de estos métodos son una improvisación propia ya que hasta ahora sólo he tenido acceso a ellos en literatura en inglés, con lo que ignoro si existe una traducción al castellano más o menos ampliamente adoptada.
Y decir finalmente que he querido poner el foco en estas dos familias de algoritmos, únicamente porque en la lectura sobre la materia aparecen con mucha frecuencia por lo que, dada su aparente representatividad, parece interesante dedicarles un poco más de atención. Vamos allá.
Gradient based-explanations
Cuando hablamos de explicabilidad de la inteligencia artificial, y en concreto del deep learning, lo que estamos es intentando encontrar formas de explicar, de una manera comprensible por los humanos, la forma de 'razonar', llamémosla así, de unos algoritmos que vemos como una suerte de "caja negra", en el sentido de que vemos sus entradas y sus salidas pero no entendemos bien su funcionamiento interno.
Sobre lo de no entender bien ya he expresado en algún momento mis catelas: el desarrollador, o al menos el inventor del algoritmo, sabe perfectamente cómo funciona, sabe perfectamente lo que ha programado si se quiere ver así, pero esto no guarda una relación directa con el razonamiento en términos humanos. Es en ese último sentido en que es una caja negra.
Pues bien, de alguna forma, los algoritmos basados en gradiente, asumen esa idea de caja negra, asumen que no conocemos el funcionamiento interno y no aspiramos en el fondo a desentrañarlo. Consideran a todo el algoritmo, toda la red neuronal como una función con sus entradas y sus salidas y lo que buscan es ver cómo reacciona ante cambios locales.
Dicho de una forma más matemática, calculan el gradiente de esa función ante cambios en, por ejemplo, el valor de uno de los parámetros de entrada. En la variante concreta que se explica en el capítulo 13 del libro citado (Gradient x Input), lo que se calcula, lo que se denomina relevancia es, en este caso, el producto de la derivada parcial de la función con respecto a la variable de entrada (lo que vendría a ser el gradiente) y eso se multiplica por el propio valor de entrada.
Con esto obtenemos, para cada caso concreto de decisión que queremos explicar, una suerte de mapa de cuánto han pesado los valores de entrada en la decisión final
Layer-wise relevance propagation
Este método no ve la red neuronal como una caja del todo negra, sino que asume un cierto conocimiento de su arquitectura, al menos sus capas.
Para cada nodo de la red que ha contribuido a la activación de un cierto nodo de la salida de la red (el hablar de activación nos hace ver que implícitamente estamos pensando en problemas de clasificación) se le asigna una relevancia a nivel de capa, es decir, todos los nodos de una cierta capa que han contribuido a la activación del nodo de salida reciben la misma relevancia.
La forma de calcular esa relevancia es partiendo del nodo de salida y aplicando una retropropagación que recorre todas las capas desde la salida hasta la entrada. Existen diversas formas de calcular la relevancia y propagarla, pero todas siguen esa misma idea general.
De nuevo, al final, y aunque de diferente forma, acabamos teniendo la relevancia, el peso si se quiere, que una cierta entrada tiene en la clasificación final.
Comentario final: ¿Es esto lo que buscamos?
Como sucede con casi todos los algoritmos de inteligencia artificial, y desde luego en el caso del deep learning, una comprensión profunda del algoritmo, en este caso de la forma de calcular relevancias, implica un despliegue matemático de un cierta complejidad en el que no vamos a entrar, al menos aquí y en este momento. Nos quedamos más con su filosofía. Pero creo que, a pesar de no entrar apenas en las matemáticas, sí que nos quedamos con una idea razonablemente aproximada de cómo funcionan estos dos métodos.
Comentaría que, en ambos casos y como hemos visto, lo que estos métodos nos proporcionan es de alguna forma el peso que las entradas tienen en las salidas de un algoritmo de deep learning.
¿Es esto lo que buscamos realmente en la explicabilidad?
Bueno, si y no. Más bien no.
Diría que es un primer paso, y un paso de mérito sin duda, pero no es la aspiración final. Y creo que no lo es porque, en el fondo, el significado de esas entradas y salidas no siempre son tan claros como para que supongan una explicación en términos humanos. Y no lo es tampoco porque, por más que sea muy interesante conocer qué pesa en la salida, no es estrictamente hablando una explicación de la forma de razonar, sino solo una aproximación.
Estos algoritmos se han aplicado, quizá sea su principal área de aplicación, en redes que trabajan como clasificadores en el ámbito de la visión artificial, es decir, en redes que de alguna forma reconocen o categorizan una imagen de entrada en una serie de categorías de salida. En esas redes, típicamente, una entrada se corresponde con la intensidad o color de un pixel. Conocer cuánto pesa un pixel en la clasificación final no parece por sí mismo una explicación. Cierto es que, normalmente, al contemplar el conjunto, más que píxels veremos regiones de la imagen que influyen en su clasificación. Un repaso de esos mapas de calor de las entradas, examinadas por un humano, en muchos casos pueden conducir a un entendimiento cierto, o casi cierto, de cómo está funcionando la red neuronal y en qué basa sus decisiones, pero nótese que no siempre será así y que, sobre todo, la explicación final la aporta un humano viendo los mapas de calor que produce el algoritmo de explicabilidad.
No quiero que esta valoración final se entienda en un sentido negativo. Nada de eso. Me parece que en muchos problemas reales es un resultado muy valioso y me parece, sobre todo, que el hecho de que seamos capaces de encontrar mecanismos algorítmicos o semi-algorítmicos para explicar, siquiera básicamente, cómo razona una red neuronal, es toda una demostración de ciencia e ingenio.
Lo que en realidad quiero decir es que, de cara a la aspiración final de la explicabilidad, todavía queda camino por recorrer, mucho, y en ello creo que los primeros que estarían de acuerdo, serían los propios científicos e ingenieros que trabajan en conseguir esa explicabilidad de la inteligencia artificial.