Herramientas de usuario

Herramientas del sitio


inteligencia_artificial:conceptos

¡Esta es una revisión vieja del documento!


Conceptos de Inteligencia Artificial

Inteligencia Artificial (IA)

No hay una definición definitiva del concepto “inteligencia artificial (IA)”, pero suele referirse a la capacidad de máquinas para imitar comportamientos inteligentes.
Se definen 2 tipos de IA:

  • Débiles: Pueden cumplir un número muy limitado de tareas.
  • Fuertes: Pueden aplicarse a una gran cantidad de problemas y dominios diferentes.

Esto se puede hacer a través de programación clásica (se programa la máquina de modo tradicional) o a través de Machine Learning (aprendizaje automático).

Machine learning

El Machine Learning es el campo que hace posible que una máquina aprenda sola. Existen multitud de técnicas y estrategias para esto, que se irán viendo en estas notas.
Una de las principales técnicas para ello son las redes neuronales.

Deep Learning

Deep Learning (aprendizaje profundo) son técnicas de aprendizaje automático avanzado que van más allá de las redes neuronales. \\Para ello es necesario una gran cantidad de datos con los que entrenar estos algoritmos, lo que se llama Big Data.

Big Data

Capacidad de acumular una gran cantidad de datos. También suele llamarse así a todo el proceso desde que los datos son capturados, hasta que se convierten en cocimiento, a través de técnicas de deep learning.

Modelo

Un modelo es la construcción conceptual simplificada de una realidad más compleja. A partir de esta construcción, podemos entender mejor esta realidad.
Cuando se utiliza la probabilidad para construir modelos, éstos se denominan modelos probabilísticos, que comprimen en probabilidades mucha de la variabilidad de la realidad que queremos modelar.
Este concepto de “modelo probabilístico” hace posible que los seres humanos podamos conceptualizar, predecir, generalizar, razonar o aprender.
En IA un Modelo también es llamado Algoritmo, y es la técnica en la que el machine learning genera el conocimiento para realizar una tarea, y se encuentra categorizado según el paradigma de aprendizaje utilizado. Puede haber modelos diferentes en cada paradigma de aprendizaje.
Para desarrollar un modelo, son esenciales los conceptos Datos, Parámetros y Función de Error.

Datos

Mediciones que hacemos de la realidad. Son multidimensionales, es decir, que cada datos puede tener diferentes dimensiones. Ejemplo: si el dato son personas, cada una puede tener un ligar de nacimiento, un campo de estudio, etc. Pueden tener más de 3 dimensiones, ojo.
Es a partir de éstos, que vamos a construir nuestro modelo.

Parámetro

Valores que podemos modificar para poder ajustar los datos. Ejemplo: Gráfica 2D con puntos marcados (datos), y debemos ajustar un área circular en que todos queden dentro. Los parámetros serían la posición X,Y del círculo y su radio r. También podríamos dotar de más libertad, asumiendo el radio rx y ry del círculo (podríamos generar elipses), para que los puntos queden mejor ajustados al área.
La tarea será de que a través de machine learning obtengamos los valores óptimos de estos parámetros para que los algoritmos funcionen adecuadamente.

Error

Función que mide cómo el modelo se ajusta a nuestros datos. En el caso de aprendizaje supervisado la función de error se computa en función de los datos suministrados. En el caso del aprendizaje no supervisado, la función de error se computa sólo a través de los datos de entrada.
Esta función de error nos permitirá ir ajustando los valores de los parámetros en un proceso de optimización denominado entrenamiento o ajuste del modelo.

Agente inteligente

Algoritmo ya entrenado, también conocido como caja negra. Después de entrenar un algoritmo a través de un paradigma de aprendizaje determinado, éste puede predecir cuestiones para las que ha sido entrenado. La forma en que lo hace nos es desconocida, por eso la denominación de “caja negra”.
Conocemos el qué hace, pero no el cómo lo hace.

