Czy uczenie maszynowe może nauczyć się funkcji wyszukiwania maksimum z listy?

26

Mam dane wejściowe, które są listą, a dane wyjściowe to maksimum elementów listy wejściowej.

Czy uczenie maszynowe może nauczyć się takiej funkcji, która zawsze wybiera maksimum elementów wejściowych obecnych na wejściu?

To może wydawać się dość podstawowym pytaniem, ale może dać mi zrozumienie tego, co uczenie maszynowe może zrobić w ogóle. Dzięki!

użytkownik78739
źródło
1
Myślę, że możesz wypróbować to jako problem szeregowy, np. Używając Recurrent Neural Network. Przesyłaj posortowane dane do sieci.
vipin bansal
2
Zobacz także: datascience.stackexchange.com/q/22242 , datascience.stackexchange.com/q/29345 ; sieci neuronowe mogą sortować listę danych wejściowych, więc na pewno można wyodrębnić maksimum.
Ben Reiniger
3
@TravisBlack: w rzeczywistości jest to zdecydowanie rodzaj funkcji, której nie można się nauczyć za pomocą standardowych sieci neuronowych. Jako przykład załóżmy, że po prostu podłączasz wektor z wartością, aby przewidzieć, że jest on większy niż jakakolwiek wartość w twoim zestawie treningowym. Czy uważasz, że wyszkolona sieć neuronowa zwróci ci tę największą wartość?
Cliff AB
10
@TravisBlack NOOO! Sieci neuronowe nie mogą nauczyć się „zasadniczo żadnej” funkcji matematycznej. Pod względem kardynalności prawie wszystkie funkcje są patologiczne, prawie wszędzie nieciągłe. To, co prawdopodobnie masz na myśli, to fakt, że wiele funkcji, którymi matematycy są naprawdę zainteresowani , jest wystarczająco dobrze zachowanych, aby sieci neuronowe mogły je dowolnie dobrze zbliżyć . Ale to wcale nie to samo, co możliwość uczenia się dowolnej funkcji .
leftaroundabout
6
@leftaroundabout i Cliff: Dobrze jest widzieć, że ktoś pozostaje na ziemi w ostatnim hype ML / DL. Ludzie używają NN, a kiedy kopiesz o jeden poziom głębiej, zauważasz, że często nie mają najmniejszego pojęcia, co tak naprawdę tam robią - poza ślepą modyfikacją parametrów z niektórych przykładów „Hello World” kamery, dopóki nie zobaczą jakiegoś wzoru. xkcd dokładnie to zrobił : xkcd.com/1838 . Mam nadzieję, że ktoś nadal może dodać tutaj odpowiedź głębszą niż obecne. (Bez obrazy dla nikogo, ale powszechny brak zrozumienia NN wkurza mnie ...)
Marco13

Odpowiedzi:

35

Być może , ale zauważ, że jest to jeden z tych przypadków, w których uczenie maszynowe nie jest odpowiedzią . Istnieje tendencja do próbowania uczenia maszynowego w przypadkach, w których naprawdę standardowe rozwiązania oparte na regułach są szybsze, prostsze i po prostu właściwy wybór: P

To, że możesz, nie oznacza, że ​​powinieneś

Edycja : Pierwotnie napisałem to jako „Tak, ale zauważcie, że ...”, ale potem zacząłem wątpić w siebie, ponieważ nigdy tego nie widziałem. Wypróbowałem to dziś po południu i na pewno jest to wykonalne:

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

Wyjście wynosi 0,74576, więc poprawnie znajduje maks. 74,5% czasu. Nie mam wątpliwości, że można to poprawić, ale jak mówię, nie jest to przypadek użycia, który poleciłbym ML.

EDYCJA 2 : Dziś rano uruchomiłem ponownie za pomocą RandomForestClassifier sklearn i działało znacznie lepiej:

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

Wynik tutaj to 94,4% próbek z poprawnie zidentyfikowanym maksimum, co jest naprawdę całkiem dobre.

