Makine öğrenmesi bir listeden maksimum bulma gibi bir işlevi öğrenebilir mi?


26

Bir liste olan bir girdi var ve çıktı, girdi listesindeki elemanların maksimumudur.

Makine öğrenmesi, girişte mevcut giriş öğelerinin maksimumunu her zaman seçen böyle bir işlevi öğrenebilir mi?

Bu oldukça basit bir soru gibi görünebilir ama bana genel makine öğrenmenin neler yapabileceği hakkında bir fikir verebilir. Teşekkürler!


1
Ben bunu bir dizi problem olarak deneyebilirim, yani Tekrarlayan Sinir Ağını kullanarak. Sıralanmış verileri ağa besleyin.
vipin bansal

2
Ayrıca bkz. Datascience.stackexchange.com/q/22242 , datascience.stackexchange.com/q/29345 ; sinir ağları bir giriş listesini sıralayabilir , bu yüzden kesinlikle bir maksimum çıkarabilir.
Ben Reiniger

3
@TravisBlack: Aslında bu o fonksiyonun tipi kesinlikle olamaz standart sinir ağları ile öğrenirler. Örnek olarak, antrenman setinizde sahip olduğunuz herhangi bir değerden daha büyük olduğunu tahmin etmek için basitçe bir değeri olan bir vektör taktığınızı varsayalım. Eğitimli sinir ağının size en büyük değeri vereceğini düşünüyor musunuz?
Cliff AB,

10
@TravisBlack NOOO! Yapay sinir ağları “temelde herhangi bir” matematiksel işlevi öğrenemez. Kardinalite-bilge, hemen hemen tüm fonksiyonlar hemen hemen her yerde süreksiz olanların patolojiktir. Muhtemelen Seni ne demek, matematikçiler aslında olduğu fonksiyonları çok olduğu ilgi sinir ağları olduğunu uslu yeterli olur içinde olabilir yaklaşır bunları keyfi olarak iyi. Ancak bu, herhangi bir işlevi öğrenmekle aynı şey değildir .
leftaroundabout

6
@leftaroundabout ve Cliff: Birisinin son ML / DL yutturmacalarında yerde durduğunu görmek güzel. İnsanlar NN'leri kullanıyor ve bir seviye daha derine indiğinizde, genellikle orada ne yaptıkları hakkında en ufak bir fikre sahip olmadıklarını fark ediyorsunuz - bazı keratlar "Merhaba Dünya" örneğindeki körü körüne ince ayar parametrelerinin ötesinde bir kalıp görene kadar. xkcd bunu tam olarak doğru buldu: xkcd.com/1838 . Umarım birileri hala burada mevcut olanlardan daha derin bir cevap ekleyebilir. (Kimseye
suçlanma

Yanıtlar:


35

Belki , ama bunun makine öğrenmenin cevap olmadığı durumlardan biri olduğuna dikkat edin . Makine standartlarını esas alan bataklık standart kurallarına dayalı çözümlerin daha hızlı, daha basit ve sadece genel olarak doğru seçim olduğu durumlara denemek ve ayakkabı çekme makinesi öğrenme eğilimi vardır: P

Sadece yapabildiğin için, yapman gerektiği anlamına gelmez.

Düzenleme : Aslen bunu "Evet, ama şunu not et ..." olarak yazdım ama daha sonra hiç yapmadığım için kendimden şüphe etmeye başladım. Öğleden sonra denedim ve kesinlikle yapılabilir:

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

Çıktı 0,74576, bu nedenle zamanın maksimum% 74,5'ini doğru buluyor. Bunun geliştirilebileceğinden şüphem yok, ancak bunun bir usecase olmadığını söylediğim gibi ML için tavsiye ederim.

2 EDIT : Aslında bu sabah sklearn's RandomForestClassifier kullanarak yeniden koştum ve önemli ölçüde daha iyi performans gösterdi:

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

Ve buradaki puan, maksimum olarak doğru tespit edilen örneklerin% 94,4'üdür, bu gerçekten de oldukça iyidir.


