当使用随机数据同时以大于1的批量进行训练时,具有足够数量的参数的神经网络无法过度拟合。该示例如下所示
# encoding: utf-8
import tensorflow as tf
import numpy as np
# define model
x = tf.placeholder(tf.float32, (None, 3))
y = tf.placeholder(tf.float32, (None,))
l1 = tf.layers.dense(x, 64, activation=tf.tanh)
l2 = tf.layers.dense(l1,32, activation=tf.tanh)
y_pred = tf.layers.dense(l2, 1, activation=None)
# optimization
loss = tf.reduce_mean((y_pred - y)**2)
train_op = tf.train.AdamOptimizer(learning_rate=1E-3).minimize(loss)
# pseudo-data
X_train = np.random.sample((16, 3))
y_train = np.random.sample((16,))
batch_size = 16
# batch training
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
for i in range(500):
idx = np.random.choice(16, batch_size, replace=False)
xx, yy = X_train[idx], y_train[idx]
_, res = sess.run([train_op, loss], feed_dict={x: xx, y: yy})
print(y_train)
print(sess.run(y_pred, feed_dict={x: X_train}))
如您所见,该模型是一个简单的完全连接的网络。训练数据X_train
及其标签y_train
完全是随机的。模型中的参数数量应足以适合如此小的数据集。如果我设置了batch_size>1
,例如16
,然后我得到如下输出
y_train=
[0.83086132 0.82769145 0.14508738 0.97679574 0.06057778 0.3840409
0.15115362 0.36072679 0.07933906 0.46839957 0.39803663 0.9986862
0.04068222 0.29919901 0.41615445 0.37946888]
y_pred=
[0.42504317 0.4272736 0.4251154 0.42976904 0.42751524 0.42498615
0.4258124 0.42656243 0.4220776 0.42700106 0.42622766 0.42853013
0.42863816 0.42554626 0.42079183 0.42584413]
很显然,该模型什么也不学,输出与输入无关。因此,损失非常大。但是,如果我们设置batch_size=1
并将训练步骤设置为500*16
,那么我们得到
y_train=
[0.83886073 0.1837958 0.83229946 0.57430425 0.85380491 0.47741767
0.36943918 0.86290274 0.81842276 0.26366024 0.87917113 0.49779675
0.16278037 0.67603003 0.09332257 0.82826345]
y_pred=
[0.8303989 0.23228788 0.82680005 0.54569584 0.7431256 0.48611945
0.678597 0.6418939 0.7954159 0.42094752 0.8058572 0.49699274
0.19076784 0.6728387 0.1060954 0.8723226 ]
这似乎好多了。这些结果有什么解释吗?
实际上,在我的问题中,情况类似于上面给出的示例。训练数据总是很嘈杂,例如财务数据以及输入特征与其标签之间的相关性不确定。