Dapatkah pembelajaran mesin mempelajari suatu fungsi seperti menemukan maksimum dari daftar?

26

Saya memiliki input yang merupakan daftar dan output adalah maksimum dari elemen-elemen dari daftar-input.

Dapatkah pembelajaran mesin mempelajari fungsi seperti itu yang selalu memilih maksimum elemen input yang ada dalam input?

Ini mungkin tampak sebagai pertanyaan yang cukup mendasar tetapi mungkin memberi saya pemahaman tentang apa yang bisa dilakukan pembelajaran mesin secara umum. Terima kasih!

pengguna78739
sumber
1
Saya pikir Anda dapat mencoba ini sebagai masalah seri yaitu menggunakan Jaringan Syaraf Berulang. Umpan data yang diurutkan ke jaringan.
vipin bansal
2
Lihat juga datasetcience.stackexchange.com/q/22242 , datasetcience.stackexchange.com/q/29345 ; jaringan saraf dapat mengurutkan daftar input, jadi tentu saja dapat mengekstraksi maksimal.
Ben Reiniger
3
@ TravisBlack: sebenarnya, ini jelas merupakan jenis fungsi yang tidak dapat Anda pelajari dengan jaringan saraf standar. Sebagai contoh, misalkan Anda cukup memasukkan vektor dengan nilai untuk memprediksi yang lebih besar dari nilai apa pun yang Anda miliki dalam set pelatihan Anda. Apakah Anda pikir jaringan saraf terlatih akan mengembalikan nilai terbesar itu?
Cliff AB
10
@ TravisBlack NOOO! Jaringan saraf tidak dapat mempelajari fungsi matematika "pada dasarnya apa saja". Dari segi kardinalitas, hampir semua fungsi bersifat patologis, hampir tidak ada di mana-mana. Apa yang Anda maksudkan adalah, banyak fungsi yang benar-benar diminati oleh matematikawan berperilaku cukup baik sehingga jaringan saraf dapat memperkirakannya dengan baik. Tapi itu sama sekali tidak sama dengan mempelajari fungsi apa pun .
leftaroundabout
6
@leftaroundabout dan Cliff: Senang melihat seseorang tetap di tanah dalam sensasi ML / DL baru-baru ini. Orang yang menggunakan NNS, dan ketika Anda menggali satu tingkat lebih dalam, Anda melihat bahwa mereka sering tidak memiliki sedikit pun tahu apa yang sesungguhnya mereka lakukan di sana - di luar membabi buta tweaker parameter dari beberapa keras "Hello World" misalnya sampai mereka melihat beberapa pola. xkcd memahami ini dengan benar: xkcd.com/1838 . Saya harap seseorang masih dapat menambahkan jawaban di sini yang lebih mendalam daripada jawaban saat ini. (Jangan tersinggung oleh siapa pun, tetapi kurangnya pemahaman tentang NNs mengganggu saya ...)
Marco13

Jawaban:

35

Mungkin , tetapi perhatikan bahwa ini adalah salah satu kasus di mana pembelajaran mesin bukanlah jawabannya . Ada kecenderungan untuk mencoba dan mencoba pembelajaran mesin ke dalam kasus-kasus di mana benar-benar, solusi berbasis aturan standar rawa lebih cepat, lebih sederhana dan hanya pada umumnya pilihan yang tepat: P

Hanya karena Anda bisa, bukan berarti Anda harus melakukannya

Sunting : Saya awalnya menulis ini sebagai "Ya, tetapi perhatikan bahwa ..." tetapi kemudian mulai meragukan diri saya sendiri, karena belum pernah melihatnya selesai. Saya mencobanya sore ini dan itu pasti bisa dilakukan:

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

Output adalah 0,74576, jadi itu benar menemukan maks 74,5% dari waktu. Saya tidak ragu bahwa itu dapat ditingkatkan, tetapi seperti yang saya katakan ini bukan usecase, saya akan merekomendasikan untuk ML.

EDIT 2 : Sebenarnya saya menjalankan ulang pagi ini menggunakan RandomForestClassifier sklearn dan kinerjanya jauh lebih baik:

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

Dan skor di sini adalah 94,4% dari sampel dengan maks diidentifikasi dengan benar, yang memang cukup bagus.

