我遇到的情况是,给神经网络提供额外的数据会降低准确性,我看不出这是怎么回事。
假设您在一组示例中训练神经网络 - 只是一个二元分类器 - 例如,每个示例包含10个变量。它学会了相当准确地对训练和测试集进行分类。然后使用相同的示例重新运行,但每个示例上都有额外的变量,比如每个额外的20个变量。也许额外的变量不能提供与原始变量一样好的信号,但它仍然可以获得原始变量。最糟糕的情况是,它应该花更多的时间学习忽略额外的变量,对吗?从表面上看,应该没有任何方法可以降低准确度?
要经历我能想到的一切:
每种情况都是相同的记录集。
所有原始变量仍然存在,只添加了一些额外的变量。
这不是过度拟合;使用额外数据训练的网络在训练和测试集上都不太准确。
我认为这不需要更多时间。它已经运行了很长时间,没有任何进展的迹象。
我尝试过学习率不变且减少,各方面结果相同。
使用TensorFlow,简单的前馈网络,带有一个隐藏层,Adam优化器。代码位于https://github.com/russellw/tf-examples/blob/master/multilayer.py,最重要的部分是
# Inputs and outputs
X = tf.placeholder(dtype, shape=(None, cols))
Y = tf.placeholder(dtype, shape=None,)
# Hidden layers
n1 = 3
w1 = tf.Variable(rnd((cols, n1)), dtype=dtype)
b1 = tf.Variable(rnd(n1), dtype=dtype)
a1 = tf.nn.sigmoid(tf.matmul(X, w1) + b1)
pr('layer 1: {}', n1)
# Output layer
no = 1
wo = tf.Variable(rnd((n1, no)), dtype=dtype)
bo = tf.Variable(rnd(no), dtype=dtype)
p = tf.nn.sigmoid(tf.squeeze(tf.matmul(a1, wo)) + bo)
tf.global_variables_initializer().run()
# Model
cost = tf.reduce_sum((p-Y)**2/rows)
optimizer = tf.train.AdamOptimizer(args.learning_rate).minimize(cost)
tf.global_variables_initializer().run()
如何使可能使额外数据不准确?我错过了什么?
答案 0 :(得分:0)
您在变量和(训练)数据之间感到困惑。变量是您用来查找的重量和偏差,可帮助网络从数据中学习。因此,通过增加变量,您可以增加可训练单位,这显然需要更多时间。在某个阈值之后,您的数据可能不足以让网络学习/更新这些变量。
额外数据仅指更多示例。
所以在你的情况下,似乎你已经越过了这个门槛(假设你已经等待你的NN学习,在说它不再学习之前已经足够长了。)
答案 1 :(得分:0)
您可能想知道一种称为维数诅咒的现象。来自维基百科,它说:
这些问题的共同主题是,当维度增加时,空间的体积增加得如此之快,以至于可用数据变得稀疏。
答案 2 :(得分:0)
事实证明,至少与优化器的属性有关。尽管Adam在一个案例中发挥了最好的优化能力,但在一个稍微不同的情况下,它在Ftrl解决问题的地方失败了。我不知道为什么Adam有这种失败模式,但目前的解决方案是:使优化器成为参数,使用批处理文件循环遍历所有这些模式。