我遇到了一个情况,给神经网络提供额外的数据反而降低了准确性,我无法理解这是如何发生的。
假设你训练了一个神经网络——仅是二元分类器——使用一组示例,每个示例有10个变量。它能够相当准确地对训练和测试集进行分类。然后使用相同的示例重新运行,但每个示例增加了额外的变量,例如每个增加了20个变量。也许这些额外变量的信号不如原始变量好,但它仍然获得了原始变量。最坏的情况是,它只需要多花一些时间来学习忽略这些额外变量,对吗?表面上看,准确性不应该降低的,对吗?
让我把我想得到的所有情况都过一遍:
-
每次都是同一组记录。
-
所有原始变量仍然存在,只是增加了一些额外的变量。
-
这不是关于过拟合的问题;使用额外数据训练的网络在训练和测试集上的准确性都大大降低了。
-
我认为这不是需要更多时间的问题。它已经运行了很长时间,现在没有任何进展的迹象。
-
我尝试过保持学习率不变和降低学习率,两种方式的结果都是一样的。
使用TensorFlow,简单的前馈网络,带有一个隐藏层,Adam优化器。代码位于 https://github.com/russellw/tf-examples/blob/master/multilayer.py,最重要的部分是
# Inputs and outputsX = tf.placeholder(dtype, shape=(None, cols))Y = tf.placeholder(dtype, shape=None,)# Hidden layersn1 = 3w1 = 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 layerno = 1wo = 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()# Modelcost = tf.reduce_sum((p-Y)**2/rows)optimizer = tf.train.AdamOptimizer(args.learning_rate).minimize(cost)tf.global_variables_initializer().run()
额外数据如何可能使网络的准确性降低?我错过了什么?
回答:
结果证明,这至少与优化器的属性有关。虽然在一种情况下Adam是所有优化器中表现最好的,但在稍微不同的情况下它表现得很差,而Ftrl解决了这个问题。我不知道为什么Adam会有这种失败模式,但当前的解决方案是:将优化器设为参数,使用批处理文件循环遍历所有优化器。