Чи може машинне навчання засвоїти таку функцію, як пошук максимуму зі списку?


26

У мене є вхід, який є списком, а вихід - максимум елементів вхідного списку.

Чи може машинне навчання засвоїти таку функцію, яка завжди вибирає максимум вхідних елементів, наявних у вході?

Це може здатися досить базовим питанням, але це може дати мені розуміння того, що може зробити машинне навчання взагалі. Спасибі!


1
Я думаю, ви можете спробувати це як проблему із серією, тобто використовуючи періодичну нейронну мережу. Подайте відсортовані дані в мережу.
vipin bansal

2
Дивіться також datascience.stackexchange.com/q/22242 , datascience.stackexchange.com/q/29345 ; нейронні мережі можуть сортувати вхідний список, тому, безумовно, можна отримати максимум.
Бен Райнігер

3
@TravisBlack: насправді це, безумовно, той тип функції, якого ви не можете навчитися зі стандартних нейронних мереж. Для прикладу, припустимо, ви просто підключите вектор із значенням для передбачення, яке було б більшим, ніж будь-яке значення у вас у вашому навчальному наборі. Як ви думаєте, навчена нейронна мережа поверне вам найбільше значення?
Кліф АВ

10
@TravisBlack NOOO! Нейронні мережі не можуть засвоїти "в основному будь-яку" математичну функцію. Кардинальність - майже всі функції патологічні майже скрізь - розривні. Що ви, мабуть, маєте на увазі, це те, що багато функцій, які насправді зацікавлені математиками, трапляються досить добре, щоб нейронні мережі могли наблизити їх довільно. Але це зовсім не те саме, що вміти вивчати будь-яку функцію .
близько

6
@leftaroundabout та Кліфф: Добре бачити, що хтось залишається на місці в нещодавній ажіотаж на ML / DL. Люди використовують NN, і коли ви копаєте один рівень глибше, ви помічаєте, що вони часто не мають найменшого уявлення про те, що вони насправді роблять там - поза сліпою настройкою параметрів із деяких прикладів керу "Hello World", поки вони не побачать певну закономірність. xkcd отримав це правильно: xkcd.com/1838 . Я сподіваюся, що хтось все-таки зможе додати тут відповідь, яка є більш глибокою, ніж це здається. (Нікого не ображати, але загальне нерозуміння мешканців НН мене
клопоче

Відповіді:


35

Можливо , але зауважте, що це один із тих випадків, коли машинне навчання - це не відповідь . Існує тенденція намагатися використовувати машинне навчання в тих випадках, коли дійсно, стандартні рішення, засновані на правилах, швидший, простіший і, як правило, правильний вибір: P

Тільки тому, що ти можеш, не означає, що ти повинен

Редагувати : Спочатку я писав це як "Так, але зауважте, що ...", але потім почав сумніватися в собі, ніколи не бачивши цього робити. Я спробував це сьогодні вдень, і це, безумовно, можливо:

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

Вихід 0,74576, тому правильно знаходити максимум 74,5% часу. Я не сумніваюся, що це можна було б покращити, але, як я говорю, це не є корисною справою, я б рекомендував для ML.

EDIT 2 : Насправді я повторно запустився сьогодні вранці за допомогою RandomForestClassifier sklearn, і він виявився значно краще:

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

І оцінка тут становить 94,4% зразків з максимально точно визначеним максимальним показником, що справді досить добре.


1
@TravisBlack Так, я спочатку почав це як "Так, але ...", але потім сумнівався в собі і отримував перевагу. Зараз я покращив відповідь :).
Dan Scally

16
Під час тренування та тестування всього з векторами, які містять значення в [0,100], то оцінка становить приблизно 0,95. Чудово. Але при тренуванні його зі значеннями в [0,100] та тестуванні зі значеннями в [100,200] бал практично дорівнює нулю . Ви вже зробили крок назад зі своєю редакцією. Але зробити це однозначно зрозумілим для тих, хто сліпо бачить ML як чудо-зброю, яка може вирішити всі проблеми: Що б ви там не вчилися: це НЕ "максимальна функція"! .
Marco13

