¿Puede el aprendizaje automático aprender una función como encontrar el máximo de una lista?

26

Tengo una entrada que es una lista y la salida es el máximo de los elementos de la lista de entrada.

¿Puede el aprendizaje automático aprender una función que siempre selecciona el máximo de los elementos de entrada presentes en la entrada?

Esto puede parecer una pregunta bastante básica, pero podría darme una idea de lo que el aprendizaje automático puede hacer en general. ¡Gracias!

usuario78739
fuente
1
Creo que puede intentar esto como un problema en serie, es decir, usando la red neuronal recurrente. Alimentar datos ordenados a la red.
Vipin Bansal
2
Ver también datascience.stackexchange.com/q/22242 , datascience.stackexchange.com/q/29345 ; Las redes neuronales pueden ordenar una lista de entrada, por lo que ciertamente pueden extraer un máximo.
Ben Reiniger
3
@TravisBlack: en realidad, este es definitivamente el tipo de función que no se puede aprender con las redes neuronales estándar. Como ejemplo, suponga que simplemente conecta un vector con un valor para predecir que fue mayor que cualquier valor que tenía en su conjunto de entrenamiento. ¿Crees que la red neuronal entrenada te devolverá ese valor más grande?
Cliff AB
10
@TravisBlack NOOO! Las redes neuronales no pueden aprender "básicamente ninguna" función matemática. En cuanto a la cardinalidad, casi todas las funciones son patológicas, casi discontinuas en todas partes. Lo que probablemente es media, muchas de las funciones que los matemáticos son en realidad interesaban en pasar a ser lo suficientemente buen comportamiento que las redes neuronales pueden aproximarse a ellos arbitrariamente bien. Pero eso no es lo mismo que poder aprender cualquier función .
Leftaroundabout
66
@leftaroundabout y Cliff: Es bueno ver que alguien se queda en el suelo en la reciente exageración de ML / DL. Las personas usan NN, y cuando profundizas un nivel más, te das cuenta de que a menudo no tienen la menor idea de lo que realmente están haciendo allí, más allá de ajustar ciegamente los parámetros de algunos ejemplos de "Hola Mundo" de keras hasta que ven algún patrón. xkcd hizo esto exactamente bien: xkcd.com/1838 . Espero que alguien todavía pueda agregar una respuesta aquí que sea más profunda de lo que parecen ser las actuales. (Sin ofender a nadie, pero la falta común de comprensión de las NN me molesta ...)
Marco13

Respuestas:

35

Tal vez , pero tenga en cuenta que este es uno de esos casos en los que el aprendizaje automático no es la respuesta . Existe una tendencia a intentar el aprendizaje automático de calzador en casos donde realmente, las soluciones basadas en reglas estándar son más rápidas, más simples y, en general, la elección correcta: P

Solo porque puedas, no significa que debas

Editar : Originalmente escribí esto como "Sí, pero tenga en cuenta que ...", pero luego comencé a dudar de mí mismo, ya que nunca lo había visto. Lo probé esta tarde y ciertamente es factible:

import numpy as np
from keras.models import Model
from keras.layers import Input, Dense, Dropout
from keras.utils import to_categorical
from sklearn.model_selection import train_test_split
from keras.callbacks import EarlyStopping

# Create an input array of 50,000 samples of 20 random numbers each
x = np.random.randint(0, 100, size=(50000, 20))

# And a one-hot encoded target denoting the index of the maximum of the inputs
y = to_categorical(np.argmax(x, axis=1), num_classes=20)

# Split into training and testing datasets
x_train, x_test, y_train, y_test = train_test_split(x, y)

# Build a network, probaly needlessly complicated since it needs a lot of dropout to
# perform even reasonably well.

i = Input(shape=(20, ))
a = Dense(1024, activation='relu')(i)
b = Dense(512, activation='relu')(a)
ba = Dropout(0.3)(b)
c = Dense(256, activation='relu')(ba)
d = Dense(128, activation='relu')(c)
o = Dense(20, activation='softmax')(d)

model = Model(inputs=i, outputs=o)

es = EarlyStopping(monitor='val_loss', patience=3)

model.compile(optimizer='adam', loss='categorical_crossentropy')