Paradigmas de aprendizaje

Mecanismos que permiten que podamos procesar toda la información nueva que percibimos para transformarla en conocimiento.

Aprendizaje supervisado

Consiste en aprender la relación entre unas variables de entrada con otras de salida. El aprendizaje se consigue enseñándole al algoritmo el resultado que se obtiene a la salida para un determinado valor a la entrada, tras mostrarle numerosos ejemplos (entrenamiento).
Tras un número suficiente de entrenamientos, será capaz de predecir la salida ante cualquier entrada.

Aprendizaje no supervisado

Consigue generar conocimiento sólo a partir de los datos de entrada. Consiste en la “clusterización”. Lo que hacen estos algoritmos es buscar patrones de similitud en los datos de entrada. Los algoritmos más potentes son capaces de descubrir la estructura interna que han generado dichos datos. Por ejemplo: hay muchos tipos de sillas, pero hay que conocer su “estructura” para comprender el concepto de “silla”.
Estos patrones estructurados se denominan espacios latentes. Una vez construidos estos espacios, las máquinas pueden predecir si una cosa es similar a otra cosa.

Aprendizaje reforzado

Modelo de regresión lineal

Consiste en generar una recta que sirva para poder predecir las salidas a través de las entradas, es decir, de forma lineal.
Cuando los datos tienen una única dimensión, se pueden representar como puntos en un plano bidimensional, es decir, una gráfica XY, y trazar la recta que más se aproxime a estos puntos. Esto sería el modelo regresión lineal simple. Puede resoverse a partir de la ecuación de una recta.
Cuando los datos tienen varias dimensiones, el modelo se denomina de regresión lineal múltiple. En el caso de que tengan 2 dimensiones, podríamos visualizarlo como el plano que más se aproxima a la nube de puntos (eje tridimensional XYZ). Cuando tiene más de 2 dimensiones, no es posible visualizarlo. Por ello se trabaja con matrices.
Cuando se realizan operaciones matemáticas con matrices, es importante trabajar con GPUs, ya que estos dispositivos están optimizados para trabajar con matrices.

Modelo de regresión lineal simple

Se puede visualizar una nube de puntos, en los que la dimensión de los datos de entrada se encuentra representada en los valores del eje X y los de salida en el eje Y, generando los diferentes puntos.
El modelo debe generar la recta que más se aproxime a los puntos de forma automática, a partir de los datos de entrada y las salida correspondiente (a partir de los datos entrada-salida suministrados).
Para ello tenemos la ecuación de la recta: y = w0+w1x

  • w0 Término independiente. Muestra a qué altura corta la recta al eje Y.
  • w1 Pendiente. Muestra la inclinación de la recta. Y conceptualmente muestra la relación entre el dato de entrada X y la salida Y.

Modelo de regresión lineal múltiple

En el caso de regresión lineal múltiple, los datos de entrada tienen varias dimensiones, donde cada dimensión es una cualidad de la realidad que contiene el dato.
Por lo que en lugar de la ecuación de una recta, tenemos por ejemplo en caso de 3 dimensiones (imposible de representar):
y1 = w0+w1x11+w2x12+w3x13
y2 = w0+w1x21+w2x22+w3x23
y3 = w0+w1x31+w2x32+w3x33
y4 = w0+w1x41+w2x42+w3x43

La mejor forma de representar estos valores, es de forma matricial:
Matriz de datos X =

1 x11 x12 x13
1 x21 x22 x23
1 x31 x32 x33
1 x41 x42 x43

Matriz de valores de salida Y =

y1
y2
y3
y4

Matriz de parámetros W =

w0 w1 w2 w3

De este modo podemos concluir que: Y = XW.

El modelo de regresión lineal se puede calcular de dos formas: Mínimos cuadrados ordinarios y Descenso del Gradiente.

Modelo de regresión lineal polinomial

Del minuto 4:48 al 6:45.