2
(Вбік: Щоб повідомити інших про відповіді на їх коментарі, використовуйте @, як це було зазначено в @Marco13). Щодо питання: Я думаю, що ваше твердження «машинне навчання - це не відповідь» дає зрозуміти. Я в основному боїться , що занадто багато людей не застосовують відповідний аналіз при використанні ML / DL / NNS, і особливо, коли вони стикаються з то , що виглядає , як він може «вирішити свої проблеми», не розуміючи , чому це , здається, зробити це і, таким чином, не визнаючи, коли "рішення" є лише артефактом не дуже добре зрозумілого процесу.
Marco13

2
@aroth впевнений; в кращому випадку це приблизне значення max (), застосовне до обсягу даних про навчання, які вони бачать. Я бавився з проблемою, але не маю наміру відволікати від первинних почуттів моєї відповіді, яка не використовує ML для подібного роду проблем .
Dan Scally

1
@BradyGilg Стандартизація вхідних даних ... ум-м ... хоча ви, мабуть, праві в тому, що це дасть "кращі" результати, результати все одно не матимуть особливого сенсу, оскільки НН не "вивчає максимальну функцію" . І аргумент певним чином є дуже академічним - я б навіть сказав "занадто академічний": Ви хочете обчислити / передбачити максимум деяких векторів, і для того, щоб обчислити макс, спершу потрібно обчислити хв / max для нормалізації (або середнього / stdDev для стандартизації, яка, здається, теж не дуже розумна).
Marco13

26

Так. Дуже важливо, що Ви вирішуєте архітектуру рішення машинного навчання. Архітектури та навчальні процедури не пишуть самі; вони повинні бути спроектовані або сплановані, і навчання слід як засіб виявлення параметризації архітектури, що підходить до набору точок даних.

Ви можете побудувати дуже просту архітектуру, яка фактично включає максимальну функцію:

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

де a і b - вивчені параметри.

З огляду на достатню кількість зразків тренувань та розумну процедуру тренувань, ця дуже проста архітектура дуже швидко навчиться встановлювати значення "1" і "b" до нуля.

Машинне навчання часто набуває форми розважальних численних гіпотез про ознайомлення та перетворення точок вхідних даних, а також вчитися зберігати лише ті гіпотези, які співвідносяться із цільовою змінною. Гіпотези кодуються явно в архітектурі та підфункціях, доступних в параметризованому алгоритмі, або як припущення, закодовані в алгоритмі "без параметрів".

Наприклад, вибір використання точкових продуктів та нелінійностей, як це часто зустрічається у ванільній нейронній мережі ML, є дещо довільним; він виражає загальну гіпотезу про те, що функція може бути побудована за допомогою заздалегідь визначеної композиційної мережевої структури лінійних перетворень та порогових функцій. Різні параметризації цієї мережі втілюють різні гіпотези щодо того, які лінійні перетворення використовувати. Будь-який інструментальний набір функцій може бути використаний, а завдання машинного учня - виявити за допомогою диференціації, проби та помилки чи іншого іншого повторюваного сигналу, які функції чи функції в його масиві найкраще мінімізують показник помилки. У наведеному вище прикладі вивчена мережа просто зводиться до максимальної самої функції, тоді як недиференційована мережа може альтернативно «вивчити» мінімальну функцію. Ці функції можна виразити або наблизити за допомогою інших засобів, як у лінійній чи нейромережевій регресії в іншій відповіді. Підсумовуючи, це дійсно залежить від того, які функції або фрагменти LEGO у вас в інструментальній панелі архітектури ML.


4
+1 ML - це не що інше, як вигадні регресійні рівняння та вимагає правильного вибору рівнянь.
aidan.plenert.macdonald

4
@ aidan.plenert.macdonald, однак, вплив і привабливість ML - це те, що не існує одного правильного вибору рівнянь. Вибрані рівняння повинні бути членами набору відповідних рівнянь, але виявляється, що для широкого кола завдань цей набір містить рівняння, набагато більш узагальнені, ніж може бути ретельно розроблене рішення, але параметри виходу, які вирішують проблема набагато швидше, ніж докладати додаткових зусиль для проектування. Це питання є гарним прикладом того, як це зовсім не усуває міркування щодо дизайну моделі.
Воля