Dan Scally
sumber
1
@ TravisBlack ya saya awalnya memulainya sebagai "Ya, tapi ..." tapi kemudian meragukan diri saya sendiri dan mengelak. Saya sudah memperbaiki jawabannya sekarang :).
Dan Scally
16
Saat melatih dan menguji semuanya dengan vektor yang berisi nilai dalam [0,100], maka skornya adalah sekitar 0,95. Baik. Tetapi ketika melatihnya dengan nilai dalam [0,100], dan mengujinya dengan nilai dalam [100.200], skornya praktis nol . Anda sudah mundur selangkah dengan hasil edit Anda. Tetapi untuk membuatnya jelas bagi mereka yang secara membabi buta melihat ML sebagai senjata ajaib yang dapat menyelesaikan semua masalah: Apa pun yang Anda pelajari di sana: BUKAN 'fungsi maksimal'! .
Marco13
2
(Selain: Untuk memberi tahu orang lain tentang tanggapan atas komentar mereka, gunakan @, seperti dalam @Marco13). Mengenai pertanyaan: Saya pikir pernyataan Anda "pembelajaran mesin bukanlah jawabannya" membuatnya jelas. Saya terutama takut bahwa terlalu banyak orang tidak menerapkan pengawasan yang tepat ketika menggunakan ML / DL / NNs, dan khususnya, ketika mereka menemukan sesuatu yang sepertinya bisa "menyelesaikan masalah mereka", tanpa memahami mengapa tampaknya melakukannya. , dan karenanya tanpa mengetahui kapan "solusi" hanyalah artefak dari proses yang tidak begitu dipahami.
Marco13
2
@ aroth yakin; paling-paling ini adalah perkiraan max () yang berlaku untuk ruang lingkup data pelatihan yang terlihat. Saya bermain-main dengan masalah ini, tetapi saya tidak bermaksud untuk mengurangi sentimen utama dari jawaban saya yang tidak menggunakan ML untuk masalah seperti ini .
Dan Scally
1
@ BradyGilg Membakukan data input ... uhhm ... walaupun Anda mungkin benar bahwa ini akan menghasilkan hasil "lebih baik", hasilnya masih tidak masuk akal, karena NN tidak "mempelajari fungsi maksimum" . Dan argumennya dalam beberapa hal jelas sangat akademis - saya bahkan akan mengatakan "terlalu akademis": Anda ingin menghitung / memperkirakan maks dari beberapa vektor, dan untuk menghitung maks, pertama - tama Anda harus menghitung min / Maks untuk melakukan normalisasi (atau mean / stdDev untuk standarisasi, yang tampaknya juga tidak masuk akal).
Marco13
26

Iya nih. Sangat penting, ANDA memutuskan arsitektur solusi pembelajaran mesin. Arsitektur dan prosedur pelatihan tidak menulis sendiri; mereka harus dirancang atau templated dan pelatihan mengikuti sebagai cara menemukan parameterisasi arsitektur yang pas untuk satu set poin data.

Anda dapat membangun arsitektur yang sangat sederhana yang sebenarnya mencakup fungsi maksimum:

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

di mana a dan b adalah parameter yang dipelajari.

Diberikan sampel pelatihan yang cukup dan rutin pelatihan yang masuk akal, arsitektur yang sangat sederhana ini akan belajar dengan sangat cepat untuk menetapkan a ke 1 dan b ke nol untuk tugas Anda.

Pembelajaran mesin sering mengambil bentuk menghibur beberapa hipotesis tentang fitur dan transformasi input poin data, dan belajar untuk mempertahankan hanya hipotesis yang berkorelasi dengan variabel target. Hipotesis dikodekan secara eksplisit dalam arsitektur dan sub-fungsi yang tersedia dalam algoritma parameter, atau sebagai asumsi dikodekan dalam algoritma "parameterless".

Sebagai contoh, pilihan untuk menggunakan produk titik dan nonlinier seperti yang umum dalam jaringan saraf vanili ML agak arbitrer; itu mengungkapkan hipotesis yang mencakup bahwa suatu fungsi dapat dibangun menggunakan struktur jaringan komposisi komposisi yang telah ditentukan sebelumnya dan fungsi ambang batas. Parameterisasi yang berbeda dari jaringan itu mewujudkan hipotesis yang berbeda tentang transformasi linear mana yang akan digunakan. Toolbox fungsi apa pun dapat digunakan dan tugas pembelajar mesin adalah menemukan melalui diferensiasi atau coba-coba atau sinyal berulang lainnya yang fungsi atau fitur dalam arraynya paling baik meminimalkan metrik kesalahan. Dalam contoh yang diberikan di atas, jaringan yang dipelajari hanya mengurangi ke fungsi maksimum itu sendiri, sedangkan jaringan yang tidak terdiferensiasi dapat "belajar" fungsi minimum. Fungsi-fungsi ini dapat diekspresikan atau diperkirakan melalui cara lain, seperti pada fungsi regresi linear atau neural net pada jawaban lain. Singkatnya, itu benar-benar tergantung pada fungsi atau potongan LEGO yang Anda miliki di kotak alat arsitektur ML Anda.