1
@TravisBlack evet, başlangıçta "Evet, ama ..." olarak başladım, ancak daha sonra kendimden şüphelendim ve denk geldim. Şimdi cevabı geliştirdim :).
Dan Scally

16
Her şeyi [0,100] 'de değerleri içeren vektörlerle eğitip test ederken, puan 0,95 civarındadır. İnce. Ancak, [0,100] 'deki değerler ile eğitim verirken ve [100,200]' daki değerler ile test ederken, puan neredeyse sıfırdır . Düzenlemenize geri adım attınız. Ancak bunu, ML'yi kör bir şekilde tüm problemleri çözebilecek mucize silah olarak görenlere açık bir şekilde açıklamak için: Orada ne öğreniyorsanız yapın: Bu 'maksimum işlev' DEĞİL! .
Marco13

2
(Bir kenara: Yorumlarına verilen yanıtları başkalarına bildirmek için @, olduğu gibi kullanın @Marco13). Soruyla ilgili: “Makine öğrenmenin cevabı değil” ifadenizin açıkça ifade ettiğini düşünüyorum . Özellikle ML / DL / NN kullanırken ve özellikle de neden göründüğünü anlamadan "sorununu çözebilir" gibi görünen bir şeyle karşılaştıklarında çok fazla insanın uygun incelemeyi uygulamadığından korkuyorum. ve bu nedenle, bir "çözümün" ne kadar iyi anlaşılmayan bir sürecin bir ürünü olduğunun farkında olmadan.
Marco13 13

2
@ kesinlikle emin; en iyi ihtimalle bu, görüldüğü eğitim verisinin kapsamına uygulanabilir bir max () yaklaşımıdır . Sorunla oynuyordum, ancak cevabımın bu tür bir sorun için ML kullanmadığına dair temel duygumdan uzaklaşmaya niyetli değilim .
Dan Scally

1
@BradyGilg Girdi verilerini standartlaştırmak ... uhhm ... Muhtemelen haklısın ki, bu "daha iyi" sonuçlar verecektir, NN "maksimum işlevi öğrenmek" olmadığı için sonuçlar hala pek mantıklı olmazdı. . Argüman bazı yönlerden açıkça akademik olanıdır - “çok akademik” bile diyebilirim: Bazı vektörlerin maksimum değerlerini hesaplamak / tahmin etmek istersiniz ve maksimum değeri hesaplamak için önce min değerini hesaplamanız gerekir. / max normalleştirme yapmak (ya da çok da mantıklı görünmeyen bir standardizasyon için mean / stdDev).
Marco13

26

Evet. Çok önemlisi, SİZE bir makine öğrenme çözümünün mimarisine karar verirsiniz. Mimariler ve eğitim prosedürleri kendilerini yazmaz; tasarlanmaları veya şablon haline getirilmeleri gerekir ve eğitim, bir dizi veri noktasına uyan mimarinin bir parametresini keşfetmenin bir yolu olarak takip edilir.

Aslında bir maksimum işlev içeren çok basit bir mimari oluşturabilirsiniz:

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

nerede bir ve b parametreleri öğrenilir.

Yeterli sayıda eğitim örneği ve makul bir eğitim rutini göz önüne alındığında, bu çok basit mimari, göreviniz için sıfıra 1 ve b sıfıra ayarlanmayı çok hızlı bir şekilde öğrenecektir.

Makine öğrenmesi genellikle girdi veri noktalarının özelliklendirilmesi ve dönüştürülmesi ile ilgili birçok hipotezi eğlendirmek ve yalnızca hedef değişkenle ilişkilendirilen hipotezleri korumayı öğrenmek şeklindedir. Hipotezler, mimaride ve parametrelenmiş bir algoritmada mevcut olan alt fonksiyonlarda veya bir "parametresiz" algoritmada kodlanan varsayımlarda açıkça kodlanır.

