¿Cómo aprendemos los humanos? En principio la mayoría del conocimiento humano proviene de nuestra experiencia con los objetos, es decir, aprendemos de los datos que obtenemos acerca de ellos y no a partir de algún tipo de definición matemática.
Esta habilidad de aprender de los datos, nos ha resultado bastante útil, dado que existe una amplia variedad de problemas que no se pueden resolver de forma analítica. En estas situaciones los datos nos permiten encontrar soluciones empíricas, que no necesariamente explican el porqué de las cosas, pero si ofrecen resultados útiles para la práctica. Por esta razón, la capacidad de aprender a partir de los datos es una técnica de mucha importancia para todas las profesiones y disciplinas.
En esta ocasión se va a tratar brevemente los principales elementos que constituyen el problema del aprendizaje a partir de los datos, para finalmente entender cómo las máquinas también pueden aprender.
El problema del aprendizaje
El poder aprender a partir de los datos es un proceso que puede ser automatizado, es decir, se pueden elaborar algoritmos que realizan esta tarea. En este punto es importante entender que los algoritmos que aprenden de los datos solo tratan de encontrar la mejor solución para predecir resultados, y no necesariamente encuentran el porqué. Aquí los datos guían a los algoritmos para construir la fórmula que ofrece las mejores aplicaciones en el sentido práctico.
En un sentido más matemático, el problema del aprendizaje se puede formular a partir de tres espacios medibles $\mathcal{X}$, $\mathcal{Y}$ y $\mathcal{Z}$, en donde el conjunto $\mathcal{Z}$ es un subconjunto de $\mathcal{X} \times \mathcal{Y}$ que representa a una relación entre los datos de $\mathcal{X}$ e $\mathcal{Y}$. En principio, la tarea de aprendizaje consiste en entender la relación $\mathcal{Z}$ a partir de una muestra de datos $S=(s_{i})_{i\in [m]}$ y alguna función de perdida $\mathcal{L}: \mathcal{M}( \mathcal{X}, \mathcal{Y} )\times \mathcal{Z} \to \mathbb{R}$ definida sobre el producto cartesiano entre el conjunto $\mathcal{M}( \mathcal{X}, \mathcal{Y} )$ de todas las funciones medibles de $\mathcal{X}$ a $\mathcal{Y}$ y el conjunto $\mathcal{Z}$, y con imagen en los número reales. La función $\mathcal{L}$ se emplea principalmente para medir cúal es el performance del aprendizaje en el algoritmo.
Resolver esta tarea implica hacer la elección de un conjunto de hipótesis $\mathcal{H} \subset \mathcal{M}( \mathcal{X}, \mathcal{Y} )$ y de la construcción de un algoritmo de aprendizaje, es decir, un mapeo:
\begin{equation} \mathcal{A}: \bigcup_{ m\in \mathbb{N} } \mathcal{Z}^{m} \to \mathcal{H} \end{equation}
que a partir de una muestra de datos $S = (s_i)_{i\in[m]}$ de cierto tamaño $m$ logre encontrar un modelo $h_S = \mathcal{A}(S)\in \mathcal{H}$ con «buen comportamiento» en $S$ y «capacidad de generalizar» para los datos desconocidos en $\mathcal{Z} \setminus \{s_i\}_{i\in[m]}$. Aquí, el buen comportamiento se mide via la función de perdida $\mathcal{L}$ y corresponde a la perdida $\mathcal{L}(h_S, z)$ e informalmente la capacidad de generalizar quiere decir que el comportamiento de $h_S$ en $z\in \mathcal{Z} \setminus \{s_i\}_{i\in[m]}$ es similar a $z\in \mathcal{S}$.
Como se puede apreciar la nociones de «buen comportamiento» y «la capacidad de generalizar» son bastante vagas, sin embargo, para tener una mejor idea de estas nociones, la atención se puede centrar en los conceptos de función de riesgo y de riesgo empírico cómo veremos a continuación
La función de riesgo para una hipótesis $h\in \mathcal{H}$ con respecto a la distribucción de probabilidad $\mathcal{D}$ sobre $\mathcal{Z}$, se define como:
\begin{equation}\tag{1} L_{D}(h) = \mathbb{E}_{z\sim \mathcal{D}}[\mathcal{L}(h, z)]. \end{equation}
Observe que para esta definición, la esperanza de la función de perdida de $h$ es sobre los datos de $z$ muestrados aleatoriamente de acuerdo con la distribucción $\mathcal{D}$. Hay que señalar que en la práctica la distribucción $\mathcal{D}$ es esencialmente desconocida.
Similarmente, el riesgo empírico es la perdida esperada sobre una muestra de datos $S = (s_i)_{i \in[m]}$, es decir:
\begin{equation}\tag{2} L_{S}(h) = \frac{1}{m}\sum_{i=1}^{m}\mathcal{L}(h, s_i). \end{equation}
Ahora bien, si existiera el modelo $h^*\in \mathcal{H}$ tal que el riesgo ideal es cero, $L_{D}(h^*)=0$, entonces el riesgo empírico también es cero, $L_{S}(h^*)=0$, pues el modelo no presentaría ningún error en su tarea de predicción, aunque esto es lo esperado, por lo general, no es posible encontrar el modelo con las características de $h^*$. Para encontrar el mejor modelo que realice la tarea, los esfuerzos se centran en una muestra de datos $S = (s_i)_{i \in[m]}$ y un conjunto de hipótesis $\mathcal{H}$, para un encontrar un modelo $h_s\in \mathcal{H}$ tal que:
\begin{equation}\tag{3} h_s \in \operatorname*{argmin}_{h\in \mathcal{H}} L_{S}(h). \end{equation}
De esta forma se estará asegurando el buen comportamiento de $h_{s}$ en $S$. Sin embargo, esta estrategía encierra un detalle con un gran demonio en su interior, el sobreentrenamiento. En la práctica es posible encontrar modelos en donde el riesgo empírico es cero, $L_{S}(h) = 0$ y la perdida fuera de la muestra es $\mathcal{L}(h, z) \neq 0$ para todo $z\in Z \setminus \{s_i\}_{i\in[m]}$; un modelo con estas características carece de la capacidad de generalizar. Este es un error frecuente, que ocurre con frecuencia cuando solo se utiliza un solo conjunto de datos para entrenar el algoritmo $\mathcal{A}$. Para evitar esto, es usual dividir el conjunto $S$ en dos, un conjunto para realizar el entrenamiento del algoritmo y el otro para medir su capacidad de generalizar. El objetivo es que el modelo encontrado tenga un comportamiento similar en ambos conjuntos.
¿Cómo garantizar la capacidad de generalizar? Como hemos visto, aquí hay un problema complejo, que en primer lugar consiste en hacer la elección adecuada de un conjunto de hipótesis $\mathcal{H}$, de manera que para cualquier $\epsilon > 0$ exista una muestra $S$ que garantice que: \begin{equation} \forall h\in \mathcal{H}, \; \;|L_{S}(h) - L_{D}(h)| \leq \epsilon. \end{equation} Una vez se ha identificado la clase de hipótesis adecuada, $\mathcal{H}$, debemos en segundo lugar, encontrar la hipótesis $h$ en $\mathcal{H}$ que satisface la ecuación (3). Si se logra conseguir un modelo con estas características, podremos decir, que nuestro modelo tiene la capacidad de generalizar y tiene buen comportamiento.
Tareas de predicción y clasificación
Veamos algunos ejemplos de problemas de aprendizaje basado en datos:
Clasificación Multiclase. Consideremos la tarea de clasificar documentos. Nuestro deseo es diseñar un programa con la capacidad para clasificar una colección de documentos, de acuerdo a diferentes tópicos (e.g., noticias, deportes, biología, medicina). Un algoritmo de aprendizaje para esta tarea debería tener acceso a una colección de documentos correctamente clasificados, $S$, y con base a estos ejemplos, debería entregar una programa (modelo) que puede tomar un nuevo documentos y clasificarlo. Aquí el conjunto de dominio, $\mathcal{X}$, es el conjunto de todos los posibles documentos. Es importante señalar, que los documentos debería ser representando por un conjunto de características que podría incluir el número de palabras diferentes en cada documento, el tamaño de cada documento, el autor, el origin, etc. El conjunto de etiquetas, $\mathcal{Y}$ es el conjunto de todos los posibles tópicos (en este caso, debería ser algún conjunto finito). Una vez hemos identificado nuestros conjuntos de dominio y etiquetas, el otro componente que hace falta es determinar una función de perdida adecuada para medir el perfomance de nuestro algoritmo.
Para el caso de la clasificación multiclase se puede considerar la variable aleatoria $z$ en $\mathcal{X}\times \mathcal{Y}$ con la siguiente función de perdida:
\begin{equation} \mathcal{L}(h, (x, y)) = \begin{cases} 0 \mbox{ si } h(x) = y \newline \newline 1 \mbox{ si } h(x)\neq y \end{cases} \end{equation}
Esta función se usa en general para problemas de clasificación binaria o multiclase.
Regresión. En esta tarea, el objetivo es encontrar algún patrón simple en los datos –una relación funcional entre los componentes de los datos $\mathcal{X}$ e $\mathcal{Y}$–. Por ejemplo, encontrar la mejor función que predice el peso de nacimiento de un bebe en relación con las medidas obtenidas por ultrasonido del diámetro de su cabeza, el diámetro abdominal y la longitud de su femur. Aquí el dominio es algún subconjunto de $\mathbb{R}^{3}$ (las tres medidas obtenidas por el ultrasonido) y el conjunto de etiquedas de $\mathcal{Y}$ es el conjunto de los números reales (el peso en gramos). En este contexto es más adecuado llamar a $\mathcal{Y}$ como el conjunto objetivo. En este caso el conjunto de entrenamiento es igual que antes, un subconjunto $S\subseteq \mathcal{X}\times \mathcal{Y}$. Sin embargo, la medida de éxito es diferente. En este ejemplo, se podría evaluar la calidad de la hipótesis $h:\mathcal{X}\to \mathcal{Y}$ por el valor esperado del cuadrado de la diferencia entre las etiquetas correctas y su predicción, es decir:
\begin{equation} \mathcal{L}(h, (x,y)) = (h(x)-y)^2. \end{equation}
En futuras publicaciones veremos otras funciones de perdidas utilizadas en tareas de regresión.
¿Cómo aprenden las maquinas?
Cómo vimos anteriormente, el problema del aprendizaje involucra la elección de un conjunto de hipótesis $\mathcal{H}$ y la busqueda de la hipótesis $h_{s}$ tal que: \begin{equation} h_s \in \operatorname*{argmin}_{h\in \mathcal{H}} L_{S}(h). \end{equation} En otra palabras, el problema se reduce a un problema de optimización del riesgo empírico $\mathcal{L}_{S}(h)$. Y existen amplia variedad de algoritmos de optimización de funciones, en particular para estas tareas el algoritmo por excelencia es el algoritmo del descenso del gradiente, este consiste en general en realizar la siguiente iteración \begin{equation} h \leftarrow h - \lambda \nabla L_{D}(h) \end{equation} para encontrar una hipótesis $h_s$. Por otro lado este es un proceso que puede ser automatizable en casi cualquier computadora en el planeta. Así que cualquier maquina con la capacidad para realizar este tipo de iteración, estaría en la capacidad de aprender a clasificar y predecir a partir del aprendizaje de los datos. Sin embargo, ese indicarle a la computadora cómo debe aprender, para esto se debe programar una serie de ordenes en las que se le indica como optimizar las diferentes funciones de perdida, según la tarea de aprendizaje que le deseamos enseñar, una vez el algoritmos se haya ejecutado, la computadora podría estar en la capacidad de clasificar y predecir, obviamente esto no es una tarea sencilla, pero no es imposible.
Dejaré por el momento esta publicación hasta aquí, para no hacerla más extensa, espero que la hayan disfrutado y aprendido mucho. Nos vemos pronto.