Simplemente consiste en introducir las variables elevándolas a un exponente.
Al elevar el grado, introducimos puntos críticos en la función (curvas), de manera que podemos adaptarnos a los puntos (datos).
Esto es aplicable al modelo de regresión simple, de modo que se puede aplicar el mínimo cuadrado ordinario, o el descenso del gradiente para ajustar la línea curva a los datos.

Mínimos cuadrados ordinarios

Se trata de encontrar una expresión matemática que nos de los valores del vector W (parámetros).
Para saber lo cerca o lejos que está cada dato X de Y, hacemos la media de la función de error de todos los datos, elevada al cuadrado. De este modo penalizamos más los valores más alejados entre X e Y:

La función de coste será la que nos diga cuál es el error para cada uno de nuestros parámetros, en este caso yr - ye
yr Valor real de salida para el dato.
ye Valor más cercano al dato predecible (valor de salida que toma sobre la recta cuando el dato tiene una dimensión, o al plano si tiene 2 dimensiones).

Error cuadrático medio: media((yr - ye)2)

Si trabajamos sobre vectores, tenemos el Error cuadrático medio vectorial: (Y - XW)T(Y - XW)
Que despejando paréntesis queda: YTY - WTXTY - YTXW + WTXTXW
Haciendo la derivada e igualando a 0 para minimizar la función obtenemos: -2XTY + 2XTXW = 0

Que operando y despejando obtenemos el Mínimo Error Cuadrático Medio W = (XTX)-1XTY

El problema es que resolver para cualquier GPU esta fórmula requiere de invertir matrices, lo cual tiene un coste computacional enorme. Además, no siempre será posible encontrar el mínimo de nuestra función de forma analítica. Esto es debido a que elevando al cuadrado el error, forzamos funciones convexas (con un sólo mínimo, para hacer posible este cálculo) cuando no necesariamente puede resultar lo más acertado.

Descenso del Gradiente

En este modelo tenemos en cuenta el error y los parámetros, de modo de que si por ejemplo tenemos un sistema con 2 parámetros en un eje XY y el error en el eje Z, tendríamos que llegar al mínimo de error de la función tridimensional.

Para ello, cuando se realiza el entrenamiento, éste comienza en un valor aleatorio, esto quiere decir en cualquier punto de la superficie. Realizando continuas derivadas parciales de los parámetros en función del error, vamos obteniendo mínimos a cada paso ∂error/∂θ1 ∂error/∂θ2
θn Parámetro n.
error Función error.

El vector

∂error/∂θ11
∂error/∂θ21

Es igual al Gradiente: la dirección del vector que asciende respecto de esa superficie (2 parámatros): ∇f

Como lo que buscamos es la dirección para la que el gradiente desciende, tomamos el sentido opuesto: θ := θ - ∇f
Esto nos da lugar a un nuevo conjunto de parámetros sobre los que volvemos a operar, hasta que alcancemos el valor mínimo de nuestra función, donde al operar no obtengamos apenas variaciones del coste, es decir, que la pendiente sea prácticamente nula.

Para que el algoritmo esté completo, tenemos que añadir el ratio de aprendizaje: θ := θ - a∇f
Esto define cómo afecta el gradiente a la actualización de nuestros parámetros en cada iteración (“cuánto avanzamos en cada paso). Si es demasiado pequeño habrá una carga computacional excesiva. Si es demasiado grande, puede ser incapaz de localizar los mínimos de la función.

Hay diferentes técnicas para ajustar el ratio de aprendizaje de forma dinámica: SGD, momentum, NAG, Adagrad, Adadelta, Rmsprop.

Redes Neuronales

Las redes neuronales “aprenden” de forma jerarquizada: en las primeras capas aprenden conceptos muy concretos, y en las capas posteriores se utilizan conceptos aprendidos en las capas anteriores para aprender conceptos más abstractos. A más capas, se aprende información más abstracta e interesante.
Este tipo de “algoritmos” pueden llegar a ser tan complejos que dan lugar a los modelos de aprendizaje automático de Deep Learning.

