神经网络按梯度下降训练,不应该用同一个样本迭代直到得到loss最小值?然后再继续下一个样本吗?

在学习神经网络训练方式,梯度下降方法有个疑问

1、如下图所示训练过程,迭代得话,不应该继续用同一个样本计算权重直到得到loss极值?
2、我的理解就是每个样本都对应一个loss极值,不是吗?但是如果用不同样本去训练,用A训练得到一个最小loss适合样本A,用B训练得到适合样本B的最小loss,那就不适合A了啊?

图片说明

3、如下代码怎么理解,每个训练批次和重复使用样本的意义
其中feed_dict函数意义是什么:如果是30000步,每步喂一个批次8个样本是怎么训练的?

import tensorflow as tf
import numpy as np
BATCH_SIZE=8
seed=23455

####1 样本和标签的生成

#基于seed产生随机数
rng=np.random.RandomState(seed)
#随机数返回32行2列的矩阵,作为输入样本
X=rng.rand(32,2)
#设置标签Y,给每行样本进行设置:和<1==>1
Y=[[int(x0+x1<1)] for(x0,x1) in X]
print('X:\n',X)
print('Y:\n',Y)

####2 定义神经网络输入、参数和输出,定义前向网络
x=tf.placeholder(tf.float32,shape=(None,2))
y_=tf.placeholder(tf.float32,shape=(None,1))#True lable

#其中的3是隐藏层的神经元个数,列举:只有一个隐藏层(w1,w2)  有两个隐藏层(w1,w2,w3)
    #n个隐藏层有n+1个权值矩阵
w1= tf.Variable(tf.random_normal([2,3], stddev=1,seed=1))
w2= tf.Variable(tf.random_normal([3,1], stddev=1,seed=1))

a= tf.matmul(x,w1)
y= tf.matmul(a,w2)

####3 定义损失函数及反向传播方法
loss=tf.reduce_mean(tf.square(y-y_))#loss函数:均方误差:差的平方和均值
train_step= tf.train.GradientDescentOptimizer(0.001).minimize(loss)#梯度下降方向传播算法
#train_step= tf.train.MomentumOptimizer(0.001,0.9).minimize(loss)
#train_step= tf.train.AdamOptimizer(0.001).minimize(loss)


####4 创建会话
with tf.Session() as sess:
    init_op = tf.global_variables_initializer()
    sess.run(init_op)
    #输出未经训练,随机生成的参数
    print('w1:\n', sess.run(w1))
    print('w2:\n', sess.run(w2))
    print('\n')

####5 训练模型
    STEPS= 30000
    for i in range(STEPS):
        start=(i*BATCH_SIZE)%32
        end = start+BATCH_SIZE
        sess.run(train_step, feed_dict={x: X[start:end], y_: Y[start:end]})
        if i % 500 == 0:
            total_loss=sess.run(loss, feed_dict={x: X, y_: Y})
            print('After %d training steps, loss on all data is %g'%(i, total_loss))

    ####6 输出训练后的参数
    print('\n')
    print('w1:\n', sess.run(w1))
    print('w2:\n', sess.run(w2))

显然不能这么做,因为你样本数量过少,始终在一个样本上学习,会导致过拟合。必须逐步对所有样本学习。