L'apprentissage automatique peut-il apprendre une fonction comme trouver le maximum dans une liste?


26

J'ai une entrée qui est une liste et la sortie est le maximum des éléments de la liste d'entrée.

L'apprentissage automatique peut-il apprendre une telle fonction qui sélectionne toujours le maximum des éléments d'entrée présents dans l'entrée?

Cela peut sembler une question assez basique mais cela pourrait me donner une compréhension de ce que l'apprentissage automatique peut faire en général. Merci!


1
Je pense que vous pouvez essayer cela comme un problème en série, c'est-à-dire en utilisant le réseau neuronal récurrent. Alimentez les données triées sur le réseau.
vipin bansal

2
Voir aussi datascience.stackexchange.com/q/22242 , datascience.stackexchange.com/q/29345 ; les réseaux de neurones peuvent trier une liste d'entrée, donc ils peuvent certainement en extraire un maximum.
Ben Reiniger

3
@TravisBlack: en fait, c'est certainement le type de fonction que vous ne pouvez pas apprendre avec les réseaux de neurones standard. Par exemple, supposons que vous branchez simplement un vecteur avec une valeur pour prédire qu'elle était supérieure à toute valeur que vous aviez dans votre ensemble d'entraînement. Pensez-vous que le réseau neuronal formé vous rendra cette plus grande valeur?
Cliff AB

10
@TravisBlack NOOO! Les réseaux de neurones ne peuvent apprendre «pratiquement aucune» fonction mathématique. Côté cardinalité, presque toutes les fonctions sont pathologiques presque partout discontinues. Qu'est - ce que vous avez probablement moyen est, beaucoup de fonctions que les mathématiciens sont effectivement intéressèrent en arriver à être assez bien comportés que les réseaux de neurones peuvent se rapprocher les arbitrairement bien. Mais ce n'est pas du tout la même chose que de pouvoir apprendre n'importe quelle fonction .
partir du

6
@leftaroundabout et Cliff: Il est bon de voir que quelqu'un reste au sol dans le battage médiatique ML / DL récent. Les gens utilisent des NN, et lorsque vous creusez un niveau plus loin, vous remarquez qu'ils n'ont souvent pas la moindre idée de ce qu'ils font réellement là-bas - au-delà de peaufiner aveuglément les paramètres de certains keras "Hello World" exemple jusqu'à ce qu'ils voient un modèle. xkcd a parfaitement compris : xkcd.com/1838 . J'espère que quelqu'un pourra encore ajouter ici une réponse plus profonde que les réponses actuelles ne semblent l'être. (N'offense à personne, mais le manque commun de compréhension des NN me dérange ...)
Marco13

Réponses:


35

Peut - être , mais notez que c'est l'un de ces cas où l'apprentissage automatique n'est pas la réponse . Il y a une tendance à essayer l'apprentissage automatique du chausse-pied dans les cas où, en réalité, les solutions basées sur des règles standard sont plus rapides, plus simples et tout simplement le bon choix: P

Ce n'est pas parce que vous le pouvez que vous devriez

Edit : à l'origine, j'ai écrit ceci comme "Oui, mais notez que ..." mais j'ai ensuite commencé à douter de moi-même, ne l'ayant jamais vu faire. Je l'ai essayé cet après-midi et c'est certainement faisable:

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 sortie est de 0,74576, il trouve donc correctement le maximum 74,5% du temps. Je ne doute pas que cela pourrait être amélioré, mais comme je le dis, ce n'est pas un cas d'utilisation que je recommanderais pour ML.

EDIT 2 : En fait, j'ai relancé ce matin en utilisant RandomForestClassifier de sklearn et il a nettement mieux fonctionné:

# 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())

Et le score ici est de 94,4% des échantillons avec le max correctement identifié, ce qui est assez bon en effet.


1
@TravisBlack ouais je l'avais à l'origine commencé comme "Oui, mais ..." mais ensuite j'ai douté de moi-même et j'ai tergiversé. J'ai amélioré la réponse maintenant :).
Dan Scally

16
Lorsque vous entraînez et testez le tout avec des vecteurs contenant des valeurs de [0,100], le score est d'environ 0,95. Bien. Mais quand on l'entraîne avec des valeurs dans [0,100] et le teste avec des valeurs dans [100,200], le score est pratiquement nul . Vous avez déjà pris du recul avec votre modification. Mais pour que cela soit clairement clair pour ceux qui voient aveuglément le ML comme l'arme miracle qui peut résoudre tous les problèmes: Quoi que vous y appreniez: Ce n'est PAS «la fonction maximale»! .
Marco13