Dan Scally
źródło
1
@TravisBlack tak, początkowo zacząłem jako „Tak, ale ...”, ale potem zwątpiłem w siebie i zachwiałem się. Poprawiłem odpowiedź teraz :).
Dan Scally
16
Podczas treningu i testowania całości za pomocą wektorów, które zawierają wartości w [0,100], wynik wynosi około 0,95. W porządku. Ale podczas trenowania z wartościami w [0,100] i testowania z wartościami w [100,200] wynik jest praktycznie zerowy . Cofnąłeś się już ze swoją edycją. Ale aby to jednoznacznie wyjaśnić dla tych, którzy ślepo postrzegają ML jako cudowną broń, która może rozwiązać wszystkie problemy: Cokolwiek się tam uczysz: NIE jest to „funkcja maksymalna”! .
Marco13
2
(Na bok: Aby powiadomić innych o odpowiedziach na ich komentarze, użyj @, jak w @Marco13). Jeśli chodzi o pytanie: myślę, że stwierdzenie „uczenie maszynowe nie jest odpowiedzią” wyjaśnia. Obawiam się głównie, że zbyt wiele osób nie stosuje odpowiedniej kontroli podczas korzystania z ML / DL / NN, a zwłaszcza, gdy napotyka coś, co wygląda na to, że „rozwiązuje ich problem”, nie rozumiejąc, dlaczego tak się dzieje. , a zatem bez rozpoznania, kiedy „rozwiązanie” jest jedynie artefaktem niezbyt dobrze rozumianego procesu.
Marco13
2
@aroth pewny; w najlepszym wypadku jest to przybliżenie wartości max () stosowanej do zakresu danych szkolenia, które jest widoczne. Bawiłem się tym problemem, ale nie zamierzam umniejszać pierwotnego sentymentu mojej odpowiedzi, którym jest nie używanie ML do tego rodzaju problemów .
Dan Scally
1
@BradyGilg Standaryzacja danych wejściowych ... uhm ... chociaż prawdopodobnie masz rację, że przyniosłoby to „lepsze” wyniki, wyniki nadal nie miałyby większego sensu, ponieważ NN nie „uczy się funkcji maksymalnej” . Argument jest pod pewnymi względami bardzo akademicki - powiedziałbym nawet „zbyt akademicki”: chcesz obliczyć / przewidzieć maksimum niektórych wektorów, a aby obliczyć maksimum, musisz najpierw obliczyć min / max, aby wykonać normalizację (lub oznaczać / stdDev dla standaryzacji, co również nie wydaje się zbyt rozsądne).
Marco13
26

Tak. Bardzo ważne, TY decydujesz o architekturze rozwiązania do uczenia maszynowego. Architektury i procedury szkoleniowe nie piszą same; muszą być zaprojektowane lub wzorowane, a szkolenie odbywa się w celu odkrycia parametryzacji architektury dopasowanej do zestawu punktów danych.

Możesz zbudować bardzo prostą architekturę, która faktycznie zawiera maksymalną funkcję:

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

gdzie a i b są wyuczonymi parametrami.

Biorąc pod uwagę wystarczającą liczbę próbek treningowych i rozsądną rutynę treningową, ta bardzo prosta architektura nauczy się bardzo szybko ustawiać od 1 do b na zero dla twojego zadania.

Uczenie maszynowe często przyjmuje formę przyjmowania wielu hipotez dotyczących featuryzacji i transformacji wejściowych punktów danych oraz uczenia się zachowania tylko tych hipotez, które są skorelowane ze zmienną docelową. Hipotezy są zakodowane jawnie w architekturze i podfunkcjach dostępnych w sparametryzowanym algorytmie lub jako założenia zakodowane w algorytmie „bez parametrów”.

Na przykład wybór produktów kropkowych i nieliniowości, jak to jest powszechne w waniliowej sieci neuronowej ML, jest nieco arbitralny; wyraża on obejmującą hipotezę, że funkcję można skonstruować przy użyciu z góry określonej struktury sieci kompozycyjnej transformacji liniowych i funkcji progowych. Różne parametryzacje tej sieci ucieleśniają różne hipotezy, które transformacje liniowe zastosować. Można użyć dowolnego przybornika funkcji, a zadaniem uczącego się maszyny jest odkrycie poprzez różnicowanie lub próbę i błąd lub inny powtarzalny sygnał, które funkcje lub cechy w jego tablicy najlepiej minimalizują wskaźnik błędów. W podanym powyżej przykładzie wyuczona sieć po prostu ogranicza się do samej funkcji maksymalnej, podczas gdy niezróżnicowana sieć może alternatywnie „nauczyć się” funkcji minimalnej. Funkcje te mogą być wyrażone lub aproksymowane innymi sposobami, jak w liniowej lub neuronowej funkcji regresji sieci w innej odpowiedzi. Podsumowując, tak naprawdę zależy to od funkcji lub elementów LEGO, które masz w zestawie narzędzi architektury ML.

