机器学习能否学习诸如从列表中查找最大值之类的功能?


26

我有一个输入,它是一个列表,输出是输入列表中元素的最大值。

机器学习是否可以学习始终选择输入中存在的最大输入元素的功能?

这似乎是一个非常基本的问题,但它可能使我对机器学习通常可以做什么有所了解。谢谢!


1
我认为您可以将其作为一系列问题来尝试,即使用递归神经网络。将分类的数据馈送到网络。
vipin bansal

2
又见datascience.stackexchange.com/q/22242datascience.stackexchange.com/q/29345 ; 神经网络可以输入列表进行排序,因此当然可以提取最大值。
Ben Reiniger

3
@TravisBlack:实际上,这绝对是标准神经网络无法学习的函数类型。例如,假设您只是插入一个向量,该向量的值可以预测该值大于训练集中的任何值。您认为训练有素的神经网络会带给您最大的价值吗?
悬崖AB

10
@TravisBlack NOOO!神经网络无法学习“基本上任何”数学函数。在基数方面,几乎所有功能都是病理性的,几乎在所有地方都是不连续的。您可能的意思是,数学家实际上感兴趣的许多函数的行为恰到好处,以至于神经网络可以很好地对它们进行任意近似。但这与学习任何功能根本不是一回事。
大约

