L'apprendimento automatico può apprendere una funzione come trovare il massimo da un elenco?


26

Ho un input che è un elenco e l'output è il massimo degli elementi dell'elenco input.

L'apprendimento automatico può apprendere una tale funzione che seleziona sempre il massimo degli elementi di input presenti nell'input?

Questa potrebbe sembrare una domanda piuttosto elementare, ma potrebbe darmi una comprensione di ciò che l'apprendimento automatico può fare in generale. Grazie!


1
Penso che tu possa provare questo come un problema in serie, ad esempio usando la rete neurale ricorrente. Invia i dati ordinati alla rete.
vipin bansal

2
Vedi anche datascience.stackexchange.com/q/22242 , datascience.stackexchange.com/q/29345 ; le reti neurali possono ordinare un elenco di input, quindi sicuramente possono estrarre un massimo.
Ben Reiniger,

3
@TravisBlack: in realtà, questo è sicuramente il tipo di funzione che non puoi imparare con le reti neurali standard. Ad esempio, supponiamo di collegare semplicemente un vettore con un valore per prevedere che era maggiore di qualsiasi valore presente nel set di allenamento. Pensi che la rete neurale addestrata ti restituirà quel valore più grande?
Cliff AB

10
@TravisBlack NOOO! Le reti neurali non possono apprendere "praticamente nessuna" funzione matematica. Per quanto riguarda la cardinalità, quasi tutte le funzioni sono patologiche quasi ovunque discontinue. Quello che probabilmente media è, un sacco di funzioni che i matematici sono in realtà interessavano in capita di essere abbastanza ben educati che le reti neurali possono approssimare loro arbitrariamente bene. Ma non è affatto la stessa cosa di essere in grado di apprendere qualsiasi funzione .
leftaroundabout

6
@leftaroundabout e Cliff: è bello vedere che qualcuno rimane a terra nel recente hype ML / DL. Le persone usano le NN e, quando scavi di un livello più in profondità, noti che spesso non hanno la minima idea di quello che stanno effettivamente facendo lì - oltre a modificare ciecamente i parametri da alcuni esempi di keras "Hello World" fino a quando non vedono qualche schema. xkcd ha capito esattamente: xkcd.com/1838 . Spero che qualcuno possa ancora aggiungere una risposta qui più profonda di quella attuale. (Senza offesa per nessuno, ma la comune mancanza di comprensione delle NN mi infastidisce ...)
Marco13

Risposte:


35

Forse , ma nota che questo è uno di quei casi in cui l'apprendimento automatico non è la risposta . Vi è la tendenza a provare e l'apprendimento automatico di calzascarpe nei casi in cui le soluzioni basate su regole standard di palude sono più veloci, più semplici e generalmente la scelta giusta: P

Solo perché puoi, non significa che dovresti

Modifica : originariamente ho scritto questo come "Sì, ma nota che ..." ma poi ho iniziato a dubitare di me stesso, non avendo mai visto farlo. L'ho provato oggi pomeriggio ed è certamente fattibile:

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

L'output è 0.74576, quindi trova correttamente il massimo 74,5% delle volte. Non ho dubbi sul fatto che ciò potrebbe essere migliorato, ma poiché dico che questo non è un caso d'uso, consiglierei per ML.

EDIT 2 : In realtà stamattina ho ripetuto di nuovo usando RandomForestClassifier di sklearn e ha funzionato significativamente meglio:

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

E il punteggio qui è il 94,4% dei campioni con il massimo identificato correttamente, il che è piuttosto buono.


1
@TravisBlack sì, inizialmente l'avevo iniziato come "Sì, ma ..." ma poi ho dubitato di me stesso e mi sono sentito equivoco. Ho migliorato la risposta ora :).
Dan Scally,

16
Durante l'addestramento e il test del tutto con vettori che contengono valori in [0,100], il punteggio è circa 0,95. Belle. Ma quando lo si allena con i valori in [0,100] e si prova con i valori in [100.200], il punteggio è praticamente zero . Hai già fatto un passo indietro con la tua modifica. Ma per renderlo chiaro in modo inequivocabile per coloro che vedono ciecamente ML come l'arma miracolosa che può risolvere tutti i problemi: qualunque cosa tu stia imparando lì: NON è "la massima funzione"! .
Marco13