pygosceles
źródło
4
+1 ML to nic innego jak fantazyjne równania regresji i wymaga właściwego wyboru równań.
aidan.plenert.macdonald
4
@ aidan.plenert.macdonald jednak wpływ i atrakcyjność ML polega na tym, że nie ma jednego właściwego wyboru równań. Wybrane równania muszą należeć do zbioru odpowiednich równań, ale okazuje się, że dla szerokiego zakresu problemów zestaw ten zawiera równania, które są znacznie bardziej uogólnione niż mogłoby być starannie zaprojektowane rozwiązanie, ale parametry wydajności, które rozwiązują problem znacznie szybciej niż wkładanie dodatkowego wysiłku projektowego. To pytanie jest dobrym przykładem tego, w jaki sposób nie eliminuje to całkowicie zagadnień związanych z projektowaniem modelu.
Czy
To nigdy nie było pytanie. OP zapytał, czy ML może znaleźć (/ nauczyć / wnioskować) funkcję podobną max()(z danych oznaczonych). Nie powiedzieli „ Biorąc pod uwagę, że masz jużmax()
cegiełkę
@smci Nie ma „uniwersalnego” wcześniejszego architektury lub funkcji uczenia maszynowego. Jak wspomniano w mojej odpowiedzi, możesz aproksymować funkcję maksymalną za pomocą częściowych funkcji liniowych przeplatanych nieliniowościami - ale nie ma uniwersalnej reguły, która mówi, że wszystkie ML musi używać tego konkretnego zestawu transformacji w swoim zestawie narzędzi. Sieci neuronowe często (ale nie zawsze) mają do dyspozycji maksymalną funkcję dzięki nieliniowości Max Pooling lub ReLU. Liczba możliwych funkcji funkcji jest nieograniczona, dlatego podkreślam rolę wyboru i predyspozycji stronniczości w architekturze ML.
pygosceles
7

Tak - uczenie maszynowe może nauczyć się znajdować maksimum na liście liczb.

Oto prosty przykład nauki znajdowania indeksu maksimum:

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
źródło
Czy naprawdę uczy się funkcji „maksymalnej”? Zestaw szkoleniowy zawierający 10 000 list pięcioelementowych jest rozsądnym przybliżeniem całej przestrzeni wejściowej.
Mark
2
Oświadczenie: Nie jestem ekspertem od ML / DL. Ale jestem całkiem pewien, że to nie ma sensu. Mam na myśli: zupełnie bez sensu. Jak widzę, nie uczysz się funkcji maksymalnej. Uczysz się wskaźników maksymalnych elementów zestawu treningowego. Jeśli wprowadzisz wektor, który zawiera dwie liczby, które są większe niż ta z zestawu treningowego, prawdopodobnie się nie powiedzie. Nie wspominając o przypadku, w którym nie masz wektora 5D, ale wektor 10D. Wrzucenie do biblioteki niektórych danych, których się nie rozumie, i zobaczenie określonego wyniku NIE (wcale) oznacza, że ​​„działa”.
Marco13
To znaczy, to zależy od tego, co „to działa” powinno oznaczać. W szczególności drzewo decyzyjne będzie zawsze generować funkcję stałą w kawałkach, przy czym elementy są prostokątnymi prostokątami wyrównanymi do osi. W przykładzie maks., Ćwicząc na stałym hipersześcianie, rzeczywista funkcja maksimum jest stała dla niektórych trójkątnych obszarów. Biorąc pod uwagę wystarczającą liczbę przykładów treningu i głębokość, drzewo zbliży te trójkątne regiony do dowolnej dokładności. Ale, podobnie jak w przypadku wielu (większości?) Innych modeli, próbki testowe poza zakresem próbek treningowych są dość beznadziejne.
Ben Reiniger
To niczego nie dowodzi. OP poprosił o „maksimum na liście liczb” . Zakładasz, że muszą to być liczby zmiennoprzecinkowe z zakresu 0..1. Spróbuj wpisać 2 (lub -1 lub 1,5), a to się nie powiedzie.
smci
4

Algorytmy uczenia się

Zamiast uczyć się funkcji jako obliczenia wykonywanego przez sieć neuronową ze sprzężeniem zwrotnym, istnieje cała dziedzina badawcza dotycząca uczenia algorytmów z przykładowych danych. Na przykład, można użyć czegoś takiego jak Neural Turing Machine lub innej metody, w której wykonywanie algorytmu jest kontrolowane przez uczenie maszynowe w jego punktach decyzyjnych. Algorytmy zabawkowe, takie jak znalezienie maksimum, sortowanie listy, odwracanie listy lub filtrowanie listy, są często używane jako przykłady w badaniach uczenia się algorytmów.

Piotr jest
źródło
2

Wykluczę wykształcone projekty z mojej odpowiedzi. Nie, nie jest możliwe zastosowanie niestandardowego uczenia maszynowego (ML) w celu pełnego przedstawienia maksymalnej funkcji dla dowolnych list z dowolną precyzją. ML jest metodą opartą na danych i jasne jest, że nie będzie można przybliżyć funkcji w regionach, w których nie ma żadnych punktów danych. Stąd przestrzeń możliwych obserwacji (która jest nieskończona) nie może być objęta obserwacjami skończonymi.

Moje stwierdzenia mają teoretyczne podstawy z uniwersalnym twierdzeniem aproksymacji Cybeko dla sieci neuronowych. Zacytuję twierdzenie z Wikipedii:

Rn

RnxR