Örneğin, vanilya sinir ağları ML'de yaygın olan nokta ürünleri ve doğrusal olmayanları kullanma seçimi bir şekilde keyfidir; lineer dönüşümlerin ve eşik fonksiyonlarının önceden belirlenmiş bir bileşik ağ yapısı kullanılarak bir fonksiyonun oluşturulabileceğini kapsayan kapsamlı bir hipotezi ifade eder. Bu ağın farklı parametreleri, hangi doğrusal dönüşümlerin kullanılacağı konusunda farklı hipotezler içerir. Herhangi bir işlev kutusu kullanılabilir ve bir makine öğrencisinin görevi, farklılaşma veya deneme ve hata veya dizisindeki işlev veya özelliklerin bir hata ölçütünü en iyi şekilde en aza indirgeyen başka bir tekrarlanabilir sinyal yoluyla keşfetmesidir. Yukarıda verilen örnekte, öğrenilen ağ basitçe maksimum işlevin kendisine indirgenirken, farklılaşmamış bir ağ alternatif olarak bir asgari işlevi "öğrenebilir". Bu fonksiyonlar, başka bir cevapta lineer veya nöral net regresyon fonksiyonunda olduğu gibi başka yollarla ifade edilebilir veya yaklaştırılabilir. Özetle, ML mimarisi araç kutunuzdaki hangi işlevlere veya LEGO parçalarına sahip olduğunuza gerçekten bağlıdır.


4
+1 ML, süslü regresyon denklemlerinden başka bir şey değildir ve doğru denklem seçimini gerektirir.
aidan.plenert.macdonald

4
@ aidan.plenert.macdonald, ML'nin etkisine ve çekiciliğine rağmen, doğru bir denklem seçeneğinin olmaması. Seçtiğiniz denklemlerin uygun denklemler grubunun bir üyesi olması gerekir, ancak setin dikkatlice tasarlanmış bir çözümden çok daha genelleştirilmiş olan denklemler içeren geniş bir problem yelpazesi için olduğu anlaşılır, ek tasarım çabasını koymaktan çok daha hızlı bir sorunum var. Bu soru, bunun model tasarımla ilgili düşünceleri tamamen nasıl ortadan kaldırmadığının iyi bir örneğidir.
Will

Asla soru bu değildi. OP, ML'nin (/ max()etiketli verilerden) benzeri bir işlevi bulabileceğini (/ öğren / çıkarım) isteyip istemediğini sordu . " Zaten max()bir yapı taşı olarak sahip olduğunuz göz önüne alındığında "
demediler

@smci Makine öğrenmesi mimarileri veya işlevleri için önceden bir "evrensel" yoktur. Cevabımda belirtildiği gibi, doğrusal olmayanlarla serpiştirilmiş parçalı doğrusal işlevleri kullanarak bir maksimum işlevi yaklaşık olarak belirleyebilirsiniz - ancak tüm ML'nin bu belirli dönüşüm setini araç kutusunda kullanması gerektiğini söyleyen evrensel bir kural yoktur. Sinir ağları sıklıkla (ancak her zaman değil) Max Pooling veya ReLU nonlineeriteler aracılığıyla emrinde maksimum bir işleve sahiptir. Olası özellik işlevlerinin sayısı sınırsızdır, bu yüzden ML mimarisinde seçimin ve önceden belirlenmiş önyargıların rolünü vurguladım.
pygosceles

7

Evet - Makine öğrenmesi, bir sayılar listesinde azami değeri bulmayı öğrenebilir.

İşte maksimumun endeksini bulmanın basit bir örneği:

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

Gerçekten "maksimum" işlevini mi öğreniyor? 10.000 beş elementli listeden oluşan bir eğitim seti, tüm girdi alanına makul bir yaklaşımdır.
Mark

2
Feragatname: Ben bir ML / DL uzmanı değilim. Ama bunun bir anlam ifade etmediğinden eminim. Demek istediğim: Hiçbir anlam ifade etmiyor. Gördüğüm gibi, maksimum işlevi öğrenmiyorsunuz. Eğitim setinin maksimum unsurlarının indekslerini öğreniyorsunuz. Her iki eğitim setinden daha büyük iki sayı içeren bir vektör girerseniz, muhtemelen başarısız olur. Bir 5D’ye sahip olmadığınız bir durumdan bahsetmiyorum bile - 10D-vektör. Bir kütüphaneye bazı verileri Fırlatma biri etmez unterstand ve belli bir sonuç görme yaptığı DEĞİL o "eser" demek (hiç).
Marco13

