Может ли машинное обучение выучить такую ​​функцию, как поиск максимума из списка?


26

У меня есть вход, который является списком, и вывод является максимумом элементов input-list.

Может ли машинное обучение выучить такую ​​функцию, которая всегда выбирает максимум входных элементов, присутствующих на входе?

Это может показаться довольно простым вопросом, но он может дать мне понимание того, что машинное обучение может делать в целом. Благодарность!


1
Я думаю, что вы можете попробовать это как последовательную проблему, то есть, используя Recurrent Neural Network. Подача отсортированных данных в сеть.
Випин Бансал

2
См. Также datascience.stackexchange.com/q/22242 , datascience.stackexchange.com/q/29345 ; Нейронные сети могут сортировать входной список, поэтому, конечно, можно извлечь максимум.
Бен Рейнигер

3
@TravisBlack: на самом деле, это определенно тот тип функций, который вы не можете изучить с помощью стандартных нейронных сетей. В качестве примера, предположим, что вы просто подключаете вектор со значением, чтобы предсказать, которое будет больше, чем любое значение в вашем тренировочном наборе. Как вы думаете, обученная нейронная сеть вернет вам это самое большое значение?
Клифф AB

10
@TravisBlack Нееет! Нейронные сети не могут выучить «в принципе любую» математическую функцию. По количеству элементов почти все функции являются патологическими почти повсеместно прерывистыми. Вы, вероятно, имеете в виду, что многие функции, которые действительно интересуют математиков, оказываются достаточно хорошими, чтобы нейронные сети могли их произвольно аппроксимировать . Но это совсем не то же самое, что способность изучать любую функцию .
осталось около

6
@leftaroundabout и Клифф: Приятно видеть, что кто-то остается на земле в недавнем обмане ML / DL. Люди используют NN, и когда вы копаете на один уровень глубже, вы замечаете, что они часто не имеют ни малейшего представления о том, что они на самом деле там делают - кроме слепой подстройки параметров из некоторого примера keras «Hello World», пока они не увидят какой-то шаблон. xkcd понял это правильно: xkcd.com/1838 . Я надеюсь, что кто-то еще может добавить здесь более глубокий ответ, чем кажется на данный момент. (Никому не обижайся, но общее недопонимание NNs меня беспокоит ...)
Marco13

Ответы:


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.

РЕДАКТИРОВАТЬ 2 : На самом деле я перезапустил это сегодня утром, используя sklearn RandomForestClassifier, и он работал значительно лучше:

# 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 да, я изначально начал это как «Да, но ...», но потом усомнился и двусмысленно. Я улучшил ответ сейчас :).
Дэн Скали

16
При обучении и тестировании всего этого с векторами, которые содержат значения в [0,100], тогда оценка составляет около 0,95. Хорошо. Но при обучении со значениями в [0,100] и при проверке со значениями в [100,200] оценка практически равна нулю . Вы уже сделали шаг назад со своим редактированием. Но чтобы сделать это однозначно понятным для тех, кто слепо видит ML как чудо-оружие, способное решить все проблемы: все, что вы там изучаете: это НЕ «максимальная функция»! ,
Marco13

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

2
@ уверен конечно; в лучшем случае это приближение max (), применимое к объему обучающих данных, которые он видит. Я играл с этой проблемой, но я не собираюсь отвлекать внимание от основного чувства моего ответа, которое заключается в том, чтобы не использовать ML для такого рода проблем .
Дэн Скалли

1
@BradyGilg Стандартизация входных данных ... хм ... в то время как вы, вероятно, правы в том, что это даст "лучшие" результаты, результаты все равно не будут иметь большого смысла, потому что NN не "изучает максимальную функцию" , И аргумент в некотором смысле, очевидно, очень академический - я бы даже сказал «слишком академический»: вы хотите вычислить / предсказать максимумы некоторых векторов, а для вычисления максимума сначала нужно вычислить мин. / max для нормализации (или означает / stdDev для стандартизации, что тоже не очень разумно).
Marco13,

26

Да. Очень важно, что вы выбираете архитектуру решения для машинного обучения. Архитектуры и процедуры обучения не пишут сами; они должны быть спроектированы или составлены из шаблонов, и обучение следует как средство обнаружения параметризации архитектуры, подходящей для набора точек данных.

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

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

где а и б - изученные параметры.