Neurona

La neurona es la unidad básica de procesamiento de una red neuronal. Esta neurona tiene canales de entrada que recibe los valores de entrada Xn. A éstos se les asigna un peso determinado Wn que define con qué intensidad afecta esa entrada a la neurona. Son los parámetros de nuestro modelo. La neurona tiene un canal de salida por donde devuelve un valor de salida Y. En definitiva: Una neurona es una función matemática que realiza una suma ponderada de las entradas Y = W1X1 + W2X2 + W3X3

Podemos ver que una neurona es básicamente un modelo de regresión lineal. Aparentemente falta el término independiente W0, que en el caso de 1 dimensión permitía mover la recta en el eje Y. En este caso será el término BIAS (b), que es una entrada con valor '1', y como parámetro b, que permite este ajuste. De este modo obtenemos Y = W1X1 + W2X2 + W3X3 + b

Sin embargo una única neurona tiene limitaciones para poder modelar todos los casos posibles, por lo que es necesario asociar neuronas para poder realizar operaciones más complejas (ejemplo: problema de la puerta XOR).

Sin embargo, la interacción de las diferentes neuronas, al tratarse de operaciones de regresión lineal, producen como resultado una función que puede reducirse a una única operación de regresión lineal, es decir, toda la red podría colapsar a una única neurona, es decir, todas las operaciones podrían reducirse a una única operación de regresión lineal. Con las limitaciones que esto conlleva.

Para poder realizar un procesamiento de la información complejo, es necesario añadir a la neurona una función de activación, que será la que proporcione a la suma ponderada interna la no linealidad que sea necesaria. Nos queda entonces: Y = f(W1X1 + W2X2 + W3X3 + b)

Las funciones de activación más comunes a utilizar son: función escalón, función sigmoide, función tangente hiperbólica (tanh(x)) y función RELU.

Esta unidad funcional se denomina Perceptrón y por sí misma puede ser entrenada para realizar tareas binarias de clasificación. Sin embargo está sujeta a muchas limitaciones que le impiden realizar otro tipo de tareas, para lo que es necesario el uso de redes neuronales.

Redes neuronales


Las neuronas se organizan en “columnas” o capas. La primera capa se denomina capa de entrada, la última capa es la capa de salida y las capas intermedias capas ocultas.
Todas las neuronas de cada capa reciben la misma información, que son las salidas de las neuronas de la capa anterior.

De esta manera, la información se procesa de forma jerarquizada por capas. A mayor número de capas (profundidad), se puede obtener información más abstracta e interesante. También resolver problemas de clasificación complejos. Esto da lugar al concepto Deep Learning o Aprendizaje Profundo.

Se puede “jugar” o visualizar cómo funciona por dentro una red neuronal con la herramienta proporcionada por TensorFlow: https://playground.tensorflow.org




Back Propagation


El ajuste de la red es complicado con lo visto hasta ahora. Esto es debido a la dificultad para saber de qué modo hay que variar los parámetros para obtener los resultados deseados. No se sabía cómo entrenar la red de forma eficiente. Antes de hacía por “fuerza bruta”, variando de forma aleatoria parámetros y comprobando cómo afectaba a la salida. Esto se denomina “Perturbación aleatoria”.

Para poder realizar un ajuste adecuado de la red, vamos a utilizar el descenso del gradiente en cada neurona. Como el cálculo de derivadas parciales dependerá del resultado de las mismas derivadas en la capa anterior, es computacionalmente inviable hacerlo por fuerza bruta.

Para ajustar una red neuronal de forma adecuada se utiliza la técnica de retropropagación de errores Back Propagation. Consiste en propagar el error”hacia atrás“ en la red, aplicando el descenso del gradiente “hacia atrás” partiendo del resultado de la red, de forma que se obtiene el “peso” de cada parámetro en el resultado final.