Demek istediğim, "işe yaraması" ne anlama geldiğine bağlı. Özellikle bir karar ağacı, yalnızca parça eksenli dikdörtgen kutular olan parça parça sabit bir işlev üretecektir. Maks. Örnekte, katı bir hiper küp üzerinde yapılan eğitimde, gerçek maksimum işlev bazı üçgen tür bölgelerinde parçacıklı sabittir. Yeterli sayıda eğitim örneği ve derinlik verildiğinde, ağaç bu üçgen bölgeleri rasgele kesinliklere yaklaştıracaktır. Ancak, birçok (en?) Modelde olduğu gibi, eğitim numuneleri kapsamı dışındaki test numuneleri oldukça umutsuz.
Ben Reiniger

Bu hiçbir şeyi kanıtlamaz. OP "sayılar listesindeki en fazla" sorusunu sordu . Yüzdeleri 0..1 aralığında olduğunu varsaydınız. Bir 2 (veya -1 veya 1.5) girmeyi deneyin ve başarısız olur.
smci

4

Öğrenme algoritmaları

İleri beslemeli bir sinir ağı tarafından yapılan bir hesaplama olarak bir işlevi öğrenmek yerine, örnek verilerden öğrenme algoritmalarıyla ilgili kapsamlı bir araştırma alanı vardır . Örneğin, bir Sinir Turing Makinesi veya bir algoritmanın uygulanmasının karar noktalarında makine öğrenmesi tarafından kontrol edildiği başka bir yöntem gibi bir şey kullanılabilir . Bir algoritma bulmak, bir listeyi sıralamak ya da bir listeyi tersine çevirmek ya da bir listeyi filtrelemek gibi oyuncak algoritmaları algoritma öğrenme araştırmalarında sıklıkla örnek olarak kullanılır.


2

Eğitimli tasarımları cevabımın dışında tutacağım. Hayır, isteğe bağlı listelerde keyfi listeler için maksimum işlevi tam olarak temsil etmek için bir kutudan öğrenme (ML) yaklaşımı kullanmak mümkün değildir . ML, veri tabanlı bir yöntemdir ve herhangi bir veri noktasına sahip olmadığınız bölgelerde bir fonksiyona yaklaşamayacağınız açıktır. Bu nedenle, olası gözlemlerin (ki sonsuz) alanı sonlu gözlemlerle kaplanamaz.

İfadelerimin Cybeko'nun sinir ağları için Evrensel Yaklaşım Teoremi ile teorik bir temeli var. Teoremi Wikipedia'dan alıntılayacağım:

Rn

RnxR

Eğer gözlem alanınız küçükse, o zaman sınırlı bir veri seti ile maksimum fonksiyona yaklaşabilirsiniz. Üst oyların cevabı netleştiğinden, tekerleği yeniden icat etmemelisin!


1

İşte yorumumda bir genişleme var. Önsöz, kesinlikle @DanScally, maksimum bir liste bulmak için ML kullanmanız için hiçbir neden olmadığı doğru. Ama bence “bana makine öğrenmenin genel olarak neler yapabileceğini anlamayı sağlayabilir” diyerek buna girmenin yeterli bir nedeni olduğunu düşünüyorum.

maxmax


maxmaxmax

n n

argmaxn(n2)δij=1(xi<xj)i<jxjxinxij<iδji+j>i(1δij)jxi>xjxisıralanmış listede. Argmax'ı tamamlamak için bu katmanı eşikleyin. Bu noktada, eğer çarpabilirsek, gerçek maksimum değeri kolayca alacağız. Kağıttaki çözüm, sayıların ikili gösterimini kullanmaktır; bu noktada ikili çarpma eşikli ekleme ile aynıdır. Sadece argmax'ı elde etmek için, göstergesini ile toplayarak ve toplayarak basit bir doğrusal işleve sahip olmak yeterlidir . i i
ii