Це ніколи не було питання. ОП запитала, чи може МЛ знайти (/ вивчити / зробити висновок) функцію на кшталт max()(з мічених даних). Вони не сказали " Враховуючи, що ви вже є max()будівельним блоком"
smci

@smci Не існує "універсального" пріоритету для архітектур або функцій машинного навчання. Як було сказано у моїй відповіді, ви можете наблизити максимальну функцію, використовуючи кусково-лінійні функції, перемежовані з нелінійностями - але не існує універсального правила, яке говорить про те, що всі ML повинні використовувати саме цей набір перетворень у своїй панелі інструментів. Нейронні мережі часто (але не завжди) мають в своєму розпорядженні максимальну функцію через нелінійності Max Pooling або ReLU. Кількість можливих функціональних функцій необмежена, саме тому я підкреслюю роль вибору та схильність до зміщення в архітектурі ML.
пігоцелез

7

Так - Машинне навчання може навчитися знаходити максимум у списку чисел.

Ось простий приклад навчання пошуку максимуму індексу:

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

Це дійсно навчання функції "максимум"? Навчальний набір з 10 000 п'ятиелементних списків є розумним наближенням до повного вхідного простору.
Марк

2
Відмова від відповідальності: Я не є експертом з питань ML / DL. Але я майже впевнений, що це не має сенсу. Я маю на увазі: Взагалі немає сенсу. Як я бачу, ви не вивчаєте максимальну функцію. Ви вивчаєте показники максимальних елементів навчального набору. Якщо ви введете вектор, який містить два числа, які обидва більше, ніж у навчального набору, він, ймовірно, не вдасться. Не кажучи вже про випадок, коли у вас немає 5D-, але 10D-вектора. Якщо кидати деякі дані в бібліотеку, які не можна зрозуміти, і побачити певний результат, НЕ (зовсім) означає, що це "працює".
Marco13

Я маю на увазі, це залежить від того, що має означати "це працює". Зокрема, дерево рішень збирається виробляти лише кусочно-постійну функцію, шматочки - прямокутні коробки, вирівняні по осі. У прикладі max, тренуючись на твердому гіперкубі, фактична функція max є кусочно-постійною у деяких регіонах трикутної форми. З огляду на достатню кількість навчальних прикладів та глибину, дерево наблизить ці трикутні області до довільної точності. Але, як і у багатьох (більшості?) Інших моделей, будь-які тестові зразки, що знаходяться поза діапазоном навчальних зразків, є досить безнадійними.
Бен Райнігер

Це нічого не доводить. ОП запитала "максимум у списку чисел" . Ви припускали, що вони повинні бути поплавцями в діапазоні 0..1. Спробуйте ввести 2 (або -1, або 1,5), і це не вдасться.
smci

4

Алгоритми навчання

Замість того, щоб вивчати функцію як обчислення, здійснене нейронною мережею подачі вперед, існує ціла область досліджень щодо алгоритмів навчання з вибіркових даних. Наприклад, можна використовувати щось на зразок нейронної машини Тюрінга чи якийсь інший метод, коли виконання алгоритму контролюється машинним навчанням у його точках прийняття рішень. Алгоритми іграшок, такі як пошук максимуму або сортування списку, перетворення списку або фільтрація списку, зазвичай використовуються як приклади в дослідженні алгоритму навчання.


2

Я виключу освічені конструкції зі своєї відповіді. Ні, неможливо використовувати підхід до машинного навчання (ML) для повного представлення максимальної функції для довільних списків з довільною точністю. ML - це метод, заснований на даних, і зрозуміло, що ви не зможете наблизити функцію в регіонах, де у вас немає точок даних. Отже, простір можливих спостережень (який нескінченний) не може бути охоплений кінцевими спостереженнями.

Мої твердження мають теоретичну основу з теоремою Універсального наближення Кібеко для нейронних мереж. Я цитую теорему з Вікіпедії:

Rn

RnxR

Якщо ваш простір спостережень є компактним, ви, можливо, зможете наблизити максимальну функцію за допомогою кінцевого набору даних. Оскільки відповідь, яка проголосувала вгорі, ясно, що ви не повинні винаходити колесо!


1