Inicialmente la red tiene sus parámetros ajustados de forma aleatoria, por lo que el error al final será muy elevado. Una explicación breve de las matemáticas de la técnica de back propagation en el siguiente vídeo (a partir del minuto 6:30):



En resumen, se puede decir que partiendo de:

  • Tomando ZL como la suma ponderada de las neuronas de la última capa: ZL = WLX + bL
  • Pasando ésta por la función de activación: a(ZL)
  • Y calculando la Función de coste C como el error: ERROR = C(a(ZL))

Tenemos una composición de funciones. Para hacer cálculos con este tipo de funciones usamos una técnica matemática llamada Chain rule, que quiere decir que para calcular la derivada de una composición de funciones, basta con multiplicar las derivadas intermedias.
De este modo obtenemos para nuestro problema:
∂C/∂wL = ∂C/∂aL · ∂aL/∂zL · ∂zL/∂wL
∂C/∂bL = ∂C/∂aL · ∂aL/∂zL · ∂zL/∂bL

Aunque obtenemos varias derivadas parciales de una, éstas son muy sencillas de resolver.

De este modo obtenemos el Error imputado a la neurona: δL = ∂C/∂zL

Y así obtenemos la manera en la que realizar todos los cálculos:

  1. Cómputo del error de la última capa: δL = ∂C/∂aL · ∂aL/∂zL
  2. Retropropagamos el error a la capa anterior: δl-1 = Wlδl · ∂al-1/∂zl-1
  3. Calculamos las derivadas de la capa usando el error: ∂C/∂bl-1 = δl-1 y ∂C/∂wl-1 = δl-1al-2


Y así, sucesivamente, recorriendo todas las capas de la red hasta el final. Con una única pasada obtenemos todos los errores y derivadas parciales de la red, haciendo uso de sólo 4 expresiones.
Sólo se trata de utilizar el error de la capa anterior para calcular el error en la capa siguiente.
Sólo hay 2 casos diferentes: la última capa en la que el error a pertenece a la función de coste, y el otro caso son el resto de capas, que dependen de otra capa.

Ajuste y sobreajuste


Si un modelo no se ajusta adecuadamente a los datos suministrados, por ser demasiado rígido (por ejemplo, modelo de regresión lineal simple) o cualquier otro motivo, se dice que tiene underfitting o subajuste.
Si un modelo se ajusta a los datos de entrada, hay que estar seguros de que también responde bien a nuevos datos con los que ha sido entrenado. Si no responde bien a nuevos datos, y sólo es adecuado para los mismos datos con los que fue entrenado, entonces se dice que sufre de overfitting o sobreajuste. El modelo no es capaz de generalizar.

La mejor forma de saber un modelo sufre de overfitting, es dividir los datos totales disponibles en dos grupos: generalmente un 80% para el entrenamiento y un 20% para hacer pruebas.
Se realizan pruebas al mismo tiempo que se entrena el modelo, de modo que podemos ver su comportamiento antes nuevos datos, que generalmente tendrá un error superior al de los datos de entrenamiento. Mientras este error (el producido con datos nuevos) siga decreciendo, no hay problema. Cuando este error empiece a incrementarse, se está produciendo overfitting. Esta estrategia de entrenamiento se denomina Hold-out.

Para que la estrategia Hold-out funcione los datos deben estar idénticamente distribuidos en ambos grupos, de modo que no exista una naturaleza distinta. Esto puede conseguirse distribuyéndolos de forma aleatoria. Y asegurándonos que no existan dependencias entre datos que enmascare el overfitting (por ejemplo, en los fotogramas de una película, en las diferentes secuencias hay muchos iguales, lo que en función de cuáles sean elegidos para hacer test, puede enmascarar el overfitting).

Suele ser más complicado hacer un correcto tratamiento de los datos que realizar el entrenamiento (unas pocas líneas de código).

inteligencia_artificial/conceptos.1683287172.txt.gz · Última modificación: por alberto

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki