Неправильная обработка mini-batch
: для пакета мы вычисляем градиенты всего пакета одновременно, затем суммируем все градиенты и затем обновляем весовые коэффициенты один раз для пакета.
Вот кодкоторый иллюстрирует вычисление градиента d(loss)/d(W)
в простом примере: y = W * x
для ввода mini-batch
и single
:
X = tf.placeholder(tf.float32, [None, 1])
Y = tf.placeholder(tf.float32, [None, 1])
W1 = tf.constant([[0.2]], dtype=tf.float32)
out = tf.matmul(X, W1)
loss = tf.square(out-Y)
#Calculate error gradient with respect to weights.
gradients = tf.gradients(loss, W1)[0]
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
#Giving individual inputs
print(sess.run([gradients], {X: np.array([[0.1]]), Y:[[0.05]]}))
# [[-0.006]]
print(sess.run([gradients], {X: np.array([[0.2]]), Y:[[0.1]]}))
#[[-0.024]]
#Give a batch combining the above inputs
print(sess.run([gradients], {X: np.array([[0.1],[0.2]]), Y:[[0.05], [0.1]]}))
# [[-0.03]] which is the sum of the above gradients.