Нейронная сеть с достаточным количеством параметров не может переопределиться при использовании случайных данных для обучения с размером пакета больше 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 ]
, что выглядит намного лучше.Есть ли какое-либо объяснение этим результатам.
На самом деле в моей проблеме ситуация аналогична приведенному выше примеру.Обучающие данные всегда зашумлены, например, финансовые данные и корреляция между входной функцией и ее меткой не являются детерминированными.