Нейронная сеть не может переопределиться при использовании случайных данных для обучения с размером пакета больше 1 - PullRequest
0 голосов
/ 06 мая 2019

Нейронная сеть с достаточным количеством параметров не может переопределиться при использовании случайных данных для обучения с размером пакета больше 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 ]

, что выглядит намного лучше.Есть ли какое-либо объяснение этим результатам.

На самом деле в моей проблеме ситуация аналогична приведенному выше примеру.Обучающие данные всегда зашумлены, например, финансовые данные и корреляция между входной функцией и ее меткой не являются детерминированными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...