Kann maschinelles Lernen eine Funktion wie das Finden des Maximums aus einer Liste lernen?

26

Ich habe eine Eingabe, die eine Liste ist, und die Ausgabe ist das Maximum der Elemente der Eingabeliste.

Kann maschinelles Lernen eine solche Funktion lernen, die immer das Maximum der in der Eingabe vorhandenen Eingabeelemente auswählt?

Dies mag als eine ziemlich grundlegende Frage erscheinen, aber es könnte mir ein Verständnis dafür geben, was maschinelles Lernen im Allgemeinen bewirken kann. Vielen Dank!

user78739
quelle
1
Ich denke, Sie können dies als Serienproblem versuchen, dh mit Recurrent Neural Network. Versorgen Sie das Netzwerk mit sortierten Daten.
Vipin Bansal
2
Siehe auch datascience.stackexchange.com/q/22242 , datascience.stackexchange.com/q/29345 ; Neuronale Netze können eine Eingabeliste sortieren , also mit Sicherheit ein Maximum extrahieren.
Ben Reiniger
3
@TravisBlack: Eigentlich ist dies definitiv die Art von Funktion, die Sie mit Standard-Neuronalen Netzen nicht lernen können. Angenommen, Sie fügen einfach einen Vektor mit einem Wert ein, um vorherzusagen, dass dieser Wert größer ist als der Wert, den Sie in Ihrem Trainingssatz hatten. Glauben Sie, dass das trainierte neuronale Netz Ihnen den größten Wert zurückgibt?
Cliff AB
10
@ TravisBlack NOOO! Neuronale Netze können "grundsätzlich keine" mathematische Funktion lernen. In Bezug auf die Kardinalität sind fast alle Funktionen pathologisch, fast überall diskontinuierlich. Was Sie wahrscheinlich Mittel ist, viele der Funktionen , die Mathematiker tatsächlich interessiert in passieren artig genug sein , dass neuronale Netze können nähern sie willkürlich gut. Aber das ist keineswegs dasselbe, als irgendeine Funktion erlernen zu können .
links um den
6
@leftaroundabout and Cliff: Es ist gut zu sehen, dass jemand in dem jüngsten ML / DL-Hype auf dem Boden bleibt. Die Leute benutzen NNs, und wenn Sie eine Ebene tiefer graben, bemerken Sie, dass sie oft nicht die geringste Ahnung haben, was sie tatsächlich dort tun - abgesehen von dem blinden Ändern von Parametern aus einigen Keras, zum Beispiel "Hello World", bis sie ein Muster sehen. xkcd hat genau das richtig gemacht: xkcd.com/1838 . Ich hoffe, dass hier noch jemand eine tiefgreifendere Antwort hinzufügen kann, als die derzeitige zu sein scheint. (Nichts für ungut, aber das allgemeine Unverständnis der
NNs stört

Antworten:

35

Vielleicht , aber beachten Sie, dass dies einer der Fälle ist, in denen maschinelles Lernen nicht die Antwort ist . Es besteht die Tendenz, maschinelles Lernen in Fällen zu versuchen, in denen regelbasierte Standardlösungen tatsächlich schneller, einfacher und im Allgemeinen genau die richtige Wahl sind: P

Nur weil Sie können, heißt das nicht, dass Sie sollten

Bearbeiten : Ich schrieb ursprünglich als "Ja, aber beachten Sie, dass ...", aber dann fing an, mich selbst zu bezweifeln, da ich es noch nie gesehen hatte. Ich habe es heute Nachmittag ausprobiert und es ist auf jeden Fall machbar:

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

Die Ausgabe ist 0.74576, sodass die maximalen 74,5% der Zeit korrekt ermittelt werden. Ich habe keinen Zweifel, dass dies verbessert werden könnte, aber da ich sage, dass dies kein nützlicher Fall ist, würde ich ML empfehlen.

EDIT 2 : Eigentlich habe ich heute Morgen mit dem RandomForestClassifier von sklearn erneut gestartet und es lief deutlich besser:

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

Und hier sind es 94,4% der Proben, bei denen das Maximum korrekt identifiziert wurde, was in der Tat ziemlich gut ist.

Dan Scally
quelle
1
@ TravisBlack ja ich habe es ursprünglich als "Ja, aber ..." angefangen aber dann mich selbst angezweifelt und zweideutig gemacht. Ich habe die Antwort jetzt verbessert :).
Dan Scally
16
Wenn Sie das Ganze mit Vektoren trainieren und testen, die Werte in [0,100] enthalten, liegt der Wert bei etwa 0,95. Fein. Wenn Sie es jedoch mit Werten in [0,100] trainieren und mit Werten in [100,200] testen, ist die Punktzahl praktisch Null . Sie sind mit Ihrer Bearbeitung bereits einen Schritt zurückgetreten. Aber um dies denjenigen klar zu machen, die ML blind als die Wunderwaffe sehen, die alle Probleme lösen kann: Was auch immer Sie dort lernen: Es ist NICHT "die maximale Funktion"! .
Marco,
2
(Nebenbei: Um andere über Antworten auf ihre Kommentare zu informieren, verwenden Sie @, wie in @Marco13). Zu der Frage: Ich denke, Ihre Aussage "Maschinelles Lernen ist nicht die Antwort" macht dies deutlich. Ich befürchte vor allem, dass zu viele Menschen bei der Verwendung von ML / DL / NNs nicht die erforderliche Sorgfalt anwenden , und insbesondere, wenn sie auf etwas stoßen, das so aussieht , als könnte es "ihr Problem lösen", ohne zu verstehen, warum es so scheint und somit ohne zu erkennen, wann eine "Lösung" nur ein Artefakt eines nicht so gut verstandenen Prozesses ist.
Marco,
2
@Aroth sicher; bestenfalls ist dies eine Näherung von max (), die für den Umfang der Trainingsdaten gilt, die angezeigt werden. Ich habe mit dem Problem gespielt, aber ich habe nicht die Absicht, das primäre Gefühl meiner Antwort zu beeinträchtigen, bei der es sich nicht um ML für diese Art von Problem handelt .
Dan Scally
1
@BradyGilg Standardisierung der Eingabedaten ... ähm ... obwohl Sie wahrscheinlich Recht haben, dass dies zu "besseren" Ergebnissen führen würde, wären die Ergebnisse immer noch nicht sehr sinnvoll, da der NN nicht "die maximale Funktion erlernen" soll. . Und das Argument ist in mancher Hinsicht offensichtlich sehr akademisch - ich würde sogar sagen "zu akademisch": Sie möchten die Maxima einiger Vektoren berechnen / vorhersagen, und um die Maxima zu berechnen, müssen Sie zuerst die Minima berechnen / max, um eine Normalisierung durchzuführen (oder mean / stdDev für eine Standardisierung, die auch nicht sehr sinnvoll zu sein scheint).
Marco,
26