2
(Un aparté: pour informer les autres des réponses à leurs commentaires, utilisez @, comme dans @Marco13). Concernant la question: je pense que votre affirmation "le machine learning n'est pas la réponse" le rend clair. Je suis surtout peur que trop de gens ne sont pas applicables à l'examen approprié lorsque l' utilisation ML / DL / NNs, et surtout, quand ils rencontrent quelque chose qui ressemble comme il pourrait « résoudre leur problème », sans comprendre pourquoi il semble le faire , et donc sans reconnaître quand une "solution" n'est qu'un artefact d'un processus pas si bien compris.
Marco13

2
@aroth sûr; au mieux, il s'agit d'une approximation de max () applicable à l'étendue des données d'entraînement vues. Je jouais avec le problème, mais je n'ai pas l'intention de nuire au sentiment principal de ma réponse qui est de ne pas utiliser ML pour ce type de problème .
Dan Scally

1
@BradyGilg Standardiser les données d'entrée ... euhhm ... alors que vous avez probablement raison en ce que cela donnerait de "meilleurs" résultats, les résultats n'auraient toujours pas beaucoup de sens, car le NN "n'apprend pas la fonction maximale" . Et l'argument est à certains égards évidemment très académique - je dirais même "trop ​​académique": vous voulez calculer / prédire le max de certains vecteurs, et pour calculer le max, vous devez d' abord calculer le min / max pour effectuer une normalisation (ou mean / stdDev pour une normalisation, ce qui ne semble pas non plus très raisonnable).
Marco13

26

Oui. Très important, VOUS décidez de l'architecture d'une solution d'apprentissage automatique. Les architectures et les procédures de formation ne s'écrivent pas elles-mêmes; ils doivent être conçus ou modélisés et la formation s'ensuit comme un moyen de découvrir une paramétrisation de l'architecture adaptée à un ensemble de points de données.

Vous pouvez construire une architecture très simple qui inclut en fait une fonction maximale:

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

a et b sont des paramètres appris.

Avec suffisamment d'échantillons de formation et une routine de formation raisonnable, cette architecture très simple apprendra très rapidement à mettre a 1 et b à zéro pour votre tâche.

L'apprentissage automatique prend souvent la forme d'hypothèses multiples sur la personnalisation et la transformation des points de données d'entrée, et d'apprendre à ne conserver que les hypothèses qui sont corrélées avec la variable cible. Les hypothèses sont encodées explicitement dans l'architecture et les sous-fonctions disponibles dans un algorithme paramétré, ou comme les hypothèses encodées dans un algorithme "sans paramètre".

Par exemple, le choix d'utiliser des produits scalaires et des non-linéarités comme cela est courant dans le réseau neuronal vanille ML est quelque peu arbitraire; il exprime l'hypothèse englobante selon laquelle une fonction peut être construite en utilisant une structure de réseau compositionnelle prédéterminée de transformations linéaires et de fonctions de seuil. Différentes paramétrisations de ce réseau incarnent différentes hypothèses sur les transformations linéaires à utiliser. N'importe quelle boîte à outils de fonctions peut être utilisée et le travail d'un apprenant machine consiste à découvrir par différenciation ou essai et erreur ou tout autre signal reproductible quelles fonctions ou fonctionnalités de sa matrice minimisent le mieux une mesure d'erreur. Dans l'exemple donné ci-dessus, le réseau appris se réduit simplement à la fonction maximale elle-même, tandis qu'un réseau indifférencié pourrait alternativement "apprendre" une fonction minimale. Ces fonctions peuvent être exprimées ou approchées par d'autres moyens, comme dans la fonction de régression nette linéaire ou neuronale dans une autre réponse. En somme, cela dépend vraiment des fonctions ou des pièces LEGO que vous avez dans votre boîte à outils d'architecture ML.


4
+1 ML n'est rien d'autre que des équations de régression sophistiquées et exige le bon choix d'équations.
aidan.plenert.macdonald

4
@ aidan.plenert.macdonald l'impact et l'attrait du ML, cependant, est qu'il n'y a pas un bon choix d'équations. Les équations que vous avez choisies doivent faire partie de l'ensemble des équations appropriées, mais il s'avère que pour un large éventail de problèmes, cet ensemble contient des équations beaucoup plus généralisées qu'une solution soigneusement conçue, mais donne des paramètres qui résolvent le problème. problème beaucoup plus rapidement que de mettre l'effort de conception supplémentaire. Cette question est un bon exemple de la façon dont cela n'élimine pas complètement les considérations de conception de modèle.
Will