model.fit(x_train, y_train, epochs=15, batch_size=8, validation_data=[x_test, y_test], callbacks=[es])

print(np.where(np.argmax(model.predict(x_test), axis=1) == np.argmax(y_test, axis=1), 1, 0).mean())

La salida es 0.74576, por lo que está encontrando correctamente el máximo 74.5% del tiempo. No tengo dudas de que eso podría mejorarse, pero como digo, este no es un caso de uso que recomendaría para ML.

EDIT 2 : en realidad volví a ejecutar esta mañana usando el RandomForestClassifier de sklearn y funcionó significativamente mejor:

# instantiation of the arrays is identical

rfc = RandomForestClassifier(n_estimators=1000, verbose=1)
rfc.fit(x_train, y_train)

yhat_proba = rfc.predict_proba(x_test)


# We have some annoying transformations to do because this .predict_proba() call returns the data in a weird format of shape (20, 12500, 2).

for i in range(len(yhat_proba)):
    yhat_proba[i] = yhat_proba[i][:, 1]

pyhat = np.reshape(np.ravel(yhat_proba), (12500,20), order='F')

print(np.where(np.argmax(pyhat, axis=1) == np.argmax(y_test, axis=1), 1, 0).mean())

Y la puntuación aquí es del 94,4% de las muestras con el máximo correctamente identificado, lo cual es bastante bueno.

Dan Scally
fuente
1
@TravisBlack, sí, originalmente lo comencé como "Sí, pero ...", pero luego dudé de mí mismo y me equivoqué. He mejorado la respuesta ahora :).
Dan Scally
16
Al entrenar y probar todo con vectores que contienen valores en [0,100], la puntuación es de aproximadamente 0,95. Multa. Pero al entrenarlo con valores en [0,100], y probarlo con valores en [100,200], el puntaje es prácticamente cero . Ya has dado un paso atrás con tu edición. Pero para dejar esto claramente claro para aquellos que ciegamente ven a ML como el arma milagrosa que puede resolver todos los problemas: lo que sea que estén aprendiendo allí: ¡NO es 'la función máxima'! .
Marco13
2
(Un aparte: para notificar a otros sobre las respuestas a sus comentarios, use @, como en @Marco13). Con respecto a la pregunta: creo que su afirmación "el aprendizaje automático no es la respuesta" lo deja claro. Principalmente me temo que demasiadas personas no aplican el escrutinio apropiado cuando usan ML / DL / NN, y particularmente, cuando encuentran algo que parece que podría "resolver su problema", sin entender por qué parece hacerlo. y, por lo tanto, sin reconocer cuándo una "solución" es solo un artefacto de un proceso no tan bien entendido.
Marco13
2
@aroth seguro; en el mejor de los casos, esta es una aproximación de max () aplicable al alcance de los datos de entrenamiento que se ve. Estaba jugando con el problema, pero no tengo la intención de restarle importancia al sentimiento principal de mi respuesta, que es no usar ML para este tipo de problema .
Dan Scally
1
@BradyGilg Estandarizando los datos de entrada ... uhhm ... aunque probablemente tenga razón en que esto produciría "mejores" resultados, los resultados aún no tendrían mucho sentido, porque el NN no está "aprendiendo la función máxima" . Y el argumento es, de alguna manera, obviamente muy académico: incluso diría "demasiado académico": desea calcular / predecir el máximo de algunos vectores, y para calcular el máximo, primero tiene que calcular el mínimo / max para hacer una normalización (o mean / stdDev para una estandarización, que tampoco parece ser muy sensible).
Marco13
26

Sí. Muy importante, USTED decide la arquitectura de una solución de aprendizaje automático. Las arquitecturas y los procedimientos de capacitación no se escriben solos; deben diseñarse o crearse una plantilla y la capacitación sigue como un medio para descubrir una parametrización de la arquitectura que se ajusta a un conjunto de puntos de datos.

Puede construir una arquitectura muy simple que realmente incluya una función máxima:

net(x) = a * max(x) + b * min(x)

donde a y b son parámetros aprendidos.

Dadas suficientes muestras de entrenamiento y una rutina de entrenamiento razonable, esta arquitectura muy simple aprenderá muy rápidamente a establecer a 1 yb a cero para su tarea.