Ja. Ganz wichtig ist, dass SIE sich für die Architektur einer Lösung für maschinelles Lernen entscheiden. Architekturen und Trainingsverfahren schreiben sich nicht von selbst; Sie müssen entworfen oder als Vorlage verwendet werden, und die Schulung dient dazu, eine Parametrisierung der Architektur zu ermitteln, die für eine Reihe von Datenpunkten geeignet ist.

Sie können eine sehr einfache Architektur erstellen, die tatsächlich eine maximale Funktion enthält:

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

Dabei sind a und b gelernte Parameter.

Bei genügend Trainingsbeispielen und einer angemessenen Trainingsroutine lernt diese sehr einfache Architektur sehr schnell, a auf 1 und b auf Null für Ihre Aufgabe zu setzen.

Maschinelles Lernen besteht häufig darin, mehrere Hypothesen über die Funktion und Transformation von Eingabedatenpunkten zu unterhalten und zu lernen, nur die Hypothesen beizubehalten, die mit der Zielvariablen korrelieren. Die Hypothesen sind explizit in der Architektur und den Unterfunktionen codiert, die in einem parametrisierten Algorithmus verfügbar sind, oder als die Annahmen, die in einem "parameterlosen" Algorithmus codiert sind.

Beispielsweise ist die Wahl der Verwendung von Punktprodukten und Nichtlinearitäten, wie sie in dem Vanille-Neuronalnetzwerk ML üblich sind, etwas willkürlich; es drückt die umfassende Hypothese aus, dass eine Funktion unter Verwendung einer vorbestimmten zusammengesetzten Netzwerkstruktur aus linearen Transformationen und Schwellenfunktionen konstruiert werden kann. Verschiedene Parametrisierungen dieses Netzwerks verkörpern verschiedene Hypothesen darüber, welche linearen Transformationen verwendet werden sollen. Jede Toolbox von Funktionen kann verwendet werden, und es ist die Aufgabe eines Maschinenschülers, durch Differenzierung oder Ausprobieren oder ein anderes wiederholbares Signal herauszufinden, welche Funktionen oder Merkmale in seinem Array eine Fehlermetrik am besten minimieren. In dem oben gegebenen Beispiel reduziert sich das gelernte Netzwerk einfach auf die maximale Funktion selbst, wohingegen ein undifferenziertes Netzwerk alternativ eine minimale Funktion "lernen" könnte. Diese Funktionen können auf andere Weise ausgedrückt oder angenähert werden, wie in der linearen oder neuronalen Netzregressionsfunktion in einer anderen Antwort. In der Summe kommt es wirklich darauf an, welche Funktionen oder LEGO-Teile Sie in Ihrer ML-Architektur-Toolbox haben.