2
(A parte: per comunicare agli altri le risposte ai loro commenti, utilizzare @, come in @Marco13). Per quanto riguarda la domanda: penso che la tua affermazione "l'apprendimento automatico non è la risposta" lo chiarisca. Temo principalmente che troppe persone non applichino il controllo appropriato quando usano ML / DL / NN e, in particolare, quando incontrano qualcosa che sembra possa "risolvere il loro problema", senza capire perché sembra farlo e quindi senza riconoscere quando una "soluzione" è solo un artefatto di un processo non così ben compreso.
Marco13

2
@aroth sicuro; nella migliore delle ipotesi questa è un'approssimazione di max () applicabile all'ambito dei dati di addestramento che viene visto. Stavo giocando con il problema, ma non intendo sminuire il sentimento primario della mia risposta, che non è usare ML per questo tipo di problema .
Dan Scally il

1
@BradyGilg Standardizzare i dati di input ... uhhm ... anche se probabilmente hai ragione nel dire che ciò produrrebbe risultati "migliori", i risultati non avrebbero ancora molto senso, perché NN non sta "imparando la massima funzione" . E l'argomento è ovviamente in qualche modo molto accademico - direi anche "troppo accademico": vuoi calcolare / prevedere i massimi di alcuni vettori e, per calcolare il massimo, devi prima calcolare il minimo / max per eseguire una normalizzazione (o mean / stdDev per una standardizzazione, che non sembra neanche molto ragionevole).
Marco13,

26

Sì. Molto importante, decidi tu l'architettura di una soluzione di apprendimento automatico. Le architetture e le procedure di formazione non si scrivono da sole; devono essere progettati o modellati e la formazione segue come mezzo per scoprire una parametrizzazione dell'architettura adatta a un insieme di punti dati.

È possibile costruire un'architettura molto semplice che in realtà include una funzione massima:

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

dove un e b sono apprese parametri.

Dati abbastanza campioni di allenamento e una ragionevole routine di allenamento, questa architettura molto semplice imparerà molto rapidamente a impostare a 1 e b a zero per il tuo compito.

L'apprendimento automatico spesso assume la forma di intrattenere molteplici ipotesi sulla featurization e la trasformazione dei punti di dati di input e di imparare a preservare solo quelle ipotesi correlate alla variabile target. Le ipotesi sono codificate esplicitamente nell'architettura e nelle sotto-funzioni disponibili in un algoritmo parametrizzato o come ipotesi codificate in un algoritmo "senza parametri".

Ad esempio, la scelta di usare prodotti a punti e non linearità come è comune nella rete neurale alla vaniglia ML è in qualche modo arbitraria; esprime l'ipotesi comprensiva che una funzione può essere costruita usando una struttura di rete compositiva predeterminata di trasformazioni lineari e funzioni di soglia. Diverse parametrizzazioni di quella rete incarnano ipotesi diverse su quali trasformazioni lineari usare. È possibile utilizzare qualsiasi toolbox di funzioni e il compito di uno studente di macchine è scoprire attraverso la differenziazione o la prova ed errore o qualche altro segnale ripetibile quali funzioni o caratteristiche nella sua matrice minimizzano al meglio una metrica di errore. Nell'esempio sopra riportato, la rete appresa si riduce semplicemente alla massima funzione stessa, mentre una rete indifferenziata potrebbe in alternativa "apprendere" una funzione minima. Queste funzioni possono essere espresse o approssimate con altri mezzi, come nella funzione di regressione della rete lineare o neurale in un'altra risposta. In breve, dipende davvero da quali funzioni o pezzi LEGO hai nella tua cassetta degli attrezzi dell'architettura ML.


4
+1 ML non è altro che fantasiose equazioni di regressione e richiede la giusta scelta di equazioni.
aidan.plenert.macdonald