Ось розширення на мій коментар. Якщо передмова, абсолютно @DanScally має рацію, що немає підстав використовувати ML для пошуку максимуму списку. Але я думаю, що ваше "це може дати мені розуміння того, що машинне навчання взагалі може зробити" є достатньою підставою для того, щоб заглиблюватися в це.

maxmax


maxmaxmax

n n

argmaxn(n2)δij=1(xi<xj)i<jxjxinxij<iδji+j>i(1δij)jxi>xjxiу відсортованому списку. Щоб завершити аргмакс, просто пороговіть цей шар.
На цьому етапі, якби ми могли розмножитися, ми отримаємо фактичне максимальне значення досить легко. Рішення в роботі полягає у використанні двійкового подання чисел, в якому точка двійкового множення є такою ж, як порогове додавання. Щоб просто отримати аргмакс, достатньо простої лінійної функції, помножуючи й показник на і підсумовуючи.ii


Нарешті, для наступного питання: чи можемо ми навчити НН до цього стану. @DanScally розпочав нас; можливо, знання теоретичної архітектури може допомогти нам обдурити рішення? (Зверніть увагу, що якщо ми зможемо навчитися / наблизити конкретний набір ваг вище, сітка фактично буде виходити за межі діапазону навчальних зразків.)

Зошит у github / Colab

Трохи змінивши речі, я отримую кращий результат тестування (0,838), і навіть тестування на вибірці поза вихідним діапазоном тренувань отримує гідну оцінку (0,698). Використання входів масштабування до[1,1]отримує тестовий бал до 0,961, поза межами діапазону - 0,758. Але я забиваю той самий метод, що і @DanScally, який здається трохи нечесним: функція ідентичності чудово оцінить цю метрику. Я також роздрукував кілька коефіцієнтів, щоб побачити, чи з’являється щось близьке до вищеописаного точного пристосування (насправді); і кілька вихідних результатів, які дозволяють припустити, що модель занадто боязка в прогнозуванні максимуму, помиляючись на тому, що передбачити, що жоден з входів не є максимальним. Можливо, зміна цілі могла б допомогти, але в цей момент я вже вклав занадто багато часу; якщо хтось прагне вдосконалити підхід, сміливо грайте (в Colab, якщо хочете) і повідомте мене.


Я ще не обернув голову навколо паперу (який є важким для математики ... і напрочуд старим ...), але, хоча це може бути просто неоднозначний термін "мережа", який привів до мене цю асоціацію, я цікавилось, чи можна створити нейронну мережу, яка по суті "емулює" сортувальну мережу ...
Marco13

@ Marco13, звичайно, я думаю, що використання цього паперу для створення NN в якості компараторів створило б емуляцію NN сортувальної мережі. Це було б набагато глибше паперу, але ширина може зменшитися до лінійного розміру?
Бен Райнігер

Справді, я не так глибоко втягнувся в NN, як мені потрібно було сказати щось глибоке. Але такі речі, як ~ "ти можеш емулювати все двома шарами", схожі на результати з низькорівневої конструкції схеми, де ти кажеш, що "можеш реалізувати кожну функцію двома шарами воріт NAND" чи що. Я думаю, що деякі з НН, які вивчаються останнім часом, - це просто химерні версії речей, які люди вже відкрили 50 років тому, але, можливо, це помилкове уявлення ...
Marco13

0

Так, навіть настільки просте машинне навчання, як звичайні лінійні найменші квадрати, це може зробити, якщо ви використовуєте деяку прикладну кмітливість.

(Але більшість вважає це досить жахливим перенасиченням).

(Я припускаю, що ми хочемо знайти max abs abs вхідного вектора):

  1. Виберіть монотонно спадаючу функцію абсолютного значення, наприклад
    f(x)=1x2
  2. Побудуйте діагональну матрицю . Назвемо цеf(r)Cr
  3. Побудувати вектор повного одних .S
  4. Побудуйте та вирішіть систему рівнянь(ϵI+103StS+Cr)1(103St)
  5. Назвемо вектор результату , це буде мірою ймовірності (дорівнює 1), ми можемо його перетягувати нелінійно, наприкладp
    pi=pik|pi|k
  6. Просто обчисліть скалярний добуток з індексним вектором і круглим.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.