Ce n'était jamais la question. L'OP a demandé si ML peut trouver (/ apprendre / déduire) une fonction comme max()(à partir de données étiquetées). Ils n'ont pas dit " Étant donné que vous en avez déjà max()un bloc de construction"
smci

@smci Il n'y a aucun préalable "universel" pour les architectures ou fonctions d'apprentissage automatique. Comme mentionné dans ma réponse, vous pouvez approximer une fonction maximale en utilisant des fonctions linéaires par morceaux entrecoupées de non-linéarités - mais il n'y a pas de règle universelle qui dit que tout ML doit utiliser cet ensemble particulier de transformations dans sa boîte à outils. Les réseaux de neurones ont souvent (mais pas toujours) une fonction maximale à leur disposition via les non-linéarités Max Pooling ou ReLU. Le nombre de fonctions possibles est illimité, c'est pourquoi je souligne le rôle du choix et du biais prédisposé dans l'architecture ML.
pygosceles

7

Oui - L'apprentissage automatique peut apprendre à trouver le maximum dans une liste de nombres.

Voici un exemple simple d'apprentissage pour trouver l'indice du maximum:

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

Apprend-il vraiment la fonction "maximum"? Un ensemble d'apprentissage de 10 000 listes à cinq éléments est une approximation raisonnable de l'espace d'entrée complet.
Mark

2
Avertissement: je ne suis pas un expert ML / DL. Mais je suis sûr que cela n'a aucun sens. Je veux dire: pas de sens du tout. À mon avis, vous n'apprenez pas la fonction maximale. Vous apprenez les indices des éléments maximaux de l'ensemble d'entraînement. Si vous saisissez un vecteur contenant deux nombres plus grands que celui de l'ensemble d'apprentissage, il échouera probablement. Sans parler du cas où vous n'avez pas de vecteur 5D mais 10D. Lancer des données dans une bibliothèque que l'on ne comprend pas et voir un certain résultat ne signifie PAS (du tout) que cela "fonctionne".
Marco13

Je veux dire, cela dépend de ce que "ça marche" est censé signifier. Un arbre de décision en particulier ne produira qu'une fonction constante par morceaux, les morceaux étant des boîtes rectangulaires alignées sur l'axe. Dans l'exemple max, en s'entraînant sur un hypercube solide, la fonction max réelle est constante par morceaux sur certains types de régions triangulaires. Avec suffisamment d'exemples d'apprentissage et de profondeur, l'arbre rapprochera ces régions triangulaires avec une précision arbitraire. Mais, comme avec beaucoup (la plupart?) D'autres modèles, tout échantillon de test en dehors de la plage des échantillons d'apprentissage est assez désespéré.
Ben Reiniger

Cela ne prouve rien. Le PO a demandé "le maximum dans une liste de chiffres" . Vous avez supposé que ces flotteurs doivent être compris entre 0 et 1. Essayez de saisir un 2 (ou -1 ou 1,5) et cela échouera.
smci

4

Algorithmes d'apprentissage

Au lieu d'apprendre une fonction comme un calcul effectué par un réseau de neurones à action directe, il y a tout un domaine de recherche concernant les algorithmes d' apprentissage à partir d'échantillons de données. Par exemple, on pourrait utiliser quelque chose comme une Neural Turing Machine ou une autre méthode où l'exécution d'un algorithme est contrôlée par l'apprentissage automatique à ses points de décision. Les algorithmes de jouets comme la recherche d'un maximum ou le tri d'une liste, ou l'inversion d'une liste ou le filtrage d'une liste sont couramment utilisés comme exemples dans la recherche d'apprentissage d'algorithmes.


2

J'exclurai les conceptions instruites de ma réponse. Non, il n'est pas possible d'utiliser une approche d'apprentissage machine (ML) prête à l'emploi pour représenter pleinement la fonction maximale pour des listes arbitraires avec une précision arbitraire. ML est une méthode basée sur les données et il est clair que vous ne pourrez pas approximer une fonction dans les régions où vous n'avez pas de points de données. Par conséquent, l'espace des observations possibles (qui est infini) ne peut pas être couvert par des observations finies.

Mes déclarations ont une base théorique avec le théorème d'approximation universelle de Cybeko pour les réseaux de neurones. Je vais citer le théorème de Wikipedia:

Rn

RnxR

Si votre espace d'observations est compact, vous pourrez peut-être approximer la fonction maximale avec un ensemble de données finies. Comme la réponse la plus votée l'a clairement montré, vous ne devez pas réinventer la roue!