4
@ aidan.plenert.macdonald, tuttavia, l'impatto e il fascino di ML è che non esiste una scelta giusta di equazioni. Le equazioni scelte devono essere un membro dell'insieme di equazioni adatte, ma risulta che per una vasta gamma di problemi che contengono equazioni sono molto più generalizzate di quanto potrebbe essere una soluzione progettata con cura, ma producono parametri che risolvono il problema molto più rapidamente rispetto allo sforzo di progettazione aggiuntivo. Questa domanda è un buon esempio di come ciò non elimini del tutto le considerazioni sulla progettazione del modello.
Will

Non è mai stata la domanda. L'OP ha chiesto se ML può trovare (/ apprendere / dedurre) una funzione simile max()(dai dati etichettati). Non hanno detto " Dato che hai già max()come blocco"
smci

@smci Non esiste un precedente "universale" per architetture o funzioni di machine learning. Come accennato nella mia risposta, puoi approssimare una funzione massima usando funzioni lineari a tratti intervallate da non linearità - ma non esiste una regola universale che dice che tutto ML deve usare quel particolare insieme di trasformazioni nella sua cassetta degli attrezzi. Le reti neurali spesso (ma non sempre) hanno una funzione massima a loro disposizione tramite il non pooling MaxLing o ReLU. Il numero di possibili funzioni è illimitato, motivo per cui metto in evidenza il ruolo della scelta e la predisposizione all'architettura ML.
pygosceles il

7

Sì - L'apprendimento automatico può imparare a trovare il massimo in un elenco di numeri.

Ecco un semplice esempio di apprendimento per trovare l'indice del massimo:

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

Sta davvero imparando la funzione "massima"? Un set di formazione di 10.000 elenchi a cinque elementi è un'approssimazione ragionevole dell'intero spazio di input.
Mark

2
Disclaimer: non sono un esperto di ML / DL. Ma sono abbastanza sicuro che questo non abbia alcun senso. Voglio dire: non ha senso. A mio avviso, non stai imparando la funzione massima. Stai imparando gli indici degli elementi massimi del set di allenamento. Se si inserisce un vettore che contiene due numeri che sono entrambi più grandi di quello del set di addestramento, probabilmente fallirebbe. Per non parlare del caso in cui non si ha un vettore 5D ma un vettore 10D. Lanciare alcuni dati in una libreria che non si intrattengono e vedere un certo risultato NON (affatto) significa che "funziona".
Marco13

Voglio dire, dipende da cosa dovrebbe significare "funziona". Un albero decisionale in particolare produrrà sempre e solo una funzione costante a tratti, poiché i pezzi sono scatole rettangolari allineate agli assi. Nell'esempio massimo, allenandosi su un ipercubo solido, la funzione massima effettiva è costante a tratti su alcune specie triangolari di regioni. Dati sufficienti esempi di addestramento e profondità, l'albero approssimherà queste regioni triangolari con precisione arbitraria. Ma, come con molti (la maggior parte?) Altri modelli, tutti i campioni di test al di fuori della gamma dei campioni di addestramento sono piuttosto senza speranza.
Ben Reiniger,

Questo non dimostra nulla. L'OP ha chiesto "il massimo in un elenco di numeri" . Hai pensato che dovessero essere float nell'intervallo 0..1. Prova a inserire un 2 (o -1, o 1.5) e fallirà.
smci,

4

Algoritmi di apprendimento

Invece di apprendere una funzione come un calcolo fatto da una rete neurale feed-forward, c'è un intero dominio di ricerca riguardante gli algoritmi di apprendimento dai dati di esempio. Ad esempio, si potrebbe usare qualcosa come una Neural Turing Machine o qualche altro metodo in cui l'esecuzione di un algoritmo è controllata dall'apprendimento automatico nei suoi punti di decisione. Gli algoritmi giocattolo come trovare un massimo o ordinare un elenco, invertire un elenco o filtrare un elenco sono comunemente usati come esempi nella ricerca sull'apprendimento di algoritmi.


2