El aprendizaje automático a menudo toma la forma de entretener múltiples hipótesis sobre la creación y transformación de puntos de datos de entrada, y aprender a preservar solo aquellas hipótesis que están correlacionadas con la variable objetivo. Las hipótesis se codifican explícitamente en la arquitectura y las subfunciones disponibles en un algoritmo parametrizado, o como los supuestos codificados en un algoritmo "sin parámetros".

Por ejemplo, la elección de usar productos de punto y no linealidades, como es común en la red neuronal de vainilla ML, es algo arbitraria; expresa la hipótesis general de que una función puede construirse utilizando una estructura de red composicional predeterminada de transformaciones lineales y funciones de umbral. Las diferentes parametrizaciones de esa red incorporan diferentes hipótesis sobre qué transformaciones lineales utilizar. Se puede usar cualquier caja de herramientas de funciones y el trabajo de un aprendiz de máquina es descubrir mediante diferenciación o prueba y error o alguna otra señal repetible qué funciones o características en su conjunto minimizan mejor una métrica de error. En el ejemplo dado anteriormente, la red aprendida simplemente se reduce a la función máxima en sí misma, mientras que una red indiferenciada podría "aprender" alternativamente una función mínima. Estas funciones se pueden expresar o aproximar por otros medios, como en la función de regresión neta lineal o neural en otra respuesta. En resumen, realmente depende de qué funciones o piezas de LEGO tenga en su caja de herramientas de arquitectura ML.

pygosceles
fuente
44
+1 ML no es más que elegantes ecuaciones de regresión y exige la elección correcta de ecuaciones.
aidan.plenert.macdonald
44
@ aidan.plenert.macdonald el impacto y el atractivo de ML, sin embargo, es que no hay una elección correcta de ecuaciones. Las ecuaciones elegidas deben ser miembros del conjunto de ecuaciones adecuadas, pero resulta que, para una amplia gama de problemas, ese conjunto contiene ecuaciones mucho más generalizadas de lo que podría ser una solución cuidadosamente diseñada, pero proporcionan parámetros que resuelven el problema. problema mucho más rápido que poner en el esfuerzo de diseño adicional. Esta pregunta es un buen ejemplo de cómo esto no elimina por completo las consideraciones de diseño del modelo.
Será el
Esa nunca fue la pregunta. El OP preguntó si ML puede encontrar (/ aprender / inferir) una función como max()(a partir de datos etiquetados). No dijeron " Dado que ya tienes max()como un bloque de construcción"
smci
@smci No existe una prioridad "universal" para las arquitecturas o funciones de aprendizaje automático. Como mencioné en mi respuesta, puede aproximar una función máxima utilizando funciones lineales por partes intercaladas con no linealidades, pero no existe una regla universal que diga que todo ML tiene que usar ese conjunto particular de transformaciones en su caja de herramientas. Las redes neuronales a menudo (pero no siempre) tienen una función máxima a su disposición a través de Max Pooling o ReLU no linealidades. El número de funciones posibles es ilimitado, por eso destaco el papel de la elección y el sesgo predispuesto en la arquitectura de ML.
pygosceles
7

Sí, el aprendizaje automático puede aprender a encontrar el máximo en una lista de números.

Aquí hay un ejemplo simple de aprender a encontrar el índice del máximo:

import numpy as np
from sklearn.tree import DecisionTreeClassifier

# Create training pairs where the input is a list of numbers and the output is the argmax
training_data = np.random.rand(10_000, 5) # Each list is 5 elements; 10K examples
training_targets = np.argmax(input_data, axis=1)

# Train a descision tree with scikit-learn
clf = DecisionTreeClassifier()
clf.fit(input_data, targets)

