Machine learning 回到XOR问题的基本原理-基本困惑

Machine learning 回到XOR问题的基本原理-基本困惑,machine-learning,scikit-learn,neural-network,perceptron,mlp,Machine Learning,Scikit Learn,Neural Network,Perceptron,Mlp,关于XOR和MLP,这是困扰我一段时间的事情;它可能是基本的(如果是的话,提前道歉),但我想知道 使用MLP解决XOR的方法有很多,但通常如下所示: from sklearn.neural_network import MLPClassifier X = [[0, 0], [0, 1], [1, 0], [1, 1]] y = [0, 1, 1, 0] model = MLPClassifier( activation='relu', max_iter=1000, hidden_la

关于XOR和MLP,这是困扰我一段时间的事情;它可能是基本的(如果是的话,提前道歉),但我想知道

使用MLP解决XOR的方法有很多,但通常如下所示:

from sklearn.neural_network import MLPClassifier

X = [[0, 0], [0, 1], [1, 0], [1, 1]]
y = [0, 1, 1, 0]

model = MLPClassifier(
    activation='relu', max_iter=1000, hidden_layer_sizes=(4,2))
现在,为了适应模型:

model.fit(X, y)
你猜怎么着

print('score:', model.score(X, y)) 
输出一个完美的

分数:1.0

但预测和评分是什么呢?在XOR的情况下,我们有一个数据集,根据定义(!)有四行、两个特征和一个二进制标签。没有标准的
X\u序列、y\u序列、X\u测试、y\u测试
可供使用。根据定义,同样地,模型不需要消化任何看不见的数据

预测以以下形式进行:

model.predict(X)
这与进行培训时使用的
X
完全相同

那么,模型不就是把它训练的
y
吐了出来吗?我们如何知道模型“学到”了什么

编辑:只是想澄清什么让我困惑-功能有2个,而且只有2个唯一的值;这两个唯一值有4个且只有4个可能的组合。标签列中已存在每个可能组合的正确标签。那么,当调用
fit()
时,模型需要“学习”什么呢?这种“学习”是如何进行的?当模型能够获得每个可能的输入组合的“正确”答案时,它怎么可能“错误”呢


再次,很抱歉,这可能是一个非常基本的问题。

关键是提出XOR问题是为了演示一些模型如何学习非线性问题,而有些模型则无法

因此,当模型在您提到的数据集上获得1.0精度时,值得注意的是,因为它已经学习了一个非线性问题。它已经学习了训练数据这一事实足以让我们知道它可以(潜在地)学习非线性模型。请注意,如果不是这种情况,您的模型将获得非常低的精度,如0.25,因为它通过一条线将二维空间划分为两个子空间

为了更好地理解这一点,让我们来看一个案例,在相同的情况下,模型无法学习数据:

import tensorflow as tf
import numpy as np

X = np.array(X)
y = np.array(y)

model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Dense(2, activation='relu'))

model.compile(optimizer=tf.train.GradientDescentOptimizer(learning_rate=0.1), loss='categorical_crossentropy', metrics=['categorical_accuracy'])
model.fit(X, y, epochs=100)
_, acc = model.evaluate(X, y)
print('acc = ' + str(acc))
其中:

acc=0.5

正如您所见,该模型无法对已经看到的数据进行分类。原因是,这是一个非线性数据,我们的模型只能对线性数据进行分类(是更好地理解XOR问题非线性的一个环节)。一旦我们将另一层添加到我们的网络中,它将能够解决此问题:

import tensorflow as tf
import numpy as np

X = np.array(X)
y = np.array(y)

model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Dense(1, activation='relu'))
model.add(tf.keras.layers.Dense(2, activation='relu'))


tb_callback = tf.keras.callbacks.TensorBoard(log_dir='./test/', write_graph=True)

model.compile(optimizer=tf.train.GradientDescentOptimizer(learning_rate=0.1), loss='categorical_crossentropy', metrics=['categorical_accuracy'])
model.fit(X, y, epochs=5, callbacks=[tb_callback, ])
acc = model.evaluate(X, y)
print('acc = ' + str(acc))
其中:

acc=1.0

通过只添加一个神经元,我们的模型学会了做它在100个时代(1层)中学不到的事情(即使它已经看到了数据)

总之,我们的数据集很小,网络可以很容易地记住它,这是正确的,但是异或问题很重要,因为它意味着有些网络无论如何都不能记住这些数据

尽管如此,对于正确的训练集和测试集,XOR问题还是有很多种。这里有一个(情节略有不同):


希望有帮助

谢谢你的回答,但我恐怕它不能完全回答这个问题:模型如何在包含(并且只能包含)4个数据点的数据集上“训练”呢?是否进行了某种装袋(带或不带替换)?我就是看不出来。另外,是什么在你的答案中创造了这个图形?我已经添加了代码(与绘图略有不同)。我不确定我是否完全理解你的问题。当您在训练过程中为NN提供样本时,权重会略有变化,以便网络生成正确答案。如果您继续向网络展示该示例—假设网络能够了解问题—它将给出正确的答案。的确,很少的样本通常不足以学习复杂问题的解决方案,但这里我们学习的是一个非常简单的问题(一个只包含4个样本的问题)。再一次,我不确定我是否理解了这个问题。很抱歉我不清楚,部分原因是我不完全确定是什么在困扰着我。我编辑成问题是为了澄清。没问题,我更新了我的答案,我想这个解释会帮助你更好地理解答案。如果我没有解释清楚,请告诉我。干杯。我不知道为什么,除非我看到你的代码,否则你可能需要为此发布一个新问题。你用的是什么损失函数?问这种关于ML的概念性问题可能更适合。@Arne-你可能是对的。我只是习惯于使用,所以。。。下一步,我将尝试这类问题的SE板或其他SE板。不用担心,看来你最终还是得到了一个好答案。我主要是想确保您了解专门用于统计和模型的stackexchange的存在。
import numpy as np
import matplotlib.pyplot as plt

x1 =np.concatenate([np.random.uniform(0, 100, 100), np.random.uniform(-100, 0, 100)])
y1 =np.concatenate([np.random.uniform(-100, 0, 100), np.random.uniform(0, 100, 100)])

x2 =np.concatenate([np.random.uniform(0, 100, 100), np.random.uniform(-100, 0, 100)])
y2 =np.concatenate([np.random.uniform(0, 100, 100), np.random.uniform(-100, 0, 100)])

plt.scatter(x1, y1, c='red')
plt.scatter(x2, y2, c='blue')
plt.show()