Escluderò i disegni educati dalla mia risposta. No, non è possibile utilizzare un fuori l'approccio machine learning scatola (ML) per pienamente rappresentare la funzione di massima per le arbitrarie liste con precisione arbitraria. ML è un metodo basato sui dati ed è chiaro che non sarai in grado di approssimare una funzione in regioni in cui non hai punti dati. Quindi, lo spazio di possibili osservazioni (che è infinito) non può essere coperto da osservazioni finite.

Le mie dichiarazioni hanno una base teorica con il Teorema di approssimazione universale di Cybeko per le reti neurali. Citerò il teorema di Wikipedia:

Rn

RnxR

Se il tuo spazio di osservazioni è compatto, potresti essere in grado di approssimare la funzione massima con un set di dati finito. Come la risposta più votata ha chiarito che non dovresti reinventare la ruota!


1

Ecco un'espansione sul mio commento. Per prefazione, assolutamente @DanScally ha ragione nel dire che non c'è motivo di usare ML per trovare un massimo di un elenco. Ma penso che il tuo "potrebbe darmi una comprensione di ciò che l'apprendimento automatico può fare in generale" è una buona ragione per approfondire questo.

maxmax


maxmaxmax

n n

argmaxn(n2)δij=1(xi<xj)i<jxjxinxij<iδji+j>i(1δij)jxi>xjxi
ii


Infine, per la domanda successiva: possiamo addestrare un NN in questo stato. @DanScally ci ha fatto iniziare; forse conoscere l'architettura teorica può aiutarci a imbrogliare nella soluzione? (Si noti che se possiamo apprendere / approssimare il particolare insieme di pesi sopra, la rete effettivamente funzionerà ben al di fuori della gamma dei campioni di allenamento.)

Quaderno in github / Colab

[1,1]ottiene il punteggio del test fino a 0,961, con un punteggio fuori range di 0,758. Ma sto segnando con lo stesso metodo di @DanScally, il che sembra un po 'disonesto: la funzione di identità avrà un punteggio perfetto su questa metrica. Ho anche stampato alcuni coefficienti per vedere se appare qualcosa di simile all'adattamento esatto sopra descritto (non proprio); e alcuni output non elaborati, che suggeriscono che il modello è troppo timido nel prevedere un massimo, errando sul lato della previsione che nessuno degli input è il massimo. Forse modificare l'obiettivo potrebbe aiutare, ma a questo punto ho già dedicato troppo tempo; se qualcuno si preoccupa di migliorare l'approccio, sentiti libero di giocare (se vuoi in Colab) e fammi sapere.


Non ho ancora avvolto la testa attorno al foglio (che è pesante per la matematica ... e sorprendentemente vecchio ...), ma anche se potrebbe essere solo il termine ambiguo "rete" che mi ha fatto venire in mente questa associazione, io si chiedeva se si potesse progettare una rete neurale che essenzialmente "emula" una rete di smistamento ...
Marco13

@ Marco13, certo, penso che usare quella carta per produrre NN come comparatori produrrebbe un'emulazione NN della rete di smistamento. Sarebbe molto più profondo di quello della carta, ma la larghezza potrebbe ridursi a dimensioni lineari?
Ben Reiniger,

Certo, non sono così profondamente coinvolto in NN come avrei dovuto essere per dire qualcosa di profondo. Ma cose come ~ "puoi emulare tutto con due livelli" suona un po 'come i risultati della progettazione di circuiti di basso livello in cui dici che puoi "implementare ogni funzione con due strati di porte NAND" o quant'altro. Penso che alcune delle NN che sono state esaminate di recente siano solo versioni fantasiose di cose che la gente ha già scoperto 50 anni fa, ma forse questo è un malinteso ...
Marco13

0

Sì, anche l'apprendimento automatico semplice quanto i minimi quadrati lineari ordinari può farlo se si utilizza una certa intelligenza applicata.

(Ma la maggior parte considererebbe questo eccessivo orribile).

(Presumo che vogliamo trovare il massimo degli addominali del vettore di input):

  1. f(X)=1X2
  2. f(r)Cr
  3. S
  4. (εio+103StS+Cr)-1(103St)
  5. p
    pio=pioKΣ|pio|K
  6. Basta calcolare il prodotto scalare con il vettore indice e arrotondare.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.