# Let's see if the trained model can correctly predict the argmax for new data
test_data = np.random.rand(1, 5)
prediction = clf.predict(test_data)
assert prediction == np.argmax(test_data) # The test passes - The model has learned argmax
Brian Spiering
fuente
¿Está realmente aprendiendo la función "máxima"? Un conjunto de entrenamiento de 10,000 listas de cinco elementos es una aproximación razonable al espacio de entrada completo.
Mark
2
Descargo de responsabilidad: no soy un experto en ML / DL. Pero estoy bastante seguro de que esto no tiene ningún sentido. Quiero decir: no tiene sentido, en absoluto. Tal como lo veo, no estás aprendiendo la función máxima. Estás aprendiendo los índices de los elementos máximos del conjunto de entrenamiento. Si ingresa un vector que contiene dos números que son más grandes que el del conjunto de entrenamiento, es probable que falle. Sin mencionar el caso en el que no tienes un vector 5D sino un 10D. Lanzar algunos datos a una biblioteca que no se entienden y ver un cierto resultado NO (en absoluto) significa que "funciona".
Marco13
Quiero decir, depende de lo que se supone que significa "funciona". Un árbol de decisión en particular solo producirá una función constante por partes, las piezas son cajas rectangulares alineadas con ejes. En el ejemplo max, entrenando en un hipercubo sólido, la función max real es constante por partes en algún tipo de región triangular. Dados suficientes ejemplos de entrenamiento y profundidad, el árbol se aproximará a estas regiones triangulares con precisión arbitraria. Pero, como ocurre con muchos (¿la mayoría?) De otros modelos, cualquier muestra de prueba fuera del rango de las muestras de entrenamiento es bastante inútil.
Ben Reiniger
Esto no prueba nada. El OP preguntó "el máximo en una lista de números" . Asumiste que deben ser flotantes en el rango 0..1. Intente ingresar un 2 (o -1, o 1.5) y fallará.
smci
4

Algoritmos de aprendizaje

En lugar de aprender una función como un cálculo realizado por una red neuronal de retroalimentación, hay todo un dominio de investigación sobre algoritmos de aprendizaje a partir de datos de muestra. Por ejemplo, uno podría usar algo como una Máquina Neural de Turing o algún otro método en el que la ejecución de un algoritmo esté controlada por el aprendizaje automático en sus puntos de decisión. Los algoritmos de juguete como encontrar un máximo, ordenar una lista, revertir una lista o filtrar una lista se usan comúnmente como ejemplos en la investigación de aprendizaje de algoritmos.

Pedro es
fuente
2

Excluiré los diseños educados de mi respuesta. No, no es posible utilizar una salida de la máquina de aprendizaje caja (ML) a totalmente representar la función máxima para arbitrarias listas con precisión arbitraria. ML es un método basado en datos y está claro que no podrá aproximar una función en regiones donde no tiene ningún punto de datos. Por lo tanto, el espacio de posibles observaciones (que es infinito) no puede ser cubierto por observaciones finitas.

Mis declaraciones tienen una base teórica con el Teorema de aproximación universal de Cybeko para redes neuronales. Citaré el teorema de Wikipedia:

Rn

RnxR

Si su espacio de observaciones es compacto, entonces podría aproximar la función máxima con un conjunto de datos finito. Como la respuesta más votada dejó en claro, ¡no debes reinventar la rueda!

MachineLearner
fuente
1

Aquí hay una expansión de mi comentario. Como prefacio, absolutamente @DanScally tiene razón en que no hay razón para usar ML para encontrar el máximo de una lista. Pero creo que su "podría darme una idea de lo que el aprendizaje automático puede hacer en general" es una razón suficiente para profundizar en esto.

maxmax


Los comentarios y la respuesta de @ MachineLearner plantearon teoremas de aproximación universales: en un dominio acotado , una red neuronal puede aproximar cualquier función razonablemente agradable como , pero no podemos esperar a priori aproximar en una entrada arbitraria, ni exactamente calcular cualquier lugar.maxmaxmax

Pero resulta que una red neuronal puede ordenar exactamente números de entrada arbitrarios. De hecho, enteros -bit se pueden ordenar por una red con sólo dos capas ocultas de tamaño cuadrática. Profundidad de redes neuronales eficientes para problemas de división y relacionados , Teorema 7 en la página 955; Muchas gracias a @MaximilianJanisch en esta respuesta por encontrar esta referencia.n n