Pygosceles
quelle
4
+1 ML ist nichts anderes als ausgefallene Regressionsgleichungen und erfordert die richtige Wahl der Gleichungen.
aidan.plenert.macdonald
4
@ aidan.plenert.macdonald Die Auswirkung und Attraktivität von ML ist jedoch, dass es keine richtige Wahl von Gleichungen gibt. Die von Ihnen gewählten Gleichungen müssen Teil des Satzes geeigneter Gleichungen sein. Es stellt sich jedoch heraus, dass der Satz für eine Vielzahl von Problemen Gleichungen enthält, die viel allgemeiner sind, als es eine sorgfältig entworfene Lösung sein könnte, aber Parameter liefern, die das Problem lösen Problem viel schneller als in den zusätzlichen Designaufwand setzen. Diese Frage ist ein gutes Beispiel dafür, wie dies die Überlegungen zum Modelldesign nicht vollständig eliminiert.
Will
Das war nie die Frage. Das OP fragte, ob ML eine Funktion wie max()(aus beschrifteten Daten) finden (/ lernen / ableiten ) kann. Sie sagten nicht " Angesichts dessen, dass Sie bereits max()einen Baustein haben"
smci
@smci Für Architekturen oder Funktionen für maschinelles Lernen gibt es keine "universelle" Priorität. Wie in meiner Antwort erwähnt, können Sie eine maximale Funktion mit stückweisen linearen Funktionen, die mit Nichtlinearitäten durchsetzt sind, approximieren. Es gibt jedoch keine universelle Regel, die besagt, dass alle ML diese bestimmte Menge von Transformationen in ihrer Toolbox verwenden müssen. Neuronale Netze verfügen häufig (aber nicht immer) über eine maximale Funktion über Max-Pooling- oder ReLU-Nichtlinearitäten. Die Anzahl der möglichen Feature-Funktionen ist unbegrenzt, weshalb ich die Rolle der Auswahl und der prädisponierten Verzerrung in der ML-Architektur hervorhole.
Pygosceles
7

Ja - Maschinelles Lernen kann lernen, das Maximum in einer Liste von Zahlen zu finden.