pygosceles
sumber
4
+1 ML tidak lebih dari persamaan regresi mewah dan menuntut pilihan persamaan yang tepat.
aidan.plenert.macdonald
4
@ aidan.plenert.macdonald dampak dan daya tarik ML, adalah bahwa tidak ada satu pilihan persamaan yang tepat. Persamaan yang Anda pilih harus menjadi anggota himpunan persamaan yang sesuai, tetapi ternyata untuk berbagai masalah yang ditetapkan berisi persamaan yang jauh lebih digeneralisasi daripada solusi yang dirancang dengan hati-hati, tetapi menghasilkan parameter yang memecahkan masalah jauh lebih cepat daripada memasukkan upaya desain tambahan. Pertanyaan ini adalah contoh yang baik tentang bagaimana ini tidak menghilangkan pertimbangan desain model sama sekali.
Will
Itu tidak pernah menjadi pertanyaan. OP bertanya apakah ML dapat menemukan (/ belajar / menyimpulkan) fungsi seperti max()(dari data yang diberi label). Mereka tidak mengatakan " Mengingat bahwa Anda sudah memiliki max()sebagai blok bangunan"
smci
@smci Tidak ada "universal" sebelumnya untuk arsitektur atau fungsi pembelajaran mesin. Seperti yang disebutkan dalam jawaban saya, Anda dapat memperkirakan fungsi maksimum menggunakan fungsi linear piecewise yang diselingi dengan nonlinier - tetapi tidak ada aturan universal yang mengatakan bahwa semua ML harus menggunakan set transformasi tertentu dalam kotak peralatannya. Jaringan saraf sering (tetapi tidak selalu) memiliki fungsi maksimal yang mereka miliki melalui Max Pooling atau ReLU non-linear. Jumlah fungsi fitur yang mungkin tidak terbatas, itulah sebabnya saya menyoroti peran pilihan dan kecenderungan bias dalam arsitektur ML.
pygosceles
7

Ya - Pembelajaran mesin dapat belajar menemukan maksimum dalam daftar angka.

Berikut adalah contoh sederhana pembelajaran untuk menemukan indeks 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
sumber
Apakah ini benar-benar mempelajari fungsi "maksimum"? Satu set pelatihan dengan 10.000 daftar lima elemen adalah perkiraan yang masuk akal untuk ruang input lengkap.
Tandai
2
Penafian: Saya bukan ahli ML / DL. Tetapi saya cukup yakin bahwa ini tidak masuk akal. Maksud saya: Sama sekali tidak masuk akal. Seperti yang saya lihat, Anda tidak belajar fungsi maksimal. Anda mempelajari indeks elemen maksimum set pelatihan. Jika Anda memasukkan vektor yang berisi dua angka yang keduanya lebih besar dari pada set pelatihan, kemungkinan akan gagal. Belum lagi kasus di mana Anda tidak memiliki 5D- tetapi vektor 10D. Melemparkan beberapa data ke perpustakaan yang tidak dipahami dan melihat hasil tertentu TIDAK (sama sekali) berarti bahwa itu "berfungsi".
Marco13
Maksud saya, itu tergantung pada apa yang "berfungsi" seharusnya dimaksudkan. Pohon keputusan khususnya hanya akan menghasilkan fungsi piecewise-konstan, potongan menjadi kotak persegi panjang yang disejajarkan dengan sumbu. Dalam contoh maks, pelatihan pada hypercube padat, fungsi maks sebenarnya adalah konstan-konstan pada beberapa jenis daerah segitiga. Diberikan contoh dan kedalaman pelatihan yang cukup, pohon akan memperkirakan daerah segitiga ini dengan akurasi yang sewenang-wenang. Tetapi, seperti halnya dengan banyak (kebanyakan?) Model lain, setiap sampel uji di luar kisaran sampel pelatihan sangat tidak ada harapan.
Ben Reiniger
Ini tidak membuktikan apa pun. OP bertanya "maksimum dalam daftar angka" . Anda berasumsi mereka pasti mengapung di kisaran 0..1. Coba masukkan 2 (atau -1, atau 1.5) dan itu akan gagal.
smci
4