1

Voici une extension de mon commentaire. Pour commencer, absolument @DanScally a raison de dire qu'il n'y a aucune raison d'utiliser ML pour trouver le maximum d'une liste. Mais je pense que votre "cela pourrait me donner une compréhension de ce que l'apprentissage automatique peut faire en général" est une raison suffisante pour approfondir cela.

maxmax


maxmaxmax

n n

argmaxn(n2)δij=1(xi<xj)i<jxjxinxij<iδji+j>i(1δij)jxi>xjxidans la liste triée. Pour terminer l'argmax, il suffit de seuiller cette couche.
À ce stade, si nous pouvions multiplier, nous obtiendrions la valeur maximale réelle assez facilement. La solution dans l'article est d'utiliser la représentation binaire des nombres, à quel point la multiplication binaire est la même que l'addition seuil. Pour obtenir juste l'argmax, il suffit d'avoir une simple fonction linéaire multipliant le ème indicateur par et sommant.ii


Enfin, pour la question suivante: pouvons-nous former un NN dans cet état? @DanScally nous a permis de démarrer; Peut-être que connaître l'architecture théorique peut nous aider à tromper la solution? (Notez que si nous pouvons apprendre / approximer l'ensemble particulier de poids ci-dessus, le filet fonctionnera réellement bien en dehors de la plage des échantillons d'entraînement.)

Carnet dans github / Colab

En changeant un peu les choses, j'obtiens un meilleur score de test (0,838), et même des tests sur un échantillon en dehors de la plage d'entraînement d'origine obtiennent un score décent (0,698). Utilisation d'entrées mises à l'échelle à[1,1]obtient le score du test jusqu'à 0,961, avec un score hors plage de 0,758. Mais, je marque avec la même méthode que @DanScally, ce qui semble un peu malhonnête: la fonction d'identité marquera parfaitement sur cette métrique. J'ai également imprimé quelques coefficients pour voir si quelque chose de proche de l'ajustement exact décrit ci-dessus apparaît (pas vraiment); et quelques sorties brutes, qui suggèrent que le modèle est trop timide pour prédire un maximum, préférant ne pas prédire qu'aucune des entrées n'est le maximum. Peut-être que modifier l'objectif pourrait aider, mais à ce stade, j'ai déjà mis trop de temps; si quelqu'un veut améliorer l'approche, n'hésitez pas à jouer (dans Colab si vous voulez) et faites le moi savoir.


Je n'ai pas encore enroulé ma tête autour du papier (qui est lourd en mathématiques ... et étonnamment vieux ...), mais même si ce n'est peut-être que le terme ambigu "réseau" qui m'a fait penser à cette association, je se demandait si on pouvait concevoir un réseau de neurones qui "émule" essentiellement un réseau de tri ...
Marco13

@ Marco13, bien sûr, je pense que l'utilisation de ce papier pour produire des NN comme comparateurs produirait une émulation NN du réseau de tri. Il serait beaucoup plus profond que celui du papier, mais la largeur pourrait-elle être réduite à une taille linéaire?
Ben Reiniger

Certes, je ne suis pas aussi profondément impliqué dans NN que je devais l'être pour dire quelque chose de profond. Mais des choses comme ~ "vous pouvez tout émuler avec deux couches" ressemble un peu aux résultats de la conception de circuits de bas niveau où vous dites que vous pouvez "implémenter chaque fonction avec deux couches de portes NAND" ou ainsi de suite. Je pense que certains des NN examinés récemment ne sont que des versions fantaisistes de choses que les gens ont déjà découvert il y a 50 ans, mais c'est peut-être une idée fausse ...
Marco13

0

Oui, même un apprentissage automatique aussi simple que les moindres carrés linéaires ordinaires peut le faire si vous utilisez une certaine intelligence appliquée.

(Mais la plupart considéreraient cette surestimation assez horrible).

(Je suppose que nous voulons trouver le maximum d'abs du vecteur d'entrée):

  1. Sélectionnez une fonction monotone décroissante de valeur absolue, par exemple
    f(x)=1x2
  2. Construisez une matrice diagonale de . Appelons-lef(r)Cr
  3. Vecteur de construction complète de ceux .S
  4. Construire et résoudre un système d'équations(ϵI+103StS+Cr)1(103St)
  5. Appelons le vecteur de résultat , ce sera une mesure de probabilité (somme à 1), nous pouvons le peser de façon non linéaire, par exemplep
    pi=pik|pi|k
  6. Calculez simplement le produit scalaire avec le vecteur d'index et arrondissez.
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.