Describiré brevemente una simplificación del enfoque en ese documento para producir la función para entradas distintas arbitrarias. La primera capa oculta consiste en neuronas, cada una representando la variable indicadora , para . Estos se construyen fácilmente como con un indicador de paso. La siguiente capa tiene neuronas, una para cada entrada ; comience con la suma ; es decir, el número de tal que , y por lo tanto la posición deargmaxn(n2)δij=1(xi<xj)i<jxjxinxij<iδji+j>i(1δij)jxi>xjxi en la lista ordenada. Para completar el argumento argmax, solo pon umbral a esta capa. En este punto, si pudiéramos multiplicar, obtendríamos el valor máximo real con bastante facilidad. La solución en el trabajo es usar la representación binaria de los números, en cuyo punto la multiplicación binaria es la misma que la suma de umbral. Para obtener el argmax, es suficiente tener una función lineal simple multiplicando el ésimo indicador por y sumando.ii
ii


Finalmente, para la siguiente pregunta: ¿podemos entrenar a un NN en este estado? @DanScally nos ayudó a comenzar; ¿Quizás conocer la arquitectura teórica nos pueda ayudar a engañarnos en la solución? (Tenga en cuenta que si podemos aprender / aproximar el conjunto particular de pesos anterior, la red realmente funcionará bien fuera del rango de las muestras de entrenamiento).

Cuaderno en github / Colab

Cambiando las cosas un poco, obtengo un mejor puntaje de prueba (0.838), e incluso las pruebas en una muestra fuera del rango de entrenamiento original obtienen un puntaje decente (0.698). Usando entradas escaladas a[1,1]obtiene el puntaje de la prueba hasta 0.961, con un puntaje fuera de rango de 0.758. Pero, estoy puntuando con el mismo método que @DanScally, lo que parece un poco deshonesto: la función de identidad puntuará perfectamente en esta métrica. También imprimí algunos coeficientes para ver si aparece algo cercano al ajuste exacto descrito anteriormente (en realidad no); y algunos resultados en bruto, que sugieren que el modelo es demasiado tímido para predecir un máximo, errando por el lado de predecir que ninguna de las entradas es el máximo. Quizás modificar el objetivo podría ayudar, pero en este punto ya he dedicado demasiado tiempo; Si a alguien le interesa mejorar el enfoque, siéntase libre de jugar (en Colab si lo desea) y hágamelo saber.

Ben Reiniger
fuente
Todavía no he entendido el papel (que es matemático pesado ... y sorprendentemente viejo ...), pero a pesar de que podría ser el término ambiguo "red" que me hizo pensar en esta asociación, yo se preguntó si se podría diseñar una red neuronal que esencialmente "emule" una red de clasificación ...
Marco13
@ Marco13, claro, creo que usar ese papel para producir NN como comparadores produciría una emulación NN de la red de clasificación. Sería mucho más profundo que el papel, pero el ancho podría reducirse a un tamaño lineal.
Ben Reiniger
Es cierto que no estoy tan profundamente involucrado en NN como necesito estar para decir algo profundo. Pero cosas como ~ "puedes emular todo con dos capas" se parecen un poco a los resultados del diseño de circuito de bajo nivel en el que dices que puedes "implementar cada función con dos capas de compuertas NAND" o cualquier otra cosa. Creo que algunas de las NN que se examinaron recientemente son solo versiones elegantes de cosas que la gente ya descubrió hace 50 años, pero tal vez esto sea un error ...
Marco13
0

Sí, incluso un aprendizaje automático tan simple como los mínimos cuadrados lineales comunes pueden hacer esto si utiliza cierta inteligencia aplicada.

(Pero la mayoría consideraría esta exageración bastante horrible).

(Asumiré que queremos encontrar el máximo de abs del vector de entrada):

  1. Seleccione una función monotónicamente decreciente de valor absoluto, por ejemplo
    f(x)=1x2
  2. Construya una matriz diagonal de . Llamémoslof(r)Cr
  3. Vector de generación completa de los .S
  4. Construye y resuelve el sistema de ecuaciones(ϵI+103StS+Cr)1(103St)
  5. Llamemos vector de resultado , será una medida de probabilidad (sumas a 1), podemos volver a pesarlo de forma no lineal, por ejemplop
    pi=pik|pi|k
  6. Simplemente calcule el producto escalar con el vector índice y redondee.
mathreadler
fuente