Algoritma pembelajaran

Alih-alih mempelajari fungsi sebagai perhitungan yang dilakukan oleh jaringan saraf umpan-maju, ada domain penelitian lengkap tentang algoritma pembelajaran dari data sampel. Sebagai contoh, seseorang mungkin menggunakan sesuatu seperti Mesin Turing Saraf atau metode lain di mana eksekusi suatu algoritma dikendalikan oleh pembelajaran mesin pada titik-titik keputusannya. Algoritme mainan seperti menemukan maksimum, atau menyortir daftar, atau membalik daftar, atau memfilter daftar biasanya digunakan sebagai contoh dalam penelitian pembelajaran algoritma.

Peter adalah
sumber
2

Saya akan mengecualikan desain berpendidikan dari jawaban saya. Tidak itu tidak mungkin untuk menggunakan keluar dari kotak pembelajaran mesin (ML) pendekatan untuk sepenuhnya mewakili fungsi maksimum untuk sewenang-wenang daftar dengan presisi sewenang-wenang. ML adalah metode berbasis data dan jelas bahwa Anda tidak akan dapat memperkirakan suatu fungsi di wilayah di mana Anda tidak memiliki titik data apa pun. Oleh karena itu, ruang pengamatan yang mungkin (yang tidak terbatas) tidak dapat ditutupi oleh pengamatan terbatas.

Pernyataan saya memiliki landasan teoretis dengan Teorema Aproksimasi Universal Cybeko untuk jaringan saraf. Saya akan mengutip teorema dari Wikipedia:

Rn

RnxR

Jika ruang pengamatan Anda kompak maka Anda mungkin dapat memperkirakan fungsi maksimum dengan set data yang terbatas. Sebagai jawaban terpilih atas dibuat jelas Anda tidak harus menemukan kembali roda!

MachineLearner
sumber
1

Inilah perluasan komentar saya. Untuk kata pengantar, benar-benar @DanScally benar bahwa tidak ada alasan untuk menggunakan ML untuk menemukan daftar maksimum. Tapi saya pikir Anda "mungkin memberi saya pemahaman tentang apa yang bisa dilakukan pembelajaran mesin secara umum" adalah alasan yang cukup baik untuk mempelajari hal ini.

maxmax


Komentar, dan jawaban @ MachineLearner mengemukakan teorema aproksimasi universal: pada domain terbatas , jaringan saraf dapat memperkirakan fungsi yang cukup bagus seperti , tetapi kami tidak dapat mengharapkan apriori untuk memperkirakan pada input sewenang-wenang, juga tidak persis hitung mana saja.maxmaxmax

Tapi, ternyata jaringan syaraf dapat secara tepat mengurutkan angka input yang berubah-ubah. Memang, bilangan bulat-bit dapat diurutkan berdasarkan jaringan dengan hanya dua lapisan tersembunyi dari ukuran kuadrat. Jaringan Syaraf Tiruan Yang Efisien untuk Divisi dan Masalah Terkait , Teorema 7 pada halaman 955; terima kasih banyak kepada @MaximilianJanisch dalam jawaban ini untuk menemukan referensi ini.n n

Saya akan menjelaskan secara singkat penyederhanaan pendekatan dalam makalah itu untuk menghasilkan fungsi untuk input berbeda yang sewenang-wenang. Lapisan tersembunyi pertama terdiri dari neuron, masing-masing mewakili variabel indikator , untuk . Ini mudah dibangun sebagai dengan indikator langkah. Lapisan berikutnya memiliki neuron, satu untuk setiap input ; mulai dengan jumlah ; yaitu, jumlah sedemikian sehingga , dan karenanya posisiargmaxn(n2)δij=1(xi<xj)i<jxjxinxij<iδji+j>i(1δij)jxi>xjxi dalam daftar yang diurutkan. Untuk menyelesaikan argmax, cukup ambangkan lapisan ini. Pada titik ini, jika kita dapat mengalikan, kita akan mendapatkan nilai maksimum aktual dengan cukup mudah. Solusi dalam makalah ini adalah dengan menggunakan representasi biner dari angka-angka, di mana perkalian biner titik adalah sama dengan penambahan ambang batas. Untuk hanya mendapatkan argmax, itu sudah cukup untuk memiliki fungsi linear sederhana mengalikan indikator th oleh dan menjumlahkan.ii
ii