Son olarak, sonraki soru için: NN'yi bu duruma eğitebilir miyiz? @DanScally bize başladı; belki teorik mimariyi bilmek, çözümü aldatmamıza yardımcı olabilir mi? (Yukarıdaki belirli ağırlık kümesini öğrenebilir / yaklaşık değerlerini öğrenebilirsek, ağın gerçekten eğitim numuneleri aralığının dışında iyi bir performans göstereceğini unutmayın.)

Github / Colab içinde defter

İşleri birazcık değiştirince, daha iyi bir test puanı (0.838) alırım ve hatta orijinal eğitim aralığının dışındaki bir örnek üzerinde test yapmak bile iyi bir puan alır (0.698). ölçeklendirilmiş girişleri kullanma[1,1]0,758 aralığının dışında bir puanla test puanını 0,961'e çıkarır. Ancak, @DanScally ile aynı yöntemle değerlendiriyorum, bu biraz sahtekâr görünüyor: kimlik işlevi bu metrikte mükemmel bir puan alacak. Ayrıca yukarıda belirtilen tam uyuma yakın bir şeyin görünüp görünmediğini görmek için birkaç katsayı yazdım (gerçekten değil); ve birkaç ham çıktı, modelin bir girdiyi tahmin etmekte çok çekingen olduğunu öne sürerek, girdilerin hiçbirinin maksimum olmadığını öngörme tarafındadır. Belki hedefi değiştirmek yardımcı olabilir, ama bu noktada çok fazla zaman harcadım; Herhangi biri yaklaşımı iyileştirmeyi umursarsa, oynamaktan çekinmeyin (isterseniz Colab'da) ve bana bildirin.


Kafamı henüz kağıdın etrafına dolamamıştım (matematik ağırlıklı ... ve şaşırtıcı derecede eski ...), ancak bu derneği aklıma getiren belirsiz "ağ" terimi olsa da, Bir sıralama ağını temelde "taklit eden" bir sinir ağı tasarlayıp tasarlayamadığını merak
etmiştim

@ Marco13, elbette, bu kağıdı NN'leri karşılaştırıcı olarak üretmek için kullanmanın, sıralama ağının NN emülasyonunu üreteceğini düşünüyorum. Kağıdınkinden çok daha derin olurdu, ancak genişlik doğrusal boyutuna düşebilir mi?
Ben Reiniger

Kuşkusuz, neredeyse derin bir şey söylemem gereken kadar NN ile ilgilenmiyorum. Ancak, "her şeyi iki katmanla taklit edebilirsiniz" gibi şeyler, "her işlevi iki NAND geçidi kaplamasıyla uygulayabileceğinizi" söylediğiniz düşük seviyeli devre tasarımının sonuçlarına biraz benziyor. Ben düşünüyorum bazı geçenlerde incelendiğinde YSA'ları halkı zaten 50 yıl önce keşfedilen şeylerin sadece fantezi versiyonları vardır, ama belki bu bir yanlış ... olduğunu
Marco13

0

Evet, basit doğrusal öğrenme kadar basit bir makine öğrenmesi olsa bile, en küçük kareler uygulanmış zekayı kullanırsanız bunu yapabilir.

(Fakat çoğu kişi bunu çok korkunç overkill olarak görür).

(Giriş vektörünün maksimum absini bulmak istediğimizi varsayacağım):

  1. Monotonetik olarak azalan bir mutlak değer fonksiyonu seçin, örneğin
    f(x)=1x2
  2. köşegen matrisini oluşturun . Bizef(r)Cr
  3. Olanları tam Yapı vektör .S
  4. Denklem sistemini kurun ve çözün(ϵI+103StS+Cr)1(103St)
  5. Sonuç vektörünü arayalım , bir olasılık ölçüsü olacaktır (toplamı 1), doğrusal olmayan bir şekilde yeniden değerlendirebiliriz, örneğinp
    pi=pik|pi|k
  6. Sadece skaler çarpımı indeks vektörü ve yuvarlak olarak hesaplayın.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.