При наличии достаточного количества обучающих образцов и разумной тренировочной программы эта очень простая архитектура очень быстро научится устанавливать a в 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.
Pygosceles

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

Это действительно обучение "максимальной" функции? Учебный набор из 10000 списков из пяти элементов является разумным приближением к полному входному пространству.
Марк

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

Я имею в виду, это зависит от того, что «это работает» должно означать. В частности, дерево решений только когда-либо будет производить кусочно-постоянную функцию, а кусочки будут выровнены по оси прямоугольных прямоугольников. В примере max, тренирующемся на твердом гиперкубе, фактическая функция max является кусочно-постоянной в некотором треугольном виде областей. Учитывая достаточное количество обучающих примеров и глубину, дерево будет приближаться к этим треугольным областям с произвольной точностью. Но, как и во многих (большинстве?) Других моделях, любые тестовые образцы вне диапазона тренировочных образцов довольно безнадежны.
Бен Рейнигер

Это ничего не доказывает. ОП спросил "максимум в списке номеров" . Вы предполагали, что они должны быть плавающими в диапазоне 0..1. Попробуйте ввести 2 (или -1, или 1,5), и это не удастся.
SMCI

4

Алгоритмы обучения

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


2

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

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

рN при мягких предположениях о функция активации. Таким образом, теорема утверждает, что простые нейронные сети могут представлять широкий спектр интересных функций при заданных соответствующих параметрах; однако он не затрагивает алгоритмическую обучаемость этих параметров.

рNИкср . Это ограничение проявляется в плохой подгонке модели из ответа с наибольшим количеством голосов.

Если ваше пространство наблюдений компактно, вы можете аппроксимировать максимальную функцию с помощью конечного набора данных. Как показал ответ с самым высоким рейтингом, вы не должны изобретать велосипед!


1

Вот расширение моего комментария. В предисловии, абсолютно верно @DanScally, что нет причин использовать ML для нахождения максимума списка. Но я думаю, что ваше «это может дать мне понимание того, что машинное обучение может сделать в целом», является достаточной причиной, чтобы вникнуть в это.

МаксимумМаксимум


МаксимумМаксимумМаксимум

N N

ArgmaxN(N2)δяJзнак равно1(Икся<ИксJ)я<JИксJ-ИксяNИксяΣJ<яδJя+ΣJ>я(1-δяJ)JИкся>ИксJИкся
яя


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

Блокнот в github / Colab

[-1,1]получает тестовый балл до 0,961, с баллом вне диапазона 0,758. Но я забиваю тем же методом, что и @DanScally, что выглядит немного нечестно: функция идентификации будет отлично работать по этой метрике. Я также распечатал несколько коэффициентов, чтобы увидеть, появляется ли что-нибудь близкое к описанному выше точному соответствию (не совсем); и несколько необработанных выходных данных, которые предполагают, что модель слишком робкая в прогнозировании максимума, ошибочно полагая, что ни один из входных данных не является максимальным. Возможно, изменение цели может помочь, но на данный момент я уже потратил слишком много времени; если кто-то хочет улучшить подход, не стесняйтесь играть (в Colab, если хотите) и дайте мне знать.


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

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

По общему признанию, я не настолько глубоко вовлечен в NN, как мне нужно было сказать что-то глубокое. Но такие вещи, как ~ «вы можете эмулировать все с двумя слоями», немного похожи на результаты низкоуровневого проектирования схем, где вы говорите, что можете «реализовать каждую функцию с двумя слоями вентилей NAND» или еще много чего. Я думаю, что некоторые из NN, которые были рассмотрены в последнее время, являются просто причудливыми версиями того, что люди уже обнаружили 50 лет назад, но, возможно, это неправильное представление ...
Marco13

0

Да, даже такое простое машинное обучение, как обычные линейные наименьшие квадраты, может сделать это, если вы используете некоторую прикладную смекалку.

(Но большинство сочло бы это довольно ужасным перебором).

(Я предполагаю, что мы хотим найти максимум абс входного вектора):

  1. е(Икс)знак равно1Икс2
  2. е(р)Ср
  3. Построить вектор, полный единиц S,
  4. Построить и решить систему уравнений (εя+103STS+Ср)-1(103ST)
  5. Давайте назовем вектор результата п, это будет мера вероятности (суммы до 1), мы можем перевесить ее, например, нелинейно
    пязнак равнопяКΣ|пя|К
  6. Просто рассчитайте скалярное произведение с индексом вектора и округления.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.