我试图创建一个基于深度学习的简单模型来预测y=x**2
,但看起来深度学习无法学习训练集范围之外的一般函数。
直观上我认为神经网络可能无法拟合y=x**2,因为输入之间没有涉及乘法运算。
请注意,我并不是在询问如何创建一个模型来拟合x**2
。我已经实现了这一点。我想知道以下问题的答案:
- 我的分析正确吗?
- 如果第1问的答案是肯定的,那么深度学习的预测范围不是很有限吗?
- 是否有更好的算法可以预测像y = x**2这样的函数,无论是在训练数据范围内还是范围外?
完整笔记本的路径:https://github.com/krishansubudhi/MyPracticeProjects/blob/master/KerasBasic-nonlinear.ipynb
训练输入:
x = np.random.random((10000,1))*1000-500y = x**2x_train= x
训练代码
def getSequentialModel(): model = Sequential() model.add(layers.Dense(8, kernel_regularizer=regularizers.l2(0.001), activation='relu', input_shape = (1,))) model.add(layers.Dense(1)) print(model.summary()) return modeldef runmodel(model): model.compile(optimizer=optimizers.rmsprop(lr=0.01),loss='mse') from keras.callbacks import EarlyStopping early_stopping_monitor = EarlyStopping(patience=5) h = model.fit(x_train,y,validation_split=0.2, epochs= 300, batch_size=32, verbose=False, callbacks=[early_stopping_monitor])_________________________________________________________________Layer (type) Output Shape Param # =================================================================dense_18 (Dense) (None, 8) 16 _________________________________________________________________dense_19 (Dense) (None, 1) 9 =================================================================Total params: 25Trainable params: 25Non-trainable params: 0_________________________________________________________________
在随机测试集上的评估
在这个例子中,深度学习在预测简单非线性函数方面表现不佳,但在预测训练数据样本空间内的值方面表现良好。
回答:
- 我的分析正确吗?
考虑到我在评论中提到你的网络肯定不是深层的,让我们接受你的分析确实是正确的(毕竟,你的模型在其训练范围内确实表现得很好),以便我们能够讨论你的第二个问题,这是最有趣的问题。
- 如果第1问的答案是肯定的,那么深度学习的预测范围不是很有限吗?
嗯,这类问题并不完全适合在SO上讨论,因为“非常有限”的确切含义可以说是不清楚的…
所以,让我们重新表述:我们应该期望深度学习模型在它们训练过的数值域之外预测这样的数值函数吗?
来自不同领域的一个例子可能会有所启发:假设我们构建了一个能够在照片中检测和识别动物的模型,并且准确率非常高(这不是假设;这样的模型确实存在);当同样的模型无法在这些照片中检测和识别飞机(或树木、冰箱等——你能想到的任何东西)时,我们应该抱怨吗?
这样说的话,答案显然是不——我们不应该抱怨,事实上,我们对这种行为根本不感到惊讶。
我们人类很容易认为这样的模型应该能够外推,特别是在数值领域,因为这是我们自己很“容易”做到的事情;但是,机器学习模型虽然在内插方面表现得异常出色,但在你这里提出的外推任务上却表现得非常糟糕。
为了让它更直观,想想这些模型的整个“世界”都被限制在它们的训练集的域内:我上面的示例模型能够在未见过的照片中泛化并识别动物,只要这些动物是在(注意引号)训练期间见过的动物之间;同样,你的模型在预测训练时使用的样本之间的参数的函数值方面表现得很好。但在任何情况下,这些模型都不期望超出它们的训练域(即外推)。我的示例模型没有“世界”超越动物,同样,你的模型没有“世界”超越[-500, 500]…
为了进一步证实,请考虑最近的一篇论文Neural Arithmetic Logic Units,由DeepMind撰写;引用摘要中的内容:
神经网络可以学习表示和操作数值信息,但它们很少能很好地泛化到训练期间遇到的数值范围之外。
另见一位著名从业者的相关推文:
关于你的第三个问题:
- 是否有更好的算法可以预测像
y = x**2
这样的函数,无论是在训练数据范围内还是范围外?
到目前为止应该很清楚,这是一个当前研究的(热门)领域;请参阅上面的论文作为起点…
那么,深度学习模型是否有限?当然是——在可预见的未来,忘记那些关于AGI的可怕故事吧。它们是否如你所说的那样非常有限?我不知道…但是,考虑到它们在外推方面的局限性,它们是否有用?
这可能是真正有趣的问题,答案显然是——当然有用!