Akhirnya, untuk pertanyaan berikut: dapatkah kita melatih NN ke kondisi ini. @DanScally membantu kami memulai; mungkin mengetahui arsitektur teoretis dapat membantu kita menyontek ke dalam solusi? (Perhatikan bahwa jika kita dapat mempelajari / memperkirakan kumpulan bobot tertentu di atas, jaring akan benar-benar berkinerja baik di luar kisaran sampel pelatihan.)

Notebook di github / Colab

Mengubah hal-hal sedikit saja, saya mendapatkan skor pengujian yang lebih baik (0,838), dan bahkan pengujian pada sampel di luar rentang pelatihan asli mendapat skor yang layak (0,698). Menggunakan input yang diskalakan ke[1,1]mendapat skor tes hingga 0,961, dengan skor di luar kisaran 0,758. Tapi, saya mencetak dengan metode yang sama dengan @DanScally, yang tampaknya sedikit tidak jujur: fungsi identitas akan mendapat skor sempurna pada metrik ini. Saya juga mencetak beberapa koefisien untuk melihat apakah sesuatu yang dekat dengan pas yang dijelaskan di atas muncul (tidak benar-benar); dan beberapa output mentah, yang menunjukkan model terlalu malu-malu dalam memperkirakan maksimum, salah di samping memprediksi bahwa tidak ada input yang maksimal. Mungkin memodifikasi tujuan bisa membantu, tetapi pada titik ini saya sudah menghabiskan terlalu banyak waktu; jika ada yang peduli untuk meningkatkan pendekatan, silakan bermain (di Colab jika Anda suka) dan beri tahu saya.

Ben Reiniger
sumber
Saya belum membungkukkan kepala saya di atas kertas (yang matematika-berat ... dan sangat tua ...), tetapi meskipun itu mungkin hanya istilah "jaringan" ambigu yang membawa asosiasi ini ke pikiran saya, saya bertanya-tanya apakah seseorang dapat merancang jaringan saraf yang pada dasarnya "mengemulasi" jaringan penyortiran ...
Marco13
@ Marco13, tentu, saya pikir menggunakan kertas itu untuk menghasilkan NNs sebagai pembanding akan menghasilkan emulasi NN dari jaringan penyortiran. Akan jauh lebih dalam dari kertas, tetapi lebarnya mungkin menyusut ke ukuran linier?
Ben Reiniger
Harus diakui, saya tidak terlibat sedalam-dalamnya dalam NN sebagaimana saya perlu mengatakan sesuatu yang mendalam. Tetapi hal-hal seperti ~ "Anda dapat meniru semuanya dengan dua lapisan" terdengar agak seperti hasil dari desain sirkuit tingkat rendah di mana Anda mengatakan bahwa Anda dapat "menerapkan setiap fungsi dengan dua lapisan gerbang NAND" atau yang lainnya. Saya pikir beberapa NN yang diperiksa baru-baru ini hanyalah versi bagus dari hal-hal yang sudah ditemukan orang 50 tahun lalu, tapi mungkin ini adalah kesalahpahaman ...
Marco13
0

Ya, meskipun pembelajaran mesin sederhana seperti linear least square biasa dapat melakukan ini jika Anda menggunakan kepintaran terapan.

(Tetapi sebagian besar akan menganggap ini adalah pembunuhan yang sangat mengerikan).

(Saya akan berasumsi kita ingin mencari jumlah maksimum vektor input):

  1. Pilih fungsi penurunan absolut nilai absolut, misalnya
    f(x)=1x2
  2. Bangun matriks diagonal . Biarkan kami menyebutnyaf(r)Cr
  3. Vektor membangun penuh yang .S
  4. Bangun dan selesaikan sistem persamaan(ϵI+103StS+Cr)1(103St)
  5. Mari kita sebut vektor hasil , itu akan menjadi ukuran probabilitas (jumlah hingga 1), kita dapat menimbangnya secara nonlinier, misalnyap
    pi=pik|pi|k
  6. Hitung saja produk skalar dengan vektor indeks dan bulat.
pembaca matematika
sumber