Jeśli twoja przestrzeń obserwacji jest niewielka, możesz być w stanie przybliżyć maksymalną funkcję za pomocą skończonego zestawu danych. Ponieważ w głosowaniu znalazła się odpowiedź najlepiej głosująca, nie należy wymyślać koła na nowo!

MachineLearner
źródło
1

Oto rozwinięcie mojego komentarza. Przedmowa absolutnie @DanScally ma rację, że nie ma powodu, aby używać ML do znalezienia maksimum listy. Ale myślę, że twoje „może dać mi zrozumienie tego, co uczenie maszynowe może zrobić ogólnie” jest wystarczającym powodem do zagłębienia się w to.

maxmax


maxmaxmax

n n

argmaxn(n2)δij=1(xi<xj)i<jxjxinxij<iδji+j>i(1δij)jxi>xjxi ja ja
W tym momencie, gdybyśmy mogli pomnożyć, dość łatwo uzyskalibyśmy rzeczywistą wartość maksymalną. Rozwiązaniem w artykule jest użycie binarnej reprezentacji liczb, w której mnożenie binarne jest takie samo jak dodawanie progowe. Aby uzyskać argmax, wystarczy prosta funkcja liniowa mnożąca ty wskaźnik przez i sumująca.ii


Wreszcie, na kolejne pytanie: czy możemy wyszkolić NN do tego stanu. @ DanScally nas rozpoczął; może znajomość teoretycznej architektury może pomóc nam oszukać rozwiązanie? (Należy pamiętać, że jeśli możemy nauczyć się / przybliżać określony zestaw wag powyżej, sieć faktycznie będzie działać dobrze poza zakresem próbek treningowych.)

Notatnik w github / Colab

Zmieniając nieco troszeczkę, otrzymuję lepszy wynik testu (0,838), a nawet testowanie próbki poza oryginalnym zakresem treningowym daje przyzwoity wynik (0,698). Używanie danych wejściowych skalowanych do[1,1]otrzymuje wynik testu do 0,961, z wynikiem poza zakresem wynoszącym 0,758. Ale oceniam za pomocą tej samej metody co @DanScally, co wydaje się trochę nieuczciwe: funkcja tożsamości będzie perfekcyjnie oceniać w tej metodzie. Wydrukowałem także kilka współczynników, aby zobaczyć, czy pojawia się coś zbliżonego do wyżej opisanego dokładnego dopasowania (nie do końca); i kilka nieprzetworzonych wyników, które sugerują, że model jest zbyt nieśmiały, aby przewidzieć maksimum, błędnie po stronie przewidywania, że ​​żadne z danych wejściowych nie jest maksimum. Może zmiana celu mogłaby pomóc, ale w tym momencie poświęciłem już zbyt wiele czasu; jeśli komuś zależy na poprawie podejścia, zagraj (w Colab, jeśli chcesz) i daj mi znać.

Ben Reiniger
źródło
Nie owinąłem jeszcze głowy w papier (który jest ciężki z matematyki ... i zaskakująco stary ...), ale nawet jeśli może to być dwuznaczny termin „sieć”, który przywołał mi to skojarzenie, ja zastanawiałem się, czy można zaprojektować sieć neuronową , która zasadniczo „emuluje” sieć sortującą ...
Marco13,
@ Marco13, oczywiście, myślę, że użycie tego papieru do wytworzenia NN jako komparatorów spowodowałoby emulację NN sieci sortującej. Byłby o wiele głębszy niż papier, ale szerokość może zostać zmniejszona do rozmiaru liniowego?
Ben Reiniger,
Trzeba przyznać, że nie jestem tak głęboko zaangażowany w NN, jak musiałem powiedzieć coś głębokiego. Ale rzeczy takie jak ~ „możesz emulować wszystko za pomocą dwóch warstw” brzmi trochę jak wyniki z projektowania obwodów niskiego poziomu, gdzie mówisz, że możesz „zaimplementować każdą funkcję z dwiema warstwami bramek NAND” lub coś w tym stylu. Myślę, że niektóre z NN, które są ostatnio badane, są tylko wymyślnymi wersjami rzeczy, które ludzie odkryli już 50 lat temu, ale może to jest nieporozumienie ...
Marco13
0

Tak, nawet tak proste uczenie maszynowe, jak zwykłe liniowe najmniejsze kwadraty, może to zrobić, jeśli zastosujesz spryt.

(Ale większość uważa, że ​​to dość okropna przesada).

(Zakładam, że chcemy znaleźć maks. Abs wektora wejściowego):

  1. f(x)=1x2
  2. f(r)Cr
  3. S
  4. (ϵI+103StS+Cr)1(103St)
  5. p
    pi=pik|pi|k
  6. Wystarczy obliczyć iloczyn skalarny za pomocą wektora indeksowego i okrągłego.
matematyk
źródło