Hier ist ein einfaches Beispiel für das Lernen, den Index des Maximums zu finden:

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
quelle
Lernt es wirklich die "maximale" Funktion? Ein Trainingssatz von 10.000 Listen mit fünf Elementen ist eine sinnvolle Annäherung an den gesamten Eingabebereich.
Mark
2
Haftungsausschluss: Ich bin kein ML / DL-Experte. Aber ich bin mir ziemlich sicher, dass dies keinen Sinn ergibt. Ich meine: Überhaupt keinen Sinn. Wie ich es sehe, lernst du nicht die maximale Funktion. Sie lernen die Indizes der maximalen Elemente des Trainingssatzes. Wenn Sie einen Vektor eingeben, der zwei Zahlen enthält, die beide größer als die des Trainingssatzes sind, schlägt dies wahrscheinlich fehl. Ganz zu schweigen von dem Fall, dass Sie keinen 5D-, sondern einen 10D-Vektor haben. Einige Daten in eine Bibliothek zu werfen, die man nicht versteht, und ein bestimmtes Ergebnis zu sehen, bedeutet NICHT (überhaupt), dass es "funktioniert".
Marco,
Ich meine, es kommt darauf an, was "es funktioniert" bedeuten soll. Insbesondere ein Entscheidungsbaum wird immer nur eine stückweise konstante Funktion erzeugen, wobei es sich bei den Stücken um achsenausgerichtete rechteckige Kästchen handelt. Im Max-Beispiel, das auf einem festen Hyperwürfel trainiert, ist die tatsächliche Max-Funktion in einigen dreieckigen Regionen stückweise konstant. Bei ausreichenden Übungsbeispielen und ausreichender Tiefe approximiert der Baum diese dreieckigen Bereiche mit beliebiger Genauigkeit. Aber, wie bei vielen (den meisten?) Anderen Modellen, ist jedes Testmuster außerhalb der Reichweite der Trainingsmuster ziemlich aussichtslos.
Ben Reiniger
Das beweist nichts. Das OP fragte "das Maximum in einer Liste von Zahlen" . Sie haben angenommen, dass es sich um Floats im Bereich 0..1 handeln muss. Versuchen Sie, eine 2 (oder -1 oder 1,5) einzugeben, und es wird fehlschlagen.
smci
4

Lernalgorithmen

Anstatt eine Funktion als Berechnung zu lernen, die von einem vorwärtsgerichteten neuronalen Netz durchgeführt wird, gibt es eine ganze Forschungsdomäne in Bezug auf Lernalgorithmen aus Probendaten. Beispielsweise könnte man so etwas wie eine neuronale Turing-Maschine oder eine andere Methode verwenden, bei der die Ausführung eines Algorithmus durch maschinelles Lernen an seinen Entscheidungspunkten gesteuert wird. Spielzeugalgorithmen wie das Finden eines Maximums oder das Sortieren einer Liste oder das Umkehren einer Liste oder das Filtern einer Liste werden häufig als Beispiele in der Algorithmuslernforschung verwendet.

Peter ist
quelle
2

Ich werde gebildete Designs von meiner Antwort ausschließen. Nein, es ist nicht möglich , einen Out-of-the-Box-Ansatz für maschinelles Lernen (ML) zu verwenden, um die maximale Funktion für beliebige Listen mit beliebiger Genauigkeit vollständig darzustellen . ML ist eine datenbasierte Methode, und es ist klar, dass Sie eine Funktion in Regionen, in denen Sie keine Datenpunkte haben, nicht approximieren können. Daher kann der Raum möglicher Beobachtungen (der unendlich ist) nicht durch endliche Beobachtungen abgedeckt werden.

Meine Aussagen basieren theoretisch auf Cybekos Universal Approximation Theorem für neuronale Netze. Ich zitiere den Satz aus Wikipedia:

Rn

RnxR

Wenn Ihr Beobachtungsraum kompakt ist, können Sie möglicherweise die maximale Funktion mit einem endlichen Datensatz approximieren. Wie die Antwort mit den meisten Stimmen deutlich machte, sollten Sie das Rad nicht neu erfinden!

MachineLearner
quelle
1

Hier ist eine Erweiterung meines Kommentars. Zum Vorwort: @DanScally hat absolut Recht, dass es keinen Grund gibt, ML zu verwenden, um maximal eine Liste zu finden. Aber ich denke, dass Ihr "es mir ein Verständnis dafür geben könnte, was maschinelles Lernen im Allgemeinen bewirken kann" Grund genug ist, sich damit auseinanderzusetzen.

maxmax


maxmaxmax

n n

argmaxn(n2)δij=1(xi<xj)i<jxjxinxij<iδji+j>i(1δij)jxi>xjxiin der sortierten Liste. Um den Argmax-Wert zu vervollständigen, müssen Sie nur diesen Layer als Schwellenwert festlegen. Wenn wir zu diesem Zeitpunkt multiplizieren könnten, würden wir ziemlich leicht den tatsächlichen Maximalwert erhalten. Die Lösung in diesem Artikel besteht darin, die binäre Darstellung der Zahlen zu verwenden. An diesem Punkt entspricht die binäre Multiplikation der Schwellenaddition. Um nur den Argmax zu erhalten, genügt eine einfache lineare Funktion, bei der der te Indikator mit multipliziert und summiert wird.ii
ii