6
@leftaroundabout和Cliff:很高兴看到有人在最近的ML / DL炒作中呆在地上。人们利用神经网络,当你挖掘更深层次的,您会发现他们往往没有丝毫他们实际上是在那里做想法-超越盲目地从一些keras调整参数的“Hello World”的例子,直到他们看到一些模式。xkcd完全正确:xkcd.com/1838。我希望有人仍然可以在这里添加比当前答案更深刻的答案。(对任何人都没有冒犯,但普遍缺乏对
NN

Answers:


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用于此类问题
Dan Scally

1
@BradyGilg标准化输入数据...嗯...虽然您可能是对的,因为这将产生“更好”的结果,但是结果仍然没有多大意义,因为NN并不是在“学习最大功能” 。在某些方面,该论点显然是非常学术性的-我什至会说“太学术性”:您要计算/预测某些向量的最大值,并且要计算最大值,首先必须计算最小值/ max进行标准化(或标准化的均值/ stdDev,这似乎也不是很明智)。
Marco13

26

是。 非常重要的是,您决定机器学习解决方案的体系结构。体系结构和培训过程不会自己编写;必须对它们进行设计或模板化,然后进行培训,作为发现适合一组数据点的体系结构参数化的一种方法。

您可以构建一个非常简单的体系结构,该体系结构实际上包括一个最大功能:

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

其中ab是学习的参数。

给定足够的训练样本和合理的训练例程,此非常简单的体系结构将很快学习将任务的a设置为1,将b设置为零。

机器学习通常采取以下形式:招待有关输入数据点特征化和变换的多个假设,并学习仅保留与目标变量相关的那些假设。假设在参数化算法中可用的体系结构和子功能中明确编码,或者在“无参数”算法中作为假设编码。

例如,香草神经网络ML中常见的使用点积和非线性的选择有些随意。它表达了一个包含性的假设,即可以使用线性变换和阈值函数的预定组成网络结构来构建函数。该网络的不同参数化体现了关于使用哪种线性变换的不同假设。可以使用任何功能工具箱,并且机器学习者的工作是通过区分或反复试验或某种其他可重复的信号来发现,其阵列中的功能或特征可以最大程度地减少错误度量。在上面给出的例子中,学习的网络只是简单地减少到最大功能本身,而未分化的网络可以替代地“学习”最小功能。这些函数可以通过其他方式表示或近似,如在另一个答案中的线性或神经网络回归函数中。总之,这实际上取决于ML体系结构工具箱中具有哪些功能或乐高积木。


4
+1 ML只是花哨的回归方程式,它要求正确选择方程式。
aidan.plenert.macdonald

4
但是,@ aidan.plenert.macdonald ML的影响和吸引力在于,没有一个正确的方程式选择。您选择的方程式需要是一组合适的方程式的一部分,但事实证明,对于一系列广泛的问题而言,该方程式包含的方程式比经过精心设计的解决方案更能概括,但得出的参数可以解决该问题。问题比投入额外的设计工作要快得多。这个问题是一个很好的例子,它说明了如何完全消除模型设计方面的考虑。
威尔

这从来不是问题。OP询问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

真的在学习“最大”功能吗?10,000个五元素列表的训练集是整个输入空间的合理近似值。
马克

2
免责声明:我不是ML / DL专家。但是我很确定这没有任何意义。我的意思是:完全没有意义。如我所见,您不是在学习最大功能。您正在学习训练集中最大元素的索引。如果输入的向量包含两个均大于训练集的数字,则可能会失败。更不用说您没有5D向量而是10D向量的情况。一些数据掷入库,一个不unterstand,看到某个结果确实(全部)意味着它“作品”。
Marco13

我的意思是,这取决于“有效”的含义。特别地,决策树只会产生分段恒定的功能,而分段是轴对齐的矩形框。在max示例中,在实体超立方体上训练时,实际的max函数在某些三角形区域上是分段恒定的。给定足够的训练示例和深度,树将以任意精度逼近这些三角形区域。但是,与许多(大多数?)其他模型一样,训练样本范围之外的任何测试样本都是毫无希望的。
Ben Reiniger,

这什么都没证明。OP询问“数字列表中的最大值”。您假设它们必须是0..1范围内的浮点数。尝试输入2(或-1或1.5),它将失败。
smci

4

学习算法

与其学习前馈神经网络的计算功能,还不如从样本数据中学习算法的整个研究领域。例如,可能使用类似神经图灵机之东西或其他方法,其中算法的执行由机器学习在其决策点控制。诸如查找最大值,对列表进行排序,对列表进行反转,对列表进行过滤等玩具算法通常用作算法学习研究的示例。


2

我将从答案中排除受过良好教育的设计。不,不可能使用开箱即用的机器学习(ML)方法来以任意精度完全表示任意列表的最大功能。ML是一种基于数据的方法,很明显,您将无法在没有任何数据点的区域中近似函数。因此,有限的观测值不能覆盖可能的观测值(无限)的空间。

我的陈述基于Cybeko神经网络的通用逼近定理的理论基础。我将引用维基百科的定理:

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在排序列表中。要完成argmax,只需设置此层的阈值即可。 在这一点上,如果我们可以相乘,我们将很容易获得实际的最大值。本文中的解决方案是使用数字的二进制表示形式,此时二进制乘法与阈值加法相同。仅获取argmax,只要有一个简单的线性函数就可以将第个指标乘以并求和。
ii


最后,对于接下来的问题:我们能否将NN训练到这种状态。@DanScally让我们开始了;也许知道理论架构可以帮助我们欺骗解决方案?(请注意,如果我们可以学习/近似上述特定权重,则该网络实际上将在训练样本范围之外表现良好。)

github / Colab中的笔记本

稍微改变一下,我会获得更好的测试分数(0.838),甚至在原始训练范围之外的样本上进行测试也可以获得不错的分数(0.698)。使用缩放为输入[1,1]测试分数最高为0.961,超出范围的分数为0.758。但是,我使用与@DanScally相同的方法来评分,这似乎有点不诚实:身份函数将在该指标上得分完美。我还打印了一些系数,以查看是否有任何与上述精确拟合相近的东西出现(不是真的)。以及一些原始输出,这表明模型在预测最大值时过于胆小,而在预测输入都不是最大值的方面就犯了错误。也许修改目标可能会有所帮助,但是到目前为止,我已经花了太多时间。如果有人愿意改进这种方法,请随时玩(如果愿意,可以在Colab中玩),并告诉我。


我还没有把头缠在纸上(这是数学上的沉重...而且令人惊讶的古老...),但是即使这可能是使我联想起这种关联的模棱两可的“网络”一词,想知道是否可以设计一个本质上“模拟” 排序网络神经网络 ……
Marco13

@ Marco13,当然,我认为使用该纸来生成NN作为比较器会产生排序网络的NN仿真。它比纸张的深度要深得多,但是宽度可能会缩小到线性尺寸吗?
Ben Reiniger

诚然,我对NN的参与程度不如说出深刻的话那么深。但是诸如“您可以用两层仿真所有东西”之类的声音听起来有点像低级电路设计的结果,您说您可以“用两层NAND门实现每个功能”或诸如此类。我认为最近检查过的某些神经网络只是人们50年前就已经发现的事物的奇特版本,但这也许是一种误解……
Marco13

0

是的,即使使用一些应用的技巧,即使像普通的线性最小二乘一样简单的机器学习也可以做到这一点。

(但是大多数人会认为这太可怕了。)

(我假设我们要查找输入向量的最大绝对值):

  1. 选择绝对值的单调递减函数,例如
    f(x)=1x2
  2. 建立对角矩阵。让我们称之为f(r)Cr
  3. 建立充满向量。S
  4. 建立并求解方程组(ϵI+103StS+Cr)1(103St)
  5. 让我们将结果向量称为概率度量(总和为1),我们可以非线性地对其进行重新,例如p
    pi=pik|pi|k
  6. 只需使用索引向量和舍入来计算标量积。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.