Zum Schluss für die folgende Frage: Können wir einen NN in diesen Zustand schulen? Mit @DanScally haben wir angefangen. Vielleicht hilft uns die Kenntnis der theoretischen Architektur, die Lösung zu finden? (Beachten Sie, dass das Netz auch außerhalb des Bereichs der Trainingsmuster eine gute Leistung erbringt, wenn wir den oben angegebenen Satz von Gewichten kennen / schätzen können.)

Notizbuch in Github / Colab

Wenn ich etwas ändere, bekomme ich eine bessere Testnote (0,838), und selbst wenn ich eine Probe außerhalb des ursprünglichen Trainingsbereichs teste, bekomme ich eine anständige Note (0,698). Verwenden von Eingängen, die auf skaliert sind[1,1]Erhöht die Testnote auf 0,961, mit einer Out-of-Range-Note von 0,758. Aber ich bewerte mit der gleichen Methode wie @DanScally, was ein wenig unehrlich erscheint: Die Identitätsfunktion wird bei dieser Metrik perfekt abschneiden. Ich habe auch ein paar Koeffizienten ausgedruckt, um zu sehen, ob etwas in der Nähe der oben beschriebenen exakten Anpassung erscheint (nicht wirklich); und ein paar rohe Ausgaben, die darauf hindeuten, dass das Modell ein Maximum zu ängstlich vorhersagt, und auf der Seite der Vorhersage, dass keine der Eingaben das Maximum ist, irren. Vielleicht könnte es helfen, das Ziel zu ändern, aber an diesem Punkt habe ich bereits zu viel Zeit investiert. Wenn jemand die Herangehensweise verbessern möchte, kann er gerne mitspielen (in Colab, wenn er möchte) und mich informieren.

Ben Reiniger
quelle
Ich habe meinen Kopf noch nicht um die Zeitung gewickelt (die mathelastig ist ... und überraschend alt ...), aber obwohl es vielleicht nur der mehrdeutige Begriff "Netzwerk" ist, der mich an diese Assoziation erinnert, habe ich fragte sich, ob man ein Design könnte neuronale Netzwerk , dass im wesentlichen „emuliert“ ein Sortiernetz ...
Marco13
@ Marco13, klar, ich denke, dass die Verwendung dieses Papiers zum Erzeugen von NNs als Komparatoren eine NN-Emulation des Sortiernetzwerks erzeugen würde. Es wäre viel tiefer als das Papier, aber die Breite könnte auf ein lineares Format verkleinert werden?
Ben Reiniger
Zugegeben, ich bin bei weitem nicht so tief in NN verwickelt, wie ich es sein musste, um etwas Tiefgründiges zu sagen. Aber Dinge wie ~ "Sie können alles mit zwei Ebenen emulieren" klingen ein bisschen wie die Ergebnisse eines Schaltungsentwurfs auf niedriger Ebene, bei dem Sie sagen, dass Sie "jede Funktion mit zwei Ebenen von NAND-Gattern implementieren können" oder so weiter. Ich denke, dass einige der NNs, die kürzlich untersucht wurden, nur ausgefallene Versionen von Dingen sind, die die Leute bereits vor 50 Jahren entdeckt haben, aber vielleicht ist dies ein Missverständnis ...
Marco13
0

Ja, selbst so einfaches maschinelles Lernen wie gewöhnliche lineare kleinste Quadrate kann dies mit etwas angewandter Klugheit tun.

(Aber die meisten würden diesen schrecklichen Overkill für möglich halten).

(Ich gehe davon aus, dass wir maximal abs des Eingabevektors finden wollen):

  1. Wählen Sie eine monoton abnehmende Funktion des Absolutwerts, zum Beispiel
    f(x)=1x2
  2. Bilde eine diagonale Matrix von . Nennen wir esf(r)Cr
  3. Build Vektor volle Einsen .S
  4. Bilde und löse das Gleichungssystem(ϵI+103StS+Cr)1(103St)
  5. Nennen wir den Ergebnisvektor , es ist ein Wahrscheinlichkeitsmaß (Summe zu 1), wir können es nichtlinear nachwägen, zum Beispielp
    pi=pik|pi|k
  6. Berechnen Sie einfach das Skalarprodukt mit dem Indexvektor und der Rundung.
mathreadler
quelle